Skip to content

Commit 5e6784b

Browse files
author
BaierD
committed
Add prover based shutdown manager that is the child of the context-wide shutdown manager, so that solvers that allow partial shutdown/shutdown of solving with reuse can be used fully
1 parent c12d66e commit 5e6784b

11 files changed

+92
-8
lines changed

src/org/sosy_lab/java_smt/api/BasicProverEnvironment.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import java.util.List;
1616
import java.util.Optional;
1717
import org.checkerframework.checker.nullness.qual.Nullable;
18+
import org.sosy_lab.common.ShutdownManager;
19+
import org.sosy_lab.common.ShutdownNotifier;
1820
import org.sosy_lab.java_smt.api.SolverContext.ProverOptions;
1921

2022
/**
@@ -202,4 +204,18 @@ interface AllSatCallback<R> {
202204
default boolean registerUserPropagator(UserPropagator propagator) {
203205
return false;
204206
}
207+
208+
/**
209+
* Returns the {@link ShutdownManager} registered for this {@link ProverEnvironment}. It is
210+
* guaranteed to be a child of the {@link ShutdownNotifier} given to the creating {@link
211+
* SolverContext}, resulting in shutdown when the {@link SolverContext}s notifier is shutting
212+
* down. The notifier returned here can be shut down independently of the creating contexts
213+
* notifier.
214+
*
215+
* @return a {@link ShutdownManager} who is the child of the {@link ShutdownNotifier} used in the
216+
* creating {@link SolverContext}, that can be used to shut down only this {@link
217+
* ProverEnvironment}.
218+
* @throws UnsupportedOperationException if the solver does not support prover specific shutdown.
219+
*/
220+
ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException;
205221
}

src/org/sosy_lab/java_smt/basicimpl/AbstractProver.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.util.List;
2323
import java.util.Set;
2424
import org.checkerframework.checker.nullness.qual.Nullable;
25+
import org.sosy_lab.common.ShutdownManager;
26+
import org.sosy_lab.common.ShutdownNotifier;
2527
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
2628
import org.sosy_lab.java_smt.api.BooleanFormula;
2729
import org.sosy_lab.java_smt.api.Evaluator;
@@ -47,7 +49,11 @@ public abstract class AbstractProver<T> implements BasicProverEnvironment<T> {
4749

4850
private static final String TEMPLATE = "Please set the prover option %s.";
4951

50-
protected AbstractProver(Set<ProverOptions> pOptions) {
52+
// Do we even need this?
53+
private final ShutdownNotifier contextShutdownNotifier;
54+
protected final ShutdownManager proverShutdownManager;
55+
56+
protected AbstractProver(ShutdownNotifier pShutdownNotifier, Set<ProverOptions> pOptions) {
5157
generateModels = pOptions.contains(ProverOptions.GENERATE_MODELS);
5258
generateAllSat = pOptions.contains(ProverOptions.GENERATE_ALL_SAT);
5359
generateUnsatCores = pOptions.contains(ProverOptions.GENERATE_UNSAT_CORE);
@@ -56,6 +62,9 @@ protected AbstractProver(Set<ProverOptions> pOptions) {
5662
enableSL = pOptions.contains(ProverOptions.ENABLE_SEPARATION_LOGIC);
5763

5864
assertedFormulas.add(LinkedHashMultimap.create());
65+
66+
contextShutdownNotifier = pShutdownNotifier;
67+
proverShutdownManager = ShutdownManager.createWithParent(contextShutdownNotifier);
5968
}
6069

6170
protected final void checkGenerateModels() {
@@ -158,4 +167,17 @@ public void close() {
158167
closeAllEvaluators();
159168
closed = true;
160169
}
170+
171+
@Override
172+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
173+
return getShutdownManagerForProverImpl();
174+
}
175+
176+
protected ShutdownManager getShutdownManagerForProverImpl() throws UnsupportedOperationException {
177+
// Override this with the prover specific ShutdownManagers notifier for supporting solvers.
178+
// The solver should then use the prover specific ShutdownManagers notifier for stopping
179+
// instead of the contexts' notifier!
180+
throw new UnsupportedOperationException(
181+
"The chosen solver does not support isolated prover " + "shutdown");
182+
}
161183
}

src/org/sosy_lab/java_smt/basicimpl/AbstractProverWithAllSat.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,14 @@
2828
*/
2929
public abstract class AbstractProverWithAllSat<T> extends AbstractProver<T> {
3030

31-
protected final ShutdownNotifier shutdownNotifier;
3231
private final BooleanFormulaManager bmgr;
3332

3433
protected AbstractProverWithAllSat(
3534
Set<ProverOptions> pOptions,
3635
BooleanFormulaManager pBmgr,
3736
ShutdownNotifier pShutdownNotifier) {
38-
super(pOptions);
37+
super(pShutdownNotifier, pOptions);
3938
bmgr = pBmgr;
40-
shutdownNotifier = pShutdownNotifier;
4139
}
4240

4341
@Override
@@ -68,7 +66,7 @@ private <R> void iterateOverAllModels(
6866
AllSatCallback<R> callback, List<BooleanFormula> importantPredicates)
6967
throws SolverException, InterruptedException {
7068
while (!isUnsat()) {
71-
shutdownNotifier.shutdownIfNecessary();
69+
proverShutdownManager.getNotifier().shutdownIfNecessary();
7270

7371
ImmutableList.Builder<BooleanFormula> valuesOfModel = ImmutableList.builder();
7472
try (Evaluator evaluator = getEvaluatorWithoutChecks()) {
@@ -88,11 +86,11 @@ private <R> void iterateOverAllModels(
8886

8987
final ImmutableList<BooleanFormula> values = valuesOfModel.build();
9088
callback.apply(values);
91-
shutdownNotifier.shutdownIfNecessary();
89+
proverShutdownManager.getNotifier().shutdownIfNecessary();
9290

9391
BooleanFormula negatedModel = bmgr.not(bmgr.and(values));
9492
addConstraint(negatedModel);
95-
shutdownNotifier.shutdownIfNecessary();
93+
proverShutdownManager.getNotifier().shutdownIfNecessary();
9694
}
9795
}
9896

@@ -113,7 +111,7 @@ private <R> void iterateOverAllPredicateCombinations(
113111
Deque<BooleanFormula> valuesOfModel)
114112
throws SolverException, InterruptedException {
115113

116-
shutdownNotifier.shutdownIfNecessary();
114+
proverShutdownManager.getNotifier().shutdownIfNecessary();
117115

118116
if (isUnsat()) {
119117
return;

src/org/sosy_lab/java_smt/basicimpl/withAssumptionsWrapper/BasicProverWithAssumptionsWrapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Collection;
1515
import java.util.List;
1616
import java.util.Optional;
17+
import org.sosy_lab.common.ShutdownManager;
1718
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
1819
import org.sosy_lab.java_smt.api.BooleanFormula;
1920
import org.sosy_lab.java_smt.api.Model;
@@ -128,4 +129,9 @@ public <R> R allSat(AllSatCallback<R> pCallback, List<BooleanFormula> pImportant
128129
clearAssumptions();
129130
return delegate.allSat(pCallback, pImportant);
130131
}
132+
133+
@Override
134+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
135+
return delegate.getShutdownManagerForProver();
136+
}
131137
}

src/org/sosy_lab/java_smt/delegate/debugging/DebuggingBasicProverEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.List;
1515
import java.util.Optional;
1616
import org.checkerframework.checker.nullness.qual.Nullable;
17+
import org.sosy_lab.common.ShutdownManager;
1718
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
1819
import org.sosy_lab.java_smt.api.BooleanFormula;
1920
import org.sosy_lab.java_smt.api.Model;
@@ -29,6 +30,11 @@ class DebuggingBasicProverEnvironment<T> implements BasicProverEnvironment<T> {
2930
debugging = pDebugging;
3031
}
3132

33+
@Override
34+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
35+
return delegate.getShutdownManagerForProver();
36+
}
37+
3238
@Override
3339
public void pop() {
3440
debugging.assertThreadLocal();

src/org/sosy_lab/java_smt/delegate/debugging/DebuggingOptimizationProverEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
package org.sosy_lab.java_smt.delegate.debugging;
1010

1111
import java.util.Optional;
12+
import org.sosy_lab.common.ShutdownManager;
1213
import org.sosy_lab.common.rationals.Rational;
1314
import org.sosy_lab.java_smt.api.Formula;
1415
import org.sosy_lab.java_smt.api.OptimizationProverEnvironment;
@@ -26,6 +27,11 @@ public DebuggingOptimizationProverEnvironment(
2627
debugging = pDebugging;
2728
}
2829

30+
@Override
31+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
32+
return delegate.getShutdownManagerForProver();
33+
}
34+
2935
@Override
3036
public int maximize(Formula objective) {
3137
debugging.assertThreadLocal();

src/org/sosy_lab/java_smt/delegate/logging/LoggingBasicProverEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Optional;
1919
import java.util.logging.Level;
2020
import org.checkerframework.checker.nullness.qual.Nullable;
21+
import org.sosy_lab.common.ShutdownManager;
2122
import org.sosy_lab.common.log.LogManager;
2223
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
2324
import org.sosy_lab.java_smt.api.BooleanFormula;
@@ -38,6 +39,11 @@ class LoggingBasicProverEnvironment<T> implements BasicProverEnvironment<T> {
3839
logger = checkNotNull(pLogger);
3940
}
4041

42+
@Override
43+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
44+
return wrapped.getShutdownManagerForProver();
45+
}
46+
4147
@Override
4248
public @Nullable T push(BooleanFormula f) throws InterruptedException {
4349
logger.log(Level.FINE, "up to level " + level++);

src/org/sosy_lab/java_smt/delegate/statistics/StatisticsBasicProverEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.List;
1515
import java.util.Optional;
1616
import org.checkerframework.checker.nullness.qual.Nullable;
17+
import org.sosy_lab.common.ShutdownManager;
1718
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
1819
import org.sosy_lab.java_smt.api.BooleanFormula;
1920
import org.sosy_lab.java_smt.api.Model;
@@ -35,6 +36,11 @@ class StatisticsBasicProverEnvironment<T> implements BasicProverEnvironment<T> {
3536
stats.provers.getAndIncrement();
3637
}
3738

39+
@Override
40+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
41+
return delegate.getShutdownManagerForProver();
42+
}
43+
3844
@Override
3945
public void pop() {
4046
stats.pop.getAndIncrement();

src/org/sosy_lab/java_smt/delegate/synchronize/SynchronizedBasicProverEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.List;
1616
import java.util.Optional;
1717
import org.checkerframework.checker.nullness.qual.Nullable;
18+
import org.sosy_lab.common.ShutdownManager;
1819
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
1920
import org.sosy_lab.java_smt.api.BooleanFormula;
2021
import org.sosy_lab.java_smt.api.Model;
@@ -31,6 +32,11 @@ class SynchronizedBasicProverEnvironment<T> implements BasicProverEnvironment<T>
3132
sync = checkNotNull(pSync);
3233
}
3334

35+
@Override
36+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
37+
return delegate.getShutdownManagerForProver();
38+
}
39+
3440
@Override
3541
public void pop() {
3642
synchronized (sync) {

src/org/sosy_lab/java_smt/delegate/synchronize/SynchronizedBasicProverEnvironmentWithContext.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.List;
1717
import java.util.Optional;
1818
import org.checkerframework.checker.nullness.qual.Nullable;
19+
import org.sosy_lab.common.ShutdownManager;
1920
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
2021
import org.sosy_lab.java_smt.api.BooleanFormula;
2122
import org.sosy_lab.java_smt.api.FormulaManager;
@@ -144,6 +145,11 @@ public <R> R allSat(AllSatCallback<R> pCallback, List<BooleanFormula> pImportant
144145
}
145146
}
146147

148+
@Override
149+
public ShutdownManager getShutdownManagerForProver() throws UnsupportedOperationException {
150+
return delegate.getShutdownManagerForProver();
151+
}
152+
147153
private class AllSatCallbackWithContext<R> implements AllSatCallback<R> {
148154

149155
private final AllSatCallback<R> delegateCallback;

0 commit comments

Comments
 (0)