#include "storm/logic/CloneVisitor.h" #include "storm/logic/Formulas.h" namespace storm { namespace logic { std::shared_ptr CloneVisitor::clone(Formula const& f) const { boost::any result = f.accept(*this, boost::any()); return boost::any_cast>(result); } boost::any CloneVisitor::visit(AtomicExpressionFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(AtomicLabelFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const { std::shared_ptr left = boost::any_cast>(f.getLeftSubformula().accept(*this, data)); std::shared_ptr right = boost::any_cast>(f.getRightSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(f.getOperator(), left, right)); } boost::any CloneVisitor::visit(BooleanLiteralFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const { std::vector> lowerBounds, upperBounds; std::vector timeBoundReferences; for (uint64_t i = 0; i < f.getDimension(); ++i) { if (f.hasLowerBound(i)) { lowerBounds.emplace_back(TimeBound(f.isLowerBoundStrict(i), f.getLowerBound(i))); } else { lowerBounds.emplace_back(); } if (f.hasUpperBound(i)) { upperBounds.emplace_back(TimeBound(f.isUpperBoundStrict(i), f.getUpperBound(i))); } else { upperBounds.emplace_back(); } timeBoundReferences.push_back(f.getTimeBoundReference(i)); } if (f.hasMultiDimensionalSubformulas()) { std::vector> leftSubformulas, rightSubformulas; for (uint64_t i = 0; i < f.getDimension(); ++i) { leftSubformulas.push_back(boost::any_cast>(f.getLeftSubformula(i).accept(*this, data))); rightSubformulas.push_back(boost::any_cast>(f.getRightSubformula(i).accept(*this, data))); } return std::static_pointer_cast(std::make_shared(leftSubformulas, rightSubformulas, lowerBounds, upperBounds, timeBoundReferences)); } else { std::shared_ptr left = boost::any_cast>(f.getLeftSubformula().accept(*this, data)); std::shared_ptr right = boost::any_cast>(f.getRightSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(left, right, lowerBounds, upperBounds, timeBoundReferences)); } } boost::any CloneVisitor::visit(ConditionalFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); std::shared_ptr conditionFormula = boost::any_cast>(f.getConditionFormula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula, conditionFormula, f.getContext())); } boost::any CloneVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(EventuallyFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); if (f.hasRewardAccumulation()) { return std::static_pointer_cast(std::make_shared(subformula, f.getContext(), f.getRewardAccumulation())); } else { return std::static_pointer_cast(std::make_shared(subformula, f.getContext())); } } boost::any CloneVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula, f.getOperatorInformation())); } boost::any CloneVisitor::visit(GloballyFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula)); } boost::any CloneVisitor::visit(GameFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(f.getCoalition(), subformula)); } boost::any CloneVisitor::visit(InstantaneousRewardFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula, f.getOperatorInformation())); } boost::any CloneVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const { std::vector> subformulas; for(auto const& subF : f.getSubformulas()){ subformulas.push_back(boost::any_cast>(subF->accept(*this, data))); } return std::static_pointer_cast(std::make_shared(subformulas)); } boost::any CloneVisitor::visit(QuantileFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(f.getBoundVariables(), subformula)); } boost::any CloneVisitor::visit(NextFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula)); } boost::any CloneVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula, f.getOperatorInformation())); } boost::any CloneVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(subformula, f.getOptionalRewardModelName(), f.getOperatorInformation())); } boost::any CloneVisitor::visit(TotalRewardFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f)); } boost::any CloneVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const { std::shared_ptr subformula = boost::any_cast>(f.getSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(f.getOperator(), subformula)); } boost::any CloneVisitor::visit(UntilFormula const& f, boost::any const& data) const { std::shared_ptr left = boost::any_cast>(f.getLeftSubformula().accept(*this, data)); std::shared_ptr right = boost::any_cast>(f.getRightSubformula().accept(*this, data)); return std::static_pointer_cast(std::make_shared(left, right)); } } }