summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2023-11-28 16:28:54 +0100
committerGitHub <noreply@github.com>2023-11-28 16:28:54 +0100
commit0e65e84768949b6e989036bbc17a2db5b4b62a4c (patch)
tree818804f18e7bb5a71feb3d5685038fc3eec7150e /lib
parente0da7154ad33a4573f91ab4068239b5a6cd1a549 (diff)
downloadspack-0e65e84768949b6e989036bbc17a2db5b4b62a4c.tar.gz
spack-0e65e84768949b6e989036bbc17a2db5b4b62a4c.tar.bz2
spack-0e65e84768949b6e989036bbc17a2db5b4b62a4c.tar.xz
spack-0e65e84768949b6e989036bbc17a2db5b4b62a4c.zip
ASP-based solver: use a unique ID counter (#41290)
* solver: use a unique counter for condition, triggers and effects * Do not reset counters when re-running setup What we need is just a unique ID, it doesn't need to start from zero every time.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/asp.py21
1 files changed, 7 insertions, 14 deletions
diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py
index b41bcba228..d33b47eeb2 100644
--- a/lib/spack/spack/solver/asp.py
+++ b/lib/spack/spack/solver/asp.py
@@ -1117,11 +1117,8 @@ class SpackSolverSetup:
self.reusable_and_possible = ConcreteSpecsByHash()
- # id for dummy variables
- self._condition_id_counter = itertools.count()
- self._trigger_id_counter = itertools.count()
+ self._id_counter = itertools.count()
self._trigger_cache = collections.defaultdict(dict)
- self._effect_id_counter = itertools.count()
self._effect_cache = collections.defaultdict(dict)
# Caches to optimize the setup phase of the solver
@@ -1535,7 +1532,7 @@ class SpackSolverSetup:
# In this way, if a condition can't be emitted but the exception is handled in the caller,
# we won't emit partial facts.
- condition_id = next(self._condition_id_counter)
+ condition_id = next(self._id_counter)
self.gen.fact(fn.pkg_fact(named_cond.name, fn.condition(condition_id)))
self.gen.fact(fn.condition_reason(condition_id, msg))
@@ -1543,7 +1540,7 @@ class SpackSolverSetup:
named_cond_key = (str(named_cond), transform_required)
if named_cond_key not in cache:
- trigger_id = next(self._trigger_id_counter)
+ trigger_id = next(self._id_counter)
requirements = self.spec_clauses(named_cond, body=True, required_from=name)
if transform_required:
@@ -1559,7 +1556,7 @@ class SpackSolverSetup:
cache = self._effect_cache[named_cond.name]
imposed_spec_key = (str(imposed_spec), transform_imposed)
if imposed_spec_key not in cache:
- effect_id = next(self._effect_id_counter)
+ effect_id = next(self._id_counter)
requirements = self.spec_clauses(imposed_spec, body=False, required_from=name)
if transform_imposed:
@@ -2573,12 +2570,8 @@ class SpackSolverSetup:
reuse: list of concrete specs that can be reused
allow_deprecated: if True adds deprecated versions into the solve
"""
- self._condition_id_counter = itertools.count()
-
- # preliminary checks
check_packages_exist(specs)
- # get list of all possible dependencies
self.possible_virtuals = set(x.name for x in specs if x.virtual)
node_counter = _create_counter(specs, tests=self.tests)
@@ -2698,8 +2691,8 @@ class SpackSolverSetup:
def literal_specs(self, specs):
for spec in specs:
self.gen.h2("Spec: %s" % str(spec))
- condition_id = next(self._condition_id_counter)
- trigger_id = next(self._trigger_id_counter)
+ condition_id = next(self._id_counter)
+ trigger_id = next(self._id_counter)
# Special condition triggered by "literal_solved"
self.gen.fact(fn.literal(trigger_id))
@@ -2713,7 +2706,7 @@ class SpackSolverSetup:
"literal specs have different requirements. clear cache before computing literals"
)
assert imposed_spec_key not in cache, msg
- effect_id = next(self._effect_id_counter)
+ effect_id = next(self._id_counter)
requirements = self.spec_clauses(spec)
root_name = spec.name
for clause in requirements: