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 []