Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
RationalFunctionToExpression.cpp
Go to the documentation of this file.
1//
2// Created by Jip Spel on 24.09.18.
3//
4
7
8namespace storm {
9namespace expressions {
10template<typename ValueType>
11RationalFunctionToExpression<ValueType>::RationalFunctionToExpression(std::shared_ptr<ExpressionManager> manager) : manager(manager) {
12 // Intentionally left empty.
13}
14
15template<typename ValueType>
16std::shared_ptr<ExpressionManager> RationalFunctionToExpression<ValueType>::getManager() {
17 return manager;
18}
19
20template<typename ValueType>
22 function.simplify();
23 auto varsFunction = function.gatherVariables();
24 for (auto var : varsFunction) {
25 auto varsManager = manager->getVariables();
26 bool found = find_if(varsManager.begin(), varsManager.end(), [&](auto val) -> bool { return val.getName() == var.name(); }) != varsManager.end();
27 if (!found) {
28 manager->declareRationalVariable(var.name());
29 }
30 }
31
32 auto denominator = function.denominator();
33 if (!denominator.isConstant()) {
34 STORM_LOG_DEBUG("Expecting the denominator to be constant");
35 }
36
38 if (function.isConstant()) {
39 result = manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(function.constantPart()));
40 } else {
41 auto nominator = function.nominatorAsPolynomial().polynomialWithCoefficient();
42 result = manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(nominator.constantPart()));
43 for (auto itr = nominator.begin(); itr != nominator.end(); ++itr) {
44 varsFunction.clear();
45 itr->gatherVariables(varsFunction);
46
47 storm::expressions::Expression nominatorPartExpr =
48 manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(itr->coeff()));
49 for (auto var : varsFunction) {
50 nominatorPartExpr =
51 nominatorPartExpr *
52 storm::expressions::pow(manager->getVariable(var.name()),
53 manager->rational(storm::utility::convertNumber<storm::RationalNumber>(itr->monomial()->exponentOfVariable(var))));
54 }
55 if (varsFunction.size() >= 1) {
56 result = result + nominatorPartExpr;
57 }
58 }
59 storm::expressions::Expression denominatorVal =
60 manager->rational(storm::utility::convertNumber<storm::RationalNumber, storm::RationalFunctionCoefficient>(denominator.constantPart()));
61 result = result / denominatorVal;
62 }
63
64 return result;
65}
66
68} // namespace expressions
69} // 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:23
Expression pow(Expression const &base, Expression const &exponent, bool allowIntegerType)
The type of the resulting expression is.
LabParser.cpp.
Definition cli.cpp:18