sig
  type t
  val empty : with_connected_components:bool -> Edges.t
  val copy : Edges.t -> Edges.t
  type stats = { nb_agents : int; }
  val stats : Edges.t -> Edges.stats
  val add_agent : ?id:int -> Signature.s -> int -> Edges.t -> int * Edges.t
  val add_free : int -> int -> Edges.t -> Edges.t
  val add_internal : int -> int -> int -> Edges.t -> Edges.t
  val add_link :
    Agent.t ->
    int -> Agent.t -> int -> Edges.t -> Edges.t * (int * int) option
  val remove_agent : int -> Edges.t -> Edges.t
  val remove_free : int -> int -> Edges.t -> Edges.t
  val remove_internal : int -> int -> Edges.t -> int * Edges.t
  val remove_link :
    int -> int -> int -> int -> Edges.t -> Edges.t * (int * int) option
  val is_agent : Agent.t -> Edges.t -> bool
  val is_free : int -> int -> Edges.t -> bool
  val is_internal : int -> int -> int -> Edges.t -> bool
  val link_exists : int -> int -> int -> int -> Edges.t -> bool
  val exists_fresh : int -> int -> int -> int -> Edges.t -> int option
  val link_destination : int -> int -> Edges.t -> (Agent.t * int) option
  val get_internal : int -> int -> Edges.t -> int
  val get_sites : int -> Edges.t -> int
  val get_sort : int -> Edges.t -> int
  val get_connected_component : int -> Edges.t -> int option
  val in_same_connected_component : int -> int -> Edges.t -> bool
  val all_agents_where : (Agent.t -> bool) -> Edges.t -> IntCollection.t
  type path = ((Agent.t * int) * (Agent.t * int)) list
  val empty_path : Edges.path
  val singleton_path : Agent.t -> int -> Agent.t -> int -> Edges.path
  val rev_path : Edges.path -> Edges.path
  val print_path :
    ?sigs:Signature.s -> Format.formatter -> Edges.path -> unit
  val are_connected :
    ?max_distance:int ->
    Edges.t -> Agent.t list -> Agent.t list -> Edges.path option
  val species :
    Signature.s -> int -> Edges.t -> User_graph.connected_component
  val build_snapshot :
    Signature.s -> Edges.t -> (int * User_graph.connected_component) list
  val debug_print : Format.formatter -> Edges.t -> unit
end