17namespace transformer {
20 LabelInformation(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas) {
21 for (
auto const& formula : formulas) {
22 std::vector<std::shared_ptr<storm::logic::AtomicLabelFormula const>> atomicLabelFormulas = formula->getAtomicLabelFormulas();
23 for (
auto const& labelFormula : atomicLabelFormulas) {
27 std::vector<std::shared_ptr<storm::logic::AtomicExpressionFormula const>> atomicExpressionFormulas = formula->getAtomicExpressionFormulas();
28 for (
auto const& expressionFormula : atomicExpressionFormulas) {
30 ss << expressionFormula->getExpression();
40template<storm::dd::DdType Type,
typename ValueType>
45 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
46 for (
auto const& rewardModelNameAndModel : symbolicDtmc.
getRewardModels()) {
47 std::optional<std::vector<ValueType>> stateRewards;
48 std::optional<std::vector<ValueType>> stateActionRewards;
49 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
50 if (rewardModelNameAndModel.second.hasStateRewards()) {
51 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(this->odd);
53 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
54 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(this->odd);
56 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
57 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(this->odd, this->odd);
59 rewardModels.emplace(rewardModelNameAndModel.first,
66 if (formulas.empty()) {
67 for (
auto const& label : symbolicDtmc.
getLabels()) {
79 return std::make_shared<storm::models::sparse::Dtmc<ValueType>>(transitionMatrix, labelling, rewardModels);
82template<storm::dd::DdType Type,
typename ValueType>
87template<storm::dd::DdType Type,
typename ValueType>
93 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
94 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
95 for (
auto const& rewardModelNameAndModel : symbolicMdp.
getRewardModels()) {
96 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
97 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
98 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
103 std::vector<std::vector<ValueType>> actionRewardVectors;
104 if (symbolicActionRewardVectors.empty()) {
108 transitionMatrix = std::move(matrRewards.first);
109 actionRewardVectors = std::move(matrRewards.second);
113 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
114 for (
auto const& rewardModelNameAndModel : symbolicMdp.
getRewardModels()) {
115 std::optional<std::vector<ValueType>> stateRewards;
116 std::optional<std::vector<ValueType>> stateActionRewards;
117 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
118 if (rewardModelNameAndModel.second.hasStateRewards()) {
119 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
121 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
122 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
123 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
125 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
126 "Translation of symbolic to explicit transition rewards is not yet supported.");
127 rewardModels.emplace(rewardModelNameAndModel.first,
135 if (formulas.empty()) {
136 for (
auto const& label : symbolicMdp.
getLabels()) {
149 return std::make_shared<storm::models::sparse::Mdp<ValueType>>(transitionMatrix, labelling, rewardModels);
152template<storm::dd::DdType Type,
typename ValueType>
157 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
158 for (
auto const& rewardModelNameAndModel : symbolicCtmc.
getRewardModels()) {
159 std::optional<std::vector<ValueType>> stateRewards;
160 std::optional<std::vector<ValueType>> stateActionRewards;
161 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
162 if (rewardModelNameAndModel.second.hasStateRewards()) {
163 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
165 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
166 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(odd);
168 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
169 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(odd, odd);
171 rewardModels.emplace(rewardModelNameAndModel.first,
178 if (formulas.empty()) {
179 for (
auto const& label : symbolicCtmc.
getLabels()) {
192 return std::make_shared<storm::models::sparse::Ctmc<ValueType>>(transitionMatrix, labelling, rewardModels);
195template<storm::dd::DdType Type,
typename ValueType>
200 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
201 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
202 for (
auto const& rewardModelNameAndModel : symbolicMa.
getRewardModels()) {
203 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
204 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
205 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
210 std::vector<std::vector<ValueType>> actionRewardVectors;
211 if (symbolicActionRewardVectors.empty()) {
215 transitionMatrix = std::move(matrRewards.first);
216 actionRewardVectors = std::move(matrRewards.second);
220 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
221 for (
auto const& rewardModelNameAndModel : symbolicMa.
getRewardModels()) {
222 std::optional<std::vector<ValueType>> stateRewards;
223 std::optional<std::vector<ValueType>> stateActionRewards;
224 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
225 if (rewardModelNameAndModel.second.hasStateRewards()) {
226 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
228 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
229 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
230 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
232 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
233 "Translation of symbolic to explicit transition rewards is not yet supported.");
234 rewardModels.emplace(rewardModelNameAndModel.first,
242 if (formulas.empty()) {
243 for (
auto const& label : symbolicMa.
getLabels()) {
257 std::move(markovianStates));
260 return std::make_shared<storm::models::sparse::MarkovAutomaton<ValueType>>(std::move(components));
std::pair< storm::storage::SparseMatrix< ValueType >, std::vector< std::vector< ValueType > > > toMatrixVectors(std::vector< storm::dd::Add< LibraryType, ValueType > > const &vectors, std::set< storm::expressions::Variable > const &groupMetaVariables, storm::dd::Odd const &rowOdd, storm::dd::Odd const &columnOdd) const
Converts the ADD to a row-grouped (sparse) matrix and the given vectors to row-grouped vectors.
storm::storage::SparseMatrix< ValueType > toMatrix() const
Converts the ADD to a (sparse) matrix.
std::vector< ValueType > toVector() const
Converts the ADD to a vector.
Odd createOdd() const
Creates an ODD based on the current BDD.
storm::storage::BitVector toVector(storm::dd::Odd const &rowOdd) const
Converts the BDD to a bit vector.
void addLabel(std::string const &label)
Adds a new label to the labelings.
This class manages the labeling of the state space with a number of (atomic) labels.
This class represents a continuous-time Markov chain.
This class represents a discrete-time Markov chain.
This class represents a discrete-time Markov decision process.
storm::dd::Bdd< Type > const & getMarkovianStates() const
storm::dd::Add< Type, ValueType > const & getExitRateVector() const
This class represents a discrete-time Markov decision process.
storm::dd::Add< Type, ValueType > const & getTransitionMatrix() const
Retrieves the matrix representing the transitions of the model.
storm::dd::Bdd< Type > const & getDeadlockStates() const
std::vector< std::string > getLabels() const
storm::dd::Bdd< Type > const & getInitialStates() const
Retrieves the initial states of the model.
std::unordered_map< std::string, RewardModelType > & getRewardModels()
virtual storm::dd::Bdd< Type > getStates(std::string const &label) const
Returns the sets of states labeled with the given label.
storm::dd::Bdd< Type > const & getReachableStates() const
Retrieves the reachable states of the model.
virtual std::set< storm::expressions::Variable > const & getNondeterminismVariables() const override
Retrieves the meta variables used to encode the nondeterminism in the model.
A bit vector that is internally represented as a vector of 64-bit values.
A class that holds a possibly non-square matrix in the compressed row storage format.
index_type getRowGroupCount() const
Returns the number of row groups in the matrix.
#define STORM_LOG_THROW(cond, exception, message)
boost::optional< std::vector< ValueType > > exitRates