sig
  module Cluster_collection :
    sig
      type 'a t = 'Queue.t
      exception Empty
      val create : unit -> 'a t
      val add : '-> 'a t -> unit
      val push : '-> 'a t -> unit
      val take : 'a t -> 'a
      val pop : 'a t -> 'a
      val peek : 'a t -> 'a
      val top : 'a t -> 'a
      val clear : 'a t -> unit
      val copy : 'a t -> 'a t
      val is_empty : 'a t -> bool
      val length : 'a t -> int
      val iter : ('-> unit) -> 'a t -> unit
      val fold : ('-> '-> 'a) -> '-> 'b t -> 'a
      val transfer : 'a t -> 'a t -> unit
    end
  type cluster = {
    id : int;
    distribution : int array;
    mutable nb_samples : int;
  }
  type clusters = {
    mutable clusters :
      Measure.Causal_states.Clustering.cluster
      Measure.Causal_states.Clustering.Cluster_collection.t;
    id_generator : unit -> int;
  }
  val merge :
    Measure.Causal_states.Clustering.cluster -> int array -> int -> unit
  val create_clusters : unit -> Measure.Causal_states.Clustering.clusters
  exception Found of int
  val add :
    Measure.Causal_states.Clustering.clusters ->
    (int array -> int -> int array -> int -> bool) -> int array -> int -> int
  val nb_samples : Measure.Causal_states.Clustering.clusters -> int array
end