let dependency_graph univ =
let timer = Util.Timer.create "SyntacticDependencyGraph.dependency_graph" in
Util.Timer.start timer;
let conflicts = CudfAdd.init_conflicts univ in
Util.Progress.set_total depgraphbar (Cudf.universe_size univ);
let gr = G.create () in
Cudf.iter_packages (fun pkg ->
Util.Progress.progress depgraphbar;
let vpid = G.V.create (PkgV.Pkg pkg) in
let c = ref 0 in
List.iter (fun vpkgs ->
match CudfAdd.resolve_deps univ vpkgs with
|[] -> ()
|[p] ->
let vp = G.V.create (PkgV.Pkg p) in
let edge = G.E.create vpid PkgE.DirDepends vp in
G.add_edge_e gr edge
|l ->
begin
let vor = G.V.create (PkgV.Or (pkg,!c)) in
let edgeor = G.E.create vpid PkgE.OrDepends vor in
G.add_edge_e gr edgeor;
incr c;
List.iter (fun p ->
let vp = G.V.create (PkgV.Pkg p) in
let oredge = G.E.create vor PkgE.OrDepends vp in
G.add_edge_e gr oredge
) l
end
) pkg.Cudf.depends
;
List.iter (fun p ->
if not(CudfAdd.equal p pkg) then
let vp = G.V.create (PkgV.Pkg p) in
let edge = G.E.create vpid PkgE.Conflict vp in
G.add_edge_e gr edge
) (CudfAdd.who_conflicts conflicts univ pkg)
) univ
;
Util.Timer.stop timer gr