sig
  module type G =
    sig
      module V :
        sig
          type t = State.t
          val compare : t -> t -> int
          val hash : t -> int
          val equal : t -> t -> bool
          type label = State.t
          val create : label -> t
          val label : t -> label
        end
      module E :
        sig
          type t = State.t * State.t
          val compare : t -> t -> int
          type vertex = State.t
          val src : t -> vertex
          val dst : t -> vertex
          type label
          val create : vertex -> label -> vertex -> t
          val label : t -> label
        end
      type t
      val iter_vertex :
        (State_dependency_graph.G.V.t -> unit) ->
        State_dependency_graph.G.t -> unit
      val fold_vertex :
        (State_dependency_graph.G.V.t -> '-> 'a) ->
        State_dependency_graph.G.t -> '-> 'a
      val iter_edges_e :
        (State_dependency_graph.G.E.t -> unit) ->
        State_dependency_graph.G.t -> unit
      val fold_edges :
        (State_dependency_graph.G.V.t ->
         State_dependency_graph.G.V.t -> '-> 'a) ->
        State_dependency_graph.G.t -> '-> 'a
      val fold_edges_e :
        (State_dependency_graph.G.E.t -> '-> 'a) ->
        State_dependency_graph.G.t -> '-> 'a
      val iter_succ :
        (State_dependency_graph.G.V.t -> unit) ->
        State_dependency_graph.G.t -> State_dependency_graph.G.V.t -> unit
      val fold_succ :
        (State_dependency_graph.G.V.t -> '-> 'a) ->
        State_dependency_graph.G.t ->
        State_dependency_graph.G.V.t -> '-> 'a
      val fold_pred :
        (State_dependency_graph.G.V.t -> '-> 'a) ->
        State_dependency_graph.G.t ->
        State_dependency_graph.G.V.t -> '-> 'a
      val mem_vertex :
        State_dependency_graph.G.t -> State_dependency_graph.G.V.t -> bool
      val mem_edge_e :
        State_dependency_graph.G.t -> State_dependency_graph.G.E.t -> bool
      val in_degree :
        State_dependency_graph.G.t -> State_dependency_graph.G.V.t -> int
      val out_degree :
        State_dependency_graph.G.t -> State_dependency_graph.G.V.t -> int
      val nb_vertex : State_dependency_graph.G.t -> int
    end
  module type S =
    sig
      module G : G
      val graph : State_dependency_graph.G.t
      val add_dependencies : from:State.t -> State.t list -> unit
      val add_codependencies : onto:State.t -> State.t list -> unit
    end
  module type Attributes =
    sig
      val graph_attributes : '-> Graph.Graphviz.DotAttributes.graph list
      val default_vertex_attributes :
        '-> Graph.Graphviz.DotAttributes.vertex list
      val vertex_name : State.t -> string
      val vertex_attributes :
        State.t -> Graph.Graphviz.DotAttributes.vertex list
      val default_edge_attributes :
        '-> Graph.Graphviz.DotAttributes.edge list
      val edge_attributes :
        State.t * State.t -> Graph.Graphviz.DotAttributes.edge list
      val get_subgraph :
        State.t -> Graph.Graphviz.DotAttributes.subgraph option
    end
  module Dynamic :
    sig
      module G : G
      val graph : G.t
      val add_dependencies : from:State.t -> State.t list -> unit
      val add_codependencies : onto:State.t -> State.t list -> unit
      module Attributes : Attributes
      module Dot :
        functor (A : Attributes-> sig val dump : string -> unit end
      val dump : string -> unit
    end
  module Static :
    sig
      module G :
        sig
          module V :
            sig
              type t = State.t
              val compare : t -> t -> int
              val hash : t -> int
              val equal : t -> t -> bool
              type label = State.t
              val create : label -> t
              val label : t -> label
            end
          module E :
            sig
              type t = State.t * State.t
              val compare : t -> t -> int
              type vertex = State.t
              val src : t -> vertex
              val dst : t -> vertex
              type label
              val create : vertex -> label -> vertex -> t
              val label : t -> label
            end
          type t
          val iter_vertex : (V.t -> unit) -> t -> unit
          val fold_vertex : (V.t -> '-> 'a) -> t -> '-> 'a
          val iter_edges_e : (E.t -> unit) -> t -> unit
          val fold_edges : (V.t -> V.t -> '-> 'a) -> t -> '-> 'a
          val fold_edges_e : (E.t -> '-> 'a) -> t -> '-> 'a
          val iter_succ : (V.t -> unit) -> t -> V.t -> unit
          val fold_succ : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
          val fold_pred : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
          val mem_vertex : t -> V.t -> bool
          val mem_edge_e : t -> E.t -> bool
          val in_degree : t -> V.t -> int
          val out_degree : t -> V.t -> int
          val nb_vertex : t -> int
        end
      val graph : G.t
      val add_dependencies : from:State.t -> State.t list -> unit
      val add_codependencies : onto:State.t -> State.t list -> unit
      type t
      val create : unit -> t
      val clear : t -> unit
      val get : unit -> t
      val set : t -> unit
      val clear_some_projects : (Project_skeleton.t -> bool) -> t -> bool
      val add_state : State.t -> State.t list -> unit
    end
  module Static_datatype :
    sig
      type t = Static.t
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
    end
  module Remove_useless_states :
    functor (G : Graph.Sig.P->
      functor
        (X : sig val kind : State_dependency_graph.G.V.t -> State.kind end->
        sig
          val get : State_dependency_graph.G.t -> State_dependency_graph.G.t
        end
  val add_state_like_the_others : State.t list -> State.t -> unit
  module Vertices : State.Local
  module Vertices_datatype :
    sig
      type t = Vertices.t
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
    end
  module Make_dynamic :
    functor (T : sig val name : string end->
      sig
        type t
        val create : unit -> t
        val clear : t -> unit
        val get : unit -> t
        val set : t -> unit
        val clear_some_projects : (Project_skeleton.t -> bool) -> t -> bool
        module Datatype :
          sig
            type t = t
            val ty : t Type.t
            val name : string
            val descr : t Descr.t
            val packed_descr : Structural_descr.pack
            val reprs : t list
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val hash : t -> int
            val pretty_code : Format.formatter -> t -> unit
            val internal_pretty_code :
              Type.precedence -> Format.formatter -> t -> unit
            val pretty : Format.formatter -> t -> unit
            val varname : t -> string
            val mem_project : (Project_skeleton.t -> bool) -> t -> bool
            val copy : t -> t
          end
        val add_state : State.t -> State.t list -> unit
        val remove_state : State.t -> unit
        val real_clear : unit -> unit
      end
end