Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
Signatures.h
Go to the documentation of this file.
1#pragma once
2
3#include <compare>
4#include <cstdint>
5#include <optional>
6#include <span>
7#include <utility>
8#include <vector>
9
13
14namespace storm::bisimulation {
15
17
23template<typename ValueType, SignatureMode Mode>
25 public:
26 Signatures(storm::models::sparse::Model<ValueType> const& model, std::optional<std::vector<uint64_t>> const& choiceClasses,
27 storm::bisimulation::Partition const& partition)
28 requires(Mode == SignatureMode::Exact);
29
30 Signatures(storm::models::sparse::Model<ValueType> const& model, std::optional<std::vector<uint64_t>> const& choiceClasses,
31 storm::bisimulation::Partition const& partition, ValueType const& tolerance)
32 requires(Mode == SignatureMode::Approximative);
33
38 void updateStateSignature(uint64_t const stateIndex);
39
40 private:
41 struct StateSignature; // Forward-declared; defined privately further down.
42
43 public:
48 class SplitOrder {
49 public:
50 explicit SplitOrder(std::vector<StateSignature> const& signatures) : signatures(signatures) {}
51 bool operator()(uint64_t const state1, uint64_t const state2) const;
52
53 private:
54 std::vector<StateSignature> const& signatures;
55 };
56
60 SplitOrder getEquivalenceSplitOrder() const
61 requires(Mode == SignatureMode::Exact);
62
66 SplitOrder getStructuralSplitOrder() const
67 requires(Mode == SignatureMode::Approximative);
68
76 SplitCondition(std::vector<StateSignature> const& signatures, ValueType const& tolerance) : signatures(signatures), tolerance(tolerance) {}
77 bool operator()(uint64_t const state1, uint64_t const state2) const
78 requires(Mode == SignatureMode::Approximative);
79
80 private:
81 std::vector<StateSignature> const& signatures;
82 ValueType const tolerance;
83 };
84
88 SplitCondition getApproximateSplitCondition() const
89 requires(Mode == SignatureMode::Approximative);
90
101 void extendQuotientData(QuotientData<ValueType>& quotientData, bool const createQuotientChoiceMapping) const;
102
103 private:
104 // For all choices, we store the current distributions over successor blocks in choiceDistributionStorage and use a view into that for ChoiceSignatures.
105 using BlockDistributionView = std::span<std::pair<Partition::Block, ValueType>>;
106
110 struct ChoiceSignature {
111 uint64_t choiceClass; // The class of this choice according to the provided choice classes.
112 // The accumulated transition values for each block, sorted by Partition::BlockCompare. This is a (non-owning) view into the choice's permanent
113 // slot of Signatures::choiceDistributionStorage, see there.
114 BlockDistributionView distr;
115
116 // Orders by choiceClass and the set of blocks (identity and order) of distr; independent of the actual transition values.
117 std::strong_ordering compareStructure(ChoiceSignature const& other) const;
118 // strong_ordering in exact mode (equal signatures are substitutable); only weak_ordering in approximative mode, since ties don't imply approxEqual.
119 using ComparisonResult = std::conditional_t<Mode == SignatureMode::Exact, std::strong_ordering, std::weak_ordering>;
120 // Strict weak order for sorting/lower_bound. In approximative mode, ties don't imply approximate equality - see StateSignature::find.
121 ComparisonResult compare(ChoiceSignature const& other) const;
122 // True iff the two signatures have the same structure and their distr values pairwise differ by at most the given tolerance.
123 bool approximatelyEqual(ChoiceSignature const& other, ValueType const& tolerance) const
124 requires(Mode == SignatureMode::Approximative);
125 };
126
127 using ChoiceSignatureIterator = typename std::vector<ChoiceSignature>::const_iterator;
128
134 struct StateSignature {
142 std::pair<ChoiceSignatureIterator, bool> find(ChoiceSignature const& signature, ValueType const tolerance) const;
143
152 std::pair<ChoiceSignatureIterator, bool> findWithHint(ChoiceSignatureIterator const hint, ChoiceSignature const& signature,
153 ValueType const tolerance) const
154 requires(Mode == SignatureMode::Approximative);
155
156 void insert(ChoiceSignature const& signature, ValueType const tolerance);
157
158 std::vector<ChoiceSignature> choices; // Always ordered and deduplicated as described above.
159 };
160
172 void addQuotientChoiceMapping(uint64_t const state, StateSignature const& representativeSignature,
173 std::vector<uint64_t> const& choiceSignatureToQuotientChoiceIndex, std::vector<uint64_t>& toQuotientChoice) const;
174
180 ChoiceSignature buildChoiceSignature(uint64_t const choiceIndex);
181
186 ChoiceSignature getChoiceSignature(uint64_t const choiceIndex) const;
187
195 class ChoiceSignatureCache {
196 public:
197 explicit ChoiceSignatureCache(uint64_t const numStates);
198
202 void addValue(Partition::Block const& b, ValueType const& value);
203
209 BlockDistributionView extract(BlockDistributionView const dest);
210
211 private:
212 std::vector<ValueType> values;
213 std::vector<Partition::Block> support;
214 } choiceSignatureCache;
215
216 storm::models::sparse::Model<ValueType> const& model;
217 Partition const& partition;
218 std::optional<std::vector<uint64_t>> const& choiceClasses;
219
226 mutable std::vector<std::pair<Partition::Block, ValueType>> choiceDistributionStorage;
227
238 ValueType const halfTolerance;
239
240 std::vector<StateSignature> stateSignatureCache;
241};
242
243} // namespace storm::bisimulation
Represents a partition of a set of consecutive indices.
Definition Partition.h:20
std::span< ElementIndex const > Block
A contiguous range of elements that form a (possibly proper super-) block of the partition.
Definition Partition.h:27
bool operator()(uint64_t const state1, uint64_t const state2) const
SplitOrder(std::vector< StateSignature > const &signatures)
Definition Signatures.h:50
void extendQuotientData(QuotientData< ValueType > &quotientData, bool const createQuotientChoiceMapping) const
Fills in the choice mappings of the given (already state-mapped) quotient data: for every quotient st...
void updateStateSignature(uint64_t const stateIndex)
Updates the state signature of the given state index.
Signatures(storm::models::sparse::Model< ValueType > const &model, std::optional< std::vector< uint64_t > > const &choiceClasses, storm::bisimulation::Partition const &partition)
SplitOrder getEquivalenceSplitOrder() const
Instantiates a SplitOrder whose ties exactly coincide with true signature equality (operator==).
SplitCondition getApproximateSplitCondition() const
Instantiates a SplitCondition.
SplitOrder getStructuralSplitOrder() const
Instantiates a SplitOrder that only compares with respect to structural equality of the state signatu...
Base class for all sparse models.
Definition Model.h:34
SFTBDDChecker::ValueType ValueType
The index mappings between an input model and its bisimulation quotient, derived from a partition of ...
SplitCondition(std::vector< StateSignature > const &signatures, ValueType const &tolerance)
Definition Signatures.h:76