Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
RationalFunctionToExpression.cpp
Go to the documentation of this file.
2
5
6namespace storm {
7namespace expressions {
8template<typename ValueType>
9RationalFunctionToExpression<ValueType>::RationalFunctionToExpression(std::shared_ptr<ExpressionManager> manager) : manager(manager) {
10 // Intentionally left empty.
11}
12
13template<typename ValueType>
14std::shared_ptr<ExpressionManager> RationalFunctionToExpression<ValueType>::getManager() {
15 return manager;
16}
17
18template<typename ValueType>
20 function.simplify();
21 auto varsFunction = function.gatherVariables();
22 for (auto var : varsFunction) {
23 auto varsManager = manager->getVariables();
24 bool found = find_if(varsManager.begin(), varsManager.end(), [&](auto val) -> bool { return val.getName() == var.name(); }) != varsManager.end();
25 if (!found) {
26 manager->declareRationalVariable(var.name());
27 }
28 }
29
30 auto denominator = function.denominator();
31 if (!denominator.isConstant()) {
32 STORM_LOG_DEBUG("Expecting the denominator to be constant");
33 }
34
36 if (function.isConstant()) {
37 result = manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(function.constantPart()));
38 } else {
39 auto nominator = function.nominatorAsPolynomial().polynomialWithCoefficient();
40 result = manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(nominator.constantPart()));
41 for (auto itr = nominator.begin(); itr != nominator.end(); ++itr) {
42 varsFunction.clear();
43 itr->gatherVariables(varsFunction);
44
45 storm::expressions::Expression nominatorPartExpr =
46 manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(itr->coeff()));
47 for (auto var : varsFunction) {
48 nominatorPartExpr =
49 nominatorPartExpr *
50 storm::expressions::pow(manager->getVariable(var.name()),
51 manager->rational(storm::utility::convertNumber<storm::RationalNumber>(itr->monomial()->exponentOfVariable(var))));
52 }
53 if (varsFunction.size() >= 1) {
54 result = result + nominatorPartExpr;
55 }
56 }
57 storm::expressions::Expression denominatorVal =
58 manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(denominator.constantPart()));
59 result = result / denominatorVal;
60 }
61
62 return result;
63}
64
66} // namespace expressions
67} // namespace storm
Expression simplify() const
Simplifies the expression according to some basic rules.
void gatherVariables(std::set< storm::expressions::Variable > &variables) const
Retrieves the set of all variables that appear in the expression.
RationalFunctionToExpression(std::shared_ptr< ExpressionManager > manager)
std::shared_ptr< ExpressionManager > getManager()
Retrieves the manager responsible for the variables of this valuation.
Expression toExpression(ValueType function)
Transforms the function into an expression.
#define STORM_LOG_DEBUG(message)
Definition logging.h:18
Expression pow(Expression const &base, Expression const &exponent, bool allowIntegerType)
The type of the resulting expression is.