sig
  type link = UnSpec | Free | Link of int * int
  type cc
  type t = Pattern.cc
  type id
  val debug_print_id : Format.formatter -> Pattern.id -> unit
  module ObsMap :
    sig
      type 'a t
      val dummy : '-> 'Pattern.ObsMap.t
      val get : 'Pattern.ObsMap.t -> Pattern.id -> 'a
      val set : 'Pattern.ObsMap.t -> Pattern.id -> '-> unit
      val fold_lefti :
        (Pattern.id -> '-> '-> 'a) -> '-> 'Pattern.ObsMap.t -> 'a
      val map : ('-> 'b) -> 'Pattern.ObsMap.t -> 'Pattern.ObsMap.t
      val print :
        ?trailing:(Format.formatter -> unit) ->
        (Format.formatter -> unit) ->
        (Pattern.id -> Format.formatter -> '-> unit) ->
        Format.formatter -> 'Pattern.ObsMap.t -> unit
    end
  module Env :
    sig
      type transition = private {
        next : Navigation.abstract Navigation.t;
        dst : Pattern.id;
        inj : Renaming.t;
      }
      type point
      val content : Pattern.Env.point -> Pattern.cc
      val roots : Pattern.Env.point -> (int list * int) option
      val deps : Pattern.Env.point -> Operator.DepSet.t
      val sons : Pattern.Env.point -> Pattern.Env.transition list
      type t
      val get : Pattern.Env.t -> Pattern.id -> Pattern.Env.point
      val get_single_agent :
        int -> Pattern.Env.t -> (Pattern.id * Operator.DepSet.t) option
      val get_elementary :
        Pattern.Env.t ->
        Agent.t ->
        int ->
        Navigation.abstract Navigation.arrow ->
        (Pattern.id * Pattern.Env.point * Renaming.t) option
      val signatures : Pattern.Env.t -> Signature.s
      val new_obs_map :
        Pattern.Env.t -> (Pattern.id -> 'a) -> 'Pattern.ObsMap.t
      val to_navigation :
        Pattern.Env.t -> Pattern.id -> Navigation.abstract Navigation.t
      val print : Format.formatter -> Pattern.Env.t -> unit
      val to_yojson : Pattern.Env.t -> Yojson.Basic.json
      val of_yojson : Yojson.Basic.json -> Pattern.Env.t
    end
  module PreEnv :
    sig
      type t
      type stat = { nodes : int; nav_steps : int; }
      val sigs : Pattern.PreEnv.t -> Signature.s
      val of_env : Pattern.Env.t -> Pattern.PreEnv.t
      val empty : Signature.s -> Pattern.PreEnv.t
      val debug_print : Format.formatter -> Pattern.PreEnv.t -> unit
    end
  type work
  val empty_cc : Signature.s -> Pattern.cc
  val begin_new : Pattern.PreEnv.t -> Pattern.work
  val new_node : Pattern.work -> int -> Agent.t * Pattern.work
  val new_link :
    Pattern.work -> Agent.t * int -> Agent.t * int -> Pattern.work
  val new_free : Pattern.work -> Agent.t * int -> Pattern.work
  val new_internal_state :
    Pattern.work -> Agent.t * int -> int -> Pattern.work
  val finish_new :
    ?origin:Operator.rev_dep ->
    Pattern.work -> Pattern.PreEnv.t * Renaming.t * Pattern.cc * Pattern.id
  val compare_canonicals : Pattern.id -> Pattern.id -> int
  val is_equal_canonicals : Pattern.id -> Pattern.id -> bool
  val print_cc :
    ?dotnet:bool ->
    ?full_species:bool ->
    ?sigs:Signature.s ->
    ?cc_id:Pattern.id ->
    with_id:bool -> Format.formatter -> Pattern.t -> unit
  val print :
    ?domain:Pattern.Env.t ->
    with_id:bool -> Format.formatter -> Pattern.id -> unit
  val id_to_yojson : Pattern.id -> Yojson.Basic.json
  val id_of_yojson : Yojson.Basic.json -> Pattern.id
  val reconstruction_navigation :
    Pattern.t -> Navigation.abstract Navigation.t
  val find_ty : Pattern.cc -> int -> int
  val automorphisms : Pattern.t -> Renaming.t list
  val embeddings_to_fully_specified :
    Pattern.Env.t -> Pattern.id -> Pattern.cc -> Renaming.t list
  val size_of_cc : Pattern.cc -> int
  val fold :
    (pos:int -> agent_type:int -> (Pattern.link * int) array -> '-> 'a) ->
    Pattern.cc -> '-> 'a
  val finalize :
    max_sharing:bool ->
    Pattern.PreEnv.t -> Contact_map.t -> Pattern.Env.t * Pattern.PreEnv.stat
  val infs : Pattern.t -> Pattern.t -> Pattern.t list
  val matchings : Pattern.t -> Pattern.t -> Renaming.t list
  val merge_on_inf :
    Pattern.PreEnv.t ->
    Renaming.t ->
    Pattern.t ->
    Pattern.t ->
    Pattern.t option *
    (Pattern.t * int * Pattern.t * int * int * bool) option
  val length : Pattern.t -> int
  module Set :
    sig
      type elt = id
      type t
      val empty : t
      val is_empty : t -> bool
      val singleton : elt -> t
      val is_singleton : t -> bool
      val add : elt -> t -> t
      val add_with_logs :
        ('parameters, 'error, elt -> t -> 'error * t) SetMap.with_log_wrap
      val remove : elt -> t -> t
      val add_while_testing_freshness :
        ('parameters, 'error, elt -> t -> 'error * bool * t)
        SetMap.with_log_wrap
      val remove_while_testing_existence :
        ('parameters, 'error, elt -> t -> 'error * bool * t)
        SetMap.with_log_wrap
      val remove_with_logs :
        ('parameters, 'error, elt -> t -> 'error * t) SetMap.with_log_wrap
      val split : elt -> t -> t * bool * t
      val union : t -> t -> t
      val disjoint_union : t -> t -> t option
      val inter : t -> t -> t
      val minus : t -> t -> t
      val diff : t -> t -> t
      val minus_with_logs :
        ('parameters, 'error, t -> t -> 'error * t) SetMap.with_log_wrap
      val union_with_logs :
        ('parameters, 'error, t -> t -> 'error * t) SetMap.with_log_wrap
      val disjoint_union_with_logs :
        ('parameters, 'error, t -> t -> 'error * t) SetMap.with_log_wrap
      val inter_with_logs :
        ('parameters, 'error, t -> t -> 'error * t) SetMap.with_log_wrap
      val diff_with_logs :
        ('parameters, 'error, t -> t -> 'error * t) SetMap.with_log_wrap
      val size : t -> int
      val mem : elt -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val filter_with_logs :
        ('parameters, 'error, (elt -> bool) -> t -> 'error * t)
        SetMap.with_log_wrap
      val for_all : (elt -> bool) -> t -> bool
      val partition : (elt -> bool) -> t -> t * t
      val partition_with_logs :
        ('parameters, 'error, (elt -> bool) -> t -> 'error * t * t)
        SetMap.with_log_wrap
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val fold_inv : (elt -> '-> 'a) -> t -> '-> 'a
      val elements : t -> elt list
      val print : Format.formatter -> t -> unit
      val choose : t -> elt option
      val random : Random.State.t -> t -> elt option
      val min_elt : t -> elt option
      val max_elt : t -> elt option
    end
end