Browse Source
Finished new expression classes and corresponding functional tests.
Finished new expression classes and corresponding functional tests.
Former-commit-id: 9268eab3a9
main
43 changed files with 1287 additions and 239 deletions
-
16src/exceptions/ExceptionMacros.h
-
17src/exceptions/InvalidOperationException.h
-
18src/exceptions/InvalidTypeException.h
-
20src/storage/expressions/BaseExpression.cpp
-
33src/storage/expressions/BaseExpression.h
-
29src/storage/expressions/BinaryBooleanFunctionExpression.cpp
-
11src/storage/expressions/BinaryBooleanFunctionExpression.h
-
20src/storage/expressions/BinaryExpression.cpp
-
18src/storage/expressions/BinaryExpression.h
-
37src/storage/expressions/BinaryNumericalFunctionExpression.cpp
-
11src/storage/expressions/BinaryNumericalFunctionExpression.h
-
35src/storage/expressions/BinaryRelationExpression.cpp
-
11src/storage/expressions/BinaryRelationExpression.h
-
8src/storage/expressions/BooleanConstantExpression.cpp
-
6src/storage/expressions/BooleanConstantExpression.h
-
18src/storage/expressions/BooleanLiteralExpression.cpp
-
9src/storage/expressions/BooleanLiteralExpression.h
-
8src/storage/expressions/ConstantExpression.cpp
-
5src/storage/expressions/ConstantExpression.h
-
4src/storage/expressions/DoubleConstantExpression.cpp
-
6src/storage/expressions/DoubleConstantExpression.h
-
18src/storage/expressions/DoubleLiteralExpression.cpp
-
11src/storage/expressions/DoubleLiteralExpression.h
-
213src/storage/expressions/Expression.cpp
-
151src/storage/expressions/Expression.h
-
1src/storage/expressions/ExpressionVisitor.h
-
6src/storage/expressions/IntegerConstantExpression.cpp
-
6src/storage/expressions/IntegerConstantExpression.h
-
18src/storage/expressions/IntegerLiteralExpression.cpp
-
9src/storage/expressions/IntegerLiteralExpression.h
-
26src/storage/expressions/SimpleValuation.cpp
-
3src/storage/expressions/SimpleValuation.h
-
170src/storage/expressions/SubstitutionVisitor.cpp
-
41src/storage/expressions/SubstitutionVisitor.h
-
26src/storage/expressions/UnaryBooleanFunctionExpression.cpp
-
12src/storage/expressions/UnaryBooleanFunctionExpression.h
-
18src/storage/expressions/UnaryExpression.cpp
-
10src/storage/expressions/UnaryExpression.h
-
31src/storage/expressions/UnaryNumericalFunctionExpression.cpp
-
12src/storage/expressions/UnaryNumericalFunctionExpression.h
-
33src/storage/expressions/VariableExpression.cpp
-
14src/storage/expressions/VariableExpression.h
-
357test/functional/storage/ExpressionTest.cpp
@ -0,0 +1,17 @@ |
|||
#ifndef STORM_EXCEPTIONS_INVALIDOPERATIONEXCEPTION_H_ |
|||
#define STORM_EXCEPTIONS_INVALIDOPERATIONEXCEPTION_H_ |
|||
|
|||
#include "src/exceptions/BaseException.h" |
|||
|
|||
namespace storm { |
|||
|
|||
namespace exceptions { |
|||
|
|||
/*! |
|||
* @brief This exception is thrown when an operation is invalid in this context |
|||
*/ |
|||
STORM_EXCEPTION_DEFINE_NEW(InvalidOperationException) |
|||
|
|||
} // namespace exceptions |
|||
} // namespace storm |
|||
#endif // STORM_EXCEPTIONS_INVALIDOPERATIONEXCEPTION_H_ |
@ -0,0 +1,18 @@ |
|||
#ifndef STORM_EXCEPTIONS_INVALIDTYPEEXCEPTION_H_ |
|||
#define STORM_EXCEPTIONS_INVALIDTYPEEXCEPTION_H_ |
|||
|
|||
#include "src/exceptions/BaseException.h" |
|||
|
|||
namespace storm { |
|||
|
|||
namespace exceptions { |
|||
|
|||
/*! |
|||
* @brief This exception is thrown when a type is invalid in this context |
|||
*/ |
|||
STORM_EXCEPTION_DEFINE_NEW(InvalidTypeException) |
|||
|
|||
} // namespace exceptions |
|||
|
|||
} // namespace storm |
|||
#endif // STORM_EXCEPTIONS_INVALIDTYPEEXCEPTION_H_ |
@ -1,15 +1,52 @@ |
|||
#ifndef STORM_STORAGE_EXPRESSIONS_SUBSTITUTIONVISITOR_H_ |
|||
#define STORM_STORAGE_EXPRESSIONS_SUBSTITUTIONVISITOR_H_ |
|||
|
|||
#include <stack> |
|||
|
|||
#include "src/storage/expressions/Expression.h" |
|||
#include "src/storage/expressions/ExpressionVisitor.h" |
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
template<template<typename... Arguments> class MapType> |
|||
class SubstitutionVisitor : public ExpressionVisitor { |
|||
public: |
|||
template<template<typename... Arguments> class MapType> |
|||
Expression substitute(BaseExpression const* expression, MapType<std::string, Expression> const& identifierToExpressionMap); |
|||
/*! |
|||
* Creates a new substitution visitor that uses the given map to replace identifiers. |
|||
* |
|||
* @param identifierToExpressionMap A mapping from identifiers to expressions. |
|||
*/ |
|||
SubstitutionVisitor(MapType<std::string, Expression> const& identifierToExpressionMap); |
|||
|
|||
/*! |
|||
* Substitutes the identifiers in the given expression according to the previously given map and returns the |
|||
* resulting expression. |
|||
* |
|||
* @param expression The expression in which to substitute the identifiers. |
|||
* @return The expression in which all identifiers in the key set of the previously given mapping are |
|||
* substituted with the mapped-to expressions. |
|||
*/ |
|||
Expression substitute(BaseExpression const* expression); |
|||
|
|||
virtual void visit(BinaryBooleanFunctionExpression const* expression) override; |
|||
virtual void visit(BinaryNumericalFunctionExpression const* expression) override; |
|||
virtual void visit(BinaryRelationExpression const* expression) override; |
|||
virtual void visit(BooleanConstantExpression const* expression) override; |
|||
virtual void visit(DoubleConstantExpression const* expression) override; |
|||
virtual void visit(IntegerConstantExpression const* expression) override; |
|||
virtual void visit(VariableExpression const* expression) override; |
|||
virtual void visit(UnaryBooleanFunctionExpression const* expression) override; |
|||
virtual void visit(UnaryNumericalFunctionExpression const* expression) override; |
|||
virtual void visit(BooleanLiteralExpression const* expression) override; |
|||
virtual void visit(IntegerLiteralExpression const* expression) override; |
|||
virtual void visit(DoubleLiteralExpression const* expression) override; |
|||
|
|||
private: |
|||
// A stack of expression used to pass the results to the higher levels. |
|||
std::stack<std::shared_ptr<BaseExpression const>> expressionStack; |
|||
|
|||
// A mapping of identifier names to expressions with which they shall be replaced. |
|||
MapType<std::string, Expression> const& identifierToExpressionMap; |
|||
}; |
|||
} |
|||
} |
|||
|
@ -1,42 +1,50 @@ |
|||
#include "src/storage/expressions/UnaryBooleanFunctionExpression.h"
|
|||
#include "src/storage/expressions/BooleanLiteralExpression.h"
|
|||
#include "src/exceptions/ExceptionMacros.h"
|
|||
#include "src/exceptions/InvalidTypeException.h"
|
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
UnaryBooleanFunctionExpression::UnaryBooleanFunctionExpression(ExpressionReturnType returnType, std::unique_ptr<BaseExpression>&& operand, OperatorType operatorType) : UnaryExpression(returnType, std::move(operand)), operatorType(operatorType) { |
|||
UnaryBooleanFunctionExpression::UnaryBooleanFunctionExpression(ExpressionReturnType returnType, std::shared_ptr<BaseExpression const> const& operand, OperatorType operatorType) : UnaryExpression(returnType, operand), operatorType(operatorType) { |
|||
// Intentionally left empty.
|
|||
} |
|||
|
|||
OperatorType UnaryBooleanFunctionExpression::getOperatorType() const { |
|||
UnaryBooleanFunctionExpression::OperatorType UnaryBooleanFunctionExpression::getOperatorType() const { |
|||
return this->operatorType; |
|||
} |
|||
|
|||
bool UnaryBooleanFunctionExpression::evaluateAsBool(Valuation const& valuation) const { |
|||
LOG_THROW(this->hasBooleanReturnType(), storm::exceptions::InvalidTypeException, "Unable to evaluate expression as boolean."); |
|||
|
|||
bool operandEvaluated = this->getOperand()->evaluateAsBool(valuation); |
|||
switch (this->getOperatorType()) { |
|||
case OperatorType::Not: return !operandEvaluated; break; |
|||
} |
|||
} |
|||
|
|||
std::unique_ptr<BaseExpression> UnaryBooleanFunctionExpression::simplify() const { |
|||
std::unique_ptr<BaseExpression> operandSimplified = this->getOperand()->simplify(); |
|||
std::shared_ptr<BaseExpression const> UnaryBooleanFunctionExpression::simplify() const { |
|||
std::shared_ptr<BaseExpression const> operandSimplified = this->getOperand()->simplify(); |
|||
switch (this->getOperatorType()) { |
|||
case OperatorType::Not: if (operandSimplified->isTrue()) { |
|||
return std::unique_ptr<BaseExpression>(new BooleanLiteralExpression(false)); |
|||
return std::shared_ptr<BaseExpression>(new BooleanLiteralExpression(false)); |
|||
} else { |
|||
return std::unique_ptr<BaseExpression>(new BooleanLiteralExpression(true)); |
|||
return std::shared_ptr<BaseExpression>(new BooleanLiteralExpression(true)); |
|||
} |
|||
} |
|||
|
|||
return UnaryBooleanFunctionExpression(this->getReturnType(), std::move(operandSimplified), this->getOperatorType()); |
|||
if (operandSimplified.get() == this->getOperand().get()) { |
|||
return this->shared_from_this(); |
|||
} else { |
|||
return std::shared_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(this->getReturnType(), operandSimplified, this->getOperatorType())); |
|||
} |
|||
} |
|||
|
|||
void UnaryBooleanFunctionExpression::accept(ExpressionVisitor* visitor) const { |
|||
visitor->visit(this); |
|||
} |
|||
|
|||
std::unique_ptr<BaseExpression> UnaryBooleanFunctionExpression::clone() const { |
|||
return std::unique_ptr<BaseExpression>(new UnaryBooleanFunctionExpression(*this)); |
|||
void UnaryBooleanFunctionExpression::printToStream(std::ostream& stream) const { |
|||
stream << "!(" << *this->getOperand() << ")"; |
|||
} |
|||
} |
|||
} |
@ -1,9 +1,358 @@ |
|||
#include "gtest/gtest.h"
|
|||
|
|||
#include <map>
|
|||
|
|||
#include "gtest/gtest.h"
|
|||
#include "src/storage/expressions/Expression.h"
|
|||
#include "src/storage/expressions/SimpleValuation.h"
|
|||
#include "src/exceptions/InvalidTypeException.h"
|
|||
|
|||
TEST(Expression, FactoryMethodTest) { |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createBooleanLiteral(true)); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createTrue()); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createFalse()); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createIntegerLiteral(3)); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createDoubleLiteral(3.14)); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createBooleanVariable("x")); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createIntegerVariable("y")); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createDoubleVariable("z")); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createBooleanConstant("a")); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createIntegerConstant("b")); |
|||
EXPECT_NO_THROW(storm::expressions::Expression::createDoubleConstant("c")); |
|||
} |
|||
|
|||
TEST(Expression, AccessorTest) { |
|||
storm::expressions::Expression trueExpression; |
|||
storm::expressions::Expression falseExpression; |
|||
storm::expressions::Expression threeExpression; |
|||
storm::expressions::Expression piExpression; |
|||
storm::expressions::Expression boolVarExpression; |
|||
storm::expressions::Expression intVarExpression; |
|||
storm::expressions::Expression doubleVarExpression; |
|||
storm::expressions::Expression boolConstExpression; |
|||
storm::expressions::Expression intConstExpression; |
|||
storm::expressions::Expression doubleConstExpression; |
|||
|
|||
ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue()); |
|||
ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse()); |
|||
ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3)); |
|||
ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14)); |
|||
ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x")); |
|||
ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y")); |
|||
ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z")); |
|||
ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a")); |
|||
ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b")); |
|||
ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c")); |
|||
|
|||
EXPECT_TRUE(trueExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
EXPECT_TRUE(trueExpression.isConstant()); |
|||
EXPECT_TRUE(trueExpression.isTrue()); |
|||
EXPECT_FALSE(trueExpression.isFalse()); |
|||
EXPECT_TRUE(trueExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(trueExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(falseExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
EXPECT_TRUE(falseExpression.isConstant()); |
|||
EXPECT_FALSE(falseExpression.isTrue()); |
|||
EXPECT_TRUE(falseExpression.isFalse()); |
|||
EXPECT_TRUE(falseExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(falseExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(threeExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
EXPECT_TRUE(threeExpression.isConstant()); |
|||
EXPECT_FALSE(threeExpression.isTrue()); |
|||
EXPECT_FALSE(threeExpression.isFalse()); |
|||
EXPECT_TRUE(threeExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(threeExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(piExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
EXPECT_TRUE(piExpression.isConstant()); |
|||
EXPECT_FALSE(piExpression.isTrue()); |
|||
EXPECT_FALSE(piExpression.isFalse()); |
|||
EXPECT_TRUE(piExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(piExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(boolVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
EXPECT_FALSE(boolVarExpression.isConstant()); |
|||
EXPECT_FALSE(boolVarExpression.isTrue()); |
|||
EXPECT_FALSE(boolVarExpression.isFalse()); |
|||
EXPECT_TRUE(boolVarExpression.getVariables() == std::set<std::string>({"x"})); |
|||
EXPECT_TRUE(boolVarExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(intVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
EXPECT_FALSE(intVarExpression.isConstant()); |
|||
EXPECT_FALSE(intVarExpression.isTrue()); |
|||
EXPECT_FALSE(intVarExpression.isFalse()); |
|||
EXPECT_TRUE(intVarExpression.getVariables() == std::set<std::string>({"y"})); |
|||
EXPECT_TRUE(intVarExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(doubleVarExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
EXPECT_FALSE(doubleVarExpression.isConstant()); |
|||
EXPECT_FALSE(doubleVarExpression.isTrue()); |
|||
EXPECT_FALSE(doubleVarExpression.isFalse()); |
|||
EXPECT_TRUE(doubleVarExpression.getVariables() == std::set<std::string>({"z"})); |
|||
EXPECT_TRUE(doubleVarExpression.getConstants() == std::set<std::string>()); |
|||
|
|||
EXPECT_TRUE(boolConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
EXPECT_FALSE(boolConstExpression.isConstant()); |
|||
EXPECT_FALSE(boolConstExpression.isTrue()); |
|||
EXPECT_FALSE(boolConstExpression.isFalse()); |
|||
EXPECT_TRUE(boolConstExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(boolConstExpression.getConstants() == std::set<std::string>({"a"})); |
|||
|
|||
EXPECT_TRUE(intConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
EXPECT_FALSE(intConstExpression.isConstant()); |
|||
EXPECT_FALSE(intConstExpression.isTrue()); |
|||
EXPECT_FALSE(intConstExpression.isFalse()); |
|||
EXPECT_TRUE(intConstExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(intConstExpression.getConstants() == std::set<std::string>({"b"})); |
|||
|
|||
EXPECT_TRUE(doubleConstExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
EXPECT_FALSE(doubleConstExpression.isConstant()); |
|||
EXPECT_FALSE(doubleConstExpression.isTrue()); |
|||
EXPECT_FALSE(doubleConstExpression.isFalse()); |
|||
EXPECT_TRUE(doubleConstExpression.getVariables() == std::set<std::string>()); |
|||
EXPECT_TRUE(doubleConstExpression.getConstants() == std::set<std::string>({"c"})); |
|||
} |
|||
|
|||
TEST(Expression, OperatorTest) { |
|||
storm::expressions::Expression trueExpression; |
|||
storm::expressions::Expression falseExpression; |
|||
storm::expressions::Expression threeExpression; |
|||
storm::expressions::Expression piExpression; |
|||
storm::expressions::Expression boolVarExpression; |
|||
storm::expressions::Expression intVarExpression; |
|||
storm::expressions::Expression doubleVarExpression; |
|||
storm::expressions::Expression boolConstExpression; |
|||
storm::expressions::Expression intConstExpression; |
|||
storm::expressions::Expression doubleConstExpression; |
|||
|
|||
ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue()); |
|||
ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse()); |
|||
ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3)); |
|||
ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14)); |
|||
ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x")); |
|||
ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y")); |
|||
ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z")); |
|||
ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a")); |
|||
ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b")); |
|||
ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c")); |
|||
|
|||
storm::expressions::Expression tempExpression; |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression + piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression + threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression + piExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
ASSERT_NO_THROW(tempExpression = doubleVarExpression + doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression - piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression - threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression - piExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
ASSERT_NO_THROW(tempExpression = doubleVarExpression - doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = -trueExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = -threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = -piExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
ASSERT_NO_THROW(tempExpression = -doubleVarExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression * piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression * threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression * piExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression * intConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression / piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression / threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression / piExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
ASSERT_NO_THROW(tempExpression = doubleVarExpression / intConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression && piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = trueExpression && falseExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = boolVarExpression && boolConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression || piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = trueExpression || falseExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = boolVarExpression || boolConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = !threeExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = !trueExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = !boolVarExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression == piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression == threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression == doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression != piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression != threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression != doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression > piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression > threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression > doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression >= piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression >= threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression >= doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression < piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression < threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression < doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression <= piExpression, storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression <= threeExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
ASSERT_NO_THROW(tempExpression = intVarExpression <= doubleConstExpression); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Bool); |
|||
|
|||
ASSERT_THROW(tempExpression = storm::expressions::Expression::minimum(trueExpression, piExpression), storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::minimum(threeExpression, threeExpression)); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::minimum(intVarExpression, doubleConstExpression)); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = storm::expressions::Expression::maximum(trueExpression, piExpression), storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::maximum(threeExpression, threeExpression)); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = storm::expressions::Expression::maximum(intVarExpression, doubleConstExpression)); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Double); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression.floor(), storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression.floor()); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = doubleConstExpression.floor()); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
|
|||
ASSERT_THROW(tempExpression = trueExpression.ceil(), storm::exceptions::InvalidTypeException); |
|||
ASSERT_NO_THROW(tempExpression = threeExpression.ceil()); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
ASSERT_NO_THROW(tempExpression = doubleConstExpression.ceil()); |
|||
EXPECT_TRUE(tempExpression.getReturnType() == storm::expressions::ExpressionReturnType::Int); |
|||
} |
|||
|
|||
TEST(Expression, SubstitutionTest) { |
|||
storm::expressions::Expression trueExpression; |
|||
storm::expressions::Expression falseExpression; |
|||
storm::expressions::Expression threeExpression; |
|||
storm::expressions::Expression piExpression; |
|||
storm::expressions::Expression boolVarExpression; |
|||
storm::expressions::Expression intVarExpression; |
|||
storm::expressions::Expression doubleVarExpression; |
|||
storm::expressions::Expression boolConstExpression; |
|||
storm::expressions::Expression intConstExpression; |
|||
storm::expressions::Expression doubleConstExpression; |
|||
|
|||
ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue()); |
|||
ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse()); |
|||
ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3)); |
|||
ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14)); |
|||
ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x")); |
|||
ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y")); |
|||
ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z")); |
|||
ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a")); |
|||
ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b")); |
|||
ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c")); |
|||
|
|||
storm::expressions::Expression tempExpression; |
|||
ASSERT_NO_THROW(tempExpression = (intVarExpression < threeExpression || boolVarExpression) && boolConstExpression); |
|||
|
|||
std::map<std::string, storm::expressions::Expression> substution = { std::make_pair("y", doubleConstExpression), std::make_pair("x", storm::expressions::Expression::createTrue()), std::make_pair("a", storm::expressions::Expression::createTrue()) }; |
|||
storm::expressions::Expression substitutedExpression; |
|||
ASSERT_NO_THROW(substitutedExpression = tempExpression.substitute<std::map>(substution)); |
|||
EXPECT_TRUE(substitutedExpression.simplify().isTrue()); |
|||
} |
|||
|
|||
TEST(Expression, SimplificationTest) { |
|||
storm::expressions::Expression trueExpression; |
|||
storm::expressions::Expression falseExpression; |
|||
storm::expressions::Expression threeExpression; |
|||
storm::expressions::Expression intVarExpression; |
|||
|
|||
ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue()); |
|||
ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse()); |
|||
ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3)); |
|||
ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y")); |
|||
|
|||
storm::expressions::Expression tempExpression; |
|||
storm::expressions::Expression simplifiedExpression; |
|||
|
|||
ASSERT_NO_THROW(tempExpression = trueExpression || intVarExpression > threeExpression); |
|||
ASSERT_NO_THROW(simplifiedExpression = tempExpression.simplify()); |
|||
EXPECT_TRUE(simplifiedExpression.isTrue()); |
|||
|
|||
ASSERT_NO_THROW(tempExpression = falseExpression && intVarExpression > threeExpression); |
|||
ASSERT_NO_THROW(simplifiedExpression = tempExpression.simplify()); |
|||
EXPECT_TRUE(simplifiedExpression.isFalse()); |
|||
} |
|||
|
|||
TEST(Expression, SimpleValuationTest) { |
|||
ASSERT_NO_THROW(storm::expressions::SimpleValuation evaluation(1, 1, 1)); |
|||
TEST(Expression, SimpleEvaluationTest) { |
|||
storm::expressions::Expression trueExpression; |
|||
storm::expressions::Expression falseExpression; |
|||
storm::expressions::Expression threeExpression; |
|||
storm::expressions::Expression piExpression; |
|||
storm::expressions::Expression boolVarExpression; |
|||
storm::expressions::Expression intVarExpression; |
|||
storm::expressions::Expression doubleVarExpression; |
|||
storm::expressions::Expression boolConstExpression; |
|||
storm::expressions::Expression intConstExpression; |
|||
storm::expressions::Expression doubleConstExpression; |
|||
|
|||
ASSERT_NO_THROW(trueExpression = storm::expressions::Expression::createTrue()); |
|||
ASSERT_NO_THROW(falseExpression = storm::expressions::Expression::createFalse()); |
|||
ASSERT_NO_THROW(threeExpression = storm::expressions::Expression::createIntegerLiteral(3)); |
|||
ASSERT_NO_THROW(piExpression = storm::expressions::Expression::createDoubleLiteral(3.14)); |
|||
ASSERT_NO_THROW(boolVarExpression = storm::expressions::Expression::createBooleanVariable("x")); |
|||
ASSERT_NO_THROW(intVarExpression = storm::expressions::Expression::createIntegerVariable("y")); |
|||
ASSERT_NO_THROW(doubleVarExpression = storm::expressions::Expression::createDoubleVariable("z")); |
|||
ASSERT_NO_THROW(boolConstExpression = storm::expressions::Expression::createBooleanConstant("a")); |
|||
ASSERT_NO_THROW(intConstExpression = storm::expressions::Expression::createIntegerConstant("b")); |
|||
ASSERT_NO_THROW(doubleConstExpression = storm::expressions::Expression::createDoubleConstant("c")); |
|||
|
|||
storm::expressions::Expression tempExpression; |
|||
|
|||
ASSERT_NO_THROW(tempExpression = (intVarExpression < threeExpression || boolVarExpression) && boolConstExpression); |
|||
|
|||
ASSERT_NO_THROW(storm::expressions::SimpleValuation valuation(2, 2, 2)); |
|||
storm::expressions::SimpleValuation valuation(2, 2, 2); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("x", 0)); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("a", 1)); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("y", 0)); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("b", 1)); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("z", 0)); |
|||
ASSERT_NO_THROW(valuation.setIdentifierIndex("c", 1)); |
|||
|
|||
ASSERT_THROW(tempExpression.evaluateAsDouble(valuation), storm::exceptions::InvalidTypeException); |
|||
ASSERT_THROW(tempExpression.evaluateAsInt(valuation), storm::exceptions::InvalidTypeException); |
|||
EXPECT_FALSE(tempExpression.evaluateAsBool(valuation)); |
|||
ASSERT_NO_THROW(valuation.setBooleanValue("a", true)); |
|||
EXPECT_TRUE(tempExpression.evaluateAsBool(valuation)); |
|||
ASSERT_NO_THROW(valuation.setIntegerValue("y", 3)); |
|||
EXPECT_FALSE(tempExpression.evaluateAsBool(valuation)); |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue