13template<
typename ValueType>
21 enumerateDontCareMetaVariables(),
23 relevantDontCareDdVariables(),
28template<
typename ValueType>
30 std::set<storm::expressions::Variable>
const* metaVariables,
bool enumerateDontCareMetaVariables)
31 : ddManager(&ddManager),
34 valueAsDouble(
storm::utility::convertNumber<double>(value)),
36 metaVariables(metaVariables),
37 enumerateDontCareMetaVariables(enumerateDontCareMetaVariables),
39 relevantDontCareDdVariables(),
40 currentValuation(ddManager.getExpressionManager().getSharedPointer()) {
49template<
typename ValueType>
51 : ddManager(other.ddManager),
52 generator(other.generator),
54 valueAsDouble(other.valueAsDouble),
55 isAtEnd(other.isAtEnd),
56 metaVariables(other.metaVariables),
57 cubeCounter(other.cubeCounter),
58 relevantDontCareDdVariables(other.relevantDontCareDdVariables),
59 currentValuation(other.currentValuation) {
62 other.generator =
nullptr;
65template<
typename ValueType>
68 this->ddManager = other.ddManager;
69 this->generator = other.generator;
70 this->cube = other.cube;
71 this->valueAsDouble = other.valueAsDouble;
72 this->isAtEnd = other.isAtEnd;
73 this->metaVariables = other.metaVariables;
74 this->cubeCounter = other.cubeCounter;
75 this->relevantDontCareDdVariables = other.relevantDontCareDdVariables;
76 this->currentValuation = other.currentValuation;
80 other.generator =
nullptr;
85template<
typename ValueType>
89 free(this->generator);
92template<
typename ValueType>
94 STORM_LOG_ASSERT(!this->isAtEnd,
"Illegally incrementing iterator that is already at its end.");
98 if (this->relevantDontCareDdVariables.empty() || this->cubeCounter >= std::pow(2, this->relevantDontCareDdVariables.size()) - 1) {
100 cudd::ABDD::NextCube(generator, &cube, &valueAsDouble);
101 this->isAtEnd = (Cudd_IsGenEmpty(generator) != 0);
104 if (!this->isAtEnd) {
105 this->treatNewCube();
109 this->treatNextInCube();
115template<
typename ValueType>
120 for (uint_fast64_t index = 0; index < this->relevantDontCareDdVariables.size(); ++index) {
121 auto const& ddMetaVariable = this->ddManager->
getMetaVariable(std::get<0>(this->relevantDontCareDdVariables[index]));
123 if ((this->cubeCounter & (1ull << index)) != 0) {
124 currentValuation.setBooleanValue(std::get<0>(this->relevantDontCareDdVariables[index]),
true);
126 currentValuation.setBooleanValue(std::get<0>(this->relevantDontCareDdVariables[index]),
false);
130 if ((this->cubeCounter & (1ull << index)) != 0) {
131 currentValuation.setBitVectorValue(metaVariable, ((currentValuation.getBitVectorValue(metaVariable) - ddMetaVariable.getLow()) |
132 (1ull << std::get<1>(this->relevantDontCareDdVariables[index]))) +
133 ddMetaVariable.getLow());
135 currentValuation.setBitVectorValue(metaVariable, ((currentValuation.getBitVectorValue(metaVariable) - ddMetaVariable.getLow()) &
136 ~(1ull << std::get<1>(this->relevantDontCareDdVariables[index]))) +
137 ddMetaVariable.getLow());
143template<
typename ValueType>
144void AddIterator<DdType::CUDD, ValueType>::treatNewCube() {
145 this->relevantDontCareDdVariables.clear();
150 for (
auto const& metaVariable : *this->metaVariables) {
151 bool metaVariableAppearsInCube =
false;
152 std::vector<std::tuple<storm::expressions::Variable, uint_fast64_t>> localRelevantDontCareDdVariables;
153 auto const& ddMetaVariable = this->ddManager->
getMetaVariable(metaVariable);
155 if (this->cube[ddMetaVariable.getDdVariables().front().getIndex()] == 0) {
156 metaVariableAppearsInCube =
true;
157 currentValuation.setBooleanValue(metaVariable,
false);
158 }
else if (this->cube[ddMetaVariable.getDdVariables().front().getIndex()] == 1) {
159 metaVariableAppearsInCube =
true;
160 currentValuation.setBooleanValue(metaVariable,
true);
162 currentValuation.setBooleanValue(metaVariable,
false);
163 localRelevantDontCareDdVariables.push_back(std::make_tuple(metaVariable, 0));
166 int_fast64_t intValue = 0;
167 for (uint_fast64_t bitIndex = 0; bitIndex < ddMetaVariable.getNumberOfDdVariables(); ++bitIndex) {
168 if (cube[ddMetaVariable.getDdVariables()[bitIndex].getIndex()] == 0) {
170 metaVariableAppearsInCube =
true;
171 }
else if (cube[ddMetaVariable.getDdVariables()[bitIndex].getIndex()] == 1) {
172 intValue |= 1ull << (ddMetaVariable.getNumberOfDdVariables() - bitIndex - 1);
173 metaVariableAppearsInCube =
true;
177 localRelevantDontCareDdVariables.push_back(std::make_tuple(metaVariable, ddMetaVariable.getNumberOfDdVariables() - bitIndex - 1));
180 if (this->enumerateDontCareMetaVariables || metaVariableAppearsInCube) {
181 currentValuation.setBitVectorValue(metaVariable, intValue + ddMetaVariable.getLow());
187 if (this->enumerateDontCareMetaVariables || metaVariableAppearsInCube) {
188 relevantDontCareDdVariables.insert(relevantDontCareDdVariables.end(), localRelevantDontCareDdVariables.begin(),
189 localRelevantDontCareDdVariables.end());
194 this->cubeCounter = 0;
197template<
typename ValueType>
199 if (this->isAtEnd && other.isAtEnd) {
202 return this->ddManager == other.ddManager && this->generator == other.generator && this->cube == other.cube &&
203 this->valueAsDouble == other.valueAsDouble && this->isAtEnd == other.isAtEnd && this->metaVariables == other.metaVariables &&
204 this->cubeCounter == other.cubeCounter && this->relevantDontCareDdVariables == other.relevantDontCareDdVariables &&
205 this->currentValuation == other.currentValuation;
209template<
typename ValueType>
211 return !(*
this == other);
214template<
typename ValueType>
216 return std::make_pair(currentValuation, storm::utility::convertNumber<ValueType>(valueAsDouble));
222#ifdef STORM_HAVE_CARL
storm::expressions::Variable getMetaVariable(std::string const &variableName) const
Retrieves the given meta variable by name.
#define STORM_LOG_ASSERT(cond, message)