Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DiscreteTimeSparseModelSimulator.cpp
Go to the documentation of this file.
3
4namespace storm {
5namespace simulator {
6template<typename ValueType, typename RewardModelType>
9 : model(model), currentState(*model.getInitialStates().begin()), zeroRewards(model.getNumberOfRewardModels(), storm::utility::zero<ValueType>()) {
10 STORM_LOG_WARN_COND(model.getInitialStates().getNumberOfSetBits() == 1,
11 "The model has multiple initial states. This simulator assumes it starts from the initial state with the lowest index.");
13 uint64_t i = 0;
14 for (auto const& rewModPair : model.getRewardModels()) {
15 if (rewModPair.second.hasStateRewards()) {
16 lastRewards[i] += rewModPair.second.getStateReward(currentState);
17 }
18 ++i;
19 }
20}
21
22template<typename ValueType, typename RewardModelType>
26
27template<typename ValueType, typename RewardModelType>
29 // TODO random_uint is slow
30 if (model.getTransitionMatrix().getRowGroupSize(currentState) == 0) {
31 return false;
32 }
33 return step(generator.random_uint(0, model.getTransitionMatrix().getRowGroupSize(currentState) - 1));
34}
35
36template<typename ValueType, typename RewardModelType>
38 // TODO lots of optimization potential.
39 // E.g., do not sample random numbers if there is only a single transition
40 lastRewards = zeroRewards;
41 ValueType probability = generator.random();
42 STORM_LOG_ASSERT(action < model.getTransitionMatrix().getRowGroupSize(currentState), "Action index higher than number of actions");
43 uint64_t row = model.getTransitionMatrix().getRowGroupIndices()[currentState] + action;
44 uint64_t i = 0;
45 for (auto const& rewModPair : model.getRewardModels()) {
46 if (rewModPair.second.hasStateActionRewards()) {
47 lastRewards[i] += rewModPair.second.getStateActionReward(row);
48 }
49 ++i;
50 }
51 ValueType sum = storm::utility::zero<ValueType>();
52 for (auto const& entry : model.getTransitionMatrix().getRow(row)) {
53 sum += entry.getValue();
54 if (sum >= probability) {
55 currentState = entry.getColumn();
56 i = 0;
57 for (auto const& rewModPair : model.getRewardModels()) {
58 if (rewModPair.second.hasStateRewards()) {
59 lastRewards[i] += rewModPair.second.getStateReward(currentState);
60 }
61 ++i;
62 }
63 return true;
64 }
65 }
66 // This position should never be reached
67 return false;
68}
69
70template<typename ValueType, typename RewardModelType>
74
75template<typename ValueType, typename RewardModelType>
77 currentState = *model.getInitialStates().begin();
78 lastRewards = zeroRewards;
79 uint64_t i = 0;
80 for (auto const& rewModPair : model.getRewardModels()) {
81 if (rewModPair.second.hasStateRewards()) {
82 lastRewards[i] += rewModPair.second.getStateReward(currentState);
83 }
84 ++i;
85 }
86 return true;
87}
88
89template<typename ValueType, typename RewardModelType>
91 return lastRewards;
92}
93
96
97} // namespace simulator
98} // namespace storm
Base class for all sparse models.
Definition Model.h:33
This class is a low-level interface to quickly sample from Discrete-Time Models stored explicitly as ...
storm::models::sparse::Model< ValueType, RewardModelType > const & model
DiscreteTimeSparseModelSimulator(storm::models::sparse::Model< ValueType, RewardModelType > const &model)
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_WARN_COND(cond, message)
Definition macros.h:38
LabParser.cpp.
Definition cli.cpp:18