summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2023-06-21 06:29:16 +0200
committerTodd Gamblin <tgamblin@llnl.gov>2023-08-15 15:54:37 -0700
commitb7cc4bd247c6dacf1fd1f6076e8d6e92c7c916b5 (patch)
treecb92da3a80f106e0d3b620546692c1a56c282f8f /lib
parent22c95923e3ec876cb37317ce58ef895ef5ddf4ce (diff)
downloadspack-b7cc4bd247c6dacf1fd1f6076e8d6e92c7c916b5.tar.gz
spack-b7cc4bd247c6dacf1fd1f6076e8d6e92c7c916b5.tar.bz2
spack-b7cc4bd247c6dacf1fd1f6076e8d6e92c7c916b5.tar.xz
spack-b7cc4bd247c6dacf1fd1f6076e8d6e92c7c916b5.zip
Reduce the dependency types in a solve
Count the maximum number of nodes based on dependency types
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/asp.py29
1 files changed, 25 insertions, 4 deletions
diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py
index 1928b22150..56bf7b6a39 100644
--- a/lib/spack/spack/solver/asp.py
+++ b/lib/spack/spack/solver/asp.py
@@ -1123,8 +1123,6 @@ class SpackSolverSetup:
def pkg_rules(self, pkg, tests):
pkg = packagize(pkg)
- self.gen.fact(fn.max_nodes(pkg.name, 1))
-
# versions
self.pkg_version_rules(pkg)
self.gen.newline()
@@ -1321,6 +1319,8 @@ class SpackSolverSetup:
msg = "%s depends on %s" % (pkg.name, dep.spec.name)
if cond != spack.spec.Spec():
msg += " when %s" % cond
+ else:
+ pass
condition_id = self.condition(cond, dep.spec, pkg.name, msg)
self.gen.fact(
@@ -2227,9 +2227,24 @@ class SpackSolverSetup:
# get list of all possible dependencies
self.possible_virtuals = set(x.name for x in specs if x.virtual)
- possible = spack.package_base.possible_dependencies(
- *specs, virtuals=self.possible_virtuals, deptype=spack.dependency.all_deptypes
+
+ link_run_dependency_types = ("link", "run", "test")
+ dependency_types = spack.dependency.all_deptypes
+ if not self.tests:
+ link_run_dependency_types = ("link", "run")
+ dependency_types = ("link", "run", "build")
+
+ link_run = spack.package_base.possible_dependencies(
+ *specs, virtuals=self.possible_virtuals, deptype=link_run_dependency_types
+ )
+ direct_build = set()
+ for x in link_run:
+ current = spack.repo.path.get_pkg_class(x).dependencies_of_type("build")
+ direct_build.update(current)
+ total_build = spack.package_base.possible_dependencies(
+ *direct_build, virtuals=self.possible_virtuals, deptype=dependency_types
)
+ possible = set(link_run) | set(total_build)
# Fail if we already know an unreachable node is requested
for spec in specs:
@@ -2272,6 +2287,12 @@ class SpackSolverSetup:
for reusable_spec in reuse:
self._facts_from_concrete_spec(reusable_spec, possible)
+ self.gen.h1("Maximum number of nodes")
+ counter = collections.Counter(list(link_run) + list(total_build))
+ for pkg, count in sorted(counter.items()):
+ # FIXME (multiple nodes): should be count
+ self.gen.fact(fn.max_nodes(pkg, 1))
+
self.gen.h1("Possible flags on nodes")
for flag in spack.spec.FlagMap.valid_compiler_flags():
self.gen.fact(fn.flag_type(flag))