TimQu
7 years ago
2 changed files with 119 additions and 0 deletions
-
80src/storm/modelchecker/multiobjective/deterministicScheds/DetSchedsWeightVectorChecker.cpp
-
39src/storm/modelchecker/multiobjective/deterministicScheds/DetSchedsWeightVectorChecker.h
@ -0,0 +1,80 @@ |
|||||
|
#include "storm/modelchecker/multiobjective/deterministicScheds/DetSchedsWeightVectorChecker.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace modelchecker { |
||||
|
namespace multiobjective { |
||||
|
|
||||
|
template <typename ModelType> |
||||
|
DetSchedsWeightVectorChecker<ModelType>::DetSchedsWeightVectorChecker(std::shared_ptr<MultiObjectiveSchedulerEvaluator<ModelType>> const& schedulerEvaluator) : schedulerEvaluator(schedulerEvaluator) { |
||||
|
// Intentionally left empty;
|
||||
|
} |
||||
|
|
||||
|
template <typename ModelType> |
||||
|
std::vector<std::vector<typename DetSchedsWeightVectorChecker<ModelType>::ValueType>> DetSchedsWeightVectorChecker<ModelType>::check(Environment const& env, std::vector<ValueType> const& weightVector) { |
||||
|
std::vector<std::vector<ValueType>> resultStack; |
||||
|
auto const& transitionMatrix = schedulerEvaluator->getModel().getTransitionMatrix(); |
||||
|
auto const& choiceIndices = schedulerEvaluator->getModel().getNondeterministicChoiceIndices(); |
||||
|
|
||||
|
uint64_t const numObjectives = weightVector.size(); |
||||
|
|
||||
|
// perform policy-iteration and store the intermediate results on the stack
|
||||
|
do { |
||||
|
schedulerEvaluator->check(env); |
||||
|
resultStack.push_back(schedulerEvaluator->getInitialStateResults()); |
||||
|
|
||||
|
auto const& stateResults = schedulerEvaluator->getResults(); |
||||
|
|
||||
|
// Check if scheduler choices can be improved
|
||||
|
auto const& scheduler = schedulerEvaluator->getScheduler(); |
||||
|
for (uint64_t state = 0; state < scheduler.size(); ++state) { |
||||
|
uint64_t choiceOffset = choiceIndices[state]; |
||||
|
uint64_t numChoices = choiceIndices[state + 1] - choiceOffset; |
||||
|
uint64_t currChoice = scheduler[state]; |
||||
|
|
||||
|
ValueType currChoiceValue = storm::utility::zero<ValueType>(); |
||||
|
for (uint64_t objIndex = 0; objIndex < numObjectives; ++objIndex) { |
||||
|
currChoiceValue += weightVector[objIndex] * stateResults[objIndex][state]; |
||||
|
} |
||||
|
|
||||
|
for (uint64_t choice = 0; choice < numChoices; ++choice) { |
||||
|
// Skip the currently selected choice
|
||||
|
if (choice == currChoice) { |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
ValueType choiceValue = storm::utility::zero<ValueType>(); |
||||
|
for (uint64_t objIndex = 0; objIndex < numObjectives; ++objIndex) { |
||||
|
if (schedulerEvaluator->getSchedulerIndependentStates(objIndex).get(state)) { |
||||
|
choiceValue += weightVector[objIndex] * stateResults[objIndex][state]; |
||||
|
} else { |
||||
|
ValueType objValue = storm::utility::zero<ValueType>(); |
||||
|
for (auto const& entry : transitionMatrix.getRow(choiceOffset + choice)) { |
||||
|
objValue += entry.getValue() * stateResults[objIndex][entry.getColumn()]; |
||||
|
} |
||||
|
choiceValue += weightVector[objIndex] * objValue; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (choiceValue > currChoiceValue) { |
||||
|
schedulerEvaluator->setChoiceAtState(state, choice); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} while (!schedulerEvaluator->hasCurrentSchedulerBeenChecked()); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
template <typename ModelType> |
||||
|
std::vector<typename DetSchedsWeightVectorChecker<ModelType>::ValueType> const& DetSchedsWeightVectorChecker<ModelType>::getResultForAllStates(uint64_t objIndex) const { |
||||
|
return schedulerEvaluator->getResultForObjective(objIndex); |
||||
|
} |
||||
|
|
||||
|
template <typename ModelType> |
||||
|
std::vector<uint64_t> const& DetSchedsWeightVectorChecker<ModelType>::getScheduler() const { |
||||
|
return schedulerEvaluator->getScheduler(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,39 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include <vector> |
||||
|
|
||||
|
#include "storm/modelchecker/multiobjective/deterministicScheds/MultiObjectiveSchedulerEvaluator.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
|
||||
|
class Environment; |
||||
|
|
||||
|
namespace modelchecker { |
||||
|
namespace multiobjective { |
||||
|
|
||||
|
template <typename ModelType> |
||||
|
class DetSchedsWeightVectorChecker { |
||||
|
public: |
||||
|
|
||||
|
typedef typename ModelType::ValueType ValueType; |
||||
|
|
||||
|
DetSchedsWeightVectorChecker(std::shared_ptr<MultiObjectiveSchedulerEvaluator<ModelType>> const& schedulerEvaluator); |
||||
|
|
||||
|
/*! |
||||
|
* Optimizes the objectives in the given direction. |
||||
|
* Returns a sequence of points such that all points are achievable and the last point is the farest point in the given direction. |
||||
|
* After calling this, getResultForAllStates and getScheduler yield results with respect to that last point. |
||||
|
*/ |
||||
|
std::vector<std::vector<ValueType>> check(Environment const& env, std::vector<ValueType> const& weightVector); |
||||
|
|
||||
|
std::vector<ValueType> const& getResultForAllStates(uint64_t objIndex) const; |
||||
|
std::vector<uint64_t> const& getScheduler() const; |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<MultiObjectiveSchedulerEvaluator<ModelType>> schedulerEvaluator; |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue