Skip to content

Commit b76b43c

Browse files
authored
solver: manually optimize trigger_node projections (spack#51605)
Project out trigger node in its own rule, instead of using anonymous variables. This should help the grounder avoiding cartesian products that lead to the same head. Signed-off-by: Massimiliano Culpo <[email protected]>
1 parent 443e1e3 commit b76b43c

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

lib/spack/spack/solver/concretize.lp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -429,16 +429,22 @@ condition_packages(ID, A1) :- condition_requirement(ID, _, A1, _, _, _).
429429
trigger_node(ID, node(PackageID, Package), node(PackageID, Package)) :- pkg_fact(Package, trigger_id(ID)), attr("node", node(PackageID, Package)).
430430
trigger_node(ID, node(PackageID, Package), node(VirtualID, Virtual)) :- pkg_fact(Virtual, trigger_id(ID)), provider(node(PackageID, Package), node(VirtualID, Virtual)).
431431

432+
% This is the "real node" that triggers the request, e.g. if the request started from "mpi" this is the mpi provider
433+
trigger_real_node(ID, PackageNode) :- trigger_node(ID, PackageNode, _).
434+
435+
% This is the requestor node, which may be a "real" or a "virtual" node
436+
trigger_requestor_node(ID, RequestorNode) :- trigger_node(ID, _, RequestorNode).
437+
432438
condition_nodes(TriggerID, PackageNode, node(X, A1))
433439
:- condition_packages(TriggerID, A1),
434440
condition_set(PackageNode, node(X, A1)),
435441
not self_build_requirement(PackageNode, node(X, A1)),
436-
trigger_node(TriggerID, PackageNode, _).
442+
trigger_real_node(TriggerID, PackageNode).
437443

438444
cannot_hold(TriggerID, PackageNode)
439445
:- condition_packages(TriggerID, A1),
440446
not condition_set(PackageNode, node(_, A1)),
441-
trigger_node(TriggerID, PackageNode, _),
447+
trigger_real_node(TriggerID, PackageNode),
442448
attr("node", PackageNode).
443449

444450
trigger_condition_holds(ID, RequestorNode) :-
@@ -455,39 +461,39 @@ trigger_condition_holds(ID, RequestorNode) :-
455461
%%%%
456462

457463
satisfied(trigger(PackageNode), condition_requirement(ID, Name, A1)) :-
458-
trigger_node(ID, PackageNode, _),
464+
trigger_real_node(ID, PackageNode),
459465
attr(Name, node(X, A1)),
460466
condition_requirement(ID, Name, A1),
461467
condition_nodes(ID, PackageNode, node(X, A1)).
462468

463469
satisfied(trigger(PackageNode), condition_requirement(ID, Name, A1, A2)) :-
464-
trigger_node(ID, PackageNode, _),
470+
trigger_real_node(ID, PackageNode),
465471
attr(Name, node(X, A1), A2),
466472
condition_requirement(ID, Name, A1, A2),
467473
condition_nodes(ID, PackageNode, node(X, A1)).
468474

469475
satisfied(trigger(PackageNode), condition_requirement(ID, Name, A1, A2, A3)) :-
470-
trigger_node(ID, PackageNode, _),
476+
trigger_real_node(ID, PackageNode),
471477
attr(Name, node(X, A1), A2, A3),
472478
condition_requirement(ID, Name, A1, A2, A3),
473479
condition_nodes(ID, PackageNode, node(X, A1)),
474480
not node_attributes_with_custom_rules(Name).
475481

476482
satisfied(trigger(PackageNode), condition_requirement(ID, Name, A1, A2, A3, A4)) :-
477-
trigger_node(ID, PackageNode, _),
483+
trigger_real_node(ID, PackageNode),
478484
attr(Name, node(X, A1), A2, A3, A4),
479485
condition_requirement(ID, Name, A1, A2, A3, A4),
480486
condition_nodes(ID, PackageNode, node(X, A1)).
481487

482488
satisfied(trigger(PackageNode), condition_requirement(ID, "depends_on", A1, A2, A3)) :-
483-
trigger_node(ID, PackageNode, _),
489+
trigger_real_node(ID, PackageNode),
484490
attr("depends_on", node(X, A1), node(Y, A2), A3),
485491
condition_requirement(ID, "depends_on", A1, A2, A3),
486492
condition_nodes(ID, PackageNode, node(X, A1)),
487493
condition_nodes(ID, PackageNode, node(Y, A2)).
488494

489495
satisfied(trigger(PackageNode), condition_requirement(ID, "concrete_variant_request", A1, A2, A3)) :-
490-
trigger_node(ID, PackageNode, _),
496+
trigger_real_node(ID, PackageNode),
491497
condition_requirement(ID, "concrete_variant_request", A1, A2, A3),
492498
condition_nodes(ID, PackageNode, node(X, A1)).
493499

@@ -501,35 +507,35 @@ satisfied(trigger(PackageNode), condition_requirement(ID, "closure", A1, A2, A3)
501507
%%%%
502508

503509
satisfied(trigger(PackageNode), condition_requirement(ID, "node", A1)) :-
504-
trigger_node(ID, PackageNode, _),
510+
trigger_real_node(ID, PackageNode),
505511
reused_provider(PackageNode, _),
506512
condition_requirement(ID, "node", A1).
507513

508514
satisfied(trigger(PackageNode), condition_requirement(ID, "virtual_node", A1)) :-
509-
trigger_node(ID, PackageNode, _),
515+
trigger_real_node(ID, PackageNode),
510516
reused_provider(PackageNode, node(_, A1)),
511517
condition_requirement(ID, "virtual_node", A1).
512518

513519
satisfied(trigger(PackageNode), condition_requirement(ID, "virtual_on_incoming_edges", A1, A2)) :-
514-
trigger_node(ID, PackageNode, _),
520+
trigger_real_node(ID, PackageNode),
515521
reused_provider(node(Hash, A1), node(Hash, A2)),
516522
condition_requirement(ID, "virtual_on_incoming_edges", A1, A2).
517523

518524
satisfied(trigger(node(Hash, Package)), condition_requirement(ID, Name, Package, A1)) :-
519-
trigger_node(ID, node(Hash, Package), _),
525+
trigger_real_node(ID, node(Hash, Package)),
520526
reused_provider(node(Hash, Package), node(Hash, Language)),
521527
hash_attr(Hash, Name, Package, A1),
522528
condition_requirement(ID, Name, Package, A1).
523529

524530
satisfied(trigger(node(Hash, Package)), condition_requirement(ID, "node_version_satisfies", Package, VersionConstraint)) :-
525-
trigger_node(ID, node(Hash, Package), _),
531+
trigger_real_node(ID, node(Hash, Package)),
526532
reused_provider(node(Hash, Package), node(Hash, Language)),
527533
hash_attr(Hash, "version", Package, Version),
528534
condition_requirement(ID, "node_version_satisfies", Package, VersionConstraint),
529535
pkg_fact(Package, version_satisfies(VersionConstraint, Version)).
530536

531537
satisfied(trigger(node(Hash, Package)), condition_requirement(ID, Name, Package, A1, A2)) :-
532-
trigger_node(ID, node(Hash, Package), _),
538+
trigger_real_node(ID, node(Hash, Package)),
533539
reused_provider(node(Hash, Package), node(Hash, Language)),
534540
hash_attr(Hash, Name, Package, A1, A2),
535541
condition_requirement(ID, Name, Package, A1, A2).
@@ -566,7 +572,7 @@ trigger_and_effect(Package, TriggerID, EffectID) :- trigger_and_effect(Package,
566572
impose(EffectID, node(X, Package))
567573
:- not subcondition(ConditionID, _),
568574
trigger_and_effect(Package, ConditionID, TriggerID, EffectID),
569-
trigger_node(TriggerID, _, node(X, Package)),
575+
trigger_requestor_node(TriggerID, node(X, Package)),
570576
trigger_condition_holds(TriggerID, node(X, Package)),
571577
not do_not_impose(EffectID, node(X, Package)).
572578

@@ -577,7 +583,7 @@ impose(EffectID, node(X, Package))
577583
condition_holds(ConditionID, ConditionNode),
578584
condition_set(ConditionNode, node(X, Package)),
579585
trigger_and_effect(Package, SubconditionID, TriggerID, EffectID),
580-
trigger_node(TriggerID, _, node(X, Package)),
586+
trigger_requestor_node(TriggerID, node(X, Package)),
581587
trigger_condition_holds(TriggerID, node(X, Package)),
582588
not do_not_impose(EffectID, node(X, Package)).
583589

@@ -591,7 +597,7 @@ imposed_nodes(EffectID, node(NodeID, Package), node(X, A1))
591597
:- trigger_and_effect(Package, TriggerID, EffectID),
592598
imposed_packages(EffectID, A1),
593599
condition_set(node(NodeID, Package), node(X, A1)),
594-
trigger_node(TriggerID, _, node(NodeID, Package)),
600+
trigger_requestor_node(TriggerID, node(NodeID, Package)),
595601
% We don't want to add build requirements to imposed nodes, to avoid
596602
% unsat problems when we deal with self-dependencies: gcc@14 %gcc@10
597603
not self_build_requirement(node(NodeID, Package), node(X, A1)).

lib/spack/spack/solver/when_possible.lp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ do_not_impose(EffectID, node(X, Package)) :-
2727
subcondition(SubconditionID, ParentConditionID),
2828
pkg_fact(Package, condition_effect(SubconditionID, EffectID)),
2929
trigger_and_effect(_, TriggerID, EffectID),
30-
trigger_node(TriggerID, _, node(X, Package)).
30+
trigger_requestor_node(TriggerID, node(X, Package)).
3131

3232
opt_criterion(320, "number of input specs not concretized").
3333
#minimize{ 0@320: #true }.

0 commit comments

Comments
 (0)