8 const size_t mUsageInfoBits;
9 const size_t stateIndexSize;
10 std::map<size_t, size_t> mSpareUsageIndex;
11 std::map<size_t, size_t> mSpareActivationIndex;
12 std::vector<size_t> mIdToStateIndex;
13 std::vector<size_t> mImmediateFailedBEs;
14 std::map<size_t, std::vector<size_t>> mSeqRestrictionPreElements;
15 std::map<size_t, std::vector<size_t>> mSeqRestrictionPostElements;
16 std::map<size_t, std::vector<size_t>> mMutexRestrictionElements;
17 std::vector<std::pair<size_t, std::vector<size_t>>>
23 stateIndexSize(
getStateVectorSize(nrElements, nrOfSpares, nrRepresentatives, maxSpareChildCount)),
24 mIdToStateIndex(nrElements) {
25 STORM_LOG_ASSERT(maxSpareChildCount < pow(2, mUsageInfoBits),
"Bit length incorrect.");
45 static size_t getStateVectorSize(
size_t nrElements,
size_t nrOfSpares,
size_t nrRepresentatives,
size_t maxSpareChildCount) {
46 return nrElements * 2 + nrOfSpares *
getUsageInfoBits(maxSpareChildCount) + nrRepresentatives;
50 return mUsageInfoBits;
56 mIdToStateIndex[id] = index;
60 mImmediateFailedBEs.push_back(
id);
64 return mImmediateFailedBEs;
68 mSeqRestrictionPreElements[id] = elems;
72 mSeqRestrictionPostElements[id] = elems;
76 mMutexRestrictionElements[id] = elems;
80 STORM_LOG_ASSERT(mSeqRestrictionPreElements.count(index) > 0,
"Index invalid.");
81 return mSeqRestrictionPreElements.at(index);
85 STORM_LOG_ASSERT(mSeqRestrictionPostElements.count(index) > 0,
"Index invalid.");
86 return mSeqRestrictionPostElements.at(index);
90 STORM_LOG_ASSERT(mMutexRestrictionElements.count(index) > 0,
"Index invalid.");
91 return mMutexRestrictionElements.at(index);
96 mSpareActivationIndex[id] = index;
101 mSpareUsageIndex[id] = index;
106 return mIdToStateIndex[id];
111 return mSpareUsageIndex.at(
id);
116 return mSpareActivationIndex.at(
id);
119 void addSymmetry(
size_t length, std::vector<size_t>& startingIndices) {
120 mSymmetries.push_back(std::make_pair(length, startingIndices));
128 for (
size_t i = 0; i < mSymmetries.size(); ++i) {
129 size_t childStart = mSymmetries[i].second[0];
130 size_t childLength = mSymmetries[i].first;
132 for (
size_t j = i + 1; j < mSymmetries.size(); ++j) {
133 size_t parentStart = mSymmetries[j].second[0];
134 size_t parentLength = mSymmetries[j].first;
136 if (parentStart <= childStart && childStart + childLength < parentStart + parentLength) {
138 std::vector<std::vector<size_t>> newSymmetries;
140 for (
size_t index = 1; index < mSymmetries[j].second.size(); ++index) {
141 std::vector<size_t> newStarts;
143 for (
size_t symmetryStarts : mSymmetries[i].second) {
145 size_t symmetryOffset = symmetryStarts - parentStart;
146 newStarts.push_back(mSymmetries[j].second[index] + symmetryOffset);
148 newSymmetries.push_back(newStarts);
151 for (
size_t index = 0; index < newSymmetries.size(); ++index) {
152 mSymmetries.insert(mSymmetries.begin() + i + 1 + index, std::make_pair(childLength, newSymmetries[index]));
154 i += newSymmetries.size();
162 for (
auto pair : mSymmetries) {
165 for (
size_t index : pair.second) {
166 STORM_LOG_ASSERT(index < stateIndexSize,
"Symmetry starting point " << index <<
" invalid.");
167 STORM_LOG_ASSERT(index + pair.first < stateIndexSize,
"Symmetry ending point " << index <<
" invalid.");
173 return mSymmetries.size();
177 return !mSymmetries.empty();
182 return mSymmetries[pos].first;
187 return mSymmetries[pos].second;
191 os <<
"StateGenerationInfo:\n";
192 os <<
"Length of state vector: " << info.stateIndexSize <<
'\n';
193 os <<
"Id to state index:\n";
194 for (
size_t id = 0;
id < info.mIdToStateIndex.size(); ++id) {
197 os <<
"Spare usage index with usage InfoBits of size " << info.mUsageInfoBits <<
":\n";
198 for (
auto pair : info.mSpareUsageIndex) {
199 os << pair.first <<
" -> " << pair.second <<
'\n';
201 os <<
"Spare activation index:\n";
202 for (
auto pair : info.mSpareActivationIndex) {
203 os << pair.first <<
" -> " << pair.second <<
'\n';
205 os <<
"Symmetries:\n";
206 for (
auto pair : info.mSymmetries) {
207 os <<
"Length: " << pair.first <<
", starting indices: ";
208 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)
uint64_t uint64_log2(uint64_t n)