sig
  module type G =
    sig
      val is_directed : bool
      type t
      val nb_vertex : Coloring.G.t -> int
      module V : Sig.COMPARABLE
      val out_degree : Coloring.G.t -> V.t -> int
      val iter_vertex : (V.t -> unit) -> Coloring.G.t -> unit
      val fold_vertex : (V.t -> '-> 'a) -> Coloring.G.t -> '-> 'a
      val iter_succ : (V.t -> unit) -> Coloring.G.t -> V.t -> unit
      val fold_succ : (V.t -> '-> 'a) -> Coloring.G.t -> V.t -> '-> 'a
    end
  module Make :
    functor (G : G->
      sig
        module H :
          sig
            type key = G.V.t
            type 'a t
            val create : int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val iter : (key -> '-> unit) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val length : 'a t -> int
            val stats : 'a t -> Hashtbl.statistics
          end
        val coloring : Coloring.G.t -> int -> int Coloring.Make.H.t
      end
  module type GM =
    sig
      val is_directed : bool
      type t
      val nb_vertex : Coloring.GM.t -> int
      module V : Sig.COMPARABLE
      val out_degree : Coloring.GM.t -> V.t -> int
      val iter_vertex : (V.t -> unit) -> Coloring.GM.t -> unit
      val fold_vertex : (V.t -> '-> 'a) -> Coloring.GM.t -> '-> 'a
      val iter_succ : (V.t -> unit) -> Coloring.GM.t -> V.t -> unit
      val fold_succ : (V.t -> '-> 'a) -> Coloring.GM.t -> V.t -> '-> 'a
      module Mark : sig val get : V.t -> int val set : V.t -> int -> unit end
    end
  module Mark :
    functor (G : GM->
      sig exception NoColoring val coloring : Coloring.G.t -> int -> unit end
end