52 changed files with 477 additions and 309 deletions
-
6src/adapters/CarlAdapter.h
-
5src/builder/ExplicitModelBuilder.cpp
-
26src/cli/entrypoints.h
-
1src/generator/Choice.cpp
-
1src/generator/CompressedState.cpp
-
1src/generator/JaniNextStateGenerator.cpp
-
6src/generator/NextStateGenerator.cpp
-
6src/generator/NextStateGenerator.h
-
29src/generator/PrismNextStateGenerator.cpp
-
2src/generator/PrismNextStateGenerator.h
-
1src/generator/StateBehavior.cpp
-
2src/modelchecker/csl/SparseCtmcCslModelChecker.cpp
-
5src/modelchecker/csl/helper/SparseCtmcCslHelper.cpp
-
1src/modelchecker/prctl/SparseDtmcPrctlModelChecker.cpp
-
5src/modelchecker/prctl/helper/SparseDtmcPrctlHelper.cpp
-
8src/modelchecker/propositional/SparsePropositionalModelChecker.cpp
-
4src/modelchecker/reachability/SparseDtmcEliminationModelChecker.cpp
-
20src/modelchecker/results/ExplicitQuantitativeCheckResult.cpp
-
4src/models/sparse/Ctmc.cpp
-
4src/models/sparse/DeterministicModel.cpp
-
158src/models/sparse/Dtmc.cpp
-
7src/models/sparse/Dtmc.h
-
4src/models/sparse/MarkovAutomaton.cpp
-
4src/models/sparse/Mdp.cpp
-
7src/models/sparse/Model.cpp
-
3src/models/sparse/NondeterministicModel.cpp
-
11src/models/sparse/StandardRewardModel.cpp
-
4src/solver/stateelimination/ConditionalStateEliminator.cpp
-
4src/solver/stateelimination/DynamicStatePriorityQueue.cpp
-
4src/solver/stateelimination/LongRunAverageEliminator.cpp
-
3src/solver/stateelimination/PrioritizedStateEliminator.cpp
-
3src/solver/stateelimination/StateEliminator.cpp
-
7src/storage/Distribution.cpp
-
7src/storage/StronglyConnectedComponentDecomposition.cpp
-
8src/storage/bisimulation/BisimulationDecomposition.cpp
-
7src/storage/bisimulation/DeterministicModelBisimulationDecomposition.cpp
-
4src/storage/bisimulation/NondeterministicModelBisimulationDecomposition.cpp
-
38src/storage/expressions/ExpressionEvaluator.cpp
-
36src/storage/expressions/ExpressionEvaluator.h
-
3src/storage/expressions/ExpressionEvaluatorBase.cpp
-
3src/storage/expressions/ExprtkExpressionEvaluator.cpp
-
4src/storage/expressions/ToRationalFunctionVisitor.cpp
-
2src/storage/expressions/ToRationalFunctionVisitor.h
-
91src/storage/expressions/ToRationalNumberVisitor.cpp
-
31src/storage/expressions/ToRationalNumberVisitor.h
-
22src/utility/constants.cpp
-
58src/utility/graph.cpp
-
15src/utility/solver.cpp
-
14src/utility/solver.h
-
7src/utility/stateelimination.cpp
-
72src/utility/storm.h
-
8test/functional/modelchecker/EigenDtmcPrctlModelCheckerTest.cpp
@ -0,0 +1,91 @@ |
|||
#include "src/storage/expressions/ToRationalNumberVisitor.h"
|
|||
|
|||
#include "src/utility/macros.h"
|
|||
#include "src/exceptions/InvalidArgumentException.h"
|
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
template<typename RationalNumberType> |
|||
ToRationalNumberVisitor<RationalNumberType>::ToRationalNumberVisitor() : ExpressionVisitor() { |
|||
// Intentionally left empty.
|
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
RationalNumberType ToRationalNumberVisitor<RationalNumberType>::toRationalNumber(Expression const& expression) { |
|||
return boost::any_cast<RationalNumberType>(expression.accept(*this)); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(IfThenElseExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(BinaryBooleanFunctionExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational number."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(BinaryNumericalFunctionExpression const& expression) { |
|||
RationalNumberType firstOperandAsRationalFunction = boost::any_cast<RationalNumberType>(expression.getFirstOperand()->accept(*this)); |
|||
RationalNumberType secondOperandAsRationalFunction = boost::any_cast<RationalNumberType>(expression.getSecondOperand()->accept(*this)); |
|||
switch(expression.getOperatorType()) { |
|||
case BinaryNumericalFunctionExpression::OperatorType::Plus: |
|||
return firstOperandAsRationalFunction + secondOperandAsRationalFunction; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Minus: |
|||
return firstOperandAsRationalFunction - secondOperandAsRationalFunction; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Times: |
|||
return firstOperandAsRationalFunction * secondOperandAsRationalFunction; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Divide: |
|||
return firstOperandAsRationalFunction / secondOperandAsRationalFunction; |
|||
break; |
|||
default: |
|||
STORM_LOG_ASSERT(false, "Illegal operator type."); |
|||
} |
|||
|
|||
// Return a dummy. This point must, however, never be reached.
|
|||
return boost::any(); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(BinaryRelationExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(VariableExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Cannot transform expressions containing variables to a rational number."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(UnaryBooleanFunctionExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(UnaryNumericalFunctionExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(BooleanLiteralExpression const& expression) { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Expression cannot be translated into a rational function."); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(IntegerLiteralExpression const& expression) { |
|||
return RationalNumberType(carl::rationalize<storm::RationalNumber>(static_cast<size_t>(expression.getValue()))); |
|||
} |
|||
|
|||
template<typename RationalNumberType> |
|||
boost::any ToRationalNumberVisitor<RationalNumberType>::visit(DoubleLiteralExpression const& expression) { |
|||
return RationalNumberType(carl::rationalize<storm::RationalNumber>(expression.getValue())); |
|||
} |
|||
|
|||
template class ToRationalNumberVisitor<storm::RationalNumber>; |
|||
|
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
#pragma once |
|||
|
|||
#include "src/adapters/CarlAdapter.h" |
|||
#include "src/storage/expressions/Expression.h" |
|||
#include "src/storage/expressions/Expressions.h" |
|||
#include "src/storage/expressions/ExpressionVisitor.h" |
|||
#include "src/storage/expressions/Variable.h" |
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
|
|||
template<typename RationalNumberType> |
|||
class ToRationalNumberVisitor : public ExpressionVisitor { |
|||
public: |
|||
ToRationalNumberVisitor(); |
|||
|
|||
RationalNumberType toRationalNumber(Expression const& expression); |
|||
|
|||
virtual boost::any visit(IfThenElseExpression const& expression) override; |
|||
virtual boost::any visit(BinaryBooleanFunctionExpression const& expression) override; |
|||
virtual boost::any visit(BinaryNumericalFunctionExpression const& expression) override; |
|||
virtual boost::any visit(BinaryRelationExpression const& expression) override; |
|||
virtual boost::any visit(VariableExpression const& expression) override; |
|||
virtual boost::any visit(UnaryBooleanFunctionExpression const& expression) override; |
|||
virtual boost::any visit(UnaryNumericalFunctionExpression const& expression) override; |
|||
virtual boost::any visit(BooleanLiteralExpression const& expression) override; |
|||
virtual boost::any visit(IntegerLiteralExpression const& expression) override; |
|||
virtual boost::any visit(DoubleLiteralExpression const& expression) override; |
|||
}; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue