You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.4 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
module F = Format
(* The definitions below taken from [Bou] "Efficient chaotic iteration strategies with widenings"
by François Bourdoncle.
*)
(**
A hierarchical ordering of a set is a well-parenthesized permutation of its elements without two
consecutive "(". I defines a total order <= over its elements.
The elements between two matching parentheses are called a Component.
The first element of a Component is called the head.
Let denote by H(v) the set of head of the nested components containing v.
*)
module Partition : sig
type 'node t = private
| Empty
| Node of {node: 'node; next: 'node t}
| Component of {head: 'node; rest: 'node t; next: 'node t}
val fold_nodes : ('node t, 'node, _) Container.fold
val fold_heads : ('node t, 'node, _) Container.fold
val expand : fold_right:('a, 'b, 'b t) Container.fold -> 'a t -> 'b t
(** Maps a partition nodes from ['a] to ['b] using the expansion [fold_right].
[fold_right] should not return its [~init] directly but must always provide
a non-empty sequence.
*)
val pp : pp_node:(F.formatter -> 'node -> unit) -> F.formatter -> 'node t -> unit
end
module type PreProcCfg = sig
module Node : sig
type t
type id
val id : t -> id
module IdMap : PrettyPrintable.PPMap with type key = id
end
type t
val fold_succs : t -> (Node.t, Node.t, 'accum) Container.fold
val start_node : t -> Node.t
end
(**
A weak topological ordering (WTO) of a directed graph is a hierarchical ordering of its vertices
such that for every edge u -> v,
u < v and v is not in H(u) (forward edge)
or
v <= u and v is in H(u) (feedback edge)
where H(u) is the set of heads of the nested components containing u.
A WTO of a directed graph is such that the head v of every feedback edge u -> v is the head of a
component containing its tail u.
*)
module type S = sig
module CFG : PreProcCfg
val make : CFG.t -> CFG.Node.t Partition.t
end
module type Make = functor (CFG : PreProcCfg) -> S with module CFG = CFG
(**
Implementation of Bourdoncle's "Hierarchical decomposition of a directed graph into strongly
connected components and subcomponents". See [Bou] Figure 4, page 10.
*)
module Bourdoncle_SCC : Make