1#include "storm-config.h"
9TEST(Cvc5SmtSolver, CheckSat) {
20 ASSERT_NO_THROW(s.add(exprDeMorgan));
21 ASSERT_NO_THROW(result = s.check());
23 ASSERT_NO_THROW(s.reset());
31 ASSERT_NO_THROW(s.add(exprFormula));
32 ASSERT_NO_THROW(result = s.check());
34 ASSERT_NO_THROW(s.reset());
37TEST(Cvc5SmtSolver, CheckUnsat) {
48 ASSERT_NO_THROW(s.add(!exprDeMorgan));
49 ASSERT_NO_THROW(result = s.check());
51 ASSERT_NO_THROW(s.reset());
60 ASSERT_NO_THROW(s.add(exprFormula));
61 ASSERT_NO_THROW(result = s.check());
63 ASSERT_NO_THROW(s.reset());
66TEST(Cvc5SmtSolver, Backtracking) {
76 ASSERT_NO_THROW(s.add(expr1));
77 ASSERT_NO_THROW(result = s.check());
79 ASSERT_NO_THROW(s.push());
80 ASSERT_NO_THROW(s.add(expr2));
81 ASSERT_NO_THROW(result = s.check());
83 ASSERT_NO_THROW(s.pop());
84 ASSERT_NO_THROW(result = s.check());
86 ASSERT_NO_THROW(s.push());
87 ASSERT_NO_THROW(s.add(expr2));
88 ASSERT_NO_THROW(result = s.check());
90 ASSERT_NO_THROW(s.push());
91 ASSERT_NO_THROW(s.add(expr3));
92 ASSERT_NO_THROW(result = s.check());
94 ASSERT_NO_THROW(s.pop(2));
95 ASSERT_NO_THROW(result = s.check());
97 ASSERT_NO_THROW(s.reset());
106 ASSERT_NO_THROW(s.add(exprFormula));
107 ASSERT_NO_THROW(result = s.check());
109 ASSERT_NO_THROW(s.push());
110 ASSERT_NO_THROW(s.add(exprFormula2));
111 ASSERT_NO_THROW(result = s.check());
113 ASSERT_NO_THROW(s.pop());
114 ASSERT_NO_THROW(result = s.check());
118TEST(Cvc5SmtSolver, Assumptions) {
132 ASSERT_NO_THROW(s.add(exprFormula));
133 ASSERT_NO_THROW(result = s.check());
135 ASSERT_NO_THROW(s.add(exprFormula2));
136 ASSERT_NO_THROW(result = s.check());
138 ASSERT_NO_THROW(result = s.checkWithAssumptions({f2}));
140 ASSERT_NO_THROW(result = s.check());
142 ASSERT_NO_THROW(result = s.checkWithAssumptions({!f2}));
146TEST(Cvc5SmtSolver, GenerateModel) {
161 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model = s.getModel();
162 int64_t aEval = model->getIntegerValue(a);
163 int64_t bEval = model->getIntegerValue(b);
164 int64_t cEval = model->getIntegerValue(c);
165 ASSERT_TRUE(cEval == aEval + bEval - 1);
168TEST(Cvc5SmtSolver, GenerateValuation) {
188TEST(Cvc5SmtSolver, AllSat) {
206 std::vector<storm::expressions::SimpleValuation> valuations = s.allSat({x, y});
208 ASSERT_TRUE(valuations.size() == 3);
209 for (uint64_t i = 0;
i < valuations.size(); ++
i) {
210 ASSERT_FALSE(valuations[i].getBooleanValue(x) && valuations[i].getBooleanValue(y));
212 for (uint64_t j = i + 1; j < valuations.size(); ++j) {
213 ASSERT_TRUE((valuations[i].getBooleanValue(x) != valuations[j].getBooleanValue(x)) ||
214 (valuations[i].getBooleanValue(y) != valuations[j].getBooleanValue(y)));
219TEST(Cvc5SmtSolver, AddNotCurrentModel) {
229 std::vector<storm::expressions::SimpleValuation> valuations;
231 valuations.push_back(s.getModelAsValuation());
232 s.addNotCurrentModel();
235 ASSERT_EQ(2ull, valuations.size());
236 ASSERT_NE(valuations[0].getBooleanValue(x), valuations[1].getBooleanValue(x));
240TEST(Cvc5SmtSolver, ModelReferenceDescribesItsOwnModel) {
247 s.add(a ==
manager->integer(42) && b);
250 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model = s.getModel();
253 std::string modelString = model->toString();
254 EXPECT_NE(modelString.find(
"a"), std::string::npos);
255 EXPECT_NE(modelString.find(
"b"), std::string::npos);
256 EXPECT_NE(modelString.find(
"42"), std::string::npos);
259 s.addNotCurrentModel();
261 EXPECT_EQ(modelString, model->toString());
262 EXPECT_EQ(42, model->getIntegerValue(a));
263 EXPECT_TRUE(model->getBooleanValue(b));
266TEST(Cvc5SmtSolver, ModelReferenceRejectsValuesOfTheWrongType) {
274 s.add(a ==
manager->integer(42) && b && c ==
manager->rational(0.5));
276 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model = s.getModel();
280 EXPECT_THROW(model->getBooleanValue(a), storm::exceptions::InvalidTypeException);
281 EXPECT_THROW(model->getBooleanValue(c), storm::exceptions::InvalidTypeException);
282 EXPECT_THROW(model->getIntegerValue(b), storm::exceptions::InvalidTypeException);
283 EXPECT_THROW(model->getIntegerValue(c), storm::exceptions::InvalidTypeException);
284 EXPECT_THROW(model->getRationalValue(a), storm::exceptions::InvalidTypeException);
285 EXPECT_THROW(model->getRationalValue(b), storm::exceptions::InvalidTypeException);
288 EXPECT_EQ(42, model->getIntegerValue(a));
289 EXPECT_TRUE(model->getBooleanValue(b));
290 EXPECT_DOUBLE_EQ(0.5, model->getRationalValue(c));
293TEST(Cvc5SmtSolver, ModelReferenceReadsBitVectorVariableAsInteger) {
301 s.add(bv ==
manager->integer(3));
303 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model = s.getModel();
305 EXPECT_EQ(3, model->getIntegerValue(bv));
306 EXPECT_THROW(model->getBooleanValue(bv), storm::exceptions::InvalidTypeException);
309TEST(Cvc5SmtSolver, ModelReferenceOutlivesItsSolver) {
316 std::shared_ptr<storm::solver::SmtSolver::ModelReference> model;
319 s.add(a ==
manager->integer(7) && b && c ==
manager->rational(0.5));
321 model = s.getModel();
325 EXPECT_EQ(7, model->getIntegerValue(a));
326 EXPECT_TRUE(model->getBooleanValue(b));
327 EXPECT_DOUBLE_EQ(0.5, model->getRationalValue(c));
328 EXPECT_NO_THROW(model->toString());
331TEST(Cvc5SmtSolver, AddNotCurrentModelWithUnconstrainedVariable) {
343 std::vector<bool> yValues;
345 yValues.push_back(s.getModelAsValuation().getBooleanValue(y));
346 s.addNotCurrentModel();
350 ASSERT_EQ(4ull, yValues.size());
351 EXPECT_NE(yValues[0], yValues[1]);
352 EXPECT_NE(yValues[2], yValues[3]);
355TEST(Cvc5SmtSolver, AddNotCurrentModelEnumeratesModelsIncrementally) {
362 s.add(x >=
manager->integer(0) && x <= manager->integer(3) && y >=
manager->integer(0) && y <= manager->integer(2));
365 uint64_t numberOfModels = 0;
368 ASSERT_LE(numberOfModels, 12ull);
369 s.addNotCurrentModel(
false);
371 EXPECT_EQ(12ull, numberOfModels);
374TEST(Cvc5SmtSolver, AddNotCurrentModelKeepsScopes) {
380 s.add(x >=
manager->integer(0) && x <= manager->integer(1));
384 s.addNotCurrentModel();
386 s.addNotCurrentModel();
390 ASSERT_NO_THROW(s.pop());
394TEST(Cvc5SmtSolver, AddNotCurrentModelWithOnlyBitVectorVariables) {
403 std::vector<int64_t> values;
405 values.push_back(s.getModelAsValuation().getIntegerValue(bv));
406 s.addNotCurrentModel();
410 ASSERT_EQ(2ull, values.size());
411 EXPECT_NE(values[0], values[1]);
414TEST(Cvc5SmtSolver, UnsatAssumptions) {
427 ASSERT_NO_THROW(s.add(exprFormula));
428 ASSERT_NO_THROW(result = s.checkWithAssumptions({exprB, exprNotB}));
431 std::vector<storm::expressions::Expression> unsatAssumptions = s.getUnsatAssumptions();
432 ASSERT_EQ(2ull, unsatAssumptions.size());
434 auto const isAssumptionB = [](
storm::expressions::Expression const& expression) {
return expression.isVariable() && expression.getIdentifier() ==
"b"; };
438 ASSERT_TRUE((isAssumptionB(unsatAssumptions[0]) && isAssumptionNotB(unsatAssumptions[1])) ||
439 (isAssumptionNotB(unsatAssumptions[0]) && isAssumptionB(unsatAssumptions[1])));
442 ASSERT_NO_THROW(result = s.checkWithAssumptions({exprB}));
444 ASSERT_ANY_THROW(s.getUnsatAssumptions());
447TEST(Cvc5SmtSolver, UnsatAssumptionsWithBooleanEquivalence) {
461 ASSERT_NO_THROW(result = s.checkWithAssumptions({equivalence, exprA, exprNotB}));
464 std::vector<storm::expressions::Expression> unsatAssumptions;
465 ASSERT_NO_THROW(unsatAssumptions = s.getUnsatAssumptions());
466 EXPECT_FALSE(unsatAssumptions.empty());
TEST(RegionConstraintCheckerTest, AffineConstraintHoldsThroughout)
This class is responsible for managing a set of typed variables and all expressions using these varia...
A simple implementation of the valuation interface.
virtual int_fast64_t getIntegerValue(Variable const &integerVariable) const override
Retrieves the value of the given integer variable.
virtual bool getBooleanValue(Variable const &booleanVariable) const override
Retrieves the value of the given boolean variable.
storm::expressions::Expression getExpression() const
Retrieves an expression that represents the variable.
CheckResult
possible check results
Expression iff(Expression const &first, Expression const &second)
Expression implies(Expression const &first, Expression const &second)
SettingsManager const & manager()
Retrieves the settings manager.