Skip to content

Commit 8632bf7

Browse files
author
BaierD
committed
Add MathSAT5 implementation for prover based shutdown
1 parent 5b64a3b commit 8632bf7

File tree

2 files changed

+24
-26
lines changed

2 files changed

+24
-26
lines changed

src/org/sosy_lab/java_smt/solvers/mathsat5/Mathsat5AbstractProver.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.Map;
4343
import java.util.Optional;
4444
import java.util.Set;
45+
import org.sosy_lab.common.ShutdownManager;
4546
import org.sosy_lab.common.ShutdownNotifier;
4647
import org.sosy_lab.java_smt.api.BooleanFormula;
4748
import org.sosy_lab.java_smt.api.Evaluator;
@@ -51,27 +52,24 @@
5152
import org.sosy_lab.java_smt.basicimpl.AbstractProver;
5253
import org.sosy_lab.java_smt.basicimpl.CachingModel;
5354
import org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.AllSatModelCallback;
55+
import org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.TerminationCallback;
5456

5557
/** Common base class for {@link Mathsat5TheoremProver} and {@link Mathsat5InterpolatingProver}. */
5658
abstract class Mathsat5AbstractProver<T2> extends AbstractProver<T2> {
5759

58-
protected final Mathsat5SolverContext context;
5960
protected final long curEnv;
6061
private final long curConfig;
6162
protected final Mathsat5FormulaCreator creator;
62-
private final ShutdownNotifier shutdownNotifier;
6363

6464
protected Mathsat5AbstractProver(
6565
Mathsat5SolverContext pContext,
6666
Set<ProverOptions> pOptions,
6767
Mathsat5FormulaCreator pCreator,
6868
ShutdownNotifier pShutdownNotifier) {
69-
super(pOptions);
70-
context = pContext;
69+
super(pShutdownNotifier, pOptions);
7170
creator = pCreator;
7271
curConfig = buildConfig(pOptions);
73-
curEnv = context.createEnvironment(curConfig);
74-
shutdownNotifier = pShutdownNotifier;
72+
curEnv = pContext.createEnvironment(curConfig);
7573
}
7674

7775
private long buildConfig(Set<ProverOptions> opts) {
@@ -100,21 +98,33 @@ private long buildConfig(Set<ProverOptions> opts) {
10098
public boolean isUnsat() throws InterruptedException, SolverException {
10199
Preconditions.checkState(!closed);
102100

103-
final long hook = msat_set_termination_callback(curEnv, context.getTerminationTest());
101+
final long hook = msat_set_termination_callback(curEnv, getTerminationTest());
104102
try {
105103
return !msat_check_sat(curEnv);
106104
} finally {
107105
msat_free_termination_callback(hook);
108106
}
109107
}
110108

109+
/**
110+
* Get a termination callback for the current prover (who's parent is the contexts callback). The
111+
* callback can be registered upfront, i.e., before calling a possibly expensive computation in
112+
* the solver to allow a proper shutdown.
113+
*/
114+
private TerminationCallback getTerminationTest() {
115+
return () -> {
116+
proverShutdownManager.getNotifier().shutdownIfNecessary();
117+
return false;
118+
};
119+
}
120+
111121
@Override
112122
public boolean isUnsatWithAssumptions(Collection<BooleanFormula> pAssumptions)
113123
throws SolverException, InterruptedException {
114124
Preconditions.checkState(!closed);
115125
checkForLiterals(pAssumptions);
116126

117-
final long hook = msat_set_termination_callback(curEnv, context.getTerminationTest());
127+
final long hook = msat_set_termination_callback(curEnv, getTerminationTest());
118128
try {
119129
return !msat_check_sat_with_assumptions(curEnv, getMsatTerm(pAssumptions));
120130
} finally {
@@ -273,10 +283,15 @@ class MathsatAllSatCallback<T> implements AllSatModelCallback {
273283

274284
@Override
275285
public void callback(long[] model) throws InterruptedException {
276-
shutdownNotifier.shutdownIfNecessary();
286+
proverShutdownManager.getNotifier().shutdownIfNecessary();
277287
clientCallback.apply(
278288
Collections.unmodifiableList(
279289
Lists.transform(Longs.asList(model), creator::encapsulateBoolean)));
280290
}
281291
}
292+
293+
@Override
294+
protected ShutdownManager getShutdownManagerForProverImpl() throws UnsupportedOperationException {
295+
return proverShutdownManager;
296+
}
282297
}

src/org/sosy_lab/java_smt/solvers/mathsat5/Mathsat5SolverContext.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import org.sosy_lab.java_smt.api.ProverEnvironment;
4747
import org.sosy_lab.java_smt.basicimpl.AbstractNumeralFormulaManager.NonLinearArithmetic;
4848
import org.sosy_lab.java_smt.basicimpl.AbstractSolverContext;
49-
import org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.TerminationCallback;
5049

5150
public final class Mathsat5SolverContext extends AbstractSolverContext {
5251

@@ -96,7 +95,6 @@ private Mathsat5Settings(Configuration config, @Nullable PathCounterTemplate pLo
9695
private final long randomSeed;
9796

9897
private final ShutdownNotifier shutdownNotifier;
99-
private final TerminationCallback terminationTest;
10098
private final Mathsat5FormulaCreator creator;
10199
private boolean closed = false;
102100

@@ -120,12 +118,6 @@ private Mathsat5SolverContext(
120118
this.randomSeed = randomSeed;
121119
this.shutdownNotifier = shutdownNotifier;
122120
this.creator = creator;
123-
124-
terminationTest =
125-
() -> {
126-
shutdownNotifier.shutdownIfNecessary();
127-
return false;
128-
};
129121
}
130122

131123
private static void logLicenseInfo(LogManager logger) {
@@ -299,15 +291,6 @@ public void close() {
299291
}
300292
}
301293

302-
/**
303-
* Get a termination callback for the current context. The callback can be registered upfront,
304-
* i.e., before calling a possibly expensive computation in the solver to allow a proper shutdown.
305-
*/
306-
TerminationCallback getTerminationTest() {
307-
Preconditions.checkState(!closed, "solver context is already closed");
308-
return terminationTest;
309-
}
310-
311294
@Override
312295
protected boolean supportsAssumptionSolving() {
313296
return true;

0 commit comments

Comments
 (0)