let dependency_closure_cache ?(maxdepth=max_int) ?(conjunctive=false) pool idlist =
let cudfpool = strip_cudf_pool pool in
let queue = Queue.create () in
let visited = Hashtbl.create (2 * (List.length idlist)) in
List.iter (fun e -> Queue.add (e,0) queue) (CudfAdd.normalize_set idlist);
while (Queue.length queue > 0) do
let (id,level) = Queue.take queue in
if not(Hashtbl.mem visited id) && level < maxdepth then begin
Hashtbl.add visited id ();
let (l,_) = cudfpool.(id) in
List.iter (function
|(_,[i]) when conjunctive = true ->
if not(Hashtbl.mem visited i) then
Queue.add (i,level+1) queue
|(_,dsj) when conjunctive = false ->
List.iter (fun i ->
if not(Hashtbl.mem visited i) then
if not(Hashtbl.mem visited i) then
Queue.add (i,level+1) queue
) dsj
|_ -> ()
) l
end
done;
Hashtbl.fold (fun k _ l -> k::l) visited []