STAMINA/STORM 0.1
Infinite state-space truncator which generates a probability within a window
StaminaModelBuilder.h
1
14#ifndef STAMINA_BUILDER_STAMINAMODELBUILDER_H
15#define STAMINA_BUILDER_STAMINAMODELBUILDER_H
16
17#include <memory>
18#include <utility>
19#include <vector>
20#include <deque>
21#include <queue>
22#include <cstdint>
23#include <functional>
24
25#include "core/Options.h"
26#include "core/StaminaMessages.h"
27
28#include "util/StateIndexArray.h"
29#include "util/StateMemoryPool.h"
30
31#include "builder/threads/ExplorationThread.h"
32#include "builder/threads/ControlThread.h"
33
34#include "builder/ProbabilityState.h"
35
36#include <boost/functional/hash.hpp>
37#include <boost/container/flat_map.hpp>
38#include <boost/variant.hpp>
39
40#include "__storm_needed_for_builder.h"
41
42// Frequency for info/debug messages in terms of number of states explored.
43#define MSG_FREQUENCY 100000
44// #define MSG_FREQUENCY 4000
45
46namespace stamina {
47 namespace builder {
48
49 using namespace storm::builder;
50 using namespace storm::utility::prism;
51 using namespace storm::generator;
52
53 using namespace core;
54
55 typedef storm::models::sparse::Ctmc<double> Ctmc;
56 typedef storm::modelchecker::SparseCtmcCslModelChecker<Ctmc> CtmcModelChecker;
57
58
59
60 template<typename ValueType, typename RewardModelType = storm::models::sparse::StandardRewardModel<ValueType>, typename StateType = uint32_t>
62 public:
63
70 public:
71 TransitionInfo(StateType from, StateType to, double transition) :
72 from(from), to(to), transition(transition) { /* Intentionally left empty */ }
73 StateType from;
74 StateType to;
75 double transition;
76 };
78 bool operator() (
79 const TransitionInfo * first
80 , const TransitionInfo * second
81 ) const {
82 return first->to > second->to;
83 }
84 };
85
92 std::shared_ptr<storm::generator::PrismNextStateGenerator<ValueType, StateType>> const& generator
93 , storm::prism::Program const& modulesFile
94 , storm::generator::NextStateGeneratorOptions const & options
95 );
103 storm::prism::Program const& program
104 , storm::generator::NextStateGeneratorOptions const& generatorOptions
105 );
113 std::shared_ptr<storm::models::sparse::Model<ValueType, RewardModelType>> build();
117 StateType getStateIndexIfKnown(CompressedState const& state);
125 void reset();
130 void setGenerator(
131 std::shared_ptr<storm::generator::PrismNextStateGenerator<ValueType, StateType>> generator
132 );
138 std::vector<StateType> getPerimeterStates();
143 void printStateSpaceInformation();
144 storm::expressions::Expression * getPropertyExpression();
153 std::shared_ptr<const storm::logic::Formula> formula
154 , const storm::prism::Program & modulesFile
155 );
163 virtual StateType getOrAddStateIndex(CompressedState const& state);
168 StateType getStateIndexOrAbsorbing(CompressedState const& state);
169 double getLocalKappa();
170 protected:
171 storm::storage::sparse::StateStorage<StateType> getStateStorage();
180 storm::storage::SparseMatrixBuilder<ValueType>& transitionMatrixBuilder
181 , CompressedState & terminalState
182 , StateType stateId
183 , std::function<StateType (CompressedState const&)> stateToIdCallback
184 );
194 virtual void buildMatrices(
195 storm::storage::SparseMatrixBuilder<ValueType>& transitionMatrixBuilder
196 , std::vector<RewardModelBuilder<typename RewardModelType::ValueType>>& rewardModelBuilders
197 , StateAndChoiceInformationBuilder& choiceInformationBuilder
198 , boost::optional<storm::storage::BitVector>& markovianChoices
199 , boost::optional<storm::storage::sparse::StateValuationsBuilder>& stateValuationsBuilder
200 ) = 0;
206 void flushToTransitionMatrix(storm::storage::SparseMatrixBuilder<ValueType>& transitionMatrixBuilder);
211 void createTransition(StateType from, StateType to, ValueType probability);
212 void createTransition(TransitionInfo transitionInfo);
218 virtual storm::storage::sparse::ModelComponents<ValueType, RewardModelType> buildModelComponents() = 0;
224 storm::models::sparse::StateLabeling buildStateLabeling();
229 storm::storage::SparseMatrixBuilder<ValueType>& transitionMatrixBuilder
230 , std::vector<RewardModelBuilder<typename RewardModelType::ValueType>>& rewardModelBuilders
231 , StateAndChoiceInformationBuilder& choiceInformationBuilder
232 , boost::optional<storm::storage::BitVector>& markovianChoices
233 , boost::optional<storm::storage::sparse::StateValuationsBuilder>& stateValuationsBuilder
234 );
235
236 /* Data Members */
237 std::shared_ptr<threads::ControlThread<StateType, RewardModelType, ValueType>> controlThread;
238 std::vector<std::shared_ptr<threads::ExplorationThread<StateType, RewardModelType, ValueType>>> explorationThreads;
239
240 std::function<StateType (CompressedState const&)> terminalStateToIdCallback;
241
242 storm::expressions::Expression * propertyExpression;
243 storm::expressions::ExpressionManager * expressionManager;
244 std::shared_ptr<const storm::logic::Formula> propertyFormula;
245
246 std::shared_ptr<storm::generator::PrismNextStateGenerator<ValueType, StateType>> generator;
247
249
250 std::deque<std::pair<ProbabilityState<StateType> *, CompressedState> > statesToExplore;
251
252 // The following data members must be accessible to threads
254 storm::storage::sparse::StateStorage<
255 StateType
256 >& stateStorage;
257
258 // Remapping (not used by STAMINA)
259 boost::optional<std::vector<uint_fast64_t>> stateRemapping;
260
261 // Transitions which we must add
262 std::vector<std::vector<TransitionInfo>> transitionsToAdd;
263 // Options for next state generators
264 storm::generator::NextStateGeneratorOptions const & options;
265 // The model builder must have access to this to create a fresh next state generator each iteration
266 storm::prism::Program const& modulesFile;
267 ProbabilityState<StateType> * currentProbabilityState;
268 CompressedState absorbingState;
269 bool absorbingWasSetUp;
270 bool isInit;
271 bool fresh;
272 uint8_t iteration;
273 bool firstIteration;
274 double localKappa;
275 bool isCtmc;
276 bool formulaMatchesExpression;
277 uint64_t numberTerminal;
278 uint64_t numberStates;
279 uint64_t numberTransitions;
280 uint_fast64_t currentRowGroup;
281 uint_fast64_t currentRow;
282
283 };
284
285 // Helper method to find in unordered_set
286 template <typename StateType>
287 bool set_contains(std::unordered_set<StateType> current_set, StateType value);
288 }
289}
290#endif // STAMINA_BUILDER_STAMINAMODELBUILDER_H
Definition: ProbabilityState.h:11
Definition: StaminaModelBuilder.h:69
Definition: StaminaModelBuilder.h:61
std::vector< StateType > getPerimeterStates()
Definition: StaminaModelBuilder.cpp:98
StaminaModelBuilder(std::shared_ptr< storm::generator::PrismNextStateGenerator< ValueType, StateType > > const &generator, storm::prism::Program const &modulesFile, storm::generator::NextStateGeneratorOptions const &options)
Definition: StaminaModelBuilder.cpp:17
void setGenerator(std::shared_ptr< storm::generator::PrismNextStateGenerator< ValueType, StateType > > generator)
Definition: StaminaModelBuilder.cpp:258
void setPropertyFormula(std::shared_ptr< const storm::logic::Formula > formula, const storm::prism::Program &modulesFile)
Definition: StaminaModelBuilder.cpp:314
void flushToTransitionMatrix(storm::storage::SparseMatrixBuilder< ValueType > &transitionMatrixBuilder)
Definition: StaminaModelBuilder.cpp:147
StateType getStateIndexIfKnown(CompressedState const &state)
void setUpAbsorbingState(storm::storage::SparseMatrixBuilder< ValueType > &transitionMatrixBuilder, std::vector< RewardModelBuilder< typename RewardModelType::ValueType > > &rewardModelBuilders, StateAndChoiceInformationBuilder &choiceInformationBuilder, boost::optional< storm::storage::BitVector > &markovianChoices, boost::optional< storm::storage::sparse::StateValuationsBuilder > &stateValuationsBuilder)
Definition: StaminaModelBuilder.cpp:197
storm::models::sparse::StateLabeling buildStateLabeling()
Definition: StaminaModelBuilder.cpp:182
void createTransition(StateType from, StateType to, ValueType probability)
Definition: StaminaModelBuilder.cpp:163
void setLocalKappaToGlobal()
Definition: StaminaModelBuilder.cpp:266
StateType getStateIndexOrAbsorbing(CompressedState const &state)
Definition: StaminaModelBuilder.cpp:137
double accumulateProbabilities()
Definition: StaminaModelBuilder.cpp:188
virtual void buildMatrices(storm::storage::SparseMatrixBuilder< ValueType > &transitionMatrixBuilder, std::vector< RewardModelBuilder< typename RewardModelType::ValueType > > &rewardModelBuilders, StateAndChoiceInformationBuilder &choiceInformationBuilder, boost::optional< storm::storage::BitVector > &markovianChoices, boost::optional< storm::storage::sparse::StateValuationsBuilder > &stateValuationsBuilder)=0
void loadPropertyExpressionFromFormula()
Definition: StaminaModelBuilder.cpp:325
void connectTerminalStatesToAbsorbing(storm::storage::SparseMatrixBuilder< ValueType > &transitionMatrixBuilder, CompressedState &terminalState, StateType stateId, std::function< StateType(CompressedState const &)> stateToIdCallback)
Definition: StaminaModelBuilder.cpp:272
virtual StateType getOrAddStateIndex(CompressedState const &state)
Definition: StaminaModelBuilder.cpp:112
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Definition: StaminaModelBuilder.cpp:68
virtual storm::storage::sparse::ModelComponents< ValueType, RewardModelType > buildModelComponents()=0
void reset()
Definition: StaminaModelBuilder.cpp:243
Definition: StateIndexArray.h:27
Definition: StateMemoryPool.h:32
Definition: ExplicitTruncatedModelBuilder.cpp:40