sig
  module type G =
    sig
      type t
      module V :
        sig
          type t
          type label
          val label : DGraphSubTree.G.V.t -> DGraphSubTree.G.V.label
          val hash : DGraphSubTree.G.V.t -> int
          val equal : DGraphSubTree.G.V.t -> DGraphSubTree.G.V.t -> bool
        end
      module E : sig type t end
      val iter_succ :
        (DGraphSubTree.G.V.t -> unit) ->
        DGraphSubTree.G.t -> DGraphSubTree.G.V.t -> unit
      val iter_pred :
        (DGraphSubTree.G.V.t -> unit) ->
        DGraphSubTree.G.t -> DGraphSubTree.G.V.t -> unit
      val find_edge :
        DGraphSubTree.G.t ->
        DGraphSubTree.G.V.t -> DGraphSubTree.G.V.t -> DGraphSubTree.G.E.t
    end
  module type Tree =
    sig
      type t
      module V :
        sig
          type t
          type label
          val create : DGraphSubTree.Tree.V.label -> DGraphSubTree.Tree.V.t
          val label : DGraphSubTree.Tree.V.t -> DGraphSubTree.Tree.V.label
          val hash : DGraphSubTree.Tree.V.t -> int
          val equal :
            DGraphSubTree.Tree.V.t -> DGraphSubTree.Tree.V.t -> bool
        end
      module E :
        sig
          type t
          val compare : t -> t -> int
          type vertex = V.t
          val src : t -> vertex
          val dst : t -> vertex
          type label
          val create : vertex -> label -> vertex -> t
          val label : t -> label
        end
      val create : ?size:int -> unit -> DGraphSubTree.Tree.t
      val add_vertex : DGraphSubTree.Tree.t -> DGraphSubTree.Tree.V.t -> unit
      val add_edge_e : DGraphSubTree.Tree.t -> DGraphSubTree.Tree.E.t -> unit
    end
  module type S =
    sig
      module Tree :
        sig
          type t
          module V :
            sig
              type t
              type label
              val create : label -> t
              val label : t -> label
              val hash : t -> int
              val equal : t -> t -> bool
            end
          module E :
            sig
              type t
              val compare : t -> t -> int
              type vertex = V.t
              val src : t -> vertex
              val dst : t -> vertex
              type label = unit
              val create : vertex -> label -> vertex -> t
              val label : t -> label
            end
          val create : ?size:int -> unit -> t
          val add_vertex : t -> V.t -> unit
          val add_edge_e : t -> E.t -> unit
        end
      type t
      val get_structure : DGraphSubTree.S.t -> DGraphSubTree.S.Tree.t
      val get_root : DGraphSubTree.S.t -> DGraphSubTree.S.Tree.V.t
      val get_tree_vertices :
        DGraphSubTree.S.Tree.V.label ->
        DGraphSubTree.S.t -> DGraphSubTree.S.Tree.V.t list
      val is_ghost_node :
        DGraphSubTree.S.Tree.V.t -> DGraphSubTree.S.t -> bool
      val is_ghost_edge :
        DGraphSubTree.S.Tree.E.t -> DGraphSubTree.S.t -> bool
      exception Ghost_node
      val get_graph_vertex :
        DGraphSubTree.S.Tree.V.t ->
        DGraphSubTree.S.t -> DGraphSubTree.S.Tree.V.label
    end
  module Make :
    functor
      (G : G) (Tree : sig
                        type t
                        module V :
                          sig
                            type t
                            type label = G.V.t
                            val create : label -> t
                            val label : t -> label
                            val hash : t -> int
                            val equal : t -> t -> bool
                          end
                        module E :
                          sig
                            type t
                            val compare : t -> t -> int
                            type vertex = V.t
                            val src : t -> vertex
                            val dst : t -> vertex
                            type label = unit
                            val create : vertex -> label -> vertex -> t
                            val label : t -> label
                          end
                        val create : ?size:int -> unit -> t
                        val add_vertex : t -> V.t -> unit
                        val add_edge_e : t -> E.t -> unit
                      end->
      sig
        module Tree :
          sig
            type t = Tree.t
            module V :
              sig
                type t = Tree.V.t
                type label = G.V.t
                val create : label -> t
                val label : t -> label
                val hash : t -> int
                val equal : t -> t -> bool
              end
            module E :
              sig
                type t = Tree.E.t
                val compare : t -> t -> int
                type vertex = V.t
                val src : t -> vertex
                val dst : t -> vertex
                type label = unit
                val create : vertex -> label -> vertex -> t
                val label : t -> label
              end
            val create : ?size:int -> unit -> t
            val add_vertex : t -> V.t -> unit
            val add_edge_e : t -> E.t -> unit
          end
        type t
        val get_structure : t -> Tree.t
        val get_root : t -> Tree.V.t
        val get_tree_vertices : Tree.V.label -> t -> Tree.V.t list
        val is_ghost_node : Tree.V.t -> t -> bool
        val is_ghost_edge : Tree.E.t -> t -> bool
        exception Ghost_node
        val get_graph_vertex : Tree.V.t -> t -> Tree.V.label
        val make :
          DGraphSubTree.G.t -> DGraphSubTree.G.V.t -> int -> int -> t
      end
  module Make_from_dot_model :
    functor
      (Tree : sig
                type t
                module V :
                  sig
                    type t
                    type label = DGraphModel.DotG.V.t
                    val create : label -> t
                    val label : t -> label
                    val hash : t -> int
                    val equal : t -> t -> bool
                  end
                module E :
                  sig
                    type t
                    val compare : t -> t -> int
                    type vertex = V.t
                    val src : t -> vertex
                    val dst : t -> vertex
                    type label = unit
                    val create : vertex -> label -> vertex -> t
                    val label : t -> label
                  end
                val create : ?size:int -> unit -> t
                val add_vertex : t -> V.t -> unit
                val add_edge_e : t -> E.t -> unit
              end->
      sig
        module Tree :
          sig
            type t = Tree.t
            module V :
              sig
                type t = Tree.V.t
                type label = DGraphModel.DotG.V.t
                val create : label -> t
                val label : t -> label
                val hash : t -> int
                val equal : t -> t -> bool
              end
            module E :
              sig
                type t = Tree.E.t
                val compare : t -> t -> int
                type vertex = V.t
                val src : t -> vertex
                val dst : t -> vertex
                type label = unit
                val create : vertex -> label -> vertex -> t
                val label : t -> label
              end
            val create : ?size:int -> unit -> t
            val add_vertex : t -> V.t -> unit
            val add_edge_e : t -> E.t -> unit
          end
        type t
        val get_structure : t -> Tree.t
        val get_root : t -> Tree.V.t
        val get_tree_vertices : Tree.V.label -> t -> Tree.V.t list
        val is_ghost_node : Tree.V.t -> t -> bool
        val is_ghost_edge : Tree.E.t -> t -> bool
        exception Ghost_node
        val get_graph_vertex : Tree.V.t -> t -> Tree.V.label
        val make :
          (DGraphSubTree.Tree.V.label, DGraphModel.DotG.E.t, string)
          DGraphModel.abstract_model ->
          DGraphSubTree.Tree.V.label -> int -> int -> t
      end
end