Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DeterministicModelBisimulationDecomposition.h
Go to the documentation of this file.
1#pragma once
2
5
6namespace storm {
7namespace storage {
8
12template<typename ModelType>
13class DeterministicModelBisimulationDecomposition : public BisimulationDecomposition<ModelType, bisimulation::DeterministicBlockData> {
14 public:
16 typedef typename ModelType::ValueType ValueType;
17 typedef typename ModelType::RewardModelType RewardModelType;
18
27
28 protected:
29 virtual std::pair<storm::storage::BitVector, storm::storage::BitVector> getStatesWithProbability01() override;
30
31 virtual void initializeMeasureDrivenPartition() override;
32
33 virtual void initializeLabelBasedPartition() override;
34
35 virtual void buildQuotient() override;
36
38 std::vector<bisimulation::Block<BlockDataType>*>& splitterQueue) override;
39
40 private:
41 // Post-processes the initial partition to properly initialize it.
42 void postProcessInitialPartition();
43
44 // Refines the given block wrt to strong bisimulation.
45 void refinePredecessorBlockOfSplitterStrong(bisimulation::Block<BlockDataType>& block, std::vector<bisimulation::Block<BlockDataType>*>& splitterQueue);
46
47 // Refines the predecessor blocks wrt. strong bisimulation.
48 void refinePredecessorBlocksOfSplitterStrong(std::list<bisimulation::Block<BlockDataType>*> const& predecessorBlocks,
49 std::vector<bisimulation::Block<BlockDataType>*>& splitterQueue);
50
54 void initializeWeakDtmcBisimulation();
55
60 void splitOffDivergentStates();
61
65 void initializeSilentProbabilities();
66
67 // Retrieves the probability of going into the splitter for the given state.
68 ValueType const& getProbabilityToSplitter(storm::storage::sparse::state_type const& state) const;
69
70 // Retrieves the silent probability for the given state.
71 ValueType getSilentProbability(storm::storage::sparse::state_type const& state) const;
72
73 // Retrieves whether the given state is silent.
74 bool isSilent(storm::storage::sparse::state_type const& state) const;
75
76 // Retrieves whether the given state has a non-zero silent probability.
77 bool hasNonZeroSilentProbability(storm::storage::sparse::state_type const& state) const;
78
79 // Retrieves whether the given predecessor of the splitters possibly needs refinement.
80 bool possiblyNeedsRefinement(bisimulation::Block<BlockDataType> const& predecessorBlock) const;
81
82 // Moves the given state to the position marked by marker1 moves the marker one step further.
83 void moveStateToMarker1(storm::storage::sparse::state_type predecessor, bisimulation::Block<BlockDataType>& predecessorBlock);
84
85 // Moves the given state to the position marked by marker2 the marker one step further.
86 void moveStateToMarker2(storm::storage::sparse::state_type predecessor, bisimulation::Block<BlockDataType>& predecessorBlock);
87
88 // Moves the given state to a proper place in the splitter, depending on where the predecessor is located.
89 void moveStateInSplitter(storm::storage::sparse::state_type predecessor, bisimulation::Block<BlockDataType>& predecessorBlock,
90 storm::storage::sparse::state_type currentPositionInSplitter, uint_fast64_t& elementsToSkip);
91
92 // Increases the probability of moving to the current splitter for the given state.
93 void increaseProbabilityToSplitter(storm::storage::sparse::state_type predecessor, bisimulation::Block<BlockDataType> const& predecessorBlock,
94 ValueType const& value);
95
96 // Explores the remaining states of the splitter.
97 void exploreRemainingStatesOfSplitter(bisimulation::Block<BlockDataType>& splitter, std::list<bisimulation::Block<BlockDataType>*>& predecessorBlocks);
98
99 // Updates the silent probabilities of the states in the block based on the probabilities of going to the splitter.
100 void updateSilentProbabilitiesBasedOnProbabilitiesToSplitter(bisimulation::Block<BlockDataType>& block);
101
102 // Updates the silent probabilities of the states in the block based on a forward exploration of the transitions
103 // of the states.
104 void updateSilentProbabilitiesBasedOnTransitions(bisimulation::Block<BlockDataType>& block);
105
106 // Refines the given block wrt to weak bisimulation in DTMCs.
107 void refinePredecessorBlockOfSplitterWeak(bisimulation::Block<BlockDataType>& block, std::vector<bisimulation::Block<BlockDataType>*>& splitterQueue);
108
109 // Refines the predecessor blocks of the splitter wrt. weak bisimulation in DTMCs.
110 void refinePredecessorBlocksOfSplitterWeak(bisimulation::Block<BlockDataType> const& splitter,
111 std::list<bisimulation::Block<BlockDataType>*> const& predecessorBlocks,
112 std::vector<bisimulation::Block<BlockDataType>*>& splitterQueue);
113
114 // Converts the one-step probabilities of going into the splitter into the conditional probabilities needed
115 // for weak bisimulation (on DTMCs).
116 void computeConditionalProbabilitiesForNonSilentStates(bisimulation::Block<BlockDataType>& block);
117
118 // Computes the (indices of the) blocks of non-silent states within the block.
119 std::vector<uint_fast64_t> computeNonSilentBlocks(bisimulation::Block<BlockDataType>& block);
120
121 // Computes a labeling for all states of the block that identifies in which block they need to end up.
122 std::vector<storm::storage::BitVector> computeWeakStateLabelingBasedOnNonSilentBlocks(bisimulation::Block<BlockDataType> const& block,
123 std::vector<uint_fast64_t> const& nonSilentBlockIndices);
124
125 // Inserts the block into the list of predecessors if it is not already contained.
126 void insertIntoPredecessorList(bisimulation::Block<BlockDataType>& predecessorBlock, std::list<bisimulation::Block<BlockDataType>*>& predecessorBlocks);
127
129 [[maybe_unused]] storm::storage::sparse::state_type state) const;
130
131 // A vector that holds the probabilities of states going into the splitter. This is used by the method that
132 // refines a block based on probabilities.
133 std::vector<ValueType> probabilitiesToCurrentSplitter;
134
135 // A vector mapping each state to its silent probability.
136 std::vector<ValueType> silentProbabilities;
137};
138} // namespace storage
139} // namespace storm
virtual void refinePartitionBasedOnSplitter(bisimulation::Block< BlockDataType > &splitter, std::vector< bisimulation::Block< BlockDataType > * > &splitterQueue) override
virtual void initializeLabelBasedPartition() override
Initializes the initial partition based on all respected labels.
virtual void initializeMeasureDrivenPartition() override
Creates the measure-driven initial partition for reaching psi states from phi states.
DeterministicModelBisimulationDecomposition(ModelType const &model, typename BisimulationDecomposition< ModelType, BlockDataType >::Options const &options)
Computes the bisimulation relation for the given model.
virtual void buildQuotient() override
Builds the quotient model based on the previously computed equivalence classes (stored in the blocks ...
virtual std::pair< storm::storage::BitVector, storm::storage::BitVector > getStatesWithProbability01() override
Computes the set of states with probability 0/1 for satisfying phi until psi.