You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

126 lines
5.5 KiB

#ifndef STORM_SOLVER_MATHSATSMTSOLVER
#define STORM_SOLVER_MATHSATSMTSOLVER
#include "storm-config.h"
#include "src/solver/SmtSolver.h"
#include "src/adapters/MathsatExpressionAdapter.h"
#include <boost/container/flat_map.hpp>
#ifdef STORM_HAVE_MSAT
#include "mathsat.h"
#endif
namespace storm {
namespace solver {
class MathsatSmtSolver : public SmtSolver {
public:
/*!
* A class that captures options that may be passed to the Mathsat solver. Settings these options has some
* implications due to the implementation of MathSAT. For example, enabling interpolation means that the
* solver must not be used for checking satisfiable formulas.
*/
class Options {
public:
Options(bool enableModelGeneration = true, bool enableUnsatCoreGeneration = false, bool enableInterpolantGeneration = false) : enableModelGeneration(enableModelGeneration), enableUnsatCoreGeneration(enableUnsatCoreGeneration), enableInterpolantGeneration(enableInterpolantGeneration) {
// Intentionally left empty.
}
bool enableModelGeneration = false;
bool enableUnsatCoreGeneration = false;
bool enableInterpolantGeneration = false;
};
#ifdef STORM_HAVE_MSAT
class MathsatAllsatModelReference : public SmtSolver::ModelReference {
public:
MathsatAllsatModelReference(storm::expressions::ExpressionManager const& manager, msat_env const& env, msat_term* model, std::unordered_map<storm::expressions::Variable, uint_fast64_t> const& variableNameToSlotMapping);
virtual bool getBooleanValue(storm::expressions::Variable const& variable) const override;
virtual int_fast64_t getIntegerValue(storm::expressions::Variable const& variable) const override;
virtual double getRationalValue(storm::expressions::Variable const& variable) const override;
private:
msat_env const& env;
msat_term* model;
std::unordered_map<storm::expressions::Variable, uint_fast64_t> const& variableToSlotMapping;
};
#endif
#ifdef STORM_HAVE_MSAT
class MathsatModelReference : public SmtSolver::ModelReference {
public:
MathsatModelReference(storm::expressions::ExpressionManager const& manager, msat_env const& env, storm::adapters::MathsatExpressionAdapter& expressionAdapter);
virtual bool getBooleanValue(storm::expressions::Variable const& variable) const override;
virtual int_fast64_t getIntegerValue(storm::expressions::Variable const& variable) const override;
virtual double getRationalValue(storm::expressions::Variable const& variable) const override;
private:
msat_env const& env;
storm::adapters::MathsatExpressionAdapter& expressionAdapter;
};
#endif
MathsatSmtSolver(storm::expressions::ExpressionManager& manager, Options const& options = Options());
virtual ~MathsatSmtSolver();
virtual void push() override;
virtual void pop() override;
virtual void pop(uint_fast64_t n) override;
virtual void reset() override;
virtual void add(storm::expressions::Expression const& assertion) override;
virtual CheckResult check() override;
virtual CheckResult checkWithAssumptions(std::set<storm::expressions::Expression> const& assumptions) override;
#ifndef WINDOWS
virtual CheckResult checkWithAssumptions(std::initializer_list<storm::expressions::Expression> const& assumptions) override;
#endif
virtual storm::expressions::SimpleValuation getModelAsValuation() override;
virtual std::shared_ptr<SmtSolver::ModelReference> getModel() override;
virtual std::vector<storm::expressions::SimpleValuation> allSat(std::vector<storm::expressions::Variable> const& important) override;
virtual uint_fast64_t allSat(std::vector<storm::expressions::Variable> const& important, std::function<bool(storm::expressions::SimpleValuation&)> const& callback) override;
virtual uint_fast64_t allSat(std::vector<storm::expressions::Variable> const& important, std::function<bool(ModelReference&)> const& callback) override;
virtual std::vector<storm::expressions::Expression> getUnsatAssumptions() override;
virtual void setInterpolationGroup(uint_fast64_t group) override;
virtual storm::expressions::Expression getInterpolant(std::vector<uint_fast64_t> const& groupsA) override;
private:
storm::expressions::SimpleValuation convertMathsatModelToValuation();
#ifdef STORM_HAVE_MSAT
// The MathSAT environment.
msat_env env;
// The expression adapter used to translate expressions to MathSAT's format. This has to be a pointer, since
// it must be initialized after creating the environment, but the adapter class has no default constructor.
std::unique_ptr<storm::adapters::MathsatExpressionAdapter> expressionAdapter;
#endif
// A flag storing whether the last call was a check involving assumptions.
bool lastCheckAssumptions;
// The result of the last call to any of the check methods.
CheckResult lastResult;
// A mapping of interpolation group indices to their MathSAT identifier.
typedef boost::container::flat_map<uint_fast64_t, int> InterpolationGroupMapType;
InterpolationGroupMapType interpolationGroups;
};
}
}
#endif // STORM_SOLVER_MATHSATSMTSOLVER