sig
  module Clustering :
    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
  val causal_states :
    float ->
    (int -> bool) ->
    int array array ->
    int -> int -> 'a array array -> 'b array array -> int array * int array
end