summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2024-04-12 09:31:44 +0200
committerGitHub <noreply@github.com>2024-04-12 09:31:44 +0200
commit263007ba81ac3164531de7bab8c8e3e20895cf26 (patch)
tree3727af7c47a417768e9a2bc11ef8f9657076acd9
parent3b6e99381f015e2a128b221622e01ad99df0ef7e (diff)
downloadspack-263007ba81ac3164531de7bab8c8e3e20895cf26.tar.gz
spack-263007ba81ac3164531de7bab8c8e3e20895cf26.tar.bz2
spack-263007ba81ac3164531de7bab8c8e3e20895cf26.tar.xz
spack-263007ba81ac3164531de7bab8c8e3e20895cf26.zip
solver: add an integrity constraint for virtual nodes (#43582)
Upon close inspection of clingo answer sets, in some cases we have "equivalent" (i.e. same hash for the concrete spec) duplicates that differ only because of virtual nodes that are added to the answer set, without any edge using them.
-rw-r--r--lib/spack/spack/solver/concretize.lp6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 4a2edaa067..5f8163c61b 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -523,6 +523,12 @@ attr("virtual_on_edge", PackageNode, ProviderNode, Virtual)
provider(ProviderNode, node(_, Virtual)),
not external(PackageNode).
+% If a virtual node is in the answer set, it must be either a virtual root,
+% or used somewhere
+:- attr("virtual_node", node(_, Virtual)),
+ not attr("virtual_on_incoming_edges", _, Virtual),
+ not attr("virtual_root", node(_, Virtual)).
+
attr("virtual_on_incoming_edges", ProviderNode, Virtual)
:- attr("virtual_on_edge", _, ProviderNode, Virtual).