|
@ -4,6 +4,7 @@ |
|
|
|
|
|
|
|
|
#include "storm/modelchecker/multiobjective/deterministicScheds/DeterministicSchedsParetoExplorer.h"
|
|
|
#include "storm/modelchecker/multiobjective/deterministicScheds/DeterministicSchedsParetoExplorer.h"
|
|
|
#include "storm/storage/geometry/coordinates.h"
|
|
|
#include "storm/storage/geometry/coordinates.h"
|
|
|
|
|
|
#include "storm/storage/MaximalEndComponentDecomposition.h"
|
|
|
#include "storm/models/sparse/MarkovAutomaton.h"
|
|
|
#include "storm/models/sparse/MarkovAutomaton.h"
|
|
|
#include "storm/models/sparse/Mdp.h"
|
|
|
#include "storm/models/sparse/Mdp.h"
|
|
|
#include "storm/models/sparse/StandardRewardModel.h"
|
|
|
#include "storm/models/sparse/StandardRewardModel.h"
|
|
@ -68,7 +69,7 @@ namespace storm { |
|
|
return DominanceResult::Equal; |
|
|
return DominanceResult::Equal; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (*thisIt > *otherIt) { |
|
|
if (*thisIt > *otherIt) { |
|
|
// *this might dominate other
|
|
|
// *this might dominate other
|
|
|
for (++thisIt, ++otherIt; thisIt != thisItE; ++thisIt, ++otherIt) { |
|
|
for (++thisIt, ++otherIt; thisIt != thisItE; ++thisIt, ++otherIt) { |
|
@ -281,7 +282,20 @@ namespace storm { |
|
|
|
|
|
|
|
|
template <class SparseModelType, typename GeometryValueType> |
|
|
template <class SparseModelType, typename GeometryValueType> |
|
|
DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::DeterministicSchedsParetoExplorer(preprocessing::SparseMultiObjectivePreprocessorResult<SparseModelType>& preprocessorResult) : model(preprocessorResult.preprocessedModel), objectives(preprocessorResult.objectives) { |
|
|
DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::DeterministicSchedsParetoExplorer(preprocessing::SparseMultiObjectivePreprocessorResult<SparseModelType>& preprocessorResult) : model(preprocessorResult.preprocessedModel), objectives(preprocessorResult.objectives) { |
|
|
|
|
|
|
|
|
|
|
|
originalModelInitialState = *preprocessorResult.originalModel.getInitialStates().begin(); |
|
|
|
|
|
objectiveHelper.reserve(objectives.size()); |
|
|
|
|
|
for (auto const& obj : objectives) { |
|
|
|
|
|
objectiveHelper.emplace_back(*model, obj); |
|
|
|
|
|
} |
|
|
|
|
|
lpChecker = std::make_shared<DeterministicSchedsLpChecker<SparseModelType, GeometryValueType>>(*model, objectiveHelper); |
|
|
|
|
|
if (preprocessorResult.containsOnlyTotalRewardFormulas()) { |
|
|
|
|
|
wvChecker = storm::modelchecker::multiobjective::WeightVectorCheckerFactory<SparseModelType>::create(preprocessorResult); |
|
|
|
|
|
} else { |
|
|
|
|
|
wvChecker = nullptr; |
|
|
|
|
|
} |
|
|
if (storm::settings::getModule<storm::settings::modules::CoreSettings>().isShowStatisticsSet()) { |
|
|
if (storm::settings::getModule<storm::settings::modules::CoreSettings>().isShowStatisticsSet()) { |
|
|
|
|
|
storm::utility::Stopwatch sw(true); |
|
|
std::string modelname = "original-model"; |
|
|
std::string modelname = "original-model"; |
|
|
std::vector<SparseModelType const*> models; |
|
|
std::vector<SparseModelType const*> models; |
|
|
models.push_back(&preprocessorResult.originalModel); |
|
|
models.push_back(&preprocessorResult.originalModel); |
|
@ -295,21 +309,31 @@ namespace storm { |
|
|
storm::RationalNumber numChoices = storm::utility::convertNumber<storm::RationalNumber, uint64_t>(m->getNumberOfChoices()); |
|
|
storm::RationalNumber numChoices = storm::utility::convertNumber<storm::RationalNumber, uint64_t>(m->getNumberOfChoices()); |
|
|
numScheds *= storm::utility::max(storm::utility::one<storm::RationalNumber>(), numChoices); |
|
|
numScheds *= storm::utility::max(storm::utility::one<storm::RationalNumber>(), numChoices); |
|
|
} |
|
|
} |
|
|
STORM_PRINT_AND_LOG("#STATS " << numScheds << " memoryless deterministic schedulers in " << modelname << std::endl); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto numSchedsStr = storm::utility::to_string(numScheds); |
|
|
|
|
|
STORM_PRINT_AND_LOG("#STATS " << numSchedsStr.front() << "e" << (numSchedsStr.size() - 1) << " memoryless deterministic schedulers in " << modelname << std::endl); |
|
|
|
|
|
storm::storage::MaximalEndComponentDecomposition<ModelValueType> mecs(*m); |
|
|
|
|
|
uint64_t nonConstMecCounter = 0; |
|
|
|
|
|
uint64_t nonConstMecStateCounter = 0; |
|
|
|
|
|
for (auto const& mec : mecs) { |
|
|
|
|
|
bool mecHasNonConstValue = false; |
|
|
|
|
|
for (auto const& stateChoices : mec) { |
|
|
|
|
|
for (auto const& helper : objectiveHelper) { |
|
|
|
|
|
if (helper.getSchedulerIndependentStateValues().count(stateChoices.first) == 0) { |
|
|
|
|
|
++nonConstMecStateCounter; |
|
|
|
|
|
mecHasNonConstValue = true; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (mecHasNonConstValue) ++nonConstMecCounter; |
|
|
|
|
|
} |
|
|
|
|
|
STORM_PRINT_AND_LOG("#STATS " << nonConstMecCounter << " non-constant MECS in " << modelname << std::endl); |
|
|
|
|
|
STORM_PRINT_AND_LOG("#STATS " << nonConstMecStateCounter << " non-constant MEC States in " << modelname << std::endl); |
|
|
|
|
|
// Print the same statistics for the unfolded model as well.
|
|
|
modelname = "unfolded-model"; |
|
|
modelname = "unfolded-model"; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
originalModelInitialState = *preprocessorResult.originalModel.getInitialStates().begin(); |
|
|
|
|
|
objectiveHelper.reserve(objectives.size()); |
|
|
|
|
|
for (auto const& obj : objectives) { |
|
|
|
|
|
objectiveHelper.emplace_back(*model, obj); |
|
|
|
|
|
} |
|
|
|
|
|
lpChecker = std::make_shared<DeterministicSchedsLpChecker<SparseModelType, GeometryValueType>>(*model, objectiveHelper); |
|
|
|
|
|
if (preprocessorResult.containsOnlyTotalRewardFormulas()) { |
|
|
|
|
|
wvChecker = storm::modelchecker::multiobjective::WeightVectorCheckerFactory<SparseModelType>::create(preprocessorResult); |
|
|
|
|
|
} else { |
|
|
|
|
|
wvChecker = nullptr; |
|
|
|
|
|
|
|
|
sw.stop(); |
|
|
|
|
|
STORM_PRINT_AND_LOG("#STATS " << sw << " seconds for computing these statistics." << std::endl); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -433,7 +457,7 @@ namespace storm { |
|
|
} |
|
|
} |
|
|
unachievableAreas.push_back(area); |
|
|
unachievableAreas.push_back(area); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <class SparseModelType, typename GeometryValueType> |
|
|
template <class SparseModelType, typename GeometryValueType> |
|
|
typename DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::Polytope DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::negateMinObjectives(Polytope const& polytope) const { |
|
|
typename DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::Polytope DeterministicSchedsParetoExplorer<SparseModelType, GeometryValueType>::negateMinObjectives(Polytope const& polytope) const { |
|
|
std::vector<GeometryValueType> zeroRow(objectives.size(), storm::utility::zero<GeometryValueType>()); |
|
|
std::vector<GeometryValueType> zeroRow(objectives.size(), storm::utility::zero<GeometryValueType>()); |
|
|