functor
  (G : G) (Opt : sig
                   val symmetric : bool
                   val unweighted : bool
                   val uniform_edge_weight : Diameter.G.W.t option
                 end->
  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 : Diameter.MakeGen.W.t
    module Queue :
      sig
        module V :
          sig
            type 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 = {
          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 : Diameter.MakeGen.Queue.t
    val bfs_distances :
      ?dist_array:Diameter.MakeGen.D.t option ->
      Diameter.G.t -> Diameter.MakeGen.D.key -> Diameter.MakeGen.D.t
    module Heap :
      sig
        module V :
          sig
            type 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 = { 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 : Diameter.MakeGen.Heap.t
    val dijkstra_distances :
      ?dist_array:Diameter.MakeGen.D.t option ->
      Diameter.G.t -> Diameter.MakeGen.D.key -> Diameter.MakeGen.D.t
    type sweep_info = {
      source : Diameter.G.vertex;
      ecc : Diameter.MakeGen.W.t;
      last : Diameter.G.vertex;
      ecc' : Diameter.MakeGen.W.t;
      last' : Diameter.G.vertex;
    }
    val dum_sweep :
      Diameter.G.vertex ->
      Diameter.MakeGen.W.t -> Diameter.MakeGen.sweep_info
    type estimate =
        Ecc
      | Ecc'
      | Ecc'Ecc
      | Dsum
      | Dsum'
      | Dmin
      | Dmin'
      | Dmax
      | Dmax'
    val str_of_estimate : Diameter.MakeGen.estimate -> string
    type extr =
        Min of Diameter.MakeGen.estimate
      | Max of Diameter.MakeGen.estimate
    val str_of_extr : Diameter.MakeGen.extr -> string
    val periodic_heuristic : 'a array -> int -> 'a
    val basic_period : Diameter.MakeGen.extr array
    val big_period : Diameter.MakeGen.extr array
    val full_period : Diameter.MakeGen.extr array
    val pseudo_sum_sweep : Diameter.MakeGen.extr array
    val maxmin_period_bizarre : Diameter.MakeGen.extr array
    val maxmin_period : Diameter.MakeGen.extr array
    val sum_sweep_period : Diameter.MakeGen.extr array
    val sum_sweep_debug : Diameter.MakeGen.extr array
    val sum_sweep_fun : int -> Diameter.MakeGen.extr
    val period : Diameter.MakeGen.extr array
    val periodic_heuristic_eriod : int -> Diameter.MakeGen.extr
    exception Break
    type diam_info = {
      diam_lb : Diameter.MakeGen.W.t;
      diam_ub : Diameter.MakeGen.W.t;
      diam_pair : Diameter.MakeGen.sweep_info;
      rev_diam_pair : Diameter.MakeGen.sweep_info;
      rad_lb : Diameter.MakeGen.W.t;
      rad_ub : Diameter.MakeGen.W.t;
      rad_center : Diameter.MakeGen.sweep_info;
      rev_rad_lb : Diameter.MakeGen.W.t;
      rev_rad_ub : Diameter.MakeGen.W.t;
      rev_rad_center : Diameter.MakeGen.sweep_info;
    }
    val diameter_radius_scc :
      ?diam_only:bool ->
      ?max_sweeps:int ->
      ?heuristic:(int -> Diameter.MakeGen.extr) ->
      Diameter.G.t -> Diameter.MakeGen.D.key -> Diameter.MakeGen.diam_info
  end