|
7 | 7 | % This logic program implements Spack's concretizer |
8 | 8 | %============================================================================= |
9 | 9 |
|
10 | | -%----------------------------------------------------------------------------- |
11 | | -% Map literal input specs to facts that drive the solve |
12 | | -%----------------------------------------------------------------------------- |
13 | | - |
14 | 10 | #const root_node_id = 0. |
15 | 11 |
|
16 | 12 | #const link_run = 0. |
@@ -78,36 +74,24 @@ unification_set(SetID, VirtualNode) :- provider(PackageNode, VirtualNode), unifi |
78 | 74 | not attr("virtual_node", node(ID2, Package)), |
79 | 75 | max_nodes(Package, X), ID1=0..X-1, ID2=0..X-1, ID2 < ID1. |
80 | 76 |
|
81 | | -% Give clingo the choice to solve an input spec or not |
82 | | -{ literal_solved(ID) } :- literal(ID). |
83 | | -literal_not_solved(ID) :- not literal_solved(ID), literal(ID). |
84 | | - |
85 | | -% If concretize_everything() is a fact, then we cannot have unsolved specs |
86 | | -:- literal_not_solved(ID), concretize_everything. |
87 | | - |
88 | | -% Make a problem with "zero literals solved" unsat. This is to trigger |
89 | | -% looking for solutions to the ASP problem with "errors", which results |
90 | | -% in better reporting for users. See #30669 for details. |
91 | | -1 { literal_solved(ID) : literal(ID) }. |
92 | | - |
93 | | -opt_criterion(300, "number of input specs not concretized"). |
94 | | -#minimize{ 0@300: #true }. |
95 | | -#minimize { 1@300,ID : literal_not_solved(ID) }. |
| 77 | +%----------------------------------------------------------------------------- |
| 78 | +% Map literal input specs to facts that drive the solve |
| 79 | +%----------------------------------------------------------------------------- |
96 | 80 |
|
97 | 81 | % TODO: literals, at the moment, can only influence the "root" unification set. This needs to be extended later. |
98 | 82 |
|
99 | 83 | special_case("node_flag_source"). |
100 | 84 | special_case("depends_on"). |
101 | 85 |
|
102 | 86 | % Map constraint on the literal ID to facts on the node |
103 | | -attr(Name, node(root_node_id, A1)) :- literal(LiteralID, Name, A1), literal_solved(LiteralID). |
104 | | -attr(Name, node(root_node_id, A1), A2) :- literal(LiteralID, Name, A1, A2), literal_solved(LiteralID). |
105 | | -attr(Name, node(root_node_id, A1), A2, A3) :- literal(LiteralID, Name, A1, A2, A3), literal_solved(LiteralID), not special_case(Name). |
106 | | -attr(Name, node(root_node_id, A1), A2, A3, A4) :- literal(LiteralID, Name, A1, A2, A3, A4), literal_solved(LiteralID). |
| 87 | +attr(Name, node(root_node_id, A1)) :- literal(LiteralID, Name, A1), solve_literal(LiteralID). |
| 88 | +attr(Name, node(root_node_id, A1), A2) :- literal(LiteralID, Name, A1, A2), solve_literal(LiteralID). |
| 89 | +attr(Name, node(root_node_id, A1), A2, A3) :- literal(LiteralID, Name, A1, A2, A3), solve_literal(LiteralID), not special_case(Name). |
| 90 | +attr(Name, node(root_node_id, A1), A2, A3, A4) :- literal(LiteralID, Name, A1, A2, A3, A4), solve_literal(LiteralID). |
107 | 91 |
|
108 | 92 | % Special cases where nodes occur in arguments other than A1 |
109 | | -attr("node_flag_source", node(root_node_id, A1), A2, node(root_node_id, A3)) :- literal(LiteralID, "node_flag_source", A1, A2, A3), literal_solved(LiteralID). |
110 | | -attr("depends_on", node(root_node_id, A1), node(root_node_id, A2), A3) :- literal(LiteralID, "depends_on", A1, A2, A3), literal_solved(LiteralID). |
| 93 | +attr("node_flag_source", node(root_node_id, A1), A2, node(root_node_id, A3)) :- literal(LiteralID, "node_flag_source", A1, A2, A3), solve_literal(LiteralID). |
| 94 | +attr("depends_on", node(root_node_id, A1), node(root_node_id, A2), A3) :- literal(LiteralID, "depends_on", A1, A2, A3), solve_literal(LiteralID). |
111 | 95 |
|
112 | 96 | #defined concretize_everything/0. |
113 | 97 | #defined literal/1. |
|
0 commit comments