summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-05-06 21:39:30 +0200
committerGitHub <noreply@github.com>2021-05-06 12:39:30 -0700
commit4402f89e390cd449fb0341edc270c078f1ea015f (patch)
treeae8456d2127977741fe9732a85aecfa2e8527ab6 /lib
parentf83ec4d46f1e87d7fad392a2d85dd5af362b5742 (diff)
downloadspack-4402f89e390cd449fb0341edc270c078f1ea015f.tar.gz
spack-4402f89e390cd449fb0341edc270c078f1ea015f.tar.bz2
spack-4402f89e390cd449fb0341edc270c078f1ea015f.tar.xz
spack-4402f89e390cd449fb0341edc270c078f1ea015f.zip
ASP-based solver: minimize mismatch of targets (#23462)
Like compilers targets now try to minimize mismatches, instead of maximizing matches. Deduction of mismatches is reworked to be the opposite of a match, since computing that is faster.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/concretize.lp51
1 files changed, 19 insertions, 32 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 64fee0f220..4fe8f64761 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -535,29 +535,19 @@ node_target_weight(Package, Weight)
node_target(Package, Target),
target_weight(Target, Package, Weight).
-% compatibility rules for targets among nodes
-node_target_match_pref(Dependency, Target)
- :- depends_on(Package, Dependency),
- node_target_match_pref(Package, Target),
- not node_target_set(Dependency, _).
-
-node_target_match_pref(Dependency, Target)
- :- depends_on(Package, Dependency),
- node_target_set(Package, Target),
- not node_target_match_pref(Package, Target),
- not node_target_set(Dependency, _).
-
-node_target_match_pref(Dependency, Target)
- :- depends_on(Package, Dependency),
- root(Package), node_target(Package, Target),
- not node_target_match_pref(Package, _).
-
-node_target_match(Package, 1)
- :- node_target(Package, Target), node_target_match_pref(Package, Target).
-
derive_target_from_parent(Parent, Package)
- :- depends_on(Parent, Package), not package_target_weight(_, Package, _).
+ :- depends_on(Parent, Package),
+ not package_target_weight(_, Package, _).
+
+% compatibility rules for targets among nodes
+node_target_match(Parent, Dependency)
+ :- depends_on(Parent, Dependency),
+ node_target(Parent, Target),
+ node_target(Dependency, Target).
+node_target_mismatch(Parent, Dependency)
+ :- depends_on(Parent, Dependency),
+ not node_target_match(Parent, Dependency).
#defined node_target_set/2.
#defined package_target_weight/3.
@@ -605,17 +595,14 @@ node_compiler_version(Package, Compiler, Version) :- node_compiler_version_set(P
% If a package and one of its dependencies don't have the
% same compiler there's a mismatch.
-compiler_mismatch(Package, Dependency)
+compiler_match(Package, Dependency)
:- depends_on(Package, Dependency),
- node_compiler_version(Package, Compiler1, _),
- node_compiler_version(Dependency, Compiler2, _),
- Compiler1 != Compiler2.
+ node_compiler_version(Package, Compiler, Version),
+ node_compiler_version(Dependency, Compiler, Version).
compiler_mismatch(Package, Dependency)
:- depends_on(Package, Dependency),
- node_compiler_version(Package, Compiler, Version1),
- node_compiler_version(Dependency, Compiler, Version2),
- Version1 != Version2.
+ not compiler_match(Package, Dependency).
#defined node_compiler_set/2.
#defined node_compiler_version_set/3.
@@ -754,7 +741,7 @@ opt_criterion(8, "count of non-root multi-valued variants").
#minimize{ 0@8 : #true }.
#maximize {
1@8,Package,Variant,Value
- : variant_not_default(Package, Variant, Value, Weight),
+ : variant_not_default(Package, Variant, Value, _),
not variant_single_value(Package, Variant),
not root(Package)
}.
@@ -776,11 +763,11 @@ opt_criterion(5, "non-preferred compilers").
#minimize{ 0@5 : #true }.
#minimize{ Weight@5,Package : compiler_weight(Package, Weight) }.
-% Maximize the number of matches for targets in the DAG, try
+% Minimize the number of mismatches for targets in the DAG, try
% to select the preferred target.
-opt_criterion(4, "target matches").
+opt_criterion(4, "target mismatches").
#minimize{ 0@4 : #true }.
-#maximize{ Weight@4,Package : node_target_match(Package, Weight) }.
+#minimize{ 1@4,Package,Dependency : node_target_mismatch(Package, Dependency) }.
opt_criterion(3, "non-preferred targets").
#minimize{ 0@3 : #true }.