My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Deduplicate DAG nodes by (pkg, universe) instead of layer hash

Check (pkg_string, universe_string) before computing the expensive
layer_hash. Universe comparison is cheap (hash of dep name.version
strings), while layer_hash reads opam file contents. For 17k
solutions with heavy overlap, most nodes are already seen and
skip the hash computation entirely.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+17 -12
+17 -12
day11/build/dag.ml
··· 1 1 open Day11_layer.Layer_type 2 2 3 3 let build_dag cache ~base_hash solutions = 4 - let seen : (string, build) Hashtbl.t = Hashtbl.create 256 in 4 + let seen : (string * string, build) Hashtbl.t = Hashtbl.create 256 in 5 5 List.iter (fun (_target, solution) -> 6 - let topo = Day11_graph.Graph.topological_sort solution in 7 6 let trans = Day11_graph.Graph.transitive_deps solution in 7 + let topo = Day11_graph.Graph.topological_sort solution in 8 8 List.iter (fun pkg -> 9 9 let pkg_deps = 10 10 match OpamPackage.Map.find_opt pkg trans with 11 11 | Some s -> OpamPackage.Set.elements s 12 12 | None -> [] 13 13 in 14 - let all_pkgs = pkg :: pkg_deps in 15 - let hash = Hash_cache.layer_hash cache ~base_hash all_pkgs in 16 - if not (Hashtbl.mem seen hash) then begin 14 + let universe = 15 + Day11_graph.Universe.of_deps 16 + (OpamPackage.Set.of_list pkg_deps) in 17 + let key = (OpamPackage.to_string pkg, 18 + Day11_graph.Universe.to_string universe) in 19 + if not (Hashtbl.mem seen key) then begin 20 + let all_pkgs = pkg :: pkg_deps in 21 + let hash = Hash_cache.layer_hash cache ~base_hash all_pkgs in 17 22 let direct_deps = 18 23 match OpamPackage.Map.find_opt pkg solution with 19 24 | Some s -> OpamPackage.Set.elements s ··· 25 30 | Some s -> OpamPackage.Set.elements s 26 31 | None -> [] 27 32 in 28 - let dep_hash = Hash_cache.layer_hash cache ~base_hash 29 - (dep :: dep_deps) in 30 - Hashtbl.find_opt seen dep_hash 33 + let dep_universe = 34 + Day11_graph.Universe.of_deps 35 + (OpamPackage.Set.of_list dep_deps) in 36 + let dep_key = (OpamPackage.to_string dep, 37 + Day11_graph.Universe.to_string dep_universe) in 38 + Hashtbl.find_opt seen dep_key 31 39 ) direct_deps in 32 - let universe = 33 - Day11_graph.Universe.of_deps 34 - (OpamPackage.Set.of_list pkg_deps) in 35 40 let node : build = { hash; pkg; deps; universe } in 36 - Hashtbl.replace seen hash node 41 + Hashtbl.replace seen key node 37 42 end 38 43 ) topo 39 44 ) solutions;