sig
  type ('id, 'v, 'e) t = {
    eq : 'id -> 'id -> bool;
    hash : 'id -> int;
    force : 'id -> ('id, 'v, 'e) LogtkLazyGraph.node;
  }
  and ('id, 'v, 'e) node = Empty | Node of 'id * 'v * ('e * 'id) Sequence.t
  and ('id, 'e) path = ('id * 'e * 'id) list
  val empty : ('id, 'v, 'e) LogtkLazyGraph.t
  val singleton :
    ?eq:('id -> 'id -> bool) ->
    ?hash:('id -> int) -> 'id -> '-> ('id, 'v, 'e) LogtkLazyGraph.t
  val make :
    ?eq:('id -> 'id -> bool) ->
    ?hash:('id -> int) ->
    ('id -> ('id, 'v, 'e) LogtkLazyGraph.node) ->
    ('id, 'v, 'e) LogtkLazyGraph.t
  val from_enum :
    ?eq:('id -> 'id -> bool) ->
    ?hash:('id -> int) ->
    vertices:('id * 'v) Sequence.t ->
    edges:('id * 'e * 'id) Sequence.t -> ('id, 'v, 'e) LogtkLazyGraph.t
  val from_list :
    ?eq:('id -> 'id -> bool) ->
    ?hash:('id -> int) ->
    ('id * 'e * 'id) list -> ('id, 'id, 'e) LogtkLazyGraph.t
  val from_fun :
    ?eq:('id -> 'id -> bool) ->
    ?hash:('id -> int) ->
    ('id -> ('v * ('e * 'id) list) option) -> ('id, 'v, 'e) LogtkLazyGraph.t
  type ('id, 'v, 'e) graph = ('id, 'v, 'e) LogtkLazyGraph.t
  module Mutable :
    sig
      type ('id, 'v, 'e) t
      val create :
        ?eq:('id -> 'id -> bool) ->
        ?hash:('id -> int) ->
        unit ->
        ('id, 'v, 'e) LogtkLazyGraph.Mutable.t *
        ('id, 'v, 'e) LogtkLazyGraph.graph
      val add_vertex :
        ('id, 'v, 'e) LogtkLazyGraph.Mutable.t -> 'id -> '-> unit
      val add_edge :
        ('id, 'v, 'e) LogtkLazyGraph.Mutable.t -> 'id -> '-> 'id -> unit
    end
  module Full :
    sig
      type ('id, 'v, 'e) traverse_event =
          EnterVertex of 'id * 'v * int * ('id, 'e) LogtkLazyGraph.path
        | ExitVertex of 'id
        | MeetEdge of 'id * 'e * 'id * LogtkLazyGraph.Full.edge_type
      and edge_type = EdgeForward | EdgeBackward | EdgeTransverse
      val bfs_full :
        ('id, 'v, 'e) LogtkLazyGraph.t ->
        'id Sequence.t ->
        ('id, 'v, 'e) LogtkLazyGraph.Full.traverse_event Sequence.t
      val dfs_full :
        ('id, 'v, 'e) LogtkLazyGraph.t ->
        'id Sequence.t ->
        ('id, 'v, 'e) LogtkLazyGraph.Full.traverse_event Sequence.t
    end
  val bfs :
    ('id, 'v, 'e) LogtkLazyGraph.t -> 'id -> ('id * 'v * int) Sequence.t
  val dfs :
    ('id, 'v, 'e) LogtkLazyGraph.t -> 'id -> ('id * 'v * int) Sequence.t
  module Heap :
    sig
      type 'a t
      val empty : cmp:('-> '-> int) -> 'LogtkLazyGraph.Heap.t
      val is_empty : 'LogtkLazyGraph.Heap.t -> bool
      val insert : 'LogtkLazyGraph.Heap.t -> '-> unit
      val pop : 'LogtkLazyGraph.Heap.t -> 'a
    end
  val a_star :
    ('id, 'v, 'e) LogtkLazyGraph.t ->
    ?on_explore:('id -> unit) ->
    ?ignore:('id -> bool) ->
    ?heuristic:('id -> float) ->
    ?distance:('id -> '-> 'id -> float) ->
    goal:('id -> bool) ->
    'id -> (float * ('id, 'e) LogtkLazyGraph.path) Sequence.t
  val dijkstra :
    ('id, 'v, 'e) LogtkLazyGraph.t ->
    ?on_explore:('id -> unit) ->
    ?ignore:('id -> bool) ->
    ?distance:('id -> '-> 'id -> float) ->
    'id -> 'id -> float * ('id, 'e) LogtkLazyGraph.path
  val is_dag : ('id, 'a, 'b) LogtkLazyGraph.t -> 'id -> bool
  val is_dag_full : ('id, 'a, 'b) LogtkLazyGraph.t -> 'id Sequence.t -> bool
  val find_cycle :
    ('id, 'a, 'e) LogtkLazyGraph.t -> 'id -> ('id, 'e) LogtkLazyGraph.path
  val rev_path :
    ('id, 'e) LogtkLazyGraph.path -> ('id, 'e) LogtkLazyGraph.path
  val union :
    ?combine:('-> '-> 'v) ->
    ('id, 'v, 'e) LogtkLazyGraph.t ->
    ('id, 'v, 'e) LogtkLazyGraph.t -> ('id, 'v, 'e) LogtkLazyGraph.t
  val map :
    vertices:('-> 'v2) ->
    edges:('-> 'e2) ->
    ('id, 'v, 'e) LogtkLazyGraph.t -> ('id, 'v2, 'e2) LogtkLazyGraph.t
  val flatMap :
    ('id -> 'id Sequence.t) ->
    ('id, 'v, 'e) LogtkLazyGraph.t -> ('id, 'v, 'e) LogtkLazyGraph.t
  val filter :
    ?vertices:('id -> '-> bool) ->
    ?edges:('id -> '-> 'id -> bool) ->
    ('id, 'v, 'e) LogtkLazyGraph.t -> ('id, 'v, 'e) LogtkLazyGraph.t
  val product :
    ('id1, 'v1, 'e1) LogtkLazyGraph.t ->
    ('id2, 'v2, 'e2) LogtkLazyGraph.t ->
    ('id1 * 'id2, 'v1 * 'v2, 'e1 * 'e2) LogtkLazyGraph.t
  module Infix :
    sig
      val ( ++ ) :
        ('id, 'v, 'e) LogtkLazyGraph.t ->
        ('id, 'v, 'e) LogtkLazyGraph.t -> ('id, 'v, 'e) LogtkLazyGraph.t
    end
  module Dot :
    sig
      type attribute =
          [ `Color of string
          | `Label of string
          | `Other of string * string
          | `Shape of string
          | `Style of string
          | `Weight of int ]
      val pp_enum :
        ?eq:('id -> 'id -> bool) ->
        ?hash:('id -> int) ->
        name:string ->
        Format.formatter ->
        ('id, LogtkLazyGraph.Dot.attribute list,
         LogtkLazyGraph.Dot.attribute list)
        LogtkLazyGraph.Full.traverse_event Sequence.t -> unit
      val pp :
        name:string ->
        ('id, LogtkLazyGraph.Dot.attribute list,
         LogtkLazyGraph.Dot.attribute list)
        LogtkLazyGraph.t -> Format.formatter -> 'id Sequence.t -> unit
    end
  val divisors_graph : (int, int, unit) LogtkLazyGraph.t
  val collatz_graph : (int, int, unit) LogtkLazyGraph.t
  val collatz_graph_bis : (int, int, bool) LogtkLazyGraph.t
  val heap_graph : (int, int, unit) LogtkLazyGraph.t
end