From 20e698c6b0ac068cd1c33e3c1d8baebfb8a10537 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 2 Jan 2023 00:34:32 -0800 Subject: [PATCH] concretizer: add depth calculation --- lib/spack/spack/solver/concretize.lp | 27 +++++++++++++++++++++++++++ lib/spack/spack/solver/display.lp | 1 + 2 files changed, 28 insertions(+) diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 059bb5eb630..fc3c72d978a 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -1106,6 +1106,33 @@ build_priority(Package, 0) :- attr("node", Package), not optimize_for_reuse(). #defined installed_hash/2. +%----------------------------------------------------------------------------- +% Calculate min depth of nodes in the DAG +% We use this to optimize nodes closer to roots with higher precedence. +%----------------------------------------------------------------------------- +#const max_depth = 10. + +% roots have depth 0 +depth(Package, 0) :- attr("root", Package). + +% possible optimization +% adding this to the minimization below doesn't seem to help. +%possible_dependency(Dependent, Package) :- dependency_condition(_, Dependent, Package). +%possible_dependency(Dependent, Package) :- +% dependency_condition(_, Dependent, Virtual), possible_provider(Package, Virtual). + +% other nodes' depth is the minimum depth of any dependent plus one. +depth(Package, N+1) :- + N = #min{ + D: depends_on(Dependent, Package), + depth(Dependent, D), + 0 <= D, + D < max_depth + }, + 0 <= N, + N <= max_depth, + attr("node", Package). + %----------------------------------------------------------------- % Optimization to avoid errors %----------------------------------------------------------------- diff --git a/lib/spack/spack/solver/display.lp b/lib/spack/spack/solver/display.lp index 6e1cf6391ae..1f308f03648 100644 --- a/lib/spack/spack/solver/display.lp +++ b/lib/spack/spack/solver/display.lp @@ -26,3 +26,4 @@ #show error/7. % debug +#show depth/2.