15namespace transformer {
18 LabelInformation(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas) {
19 for (
auto const& formula : formulas) {
20 std::vector<std::shared_ptr<storm::logic::AtomicLabelFormula const>> atomicLabelFormulas = formula->getAtomicLabelFormulas();
21 for (
auto const& labelFormula : atomicLabelFormulas) {
25 std::vector<std::shared_ptr<storm::logic::AtomicExpressionFormula const>> atomicExpressionFormulas = formula->getAtomicExpressionFormulas();
26 for (
auto const& expressionFormula : atomicExpressionFormulas) {
28 ss << expressionFormula->getExpression();
38template<storm::dd::DdType Type,
typename ValueType>
43 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
44 for (
auto const& rewardModelNameAndModel : symbolicDtmc.
getRewardModels()) {
45 std::optional<std::vector<ValueType>> stateRewards;
46 std::optional<std::vector<ValueType>> stateActionRewards;
47 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
48 if (rewardModelNameAndModel.second.hasStateRewards()) {
49 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(this->odd);
51 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
52 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(this->odd);
54 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
55 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(this->odd, this->odd);
57 rewardModels.emplace(rewardModelNameAndModel.first,
64 if (formulas.empty()) {
65 for (
auto const& label : symbolicDtmc.
getLabels()) {
77 return std::make_shared<storm::models::sparse::Dtmc<ValueType>>(transitionMatrix, labelling, rewardModels);
80template<storm::dd::DdType Type,
typename ValueType>
85template<storm::dd::DdType Type,
typename ValueType>
91 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
92 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
93 for (
auto const& rewardModelNameAndModel : symbolicMdp.
getRewardModels()) {
94 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
95 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
96 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
101 std::vector<std::vector<ValueType>> actionRewardVectors;
102 if (symbolicActionRewardVectors.empty()) {
106 transitionMatrix = std::move(matrRewards.first);
107 actionRewardVectors = std::move(matrRewards.second);
111 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
112 for (
auto const& rewardModelNameAndModel : symbolicMdp.
getRewardModels()) {
113 std::optional<std::vector<ValueType>> stateRewards;
114 std::optional<std::vector<ValueType>> stateActionRewards;
115 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
116 if (rewardModelNameAndModel.second.hasStateRewards()) {
117 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
119 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
120 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
121 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
123 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
124 "Translation of symbolic to explicit transition rewards is not yet supported.");
125 rewardModels.emplace(rewardModelNameAndModel.first,
133 if (formulas.empty()) {
134 for (
auto const& label : symbolicMdp.
getLabels()) {
147 return std::make_shared<storm::models::sparse::Mdp<ValueType>>(transitionMatrix, labelling, rewardModels);
150template<storm::dd::DdType Type,
typename ValueType>
155 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
156 for (
auto const& rewardModelNameAndModel : symbolicCtmc.
getRewardModels()) {
157 std::optional<std::vector<ValueType>> stateRewards;
158 std::optional<std::vector<ValueType>> stateActionRewards;
159 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
160 if (rewardModelNameAndModel.second.hasStateRewards()) {
161 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
163 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
164 stateActionRewards = rewardModelNameAndModel.second.getStateActionRewardVector().toVector(odd);
166 if (rewardModelNameAndModel.second.hasTransitionRewards()) {
167 transitionRewards = rewardModelNameAndModel.second.getTransitionRewardMatrix().toMatrix(odd, odd);
169 rewardModels.emplace(rewardModelNameAndModel.first,
176 if (formulas.empty()) {
177 for (
auto const& label : symbolicCtmc.
getLabels()) {
190 return std::make_shared<storm::models::sparse::Ctmc<ValueType>>(transitionMatrix, labelling, rewardModels);
193template<storm::dd::DdType Type,
typename ValueType>
198 std::vector<storm::dd::Add<Type, ValueType>> symbolicActionRewardVectors;
199 std::map<std::string, uint64_t> rewardNameToActionRewardIndexMap;
200 for (
auto const& rewardModelNameAndModel : symbolicMa.
getRewardModels()) {
201 if (rewardModelNameAndModel.second.hasStateActionRewards()) {
202 rewardNameToActionRewardIndexMap.emplace(rewardModelNameAndModel.first, symbolicActionRewardVectors.size());
203 symbolicActionRewardVectors.push_back(rewardModelNameAndModel.second.getStateActionRewardVector());
208 std::vector<std::vector<ValueType>> actionRewardVectors;
209 if (symbolicActionRewardVectors.empty()) {
213 transitionMatrix = std::move(matrRewards.first);
214 actionRewardVectors = std::move(matrRewards.second);
218 std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<ValueType>> rewardModels;
219 for (
auto const& rewardModelNameAndModel : symbolicMa.
getRewardModels()) {
220 std::optional<std::vector<ValueType>> stateRewards;
221 std::optional<std::vector<ValueType>> stateActionRewards;
222 std::optional<storm::storage::SparseMatrix<ValueType>> transitionRewards;
223 if (rewardModelNameAndModel.second.hasStateRewards()) {
224 stateRewards = rewardModelNameAndModel.second.getStateRewardVector().toVector(odd);
226 auto actRewIndexIt = rewardNameToActionRewardIndexMap.find(rewardModelNameAndModel.first);
227 if (actRewIndexIt != rewardNameToActionRewardIndexMap.end()) {
228 stateActionRewards = std::move(actionRewardVectors[actRewIndexIt->second]);
230 STORM_LOG_THROW(!rewardModelNameAndModel.second.hasTransitionRewards(), storm::exceptions::NotImplementedException,
231 "Translation of symbolic to explicit transition rewards is not yet supported.");
232 rewardModels.emplace(rewardModelNameAndModel.first,
240 if (formulas.empty()) {
241 for (
auto const& label : symbolicMa.
getLabels()) {
255 std::move(markovianStates));
258 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