15TEST(ValuationTest, StateValuationConstruction) {
17 GTEST_SKIP() <<
"Z3 not available.";
24 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
25 ASSERT_TRUE(model->hasStateValuations());
26 auto const& sv = model->getStateValuations();
27 ASSERT_EQ(sv.getNumberOfEntities(), model->getNumberOfStates());
28 ASSERT_TRUE(sv.getManager().hasVariable(
"s"));
29 ASSERT_TRUE(sv.getManager().hasVariable(
"d"));
30 auto const s = sv.getManager().getVariable(
"s");
31 auto const d = sv.getManager().getVariable(
"d");
32 auto const vars = sv.getAllVariables();
33 ASSERT_EQ(2, vars.size());
34 ASSERT_TRUE(vars.contains(s));
35 ASSERT_TRUE(vars.contains(d));
37 uint64_t
const sinit = *model->getInitialStates().begin();
38 ASSERT_TRUE(sv.entityHasVariable(sinit, s));
39 ASSERT_TRUE(sv.entityHasVariable(sinit, d));
40 EXPECT_EQ(0, sv.getInt64Value(sinit, s));
41 EXPECT_EQ(0, sv.getOptionalInt64Value(sinit, s).value());
42 EXPECT_EQ(0, sv.getOptionalInt64Value(sinit, d).value());
44 auto js = sv.toJson(sinit);
45 EXPECT_EQ(2, js.size());
46 EXPECT_TRUE(js.contains(
"s"));
47 EXPECT_TRUE(js.contains(
"d"));
48 EXPECT_EQ(0, js[
"s"].get<int64_t>());
49 EXPECT_EQ(0, js[
"d"].get<int64_t>());
51 ASSERT_TRUE(model->getStateLabeling().containsLabel(
"three"));
52 ASSERT_TRUE(model->getStates(
"three").hasUniqueSetBit());
53 uint64_t
const three = *model->getStates(
"three").begin();
54 EXPECT_EQ(7, sv.getInt64Value(three, s));
55 EXPECT_EQ(3, sv.getInt64Value(three, d));
57 auto dValues = sv.getInt64Values(d);
58 ASSERT_EQ(sv.getNumberOfEntities(), dValues.size());
59 EXPECT_EQ(3, dValues[three]);
60 int64_t
const sum = std::accumulate(dValues.begin(), dValues.end(), 0ll);
61 EXPECT_EQ(1 + 2 + 3 + 4 + 5 + 6, sum);
64TEST(ValuationTest, StateValuationTransformation) {
66 GTEST_SKIP() <<
"Z3 not available.";
72 std::shared_ptr<storm::models::sparse::Model<double>> model = builder.build();
73 ASSERT_TRUE(model->hasStateValuations());
74 auto const& sv = model->getStateValuations();
76 auto newsv = notransformer.
build(
true);
77 ASSERT_EQ(newsv.getNumberOfEntities(), sv.getNumberOfEntities());
85 transformer.
addExpression(alwaysTrueVar, svar.getExpression() == svar.getExpression());
86 transformer.
addExpression(alwaysFalseVar, dvar.getExpression() < dvar.getExpression());
87 newsv = transformer.
build(
true);
89 ASSERT_EQ(5, vars.size());
90 ASSERT_TRUE(vars.contains(svar));
91 ASSERT_TRUE(vars.contains(dvar));
92 ASSERT_TRUE(vars.contains(sgt3Var));
93 ASSERT_TRUE(vars.contains(alwaysTrueVar));
94 ASSERT_TRUE(vars.contains(alwaysFalseVar));
95 uint64_t
const sinit = *model->getInitialStates().begin();
96 EXPECT_EQ(0, newsv.getInt64Value(sinit, svar));
97 EXPECT_EQ(0, newsv.getInt64Value(sinit, dvar));
98 EXPECT_FALSE(newsv.getBooleanValue(sinit, sgt3Var));
99 EXPECT_TRUE(newsv.getBooleanValue(sinit, alwaysTrueVar));
100 EXPECT_FALSE(newsv.getBooleanValue(sinit, alwaysFalseVar));
102 for (uint64_t state = 0; state < newsv.getNumberOfEntities(); ++state) {
103 ASSERT_TRUE(newsv.getBooleanValue(state, alwaysTrueVar));
104 ASSERT_FALSE(newsv.getBooleanValue(state, alwaysFalseVar));
105 ASSERT_EQ(sv.getInt64Value(state, svar), newsv.getInt64Value(state, svar));
106 ASSERT_EQ(newsv.getBooleanValue(state, sgt3Var), newsv.getInt64Value(state, svar) > 3);
110TEST(ValuationTest, Valuations2classes) {
111 auto manager = std::make_shared<storm::expressions::ExpressionManager>();
112 auto const b = manager->declareBooleanVariable(
"b");
113 auto const i = manager->declareIntegerVariable(
"i");
114 auto const s = manager->declareStringVariable(
"s");
115 auto const r = manager->declareRationalVariable(
"r");
116 std::vector<storm::storage::sparse::ValuationClassDescription> classes;
124 EXPECT_EQ(2 + 5 + 65 + 166 + 2, classes.back().sizeInBits());
125 EXPECT_TRUE(classes.back().hasStringVariable());
132 EXPECT_EQ(64 + 1 + 2 + 5, classes.back().sizeInBits());
133 EXPECT_FALSE(classes.back().hasStringVariable());
136 EXPECT_EQ(0, valuations.numStrings());
137 EXPECT_EQ(2, valuations.numClasses());
138 EXPECT_EQ(classes[0].sizeInBits(), valuations.getClassDescription(0).sizeInBits());
139 EXPECT_EQ(classes[1].sizeInBits(), valuations.getClassDescription(1).sizeInBits());
140 auto const vars = valuations.getAllVariables();
141 EXPECT_EQ(4, vars.size());
142 EXPECT_TRUE(vars.contains(b));
143 EXPECT_TRUE(vars.contains(i));
144 EXPECT_TRUE(vars.contains(s));
145 EXPECT_TRUE(vars.contains(r));
147 std::vector<std::optional<bool>> b_values;
148 std::vector<int64_t> i_values;
149 std::vector<std::optional<std::string>> s_values;
150 std::vector<storm::RationalNumber> r_values;
151 for (uint64_t e = 0; e < 200; ++e) {
154 valuations.emplaceBack<
true>(0, [&](
auto entity,
auto const& var,
auto& value) {
155 using ValueType = std::remove_cvref_t<
decltype(value)>;
156 if constexpr (std::is_same_v<ValueType, std::optional<bool>>) {
158 if (entity % 2 == 0) {
159 value = entity % 4 == 0;
161 b_values.push_back(value);
162 }
else if constexpr (std::is_same_v<ValueType, int64_t>) {
164 value =
static_cast<int64_t
>(entity) % 17 - 4;
165 i_values.push_back(value);
166 }
else if constexpr (std::is_same_v<ValueType, std::optional<std::string>>) {
168 if (entity % 2 == 1) {
169 value =
"str" + std::to_string(entity);
171 s_values.push_back(value);
172 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
176 if (entity % 8 == 0) {
179 r_values.push_back(value);
181 FAIL() <<
"Unexpected variable type " <<
typeid(ValueType).name() <<
" for variable " << var.getName();
186 valuations.emplaceBack<
false, double, bool, int64_t>(1, [&](
auto entity,
auto const& var,
auto& value) {
187 using ValueType = std::remove_cvref_t<
decltype(value)>;
188 if constexpr (std::is_same_v<ValueType, double>) {
190 value =
static_cast<double>(entity) / 3.0;
192 }
else if constexpr (std::is_same_v<ValueType, bool>) {
194 value = entity % 2 == 0;
195 b_values.push_back(value);
197 static_assert(std::is_same_v<ValueType, int64_t>);
199 value =
static_cast<int64_t
>(entity) % 4 - 10;
200 i_values.push_back(value);
203 s_values.push_back(std::nullopt);
207 ASSERT_EQ(200, b_values.size());
208 ASSERT_EQ(200, i_values.size());
209 ASSERT_EQ(200, s_values.size());
210 ASSERT_EQ(200, r_values.size());
211 valuations.readCallback<std::nullopt_t, bool, int64_t, std::string, storm::RationalNumber,
double>([&](
auto entity,
auto const& var,
auto const& value) {
212 using ValueType = std::remove_cvref_t<
decltype(value)>;
213 if constexpr (std::is_same_v<ValueType, std::nullopt_t>) {
214 EXPECT_EQ(0, valuations.getClassOfEntity(entity));
216 EXPECT_FALSE(b_values[entity].has_value());
218 EXPECT_TRUE(var == s);
219 EXPECT_FALSE(s_values[entity].has_value());
221 }
else if constexpr (std::is_same_v<ValueType, bool>) {
223 ASSERT_TRUE(b_values[entity].has_value());
224 EXPECT_EQ(b_values[entity].value(), value);
225 }
else if constexpr (std::is_same_v<ValueType, int64_t>) {
227 EXPECT_EQ(i_values[entity], value);
228 }
else if constexpr (std::is_same_v<ValueType, std::string>) {
230 ASSERT_TRUE(s_values[entity].has_value());
231 EXPECT_EQ(s_values[entity].value(), value);
232 }
else if constexpr (std::is_same_v<ValueType, storm::RationalNumber>) {
233 EXPECT_EQ(0, valuations.getClassOfEntity(entity));
235 EXPECT_EQ(r_values[entity], value);
237 static_assert(std::is_same_v<ValueType, double>);
238 EXPECT_EQ(1, valuations.getClassOfEntity(entity));
245TEST(ValuationTest, ValuationsSingleClass) {
248 auto manager = std::make_shared<storm::expressions::ExpressionManager>();
249 auto const b = manager->declareBooleanVariable(
"b");
250 auto const i = manager->declareIntegerVariable(
"i");
251 auto const d = manager->declareRationalVariable(
"d");
258 EXPECT_EQ(1 + 4 + 64 + 3, desc.sizeInBits());
261 EXPECT_EQ(0u, valuations.
size());
266 EXPECT_EQ(3u, vars.size());
267 EXPECT_TRUE(vars.contains(b));
268 EXPECT_TRUE(vars.contains(i));
269 EXPECT_TRUE(vars.contains(d));
272 std::vector<bool> bVals = {
true,
false,
true,
false,
true,
false};
273 std::vector<int64_t> iVals = {-5, -3, 0, 2, 4, 5};
274 std::vector<double> dVals = {0.0, 1.5, -2.25, 1e10, -1e-5, 3.14};
276 for (uint64_t e = 0; e < 6; ++e) {
277 valuations.
emplaceBack<
false, bool, int64_t,
double>([&](
auto entity,
auto const& var,
auto& value) {
278 using ValueType = std::remove_cvref_t<
decltype(value)>;
279 if constexpr (std::is_same_v<ValueType, bool>) {
280 value = bVals[entity];
281 }
else if constexpr (std::is_same_v<ValueType, int64_t>) {
282 value = iVals[entity];
284 static_assert(std::is_same_v<ValueType, double>);
285 value = dVals[entity];
289 ASSERT_EQ(6u, valuations.
size());
292 for (uint64_t e = 0; e < 6; ++e) {
299 for (uint64_t e = 0; e < 6; ++e) {
300 EXPECT_EQ(bVals[e], valuations.
readValue<
bool>(e, b)) <<
" at entity " << e;
301 EXPECT_EQ(iVals[e], valuations.
readValue<int64_t>(e, i)) <<
" at entity " << e;
302 EXPECT_EQ(dVals[e], valuations.
readValue<
double>(e, d)) <<
" at entity " << e;
309 EXPECT_EQ(
true, valuations.
readValue<
bool>(3, b));
310 EXPECT_EQ(-1, valuations.
readValue<int64_t>(3, i));
311 EXPECT_EQ(99.0, valuations.
readValue<
double>(3, d));
313 EXPECT_EQ(bVals[2], valuations.
readValue<
bool>(2, b));
314 EXPECT_EQ(iVals[4], valuations.
readValue<int64_t>(4, i));
318 ASSERT_EQ(9u, valuations.
size());
319 for (uint64_t e = 0; e < 6; ++e) {
323 EXPECT_EQ(bVals[e], valuations.
readValue<
bool>(e, b)) <<
" at entity " << e;
324 EXPECT_EQ(iVals[e], valuations.
readValue<int64_t>(e, i)) <<
" at entity " << e;
325 EXPECT_EQ(dVals[e], valuations.
readValue<
double>(e, d)) <<
" at entity " << e;
330 EXPECT_EQ(4u, valuations.
size());
331 EXPECT_EQ(bVals[0], valuations.
readValue<
bool>(0, b));
332 EXPECT_EQ(iVals[1], valuations.
readValue<int64_t>(1, i));
333 EXPECT_EQ(dVals[2], valuations.
readValue<
double>(2, d));
336TEST(ValuationTest, ValuationsSelectEntities) {
340 auto manager = std::make_shared<storm::expressions::ExpressionManager>();
341 auto const b = manager->declareBooleanVariable(
"b");
342 auto const i = manager->declareIntegerVariable(
"i");
352 for (uint64_t e = 0; e < 8; ++e) {
353 valuations.
emplaceBack<
false, bool, int64_t>([e](
auto ,
auto const& var,
auto& value) {
354 using ValueType = std::remove_cvref_t<
decltype(value)>;
355 if constexpr (std::is_same_v<ValueType, bool>) {
356 value = (e % 2 == 0);
358 static_assert(std::is_same_v<ValueType, int64_t>);
359 value =
static_cast<int64_t
>(e);
363 ASSERT_EQ(8u, valuations.
size());
367 for (uint64_t e = 1; e < 8; e += 2) {
371 ASSERT_EQ(4u, selectedBv.size());
372 EXPECT_EQ(1u, selectedBv.numClasses());
373 for (uint64_t sel = 0; sel < 4; ++sel) {
374 uint64_t
const origEntity = 2 * sel + 1;
375 EXPECT_EQ(
false, selectedBv.readValue<
bool>(sel, b)) <<
" selected entity " << sel;
376 EXPECT_EQ(
static_cast<int64_t
>(origEntity), selectedBv.readValue<int64_t>(sel, i)) <<
" selected entity " << sel;
380 std::vector<uint64_t>
const indices = {6, 0, 4};
382 ASSERT_EQ(3u, selectedVec.size());
383 EXPECT_EQ(
true, selectedVec.readValue<
bool>(0, b));
384 EXPECT_EQ(6, selectedVec.readValue<int64_t>(0, i));
385 EXPECT_EQ(
true, selectedVec.readValue<
bool>(1, b));
386 EXPECT_EQ(0, selectedVec.readValue<int64_t>(1, i));
387 EXPECT_EQ(
true, selectedVec.readValue<
bool>(2, b));
388 EXPECT_EQ(4, selectedVec.readValue<int64_t>(2, i));
391 ASSERT_EQ(8u, valuations.
size());
392 for (uint64_t e = 0; e < 8; ++e) {
393 EXPECT_EQ(e % 2 == 0, valuations.
readValue<
bool>(e, b)) <<
" at original entity " << e;
394 EXPECT_EQ(
static_cast<int64_t
>(e), valuations.
readValue<int64_t>(e, i)) <<
" at original entity " << e;
398TEST(ValuationTest, RejectsNonCompliantDoubleOrStringSize) {
401 auto manager = std::make_shared<storm::expressions::ExpressionManager>();
402 auto const d = manager->declareRationalVariable(
"d");
405 .name =
"d", .isOptional = std::nullopt, .type = {
storm::umb::Type::Double, 128}, .lower = {}, .upper = {}, .offset = {}};
406 EXPECT_THROW(doubleBuilder.
addVariable(badDouble), storm::exceptions::WrongFormatException);
408 auto const s = manager->declareStringVariable(
"s");
411 .name =
"s", .isOptional = std::nullopt, .type = {
storm::umb::Type::String, 128}, .lower = {}, .upper = {}, .offset = {}};
412 EXPECT_THROW(stringBuilder.
addVariable(badString), storm::exceptions::WrongFormatException);
417 .name =
"d", .isOptional = std::nullopt, .type = {
storm::umb::Type::Double, std::nullopt}, .lower = {}, .upper = {}, .offset = {}};