6 changed files with 317 additions and 0 deletions
-
67src/storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.cpp
-
31src/storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.h
-
71src/storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.cpp
-
31src/storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.h
-
73src/storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.cpp
-
44src/storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h
@ -0,0 +1,67 @@ |
|||||
|
#include "storm-pars/modelchecker/region/ValidatingSparseDtmcParameterLiftingModelChecker.h"
|
||||
|
#include "storm-pars/transformer/SparseParametricDtmcSimplifier.h"
|
||||
|
|
||||
|
#include "storm/models/sparse/Dtmc.h"
|
||||
|
#include "storm/utility/macros.h"
|
||||
|
|
||||
|
#include "storm/exceptions/UnexpectedException.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseDtmcParameterLiftingModelChecker() { |
||||
|
// Intentionally left empty
|
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
void ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { |
||||
|
STORM_LOG_ASSERT(this->canHandle(parametricModel, checkTask), "specified model and formula can not be handled by this."); |
||||
|
|
||||
|
auto dtmc = parametricModel->template as<SparseModelType>(); |
||||
|
auto simplifier = storm::transformer::SparseParametricDtmcSimplifier<SparseModelType>(*dtmc); |
||||
|
|
||||
|
if (!simplifier.simplify(checkTask.getFormula())) { |
||||
|
STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Simplifying the model was not successfull."); |
||||
|
} |
||||
|
|
||||
|
auto simplifiedTask = checkTask.substituteFormula(*simplifier.getSimplifiedFormula()); |
||||
|
|
||||
|
impreciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); |
||||
|
preciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() { |
||||
|
return impreciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() const { |
||||
|
return impreciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() { |
||||
|
return preciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() const { |
||||
|
return preciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
void ValidatingSparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::applyHintsToPreciseChecker() { |
||||
|
|
||||
|
if (impreciseChecker.getCurrentMaxScheduler()) { |
||||
|
preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType<PreciseType>(); |
||||
|
} |
||||
|
if (impreciseChecker.getCurrentMinScheduler()) { |
||||
|
preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType<PreciseType>(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template class ValidatingSparseDtmcParameterLiftingModelChecker<storm::models::sparse::Dtmc<storm::RationalFunction>, double, storm::RationalNumber>; |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h" |
||||
|
#include "storm-pars/modelchecker/region/SparseDtmcParameterLiftingModelChecker.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
class ValidatingSparseDtmcParameterLiftingModelChecker : public ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType> { |
||||
|
public: |
||||
|
ValidatingSparseDtmcParameterLiftingModelChecker(); |
||||
|
virtual ~ValidatingSparseDtmcParameterLiftingModelChecker() = default; |
||||
|
|
||||
|
virtual void specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; |
||||
|
|
||||
|
protected: |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const override; |
||||
|
|
||||
|
virtual void applyHintsToPreciseChecker() override ; |
||||
|
|
||||
|
private: |
||||
|
SparseDtmcParameterLiftingModelChecker<SparseModelType, ImpreciseType> impreciseChecker; |
||||
|
SparseDtmcParameterLiftingModelChecker<SparseModelType, PreciseType> preciseChecker; |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
#include "storm-pars/modelchecker/region/ValidatingSparseMdpParameterLiftingModelChecker.h"
|
||||
|
#include "storm-pars/transformer/SparseParametricMdpSimplifier.h"
|
||||
|
|
||||
|
#include "storm/models/sparse/Mdp.h"
|
||||
|
#include "storm/utility/macros.h"
|
||||
|
|
||||
|
#include "storm/exceptions/UnexpectedException.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseMdpParameterLiftingModelChecker() { |
||||
|
// Intentionally left empty
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
void ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) { |
||||
|
STORM_LOG_ASSERT(this->canHandle(parametricModel, checkTask), "specified model and formula can not be handled by this."); |
||||
|
|
||||
|
auto mdp = parametricModel->template as<SparseModelType>(); |
||||
|
auto simplifier = storm::transformer::SparseParametricMdpSimplifier<SparseModelType>(*mdp); |
||||
|
|
||||
|
if (!simplifier.simplify(checkTask.getFormula())) { |
||||
|
STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Simplifying the model was not successfull."); |
||||
|
} |
||||
|
|
||||
|
auto simplifiedTask = checkTask.substituteFormula(*simplifier.getSimplifiedFormula()); |
||||
|
|
||||
|
impreciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); |
||||
|
preciseChecker.specify(simplifier.getSimplifiedModel(), simplifiedTask, true); |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() { |
||||
|
return impreciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getImpreciseChecker() const { |
||||
|
return impreciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() { |
||||
|
return preciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::getPreciseChecker() const { |
||||
|
return preciseChecker; |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
void ValidatingSparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::applyHintsToPreciseChecker() { |
||||
|
|
||||
|
if (impreciseChecker.getCurrentMaxScheduler()) { |
||||
|
preciseChecker.getCurrentMaxScheduler() = impreciseChecker.getCurrentMaxScheduler()->template toValueType<PreciseType>(); |
||||
|
} |
||||
|
if (impreciseChecker.getCurrentMinScheduler()) { |
||||
|
preciseChecker.getCurrentMinScheduler() = impreciseChecker.getCurrentMinScheduler()->template toValueType<PreciseType>(); |
||||
|
} |
||||
|
if (impreciseChecker.getCurrentPlayer1Scheduler()) { |
||||
|
preciseChecker.getCurrentPlayer1Scheduler() = impreciseChecker.getCurrentPlayer1Scheduler()->template toValueType<PreciseType>(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template class ValidatingSparseMdpParameterLiftingModelChecker<storm::models::sparse::Mdp<storm::RationalFunction>, double, storm::RationalNumber>; |
||||
|
} |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h" |
||||
|
#include "storm-pars/modelchecker/region/SparseMdpParameterLiftingModelChecker.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
class ValidatingSparseMdpParameterLiftingModelChecker : public ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType> { |
||||
|
public: |
||||
|
ValidatingSparseMdpParameterLiftingModelChecker(); |
||||
|
virtual ~ValidatingSparseMdpParameterLiftingModelChecker() = default; |
||||
|
|
||||
|
virtual void specify(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) override; |
||||
|
|
||||
|
protected: |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() override; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const override; |
||||
|
|
||||
|
virtual void applyHintsToPreciseChecker() override ; |
||||
|
|
||||
|
private: |
||||
|
SparseMdpParameterLiftingModelChecker<SparseModelType, ImpreciseType> impreciseChecker; |
||||
|
SparseMdpParameterLiftingModelChecker<SparseModelType, PreciseType> preciseChecker; |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
@ -0,0 +1,73 @@ |
|||||
|
#include "storm-pars/modelchecker/region/ValidatingSparseParameterLiftingModelChecker.h"
|
||||
|
|
||||
|
#include "storm/adapters/RationalFunctionAdapter.h"
|
||||
|
#include "storm/modelchecker/results/ExplicitQualitativeCheckResult.h"
|
||||
|
#include "storm/settings/SettingsManager.h"
|
||||
|
#include "storm/settings/modules/CoreSettings.h"
|
||||
|
#include "storm/models/sparse/Dtmc.h"
|
||||
|
#include "storm/models/sparse/Mdp.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::ValidatingSparseParameterLiftingModelChecker() : numOfWrongRegions(0) { |
||||
|
// Intentionally left empty
|
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::~ValidatingSparseParameterLiftingModelChecker() { |
||||
|
if (storm::settings::getModule<storm::settings::modules::CoreSettings>().isShowStatisticsSet()) { |
||||
|
STORM_PRINT_AND_LOG("Validating Parameter Lifting Model Checker detected " << numOfWrongRegions << " regions where the imprecise method was wrong."); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
bool ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::canHandle(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) const { |
||||
|
return getImpreciseChecker().canHandle(parametricModel, checkTask) && getPreciseChecker().canHandle(parametricModel, checkTask); |
||||
|
}; |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
RegionResult ValidatingSparseParameterLiftingModelChecker<SparseModelType, ImpreciseType, PreciseType>::analyzeRegion(storm::storage::ParameterRegion<typename SparseModelType::ValueType> const& region, RegionResult const& initialResult, bool sampleVerticesOfRegion) { |
||||
|
|
||||
|
RegionResult currentResult = getImpreciseChecker().analyzeRegion(region, initialResult); |
||||
|
|
||||
|
if (currentResult == RegionResult::AllSat || currentResult == RegionResult::AllViolated) { |
||||
|
applyHintsToPreciseChecker(); |
||||
|
|
||||
|
storm::solver::OptimizationDirection parameterOptDir = getPreciseChecker().getCurrentCheckTask().getOptimizationDirection(); |
||||
|
if (currentResult == RegionResult::AllViolated) { |
||||
|
parameterOptDir = storm::solver::invert(parameterOptDir); |
||||
|
} |
||||
|
|
||||
|
bool preciseResult = getPreciseChecker().check(region, parameterOptDir)->asExplicitQualitativeCheckResult()[*getPreciseChecker().getConsideredParametricModel().getInitialStates().begin()]; |
||||
|
bool preciseResultAgrees = preciseResult == (currentResult == RegionResult::AllSat); |
||||
|
|
||||
|
if (!preciseResultAgrees) { |
||||
|
// Imprecise result is wrong!
|
||||
|
currentResult = RegionResult::Unknown; |
||||
|
++numOfWrongRegions; |
||||
|
|
||||
|
// Check the other direction
|
||||
|
parameterOptDir = storm::solver::invert(parameterOptDir); |
||||
|
preciseResult = getPreciseChecker().check(region, parameterOptDir)->asExplicitQualitativeCheckResult()[*getPreciseChecker().getConsideredParametricModel().getInitialStates().begin()]; |
||||
|
if (preciseResult && parameterOptDir == getPreciseChecker().getCurrentCheckTask().getOptimizationDirection()) { |
||||
|
currentResult = RegionResult::AllSat; |
||||
|
} else if (!preciseResult && parameterOptDir == storm::solver::invert(getPreciseChecker().getCurrentCheckTask().getOptimizationDirection())) { |
||||
|
currentResult = RegionResult::AllViolated; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (sampleVerticesOfRegion && currentResult != RegionResult::AllSat && currentResult != RegionResult::AllViolated) { |
||||
|
currentResult = getPreciseChecker().sampleVertices(region, currentResult); |
||||
|
} |
||||
|
|
||||
|
return currentResult; |
||||
|
} |
||||
|
|
||||
|
template class ValidatingSparseParameterLiftingModelChecker<storm::models::sparse::Dtmc<storm::RationalFunction>, double, storm::RationalNumber>; |
||||
|
template class ValidatingSparseParameterLiftingModelChecker<storm::models::sparse::Mdp<storm::RationalFunction>, double, storm::RationalNumber>; |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include "storm-pars/modelchecker/region/RegionModelChecker.h" |
||||
|
#include "storm-pars/modelchecker/region/SparseParameterLiftingModelChecker.h" |
||||
|
#include "storm-pars/storage/ParameterRegion.h" |
||||
|
#include "storm/utility/NumberTraits.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
|
||||
|
template <typename SparseModelType, typename ImpreciseType, typename PreciseType> |
||||
|
class ValidatingSparseParameterLiftingModelChecker : public RegionModelChecker<typename SparseModelType::ValueType> { |
||||
|
static_assert(storm::NumberTraits<PreciseType>::IsExact, "Specified type for exact computations is not exact."); |
||||
|
|
||||
|
public: |
||||
|
ValidatingSparseParameterLiftingModelChecker(); |
||||
|
virtual ~ValidatingSparseParameterLiftingModelChecker(); |
||||
|
|
||||
|
virtual bool canHandle(std::shared_ptr<storm::models::ModelBase> parametricModel, CheckTask<storm::logic::Formula, typename SparseModelType::ValueType> const& checkTask) const override; |
||||
|
|
||||
|
/*! |
||||
|
* Analyzes the given region by means of parameter lifting. |
||||
|
* We first apply unsound solution methods (standard value iteratio with doubles) and then validate the obtained result |
||||
|
* by means of exact and soud methods. |
||||
|
*/ |
||||
|
virtual RegionResult analyzeRegion(storm::storage::ParameterRegion<typename SparseModelType::ValueType> const& region, RegionResult const& initialResult = RegionResult::Unknown, bool sampleVerticesOfRegion = false) override; |
||||
|
|
||||
|
protected: |
||||
|
|
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType>& getImpreciseChecker() = 0; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, ImpreciseType> const& getImpreciseChecker() const = 0; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType>& getPreciseChecker() = 0; |
||||
|
virtual SparseParameterLiftingModelChecker<SparseModelType, PreciseType> const& getPreciseChecker() const = 0; |
||||
|
|
||||
|
virtual void applyHintsToPreciseChecker() = 0; |
||||
|
|
||||
|
private: |
||||
|
|
||||
|
// Information for statistics |
||||
|
uint_fast64_t numOfWrongRegions; |
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue