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.

119 lines
7.0 KiB

  1. #include "src/logic/ToExpressionVisitor.h"
  2. #include "src/logic/Formulas.h"
  3. #include "src/storage/expressions/ExpressionManager.h"
  4. #include "src/utility/macros.h"
  5. #include "src/exceptions/InvalidOperationException.h"
  6. namespace storm {
  7. namespace logic {
  8. storm::expressions::Expression ToExpressionVisitor::toExpression(Formula const& f, storm::expressions::ExpressionManager const& manager) const {
  9. boost::any result = f.accept(*this, std::ref(manager));
  10. return boost::any_cast<storm::expressions::Expression>(result);
  11. }
  12. boost::any ToExpressionVisitor::visit(AtomicExpressionFormula const& f, boost::any const& data) const {
  13. return f.getExpression();
  14. }
  15. boost::any ToExpressionVisitor::visit(AtomicLabelFormula const& f, boost::any const& data) const {
  16. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression, because the undefined atomic label '" << f.getLabel() << "' appears in the formula.");
  17. }
  18. boost::any ToExpressionVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
  19. storm::expressions::Expression left = boost::any_cast<storm::expressions::Expression>(f.getLeftSubformula().accept(*this, data));
  20. storm::expressions::Expression right = boost::any_cast<storm::expressions::Expression>(f.getRightSubformula().accept(*this, data));
  21. switch (f.getOperator()) {
  22. case BinaryBooleanStateFormula::OperatorType::And:
  23. return left && right;
  24. break;
  25. case BinaryBooleanStateFormula::OperatorType::Or:
  26. return left || right;
  27. break;
  28. }
  29. }
  30. boost::any ToExpressionVisitor::visit(BooleanLiteralFormula const& f, boost::any const& data) const {
  31. storm::expressions::Expression result;
  32. if (f.isTrueFormula()) {
  33. result = boost::any_cast<std::reference_wrapper<storm::expressions::ExpressionManager const>>(data).get().boolean(true);
  34. } else {
  35. result = boost::any_cast<std::reference_wrapper<storm::expressions::ExpressionManager const>>(data).get().boolean(false);
  36. }
  37. return result;
  38. }
  39. boost::any ToExpressionVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
  40. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  41. }
  42. boost::any ToExpressionVisitor::visit(ConditionalFormula const& f, boost::any const& data) const {
  43. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  44. }
  45. boost::any ToExpressionVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const {
  46. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  47. }
  48. boost::any ToExpressionVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
  49. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  50. }
  51. boost::any ToExpressionVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const {
  52. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  53. }
  54. boost::any ToExpressionVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
  55. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  56. }
  57. boost::any ToExpressionVisitor::visit(InstantaneousRewardFormula const& f, boost::any const& data) const {
  58. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  59. }
  60. boost::any ToExpressionVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
  61. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  62. }
  63. boost::any ToExpressionVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const& data) const {
  64. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  65. }
  66. boost::any ToExpressionVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const {
  67. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  68. }
  69. boost::any ToExpressionVisitor::visit(NextFormula const& f, boost::any const& data) const {
  70. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  71. }
  72. boost::any ToExpressionVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
  73. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  74. }
  75. boost::any ToExpressionVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
  76. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  77. }
  78. boost::any ToExpressionVisitor::visit(TotalRewardFormula const& f, boost::any const& data) const {
  79. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  80. }
  81. boost::any ToExpressionVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
  82. storm::expressions::Expression subexpression = boost::any_cast<storm::expressions::Expression>(f.getSubformula().accept(*this, data));
  83. switch (f.getOperator()) {
  84. case UnaryBooleanStateFormula::OperatorType::Not:
  85. return !subexpression;
  86. break;
  87. }
  88. }
  89. boost::any ToExpressionVisitor::visit(UntilFormula const& f, boost::any const& data) const {
  90. STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements.");
  91. }
  92. }
  93. }