let add_edge transitive graph i j =
let rec adapt k red =
let new_red =
S.fold (fun l acc ->
if k <> l then G.add_edge graph k l;
G.fold_succ (fun m acc' ->
if not (G.mem_edge graph k m)
then S.add m acc'
else acc'
) graph l acc
) red S.empty
in
if S.is_empty new_red then ()
else adapt k new_red
in
begin
debug "Adding edge from %d to %d" i j;
G.add_edge graph i j;
if transitive then begin
adapt i (S.singleton j);
G.iter_pred (fun k ->
if not (G.mem_edge graph k j) then
adapt k (S.singleton j)
) graph i
end
end