You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

62 lines
2.5 KiB

#include "gtest/gtest.h"
#include "src/storage/expressions/Expression.h"
#include "src/storage/expressions/ExpressionManager.h"
#include "src/storage/expressions/SimpleValuation.h"
#include "src/storage/expressions/ExprtkExpressionEvaluator.h"
TEST(ExpressionEvaluation, NaiveEvaluation) {
std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
storm::expressions::Variable x;
storm::expressions::Variable y;
storm::expressions::Variable z;
ASSERT_NO_THROW(x = manager->declareBooleanVariable("x"));
ASSERT_NO_THROW(y = manager->declareIntegerVariable("y"));
ASSERT_NO_THROW(z = manager->declareRationalVariable("z"));
storm::expressions::SimpleValuation eval(manager);
storm::expressions::Expression iteExpression = storm::expressions::ite(x, y + z, manager->integer(3) * z);
eval.setRationalValue(z, 5.5);
eval.setBooleanValue(x, true);
for (int_fast64_t i = 0; i < 1000; ++i) {
eval.setIntegerValue(y, 3 + i);
EXPECT_NEAR(8.5 + i, iteExpression.evaluateAsDouble(&eval), 1e-6);
}
eval.setBooleanValue(x, false);
for (int_fast64_t i = 0; i < 1000; ++i) {
double zValue = i / static_cast<double>(10);
eval.setRationalValue(z, zValue);
EXPECT_NEAR(3 * zValue, iteExpression.evaluateAsDouble(&eval), 1e-6);
}
}
TEST(ExpressionEvaluation, ExprTkEvaluation) {
std::shared_ptr<storm::expressions::ExpressionManager> manager(new storm::expressions::ExpressionManager());
storm::expressions::Variable x;
storm::expressions::Variable y;
storm::expressions::Variable z;
ASSERT_NO_THROW(x = manager->declareBooleanVariable("x"));
ASSERT_NO_THROW(y = manager->declareIntegerVariable("y"));
ASSERT_NO_THROW(z = manager->declareRationalVariable("z"));
storm::expressions::Expression iteExpression = storm::expressions::ite(x, y + z, manager->integer(3) * z);
storm::expressions::ExprtkExpressionEvaluator eval(*manager);
eval.setRationalValue(z, 5.5);
eval.setBooleanValue(x, true);
for (int_fast64_t i = 0; i < 1000; ++i) {
eval.setIntegerValue(y, 3 + i);
EXPECT_NEAR(8.5 + i, eval.asRational(iteExpression), 1e-6);
}
eval.setBooleanValue(x, false);
for (int_fast64_t i = 0; i < 1000; ++i) {
double zValue = i / static_cast<double>(10);
eval.setRationalValue(z, zValue);
EXPECT_NEAR(3 * zValue, eval.asRational(iteExpression), 1e-6);
}
}