sig
  type 'a priority =
    'a SHGraph.priority =
      Filter of ('a -> bool)
    | Priority of ('a -> int)
  type ('a, 'b) compare =
    ('a, 'b) SHGraph.compare = {
    hashv : 'a Hashhe.compare;
    hashh : 'b Hashhe.compare;
    comparev : 'a -> 'a -> int;
    compareh : 'b -> 'b -> int;
  }
  type ('a, 'b, 'c, 'd, 'e) t = {
    compare : ('a, 'b) PSHGraph.compare;
    mutable graph : ('a, 'b, 'c, 'd, 'e) SHGraph.t;
  }
  val stdcompare : ('a, 'b) PSHGraph.compare
  val make :
    ('a, 'b) PSHGraph.compare ->
    ('a, 'b, 'c, 'd, 'e) SHGraph.t -> ('a, 'b, 'c, 'd, 'e) PSHGraph.t
  val create_compare :
    ('a, 'b) PSHGraph.compare -> int -> 'c -> ('a, 'b, 'd, 'e, 'c) PSHGraph.t
  val create :
    ('a, 'b) PSHGraph.compare -> int -> 'c -> ('a, 'b, 'd, 'e, 'c) PSHGraph.t
  val clear : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> unit
  val size_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> int
  val size_hedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> int
  val size_edgevh : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> int
  val size_edgehv : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> int
  val size : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> int * int * int * int
  val attrvertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'c
  val attrhedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'd
  val info : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'e
  val is_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> bool
  val is_hedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> bool
  val is_empty : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> bool
  val succhedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'b PSette.t
  val predhedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'b PSette.t
  val succvertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'a array
  val predvertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'a array
  val succ_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'a PSette.t
  val pred_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'a PSette.t
  val add_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'c -> unit
  val add_hedge :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    'b -> 'd -> pred:'a array -> succ:'a array -> unit
  val replace_attrvertex :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> 'c -> unit
  val replace_attrhedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'd -> unit
  val remove_hedge : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'b -> unit
  val remove_vertex : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a -> unit
  val iter_vertex :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    ('a -> 'c -> pred:'b PSette.t -> succ:'b PSette.t -> unit) -> unit
  val fold_vertex :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    ('a -> 'c -> pred:'b PSette.t -> succ:'b PSette.t -> 'f -> 'f) ->
    'f -> 'f
  val iter_hedge :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    ('b -> 'd -> pred:'a array -> succ:'a array -> unit) -> unit
  val fold_hedge :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    ('b -> 'd -> pred:'a array -> succ:'a array -> 'f -> 'f) -> 'f -> 'f
  val map :
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    ('a -> 'c -> 'f) ->
    ('b -> 'd -> 'g) -> ('e -> 'h) -> ('a, 'b, 'f, 'g, 'h) PSHGraph.t
  val copy :
    ('a -> 'b -> 'c) ->
    ('d -> 'e -> 'f) ->
    ('g -> 'h) ->
    ('a, 'd, 'b, 'e, 'g) PSHGraph.t -> ('a, 'd, 'c, 'f, 'h) PSHGraph.t
  val transpose :
    ('a -> 'b -> 'c) ->
    ('d -> 'e -> 'f) ->
    ('g -> 'h) ->
    ('a, 'd, 'b, 'e, 'g) PSHGraph.t -> ('a, 'd, 'c, 'f, 'h) PSHGraph.t
  val topological_sort :
    ?priority:'a PSHGraph.priority ->
    ('b, 'a, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'b list
  val topological_sort_multi :
    'a ->
    'b ->
    ?priority:'b PSHGraph.priority ->
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a PSette.t -> 'a list
  val reachable :
    ?filter:('a -> bool) ->
    ('b, 'a, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'b PSette.t * 'a PSette.t
  val reachable_multi :
    'a ->
    'b ->
    ?filter:('b -> bool) ->
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t ->
    'a PSette.t -> 'a PSette.t * 'b PSette.t
  val cfc :
    ?priority:'a PSHGraph.priority ->
    ('b, 'a, 'c, 'd, 'e) PSHGraph.t -> 'b -> 'b list list
  val cfc_multi :
    'a ->
    'b ->
    ?priority:'b PSHGraph.priority ->
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a PSette.t -> 'a list list
  val scfc :
    ?priority:'a PSHGraph.priority ->
    ('b, 'a, 'c, 'd, 'e) PSHGraph.t -> 'b -> (unit, 'b) Ilist.t
  val scfc_multi :
    'a ->
    'b ->
    ?priority:'b PSHGraph.priority ->
    ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a PSette.t -> (unit, 'a) Ilist.t
  val print :
    (Format.formatter -> 'a -> unit) ->
    (Format.formatter -> 'b -> unit) ->
    (Format.formatter -> 'c -> unit) ->
    (Format.formatter -> 'd -> unit) ->
    (Format.formatter -> 'e -> unit) ->
    Format.formatter -> ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> unit
  val print_dot :
    ?style:string ->
    ?titlestyle:string ->
    ?vertexstyle:string ->
    ?hedgestyle:string ->
    ?fvertexstyle:('a -> string) ->
    ?fhedgestyle:('b -> string) ->
    ?title:string ->
    (Format.formatter -> 'a -> unit) ->
    (Format.formatter -> 'b -> unit) ->
    (Format.formatter -> 'a -> 'c -> unit) ->
    (Format.formatter -> 'b -> 'd -> unit) ->
    Format.formatter -> ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> unit
  val min : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a PSette.t
  val max : ('a, 'b, 'c, 'd, 'e) PSHGraph.t -> 'a PSette.t
end