129 lines
9.3 KiB
129 lines
9.3 KiB
#include "storm/models/symbolic/Ctmc.h"
|
|
|
|
#include "storm/storage/dd/DdManager.h"
|
|
#include "storm/storage/dd/Add.h"
|
|
#include "storm/storage/dd/Bdd.h"
|
|
|
|
#include "storm/models/symbolic/StandardRewardModel.h"
|
|
|
|
#include "storm/adapters/RationalFunctionAdapter.h"
|
|
|
|
namespace storm {
|
|
namespace models {
|
|
namespace symbolic {
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
Ctmc<Type, ValueType>::Ctmc(std::shared_ptr<storm::dd::DdManager<Type>> manager,
|
|
storm::dd::Bdd<Type> reachableStates,
|
|
storm::dd::Bdd<Type> initialStates,
|
|
storm::dd::Bdd<Type> deadlockStates,
|
|
storm::dd::Add<Type, ValueType> transitionMatrix,
|
|
std::set<storm::expressions::Variable> const& rowVariables,
|
|
std::shared_ptr<storm::adapters::AddExpressionAdapter<Type, ValueType>> rowExpressionAdapter,
|
|
std::set<storm::expressions::Variable> const& columnVariables,
|
|
std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
|
|
std::map<std::string, storm::expressions::Expression> labelToExpressionMap,
|
|
std::unordered_map<std::string, RewardModelType> const& rewardModels)
|
|
: DeterministicModel<Type, ValueType>(storm::models::ModelType::Ctmc, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, rowColumnMetaVariablePairs, labelToExpressionMap, rewardModels) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
Ctmc<Type, ValueType>::Ctmc(std::shared_ptr<storm::dd::DdManager<Type>> manager,
|
|
storm::dd::Bdd<Type> reachableStates,
|
|
storm::dd::Bdd<Type> initialStates,
|
|
storm::dd::Bdd<Type> deadlockStates,
|
|
storm::dd::Add<Type, ValueType> transitionMatrix,
|
|
boost::optional<storm::dd::Add<Type, ValueType>> exitRateVector,
|
|
std::set<storm::expressions::Variable> const& rowVariables,
|
|
std::shared_ptr<storm::adapters::AddExpressionAdapter<Type, ValueType>> rowExpressionAdapter,
|
|
std::set<storm::expressions::Variable> const& columnVariables,
|
|
std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
|
|
std::map<std::string, storm::expressions::Expression> labelToExpressionMap,
|
|
std::unordered_map<std::string, RewardModelType> const& rewardModels)
|
|
: DeterministicModel<Type, ValueType>(storm::models::ModelType::Ctmc, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, rowExpressionAdapter, columnVariables, rowColumnMetaVariablePairs, labelToExpressionMap, rewardModels), exitRates(exitRateVector) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
Ctmc<Type, ValueType>::Ctmc(std::shared_ptr<storm::dd::DdManager<Type>> manager,
|
|
storm::dd::Bdd<Type> reachableStates,
|
|
storm::dd::Bdd<Type> initialStates,
|
|
storm::dd::Bdd<Type> deadlockStates,
|
|
storm::dd::Add<Type, ValueType> transitionMatrix,
|
|
std::set<storm::expressions::Variable> const& rowVariables,
|
|
std::set<storm::expressions::Variable> const& columnVariables,
|
|
std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
|
|
std::map<std::string, storm::dd::Bdd<Type>> labelToBddMap,
|
|
std::unordered_map<std::string, RewardModelType> const& rewardModels)
|
|
: DeterministicModel<Type, ValueType>(storm::models::ModelType::Ctmc, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, columnVariables, rowColumnMetaVariablePairs, labelToBddMap, rewardModels) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
Ctmc<Type, ValueType>::Ctmc(std::shared_ptr<storm::dd::DdManager<Type>> manager,
|
|
storm::dd::Bdd<Type> reachableStates,
|
|
storm::dd::Bdd<Type> initialStates,
|
|
storm::dd::Bdd<Type> deadlockStates,
|
|
storm::dd::Add<Type, ValueType> transitionMatrix,
|
|
boost::optional<storm::dd::Add<Type, ValueType>> exitRateVector,
|
|
std::set<storm::expressions::Variable> const& rowVariables,
|
|
std::set<storm::expressions::Variable> const& columnVariables,
|
|
std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
|
|
std::map<std::string, storm::dd::Bdd<Type>> labelToBddMap,
|
|
std::unordered_map<std::string, RewardModelType> const& rewardModels)
|
|
: DeterministicModel<Type, ValueType>(storm::models::ModelType::Ctmc, manager, reachableStates, initialStates, deadlockStates, transitionMatrix, rowVariables, columnVariables, rowColumnMetaVariablePairs, labelToBddMap, rewardModels), exitRates(exitRateVector) {
|
|
// Intentionally left empty.
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> const& Ctmc<Type, ValueType>::getExitRateVector() const {
|
|
if (!exitRates) {
|
|
exitRates = this->getTransitionMatrix().sumAbstract(this->getColumnVariables());
|
|
}
|
|
return exitRates.get();
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
void Ctmc<Type, ValueType>::reduceToStateBasedRewards() {
|
|
for (auto& rewardModel : this->getRewardModels()) {
|
|
if (rewardModel.second.hasStateActionRewards()) {
|
|
rewardModel.second.getStateActionRewardVector() *= getExitRateVector();
|
|
}
|
|
rewardModel.second.reduceToStateBasedRewards(this->getTransitionMatrix(), this->getRowVariables(), this->getColumnVariables(), true);
|
|
}
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
storm::dd::Add<Type, ValueType> Ctmc<Type, ValueType>::computeProbabilityMatrix() const {
|
|
return this->getTransitionMatrix() / this->getExitRateVector();
|
|
}
|
|
|
|
template<storm::dd::DdType Type, typename ValueType>
|
|
template<typename NewValueType>
|
|
std::shared_ptr<Ctmc<Type, NewValueType>> Ctmc<Type, ValueType>::toValueType() const {
|
|
typedef typename DeterministicModel<Type, NewValueType>::RewardModelType NewRewardModelType;
|
|
std::unordered_map<std::string, NewRewardModelType> newRewardModels;
|
|
|
|
for (auto const& e : this->getRewardModels()) {
|
|
newRewardModels.emplace(e.first, e.second.template toValueType<NewValueType>());
|
|
}
|
|
|
|
auto newLabelToBddMap = this->getLabelToBddMap();
|
|
newLabelToBddMap.erase("init");
|
|
newLabelToBddMap.erase("deadlock");
|
|
|
|
return std::make_shared<Ctmc<Type, NewValueType>>(this->getManagerAsSharedPointer(), this->getReachableStates(), this->getInitialStates(), this->getDeadlockStates(), this->getTransitionMatrix().template toValueType<NewValueType>(), this->getExitRateVector().template toValueType<NewValueType>(), this->getRowVariables(), this->getColumnVariables(), this->getRowColumnMetaVariablePairs(), newLabelToBddMap, newRewardModels);
|
|
}
|
|
|
|
// Explicitly instantiate the template class.
|
|
template class Ctmc<storm::dd::DdType::CUDD, double>;
|
|
template class Ctmc<storm::dd::DdType::Sylvan, double>;
|
|
|
|
template class Ctmc<storm::dd::DdType::Sylvan, storm::RationalNumber>;
|
|
template std::shared_ptr<Ctmc<storm::dd::DdType::Sylvan, double>> Ctmc<storm::dd::DdType::Sylvan, storm::RationalNumber>::toValueType() const;
|
|
template class Ctmc<storm::dd::DdType::Sylvan, storm::RationalFunction>;
|
|
|
|
} // namespace symbolic
|
|
} // namespace models
|
|
} // namespace storm
|