aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java')
-rw-r--r--subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java7
1 files changed, 7 insertions, 0 deletions
diff --git a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java
index 62aadb4a..3ae4d84b 100644
--- a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java
+++ b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/BoundScopePropagator.java
@@ -22,6 +22,7 @@ import tools.refinery.store.representation.cardinality.*;
22import tools.refinery.store.tuple.Tuple; 22import tools.refinery.store.tuple.Tuple;
23 23
24class BoundScopePropagator implements BoundPropagator { 24class BoundScopePropagator implements BoundPropagator {
25 private final Model model;
25 private final ModelQueryAdapter queryEngine; 26 private final ModelQueryAdapter queryEngine;
26 private final Interpretation<CardinalityInterval> countInterpretation; 27 private final Interpretation<CardinalityInterval> countInterpretation;
27 private final MPSolver solver; 28 private final MPSolver solver;
@@ -32,6 +33,7 @@ class BoundScopePropagator implements BoundPropagator {
32 private boolean changed = true; 33 private boolean changed = true;
33 34
34 public BoundScopePropagator(Model model, ScopePropagator storeAdapter) { 35 public BoundScopePropagator(Model model, ScopePropagator storeAdapter) {
36 this.model = model;
35 queryEngine = model.getAdapter(ModelQueryAdapter.class); 37 queryEngine = model.getAdapter(ModelQueryAdapter.class);
36 countInterpretation = model.getInterpretation(storeAdapter.getCountSymbol()); 38 countInterpretation = model.getInterpretation(storeAdapter.getCountSymbol());
37 solver = MPSolver.createSolver("GLOP"); 39 solver = MPSolver.createSolver("GLOP");
@@ -41,6 +43,7 @@ class BoundScopePropagator implements BoundPropagator {
41 var propagatorFactories = storeAdapter.getTypeScopePropagatorFactories(); 43 var propagatorFactories = storeAdapter.getTypeScopePropagatorFactories();
42 propagators = new TypeScopePropagator[propagatorFactories.size()]; 44 propagators = new TypeScopePropagator[propagatorFactories.size()];
43 for (int i = 0; i < propagators.length; i++) { 45 for (int i = 0; i < propagators.length; i++) {
46 model.checkCancelled();
44 propagators[i] = propagatorFactories.get(i).createPropagator(this); 47 propagators[i] = propagatorFactories.get(i).createPropagator(this);
45 } 48 }
46 } 49 }
@@ -145,6 +148,7 @@ class BoundScopePropagator implements BoundPropagator {
145 } 148 }
146 changed = false; 149 changed = false;
147 for (var propagator : propagators) { 150 for (var propagator : propagators) {
151 model.checkCancelled();
148 propagator.updateBounds(); 152 propagator.updateBounds();
149 } 153 }
150 var result = PropagationResult.UNCHANGED; 154 var result = PropagationResult.UNCHANGED;
@@ -167,6 +171,7 @@ class BoundScopePropagator implements BoundPropagator {
167 } 171 }
168 172
169 private PropagationResult checkEmptiness() { 173 private PropagationResult checkEmptiness() {
174 model.checkCancelled();
170 var emptinessCheckingResult = solver.solve(); 175 var emptinessCheckingResult = solver.solve();
171 return switch (emptinessCheckingResult) { 176 return switch (emptinessCheckingResult) {
172 case OPTIMAL, UNBOUNDED -> PropagationResult.UNCHANGED; 177 case OPTIMAL, UNBOUNDED -> PropagationResult.UNCHANGED;
@@ -178,6 +183,7 @@ class BoundScopePropagator implements BoundPropagator {
178 private PropagationResult propagateNode(int nodeId, MPVariable variable) { 183 private PropagationResult propagateNode(int nodeId, MPVariable variable) {
179 objective.setCoefficient(variable, 1); 184 objective.setCoefficient(variable, 1);
180 try { 185 try {
186 model.checkCancelled();
181 objective.setMinimization(); 187 objective.setMinimization();
182 var minimizationResult = solver.solve(); 188 var minimizationResult = solver.solve();
183 int lowerBound; 189 int lowerBound;
@@ -191,6 +197,7 @@ class BoundScopePropagator implements BoundPropagator {
191 .formatted(variable, minimizationResult)); 197 .formatted(variable, minimizationResult));
192 } 198 }
193 199
200 model.checkCancelled();
194 objective.setMaximization(); 201 objective.setMaximization();
195 var maximizationResult = solver.solve(); 202 var maximizationResult = solver.solve();
196 UpperCardinality upperBound; 203 UpperCardinality upperBound;