let add_edge ?transitive graph i j =
let rec adapt g k red =
let new_red =
S.fold (fun l acc ->
if not(G.V.equal k l) then G.add_edge g k l;
G.fold_succ (fun m acc' ->
if not (G.mem_edge g k m) then S.add m acc'
else acc'
) g l acc
) red S.empty
in
if S.is_empty new_red then ()
else adapt g k new_red
in
let insert g i j =
adapt g i (S.singleton j);
G.iter_pred (fun k ->
if not (G.mem_edge g k j) then
adapt g k (S.singleton j)
) g i
in
match transitive with
|None -> G.add_edge graph i j
|Some true ->
insert graph i j
|Some false ->
G.add_edge graph i j