11 std::shared_ptr<storm::logic::Formula const>
const& formula) {
18 std::shared_ptr<storm::logic::Formula const>
const& formula) {
24 std::shared_ptr<storm::logic::Formula const>
const& formula,
27 STORM_LOG_THROW(formula->isProbabilityOperatorFormula(), storm::exceptions::InvalidPropertyException,
28 "Counterexample generation does not support this kind of formula. Expecting a probability operator as the outermost formula element.");
30 STORM_LOG_THROW(probabilityOperator.
hasBound(), storm::exceptions::InvalidPropertyException,
"Counterexample generation only supports bounded formulas.");
32 "Counterexample generation only supports upper bounds.");
35 STORM_LOG_THROW(subformula.isEventuallyFormula(), storm::exceptions::InvalidPropertyException,
36 "Path formula is required to be of the form 'F psi' for counterexample generation.");
38 STORM_LOG_THROW(model->getInitialStates().getNumberOfSetBits() == 1, storm::exceptions::NotSupportedException,
39 "k-shortest paths is only supported for models with a unique initial state.");
40 size_t initialState = *(model->getInitialStates().begin());
47 std::unique_ptr<storm::modelchecker::CheckResult> subResult = modelchecker.
check(env, eventuallyFormula.
getSubformula());
53 env,
false, model->getTransitionMatrix(), model->getBackwardTransitions(), phiStates, subQualitativeResult.
getTruthValuesVector(),
true);
54 double reachProb = results.at(initialState);
55 STORM_LOG_THROW((reachProb > threshold) || (strictBound && reachProb >= threshold), storm::exceptions::InvalidArgumentException,
56 "Given probability threshold " << threshold <<
" cannot be " << (strictBound ?
"achieved" :
"exceeded")
57 <<
" in model with maximal reachability probability of " << reachProb <<
".");
61 double probability = 0;
62 bool thresholdExceeded =
false;
63 for (
size_t k = 1; k <= maxK; ++k) {
64 cex.
addPath(generator.getPathAsList(k), k);
65 probability += generator.getDistance(k);
67 if ((probability > threshold) || (strictBound && probability >= threshold && strictBound)) {
68 thresholdExceeded =
true;
72 STORM_LOG_WARN_COND(thresholdExceeded,
"Aborted computation because maximal number of paths was reached. Probability threshold is not yet exceeded.");
74 return std::make_shared<storm::counterexamples::PathCounterexample<double>>(cex);
static std::shared_ptr< HighLevelCounterexample > computeCounterexample(Environment const &env, storm::storage::SymbolicModelDescription const &symbolicModel, storm::models::sparse::Mdp< T > const &mdp, std::shared_ptr< storm::logic::Formula const > const &formula)
Computes a (minimal) counterexample with respect to the number of prism commands for the given model ...
void addPath(std::vector< storage::sparse::state_type > path, size_t k)
static std::shared_ptr< HighLevelCounterexample > computeCounterexample(Environment const &env, storm::storage::SymbolicModelDescription const &symbolicModel, storm::models::sparse::Model< T > const &model, std::shared_ptr< storm::logic::Formula const > const &formula)
virtual std::unique_ptr< CheckResult > check(Environment const &env, CheckTask< storm::logic::Formula, SolutionType > const &checkTask)
Checks the provided formula.
ExplicitQualitativeCheckResult & asExplicitQualitativeCheckResult()
vector_type const & getTruthValuesVector() const
static std::vector< ValueType > computeUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates, bool qualitative, ModelCheckerHint const &hint=ModelCheckerHint())
This class represents a (discrete-time) Markov decision process.
Base class for all sparse models.
A bit vector that is internally represented as a vector of 64-bit values.
#define STORM_LOG_WARN_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::shared_ptr< storm::counterexamples::Counterexample > computeHighLevelCounterexampleMilp(storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Mdp< double > > mdp, std::shared_ptr< storm::logic::Formula const > const &formula)
std::shared_ptr< storm::counterexamples::Counterexample > computeHighLevelCounterexampleMaxSmt(storm::storage::SymbolicModelDescription const &symbolicModel, std::shared_ptr< storm::models::sparse::Model< double > > model, std::shared_ptr< storm::logic::Formula const > const &formula)
std::shared_ptr< storm::counterexamples::Counterexample > computeKShortestPathCounterexample(std::shared_ptr< storm::models::sparse::Model< double > > model, std::shared_ptr< storm::logic::Formula const > const &formula, size_t maxK)
bool isLowerBound(ComparisonType t)