23 changed files with 515 additions and 97 deletions
-
1src/logic/AtomicLabelFormula.cpp
-
2src/logic/BinaryBooleanStateFormula.h
-
2src/logic/BooleanLiteralFormula.h
-
2src/logic/BoundedUntilFormula.h
-
37src/logic/CloneVisitor.h
-
4src/logic/ConditionalFormula.cpp
-
7src/logic/ConditionalFormula.h
-
106src/logic/CopyVisitor.cpp
-
2src/logic/CumulativeRewardFormula.h
-
4src/logic/EventuallyFormula.cpp
-
2src/logic/EventuallyFormula.h
-
12src/logic/Formula.cpp
-
9src/logic/Formula.h
-
27src/logic/LabelSubstitutionVisitor.cpp
-
29src/logic/LabelSubstitutionVisitor.h
-
4src/logic/OperatorFormula.cpp
-
4src/logic/OperatorFormula.h
-
103src/logic/ToExpressionVisitor.cpp
-
39src/logic/ToExpressionVisitor.h
-
167src/modelchecker/reachability/SparseMdpLearningModelChecker.cpp
-
34src/modelchecker/reachability/SparseMdpLearningModelChecker.h
-
8src/storage/prism/Program.cpp
-
7src/storage/prism/Program.h
@ -0,0 +1,37 @@ |
|||
#ifndef STORM_LOGIC_CLONEVISITOR_H_ |
|||
#define STORM_LOGIC_CLONEVISITOR_H_ |
|||
|
|||
#include "src/logic/FormulaVisitor.h" |
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
class CloneVisitor : public FormulaVisitor { |
|||
public: |
|||
std::shared_ptr<Formula> clone(Formula const& f) const; |
|||
|
|||
virtual boost::any visit(AtomicExpressionFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(AtomicLabelFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BinaryBooleanStateFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BooleanLiteralFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BoundedUntilFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(ConditionalFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(CumulativeRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(EventuallyFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(TimeOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(GloballyFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(InstantaneousRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(LongRunAverageRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(NextFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(ProbabilityOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(RewardOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(UnaryBooleanStateFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(UntilFormula const& f, boost::any const& data) const override; |
|||
}; |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
#endif /* STORM_LOGIC_CLONEVISITOR_H_ */ |
@ -0,0 +1,106 @@ |
|||
#include "src/logic/CloneVisitor.h"
|
|||
|
|||
#include "src/logic/Formulas.h"
|
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
std::shared_ptr<Formula> CloneVisitor::clone(Formula const& f) const { |
|||
boost::any result = f.accept(*this, boost::any()); |
|||
return boost::any_cast<std::shared_ptr<Formula>>(result); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(AtomicExpressionFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<AtomicExpressionFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(AtomicLabelFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<AtomicLabelFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data)); |
|||
std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<BinaryBooleanStateFormula>(f.getOperator(), left, right)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(BooleanLiteralFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<BooleanLiteralFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data)); |
|||
std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data)); |
|||
if (f.hasDiscreteTimeBound()) { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, f.getDiscreteTimeBound())); |
|||
} else { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<BoundedUntilFormula>(left, right, f.getIntervalBounds())); |
|||
} |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(ConditionalFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
std::shared_ptr<Formula> conditionFormula = boost::any_cast<std::shared_ptr<Formula>>(f.getConditionFormula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<ConditionalFormula>(subformula, conditionFormula, f.getContext())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<CumulativeRewardFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(EventuallyFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<EventuallyFormula>(subformula, f.getContext())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<TimeOperatorFormula>(subformula, f.getOperatorInformation())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(GloballyFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<GloballyFormula>(subformula)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(InstantaneousRewardFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<InstantaneousRewardFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageOperatorFormula>(subformula, f.getOperatorInformation())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<LongRunAverageRewardFormula>(f)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(NextFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<NextFormula>(subformula)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<ProbabilityOperatorFormula>(subformula, f.getOperatorInformation())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<RewardOperatorFormula>(subformula, f.getOptionalRewardModelName(), f.getOperatorInformation())); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> subformula = boost::any_cast<std::shared_ptr<Formula>>(f.getSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<UnaryBooleanStateFormula>(f.getOperator(), subformula)); |
|||
} |
|||
|
|||
boost::any CloneVisitor::visit(UntilFormula const& f, boost::any const& data) const { |
|||
std::shared_ptr<Formula> left = boost::any_cast<std::shared_ptr<Formula>>(f.getLeftSubformula().accept(*this, data)); |
|||
std::shared_ptr<Formula> right = boost::any_cast<std::shared_ptr<Formula>>(f.getRightSubformula().accept(*this, data)); |
|||
return std::static_pointer_cast<Formula>(std::make_shared<UntilFormula>(left, right)); |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
#include "src/logic/LabelSubstitutionVisitor.h"
|
|||
|
|||
#include "src/logic/Formulas.h"
|
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
LabelSubstitutionVisitor::LabelSubstitutionVisitor(std::map<std::string, storm::expressions::Expression> const& labelToExpressionMapping) : labelToExpressionMapping(labelToExpressionMapping) { |
|||
// Intentionally left empty.
|
|||
} |
|||
|
|||
std::shared_ptr<Formula> LabelSubstitutionVisitor::substitute(Formula const& f) const { |
|||
boost::any result = f.accept(*this, boost::any()); |
|||
return boost::any_cast<std::shared_ptr<Formula>>(result); |
|||
} |
|||
|
|||
boost::any LabelSubstitutionVisitor::visit(AtomicLabelFormula const& f, boost::any const& data) const { |
|||
auto it = labelToExpressionMapping.find(f.getLabel()); |
|||
if (it != labelToExpressionMapping.end()) { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<AtomicExpressionFormula>(it->second)); |
|||
} else { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<AtomicLabelFormula>(f)); |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
#ifndef STORM_LOGIC_LABELSUBSTITUTIONVISITOR_H_ |
|||
#define STORM_LOGIC_LABELSUBSTITUTIONVISITOR_H_ |
|||
|
|||
#include <map> |
|||
|
|||
#include "src/logic/CloneVisitor.h" |
|||
|
|||
#include "src/storage/expressions/Expression.h" |
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
class LabelSubstitutionVisitor : public CloneVisitor { |
|||
public: |
|||
LabelSubstitutionVisitor(std::map<std::string, storm::expressions::Expression> const& labelToExpressionMapping); |
|||
|
|||
std::shared_ptr<Formula> substitute(Formula const& f) const; |
|||
|
|||
virtual boost::any visit(AtomicLabelFormula const& f, boost::any const& data) const override; |
|||
|
|||
private: |
|||
std::map<std::string, storm::expressions::Expression> const& labelToExpressionMapping; |
|||
}; |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
#endif /* STORM_LOGIC_FORMULAINFORMATIONVISITOR_H_ */ |
@ -0,0 +1,103 @@ |
|||
#include "src/logic/ToExpressionVisitor.h"
|
|||
|
|||
#include "src/logic/Formulas.h"
|
|||
|
|||
#include "src/utility/macros.h"
|
|||
#include "src/exceptions/InvalidOperationException.h"
|
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
storm::expressions::Expression ToExpressionVisitor::toExpression(Formula const& f) const { |
|||
boost::any result = f.accept(*this, boost::any()); |
|||
return boost::any_cast<storm::expressions::Expression>(result); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(AtomicExpressionFormula const& f, boost::any const& data) const { |
|||
return f.getExpression(); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(AtomicLabelFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const { |
|||
storm::expressions::Expression left = boost::any_cast<storm::expressions::Expression>(f.getLeftSubformula().accept(*this, data)); |
|||
storm::expressions::Expression right = boost::any_cast<storm::expressions::Expression>(f.getRightSubformula().accept(*this, data)); |
|||
switch (f.getOperator()) { |
|||
case BinaryBooleanStateFormula::OperatorType::And: |
|||
return left && right; |
|||
break; |
|||
case BinaryBooleanStateFormula::OperatorType::Or: |
|||
return left || right; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(BooleanLiteralFormula const& f, boost::any const& data) const { |
|||
return std::static_pointer_cast<Formula>(std::make_shared<BooleanLiteralFormula>(f)); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(ConditionalFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(EventuallyFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(GloballyFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(InstantaneousRewardFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(NextFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const { |
|||
storm::expressions::Expression subexpression = boost::any_cast<storm::expressions::Expression>(f.getSubformula().accept(*this, data)); |
|||
switch (f.getOperator()) { |
|||
case UnaryBooleanStateFormula::OperatorType::Not: |
|||
return !subexpression; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
boost::any ToExpressionVisitor::visit(UntilFormula const& f, boost::any const& data) const { |
|||
STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Cannot assemble expression from formula that contains illegal elements."); |
|||
} |
|||
|
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
#ifndef STORM_LOGIC_TOEXPRESSIONVISITOR_H_ |
|||
#define STORM_LOGIC_TOEXPRESSIONVISITOR_H_ |
|||
|
|||
#include "src/logic/FormulaVisitor.h" |
|||
|
|||
#include "src/storage/expressions/Expression.h" |
|||
|
|||
namespace storm { |
|||
namespace logic { |
|||
|
|||
class ToExpressionVisitor : public FormulaVisitor { |
|||
public: |
|||
storm::expressions::Expression toExpression(Formula const& f) const; |
|||
|
|||
virtual boost::any visit(AtomicExpressionFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(AtomicLabelFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BinaryBooleanStateFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BooleanLiteralFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(BoundedUntilFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(ConditionalFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(CumulativeRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(EventuallyFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(TimeOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(GloballyFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(InstantaneousRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(LongRunAverageRewardFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(NextFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(ProbabilityOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(RewardOperatorFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(UnaryBooleanStateFormula const& f, boost::any const& data) const override; |
|||
virtual boost::any visit(UntilFormula const& f, boost::any const& data) const override; |
|||
}; |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
#endif /* STORM_LOGIC_TOEXPRESSIONVISITOR_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue