13 const size_t mUsageInfoBits;
14 const size_t stateIndexSize;
15 std::map<size_t, size_t> mSpareUsageIndex;
16 std::map<size_t, size_t> mSpareActivationIndex;
17 std::vector<size_t> mIdToStateIndex;
18 std::vector<size_t> mImmediateFailedBEs;
19 std::map<size_t, std::vector<size_t>> mSeqRestrictionPreElements;
20 std::map<size_t, std::vector<size_t>> mSeqRestrictionPostElements;
21 std::map<size_t, std::vector<size_t>> mMutexRestrictionElements;
22 std::vector<std::pair<size_t, std::vector<size_t>>>
28 stateIndexSize(
getStateVectorSize(nrElements, nrOfSpares, nrRepresentatives, maxSpareChildCount)),
29 mIdToStateIndex(nrElements) {
30 STORM_LOG_ASSERT(maxSpareChildCount < std::pow(2, mUsageInfoBits),
"Bit length incorrect.");
39 return std::bit_width(maxSpareChildCount);
50 static size_t getStateVectorSize(
size_t nrElements,
size_t nrOfSpares,
size_t nrRepresentatives,
size_t maxSpareChildCount) {
51 return nrElements * 2 + nrOfSpares *
getUsageInfoBits(maxSpareChildCount) + nrRepresentatives;
55 return mUsageInfoBits;
61 mIdToStateIndex[id] = index;
65 mImmediateFailedBEs.push_back(
id);
69 return mImmediateFailedBEs;
73 mSeqRestrictionPreElements[id] = elems;
77 mSeqRestrictionPostElements[id] = elems;
81 mMutexRestrictionElements[id] = elems;
85 STORM_LOG_ASSERT(mSeqRestrictionPreElements.count(index) > 0,
"Index invalid.");
86 return mSeqRestrictionPreElements.at(index);
90 STORM_LOG_ASSERT(mSeqRestrictionPostElements.count(index) > 0,
"Index invalid.");
91 return mSeqRestrictionPostElements.at(index);
95 STORM_LOG_ASSERT(mMutexRestrictionElements.count(index) > 0,
"Index invalid.");
96 return mMutexRestrictionElements.at(index);
101 mSpareActivationIndex[id] = index;
106 mSpareUsageIndex[id] = index;
111 return mIdToStateIndex[id];
116 return mSpareUsageIndex.at(
id);
121 return mSpareActivationIndex.at(
id);
124 void addSymmetry(
size_t length, std::vector<size_t>& startingIndices) {
125 mSymmetries.push_back(std::make_pair(length, startingIndices));
133 for (
size_t i = 0; i < mSymmetries.size(); ++i) {
134 size_t childStart = mSymmetries[i].second[0];
135 size_t childLength = mSymmetries[i].first;
137 for (
size_t j = i + 1; j < mSymmetries.size(); ++j) {
138 size_t parentStart = mSymmetries[j].second[0];
139 size_t parentLength = mSymmetries[j].first;
141 if (parentStart <= childStart && childStart + childLength < parentStart + parentLength) {
143 std::vector<std::vector<size_t>> newSymmetries;
145 for (
size_t index = 1; index < mSymmetries[j].second.size(); ++index) {
146 std::vector<size_t> newStarts;
148 for (
size_t symmetryStarts : mSymmetries[i].second) {
150 size_t symmetryOffset = symmetryStarts - parentStart;
151 newStarts.push_back(mSymmetries[j].second[index] + symmetryOffset);
153 newSymmetries.push_back(newStarts);
156 for (
size_t index = 0; index < newSymmetries.size(); ++index) {
157 mSymmetries.insert(mSymmetries.begin() + i + 1 + index, std::make_pair(childLength, newSymmetries[index]));
159 i += newSymmetries.size();
167 for (
auto pair : mSymmetries) {
170 for ([[maybe_unused]]
size_t index : pair.second) {
171 STORM_LOG_ASSERT(index < stateIndexSize,
"Symmetry starting point " << index <<
" invalid.");
172 STORM_LOG_ASSERT(index + pair.first < stateIndexSize,
"Symmetry ending point " << index <<
" invalid.");
178 return mSymmetries.size();
182 return !mSymmetries.empty();
187 return mSymmetries[pos].first;
192 return mSymmetries[pos].second;
196 os <<
"StateGenerationInfo:\n";
197 os <<
"Length of state vector: " << info.stateIndexSize <<
'\n';
198 os <<
"Id to state index:\n";
199 for (
size_t id = 0;
id < info.mIdToStateIndex.size(); ++id) {
202 os <<
"Spare usage index with usage InfoBits of size " << info.mUsageInfoBits <<
":\n";
203 for (
auto pair : info.mSpareUsageIndex) {
204 os << pair.first <<
" -> " << pair.second <<
'\n';
206 os <<
"Spare activation index:\n";
207 for (
auto pair : info.mSpareActivationIndex) {
208 os << pair.first <<
" -> " << pair.second <<
'\n';
210 os <<
"Symmetries:\n";
211 for (
auto pair : info.mSymmetries) {
212 os <<
"Length: " << pair.first <<
", starting indices: ";
213 for (
size_t index : pair.second) {
static size_t getStateVectorSize(size_t nrElements, size_t nrOfSpares, size_t nrRepresentatives, size_t maxSpareChildCount)
Get length of BitVector capturing DFT state.
size_t getStateIndex(size_t id) const
size_t getSpareActivationIndex(size_t id) const
size_t getSpareUsageIndex(size_t id) const
std::vector< size_t > const & immediateFailedBE() const
void addImmediateFailedBE(size_t id)
void addSpareActivationIndex(size_t id, size_t index)
size_t usageInfoBits() const
DFTStateGenerationInfo(size_t nrElements, size_t nrOfSpares, size_t nrRepresentatives, size_t maxSpareChildCount)
bool hasSymmetries() const
void generateSymmetries()
Generate more symmetries by combining two symmetries.
void setRestrictionPostElements(size_t id, std::vector< size_t > const &elems)
void addStateIndex(size_t id, size_t index)
void setRestrictionPreElements(size_t id, std::vector< size_t > const &elems)
std::vector< size_t > const & mutexRestrictionElements(size_t index) const
std::vector< size_t > const & seqRestrictionPreElements(size_t index) const
std::vector< size_t > const & seqRestrictionPostElements(size_t index) const
friend std::ostream & operator<<(std::ostream &os, DFTStateGenerationInfo const &info)
std::vector< size_t > const & getSymmetryIndices(size_t pos) const
void addSymmetry(size_t length, std::vector< size_t > &startingIndices)
static size_t getUsageInfoBits(size_t maxSpareChildCount)
Get number of bits required to store claiming information for spares in binary format.
void addSpareUsageIndex(size_t id, size_t index)
void setMutexElements(size_t id, std::vector< size_t > const &elems)
size_t getSymmetrySize() const
size_t getSymmetryLength(size_t pos) const
#define STORM_LOG_ASSERT(cond, message)