Note:

You are viewing a development version of the library. Goto the latest version.

let transitive_closure t =
  let size = Array.length t.vertexes in
  let visited = Array.make size false in

  let rec visit set v =
    if not visited.(v) then
      begin
        (* The set of outgoing edges is not complete *)
        let current_set = snd t.vertexes.(v) in
        let set' =
          SetInt.fold
            (fun v set' -> visit set' v)
            !current_set !current_set
        in
          visited.(v) <- true;
          current_set := set';
          SetInt.union set set'
      end
    else
      begin
        (* The set is complete *)
        SetInt.union set !(snd t.vertexes.(v))
      end
  in

    for v = 0 to size - 1 do
      let _set : SetInt.t = visit SetInt.empty v in
        ()
    done