functor (G : G->
  sig
    module W :
      sig
        type t = G.label
        val zero : t
        val infinity : t
        val compare : t -> t -> int
        val add : t -> t -> t
        val to_string : t -> string
        val max : t -> t -> t
        val min : t -> t -> t
      end
    module D :
      sig
        type t = G.WT.t
        type key = G.vertex
        type value = G.label
        val create : int -> t
        val set : t -> key -> value -> unit
        val get : t -> key -> value
      end
    val no_dist : W.t
    module Queue :
      sig
        module V :
          sig
            type t = MakeGen(G)(NoOpt).Queue.V.t
            type elt = G.vertex
            val make : ?size:int -> unit -> t
            val set : t -> int -> elt -> unit
            val get : t -> int -> elt
            val clear : t -> unit
            val index_max : t -> int
            val length : t -> int
            val capacity : t -> int
            val blit : t -> int -> t -> int -> int -> unit
            val default : unit -> elt
          end
        type t =
          MakeGen(G)(NoOpt).Queue.t = {
          mutable v : V.t;
          mutable front : int;
          mutable back : int;
        }
        type elt = V.elt
        val create : ?size:int -> unit -> t
        val is_empty : t -> bool
        val clear : t -> unit
        val add : t -> V.elt -> unit
        val peek : t -> V.elt
        val compact : t -> unit
        val pop : t -> V.elt
        val size : t -> int
      end
    val q : Queue.t
    val bfs_distances : ?dist_array:D.t option -> G.t -> D.key -> D.t
    module Heap :
      sig
        module V :
          sig
            type t = MakeGen(G)(NoOpt).Heap.V.t
            type elt = G.vertex * W.t
            val make : ?size:int -> unit -> t
            val set : t -> int -> elt -> unit
            val get : t -> int -> elt
            val clear : t -> unit
            val index_max : t -> int
            val length : t -> int
            val capacity : t -> int
            val blit : t -> int -> t -> int -> int -> unit
            val default : unit -> elt
          end
        type t =
          MakeGen(G)(NoOpt).Heap.t = {
          mutable v : V.t;
          mutable back : int;
        }
        type elt = V.elt
        val create : ?size:int -> unit -> t
        val is_empty : t -> bool
        val clear : t -> unit
        val add : t -> V.elt -> unit
        val push : t -> V.elt -> unit
        val peek_min : t -> V.elt
        val pop_min : t -> V.elt
        val size : t -> int
      end
    val h : Heap.t
    val dijkstra_distances : ?dist_array:D.t option -> G.t -> D.key -> D.t
    type sweep_info =
      MakeGen(G)(NoOpt).sweep_info = {
      source : G.vertex;
      ecc : W.t;
      last : G.vertex;
      ecc' : W.t;
      last' : G.vertex;
    }
    val dum_sweep : G.vertex -> W.t -> sweep_info
    type estimate =
      MakeGen(G)(NoOpt).estimate =
        Ecc
      | Ecc'
      | Ecc'Ecc
      | Dsum
      | Dsum'
      | Dmin
      | Dmin'
      | Dmax
      | Dmax'
    val str_of_estimate : estimate -> string
    type extr = MakeGen(G)(NoOpt).extr = Min of estimate | Max of estimate
    val str_of_extr : extr -> string
    val periodic_heuristic : 'a array -> int -> 'a
    val basic_period : extr array
    val big_period : extr array
    val full_period : extr array
    val pseudo_sum_sweep : extr array
    val maxmin_period_bizarre : extr array
    val maxmin_period : extr array
    val sum_sweep_period : extr array
    val sum_sweep_debug : extr array
    val sum_sweep_fun : int -> extr
    val period : extr array
    val periodic_heuristic_eriod : int -> extr
    exception Break
    type diam_info =
      MakeGen(G)(NoOpt).diam_info = {
      diam_lb : W.t;
      diam_ub : W.t;
      diam_pair : sweep_info;
      rev_diam_pair : sweep_info;
      rad_lb : W.t;
      rad_ub : W.t;
      rad_center : sweep_info;
      rev_rad_lb : W.t;
      rev_rad_ub : W.t;
      rev_rad_center : sweep_info;
    }
    val diameter_radius_scc :
      ?diam_only:bool ->
      ?max_sweeps:int ->
      ?heuristic:(int -> extr) -> G.t -> D.key -> diam_info
  end