diff --git a/src/formula/AbstractFilter.h b/src/formula/AbstractFilter.h index d0f9aa60e..59bc935fa 100644 --- a/src/formula/AbstractFilter.h +++ b/src/formula/AbstractFilter.h @@ -30,16 +30,42 @@ public: // Intentionally left empty. } - AbstractFilter(action::AbstractAction<T>* action, OptimizingOperator opt = UNDEFINED) : opt(opt) { - actions.push_back(action); + AbstractFilter(std::shared_ptr<action::AbstractAction<T>> const & action, OptimizingOperator opt = UNDEFINED) : opt(opt) { + if(action.get() != nullptr) { + actions.push_back(action); + } } - AbstractFilter(std::vector<action::AbstractAction<T>*> actions, OptimizingOperator opt = UNDEFINED) : actions(actions), opt(opt) { - // Intentionally left empty. + AbstractFilter(std::vector<std::shared_ptr<action::AbstractAction<T>>> const & actions, OptimizingOperator opt = UNDEFINED) { + // Filter out all nullptr actions. + // First detect that there is at least one. + uint_fast64_t emptyCount = 0; + for(uint_fast64_t i = 0; i < actions.size(); i++) { + if (actions[i].get() == nullptr) { + emptyCount++; + } + } + + if(emptyCount > 0) { + // There is at least one nullptr action. + // Allocate space for the non null actions. + this->actions = std::vector<std::shared_ptr<action::AbstractAction<T>>>(actions.size() - emptyCount); + + // Fill the vector. Note: For most implementations of the standard there will be no reallocation in the vector while doing this. + for(auto action : actions){ + if(action.get() != nullptr) { + this->actions.push_back(action); + } + } + } else { + this->actions = actions; + } + + this->opt = opt; } virtual ~AbstractFilter() { - actions.clear(); + // Intentionally left empty. } virtual std::string toString() const { @@ -70,8 +96,8 @@ public: return desc; } - void addAction(action::AbstractAction<T>* action) { - if(action != nullptr) { + void addAction(std::shared_ptr<action::AbstractAction<T>> const & action) { + if(action.get() != nullptr) { actions.push_back(action); } } @@ -80,6 +106,16 @@ public: actions.pop_back(); } + std::shared_ptr<action::AbstractAction<T>> getAction(uint_fast64_t position) { + // Make sure the chosen position is not beyond the end of the vector. + // If it is so return the last element. + if(position < actions.size()) { + return actions[position]; + } else { + return actions[actions.size()-1]; + } + } + uint_fast64_t getActionCount() const { return actions.size(); } @@ -94,7 +130,7 @@ public: protected: - std::vector<action::AbstractAction<T>*> actions; + std::vector<std::shared_ptr<action::AbstractAction<T>>> actions; OptimizingOperator opt; }; diff --git a/src/formula/csl/CslFilter.h b/src/formula/csl/CslFilter.h index b7c99df39..fffd78663 100644 --- a/src/formula/csl/CslFilter.h +++ b/src/formula/csl/CslFilter.h @@ -43,11 +43,11 @@ public: // Intentionally left empty. } - CslFilter(std::shared_ptr<AbstractCslFormula<T>> const & child, action::AbstractAction<T>* action, OptimizingOperator opt = UNDEFINED, bool steadyStateQuery = false) : AbstractFilter<T>(action, opt), child(child), steadyStateQuery(steadyStateQuery) { + CslFilter(std::shared_ptr<AbstractCslFormula<T>> const & child, std::shared_ptr<action::AbstractAction<T>> const & action, OptimizingOperator opt = UNDEFINED, bool steadyStateQuery = false) : AbstractFilter<T>(action, opt), child(child), steadyStateQuery(steadyStateQuery) { // Intentionally left empty } - CslFilter(std::shared_ptr<AbstractCslFormula<T>> const & child, std::vector<action::AbstractAction<T>*> actions, OptimizingOperator opt = UNDEFINED, bool steadyStateQuery = false) : AbstractFilter<T>(actions, opt), child(child), steadyStateQuery(steadyStateQuery) { + CslFilter(std::shared_ptr<AbstractCslFormula<T>> const & child, std::vector<std::shared_ptr<action::AbstractAction<T>>> const & actions, OptimizingOperator opt = UNDEFINED, bool steadyStateQuery = false) : AbstractFilter<T>(actions, opt), child(child), steadyStateQuery(steadyStateQuery) { // Intentionally left empty. } diff --git a/src/formula/ltl/LtlFilter.h b/src/formula/ltl/LtlFilter.h index a13148b86..d35b9fd46 100644 --- a/src/formula/ltl/LtlFilter.h +++ b/src/formula/ltl/LtlFilter.h @@ -41,11 +41,11 @@ public: // Intentionally left empty. } - LtlFilter(std::shared_ptr<AbstractLtlFormula<T>> const & child, action::AbstractAction<T>* action, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(action, opt), child(child) { + LtlFilter(std::shared_ptr<AbstractLtlFormula<T>> const & child, std::shared_ptr<action::AbstractAction<T>> const & action, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(action, opt), child(child) { this->actions.push_back(action); } - LtlFilter(std::shared_ptr<AbstractLtlFormula<T>> const & child, std::vector<action::AbstractAction<T>*> actions, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(actions, opt), child(child) { + LtlFilter(std::shared_ptr<AbstractLtlFormula<T>> const & child, std::vector<std::shared_ptr<action::AbstractAction<T>>> const & actions, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(actions, opt), child(child) { // Intentionally left empty. } diff --git a/src/formula/prctl/PrctlFilter.h b/src/formula/prctl/PrctlFilter.h index 161a9d3f8..48967486e 100644 --- a/src/formula/prctl/PrctlFilter.h +++ b/src/formula/prctl/PrctlFilter.h @@ -46,16 +46,16 @@ public: // Intentionally left empty. } - PrctlFilter(std::shared_ptr<AbstractPrctlFormula<T>> const & child, action::AbstractAction<T>* action, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(action, opt), child(child) { + PrctlFilter(std::shared_ptr<AbstractPrctlFormula<T>> const & child, std::shared_ptr<action::AbstractAction<T>> const & action, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(action, opt), child(child) { // Intentionally left empty. } - PrctlFilter(std::shared_ptr<AbstractPrctlFormula<T>> const & child, std::vector<action::AbstractAction<T>*> actions, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(actions, opt), child(child) { + PrctlFilter(std::shared_ptr<AbstractPrctlFormula<T>> const & child, std::vector<std::shared_ptr<action::AbstractAction<T>>> const & actions, OptimizingOperator opt = UNDEFINED) : AbstractFilter<T>(actions, opt), child(child) { // Intentionally left empty. } virtual ~PrctlFilter() { - this->actions.clear(); + // Intentionally left empty. } void check(storm::modelchecker::prctl::AbstractModelChecker<T> const & modelchecker) const { diff --git a/src/parser/CslParser.cpp b/src/parser/CslParser.cpp index c28d31b0a..f0a51afa6 100644 --- a/src/parser/CslParser.cpp +++ b/src/parser/CslParser.cpp @@ -148,35 +148,35 @@ struct CslParser::CslGrammar : qi::grammar<Iterator, std::shared_ptr<csl::CslFil // This block defines rules for parsing filter actions. boundAction = (qi::lit("bound") > qi::lit("(") >> comparisonType >> qi::lit(",") >> qi::double_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::BoundAction<double>>(qi::_1, qi::_2)]; + MAKE(storm::property::action::BoundAction<double> ,qi::_1, qi::_2)]; boundAction.name("bound action"); - invertAction = qi::lit("invert")[qi::_val = phoenix::new_<storm::property::action::InvertAction<double>>()]; + invertAction = qi::lit("invert")[qi::_val = MAKE(storm::property::action::InvertAction<double>, )]; invertAction.name("invert action"); formulaAction = (qi::lit("formula") > qi::lit("(") >> stateFormula >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::FormulaAction<double>>(qi::_1)]; + MAKE(storm::property::action::FormulaAction<double>, qi::_1)]; formulaAction.name("formula action"); rangeAction = ( (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(",") > qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_2)] | + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_2)] | (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_1 + 1)] + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_1 + 1)] ); rangeAction.name("range action"); sortAction = ( - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1)] | - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(", ") >> qi::lit("asc") > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, true)] | - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(", ") >> qi::lit("desc") > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, false)] + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1)] | + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("ascending") | qi::lit("asc")) > qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1, true)] | + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("descending") | qi::lit("desc")) > qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1, false)] ); sortAction.name("sort action"); - abstractAction = (boundAction | invertAction | formulaAction | rangeAction | sortAction) >> (qi::eps | qi::lit(";")); + abstractAction = (boundAction | invertAction | formulaAction | rangeAction | sortAction) >> (qi::lit(";") | qi::eps); abstractAction.name("filter action"); filter = (qi::lit("filter") >> qi::lit("[") >> +abstractAction >> qi::lit("]") >> qi::lit("(") >> formula >> qi::lit(")"))[qi::_val = @@ -200,12 +200,12 @@ struct CslParser::CslGrammar : qi::grammar<Iterator, std::shared_ptr<csl::CslFil qi::rule<Iterator, std::shared_ptr<csl::CslFilter<double>>(), Skipper> probabilisticNoBoundOperator; qi::rule<Iterator, std::shared_ptr<csl::CslFilter<double>>(), Skipper> steadyStateNoBoundOperator; - qi::rule<Iterator, storm::property::action::AbstractAction<double>*(), Skipper> abstractAction; - qi::rule<Iterator, storm::property::action::BoundAction<double>*(), Skipper> boundAction; - qi::rule<Iterator, storm::property::action::InvertAction<double>*(), Skipper> invertAction; - qi::rule<Iterator, storm::property::action::FormulaAction<double>*(), Skipper> formulaAction; - qi::rule<Iterator, storm::property::action::RangeAction<double>*(), Skipper> rangeAction; - qi::rule<Iterator, storm::property::action::SortAction<double>*(), Skipper> sortAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::AbstractAction<double>>(), Skipper> abstractAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::BoundAction<double>>(), Skipper> boundAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::InvertAction<double>>(), Skipper> invertAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::FormulaAction<double>>(), Skipper> formulaAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::RangeAction<double>>(), Skipper> rangeAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::SortAction<double>>(), Skipper> sortAction; qi::rule<Iterator, std::shared_ptr<csl::AbstractCslFormula<double>>(), Skipper> formula; qi::rule<Iterator, std::shared_ptr<csl::AbstractCslFormula<double>>(), Skipper> comment; diff --git a/src/parser/LtlParser.cpp b/src/parser/LtlParser.cpp index 3bc614243..25d62d241 100644 --- a/src/parser/LtlParser.cpp +++ b/src/parser/LtlParser.cpp @@ -109,31 +109,31 @@ struct LtlParser::LtlGrammar : qi::grammar<Iterator, std::shared_ptr<storm::prop // This block defines rules for parsing filter actions. boundAction = (qi::lit("bound") > qi::lit("(") >> comparisonType >> qi::lit(",") >> qi::double_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::BoundAction<double>>(qi::_1, qi::_2)]; + MAKE(storm::property::action::BoundAction<double> ,qi::_1, qi::_2)]; boundAction.name("bound action"); - invertAction = qi::lit("invert")[qi::_val = phoenix::new_<storm::property::action::InvertAction<double>>()]; + invertAction = qi::lit("invert")[qi::_val = MAKE(storm::property::action::InvertAction<double>, )]; invertAction.name("invert action"); rangeAction = ( (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(",") > qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_2)] | + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_2)] | (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_1 + 1)] + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_1 + 1)] ); rangeAction.name("range action"); sortAction = ( - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1)] | - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(", ") >> qi::lit("asc") > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, true)] | - (qi::lit("sort") > qi::lit("(") >> sortingCategory >> qi::lit(", ") >> qi::lit("desc") > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, false)] + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1)] | + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("ascending") | qi::lit("asc")) > qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1, true)] | + (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("descending") | qi::lit("desc")) > qi::lit(")"))[qi::_val = + MAKE(storm::property::action::SortAction<double>, qi::_1, false)] ); sortAction.name("sort action"); - abstractAction = (boundAction | invertAction | rangeAction | sortAction) >> (qi::eps | qi::lit(";")); + abstractAction = (boundAction | invertAction | rangeAction | sortAction) >> (qi::lit(";") | qi::eps); abstractAction.name("filter action"); filter = (qi::lit("filter") >> qi::lit("[") >> +abstractAction >> qi::lit("]") > qi::lit("(") >> formula >> qi::lit(")"))[qi::_val = @@ -153,11 +153,11 @@ struct LtlParser::LtlGrammar : qi::grammar<Iterator, std::shared_ptr<storm::prop qi::rule<Iterator, std::shared_ptr<storm::property::ltl::LtlFilter<double>>(), Skipper> start; qi::rule<Iterator, std::shared_ptr<storm::property::ltl::LtlFilter<double>>(), Skipper> filter; - qi::rule<Iterator, storm::property::action::AbstractAction<double>*(), Skipper> abstractAction; - qi::rule<Iterator, storm::property::action::BoundAction<double>*(), Skipper> boundAction; - qi::rule<Iterator, storm::property::action::InvertAction<double>*(), Skipper> invertAction; - qi::rule<Iterator, storm::property::action::RangeAction<double>*(), Skipper> rangeAction; - qi::rule<Iterator, storm::property::action::SortAction<double>*(), Skipper> sortAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::AbstractAction<double>>(), Skipper> abstractAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::BoundAction<double>>(), Skipper> boundAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::InvertAction<double>>(), Skipper> invertAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::RangeAction<double>>(), Skipper> rangeAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::SortAction<double>>(), Skipper> sortAction; qi::rule<Iterator, std::shared_ptr<storm::property::ltl::AbstractLtlFormula<double>>(), Skipper> comment; qi::rule<Iterator, std::shared_ptr<storm::property::ltl::AbstractLtlFormula<double>>(), Skipper> formula; diff --git a/src/parser/PrctlParser.cpp b/src/parser/PrctlParser.cpp index 35036ffcf..b31b621bb 100644 --- a/src/parser/PrctlParser.cpp +++ b/src/parser/PrctlParser.cpp @@ -155,31 +155,31 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, std::shared_ptr<storm:: // This block defines rules for parsing filter actions. boundAction = (qi::lit("bound") > qi::lit("(") >> comparisonType >> qi::lit(",") >> qi::double_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::BoundAction<double>>(qi::_1, qi::_2)]; + MAKE(storm::property::action::BoundAction<double> ,qi::_1, qi::_2)]; boundAction.name("bound action"); - invertAction = qi::lit("invert")[qi::_val = phoenix::new_<storm::property::action::InvertAction<double>>()]; + invertAction = qi::lit("invert")[qi::_val = MAKE(storm::property::action::InvertAction<double>, )]; invertAction.name("invert action"); formulaAction = (qi::lit("formula") > qi::lit("(") >> stateFormula >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::FormulaAction<double>>(qi::_1)]; + MAKE(storm::property::action::FormulaAction<double>, qi::_1)]; formulaAction.name("formula action"); rangeAction = ( (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(",") > qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_2)] | + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_2)] | (qi::lit("range") >> qi::lit("(") >> qi::uint_ >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::RangeAction<double>>(qi::_1, qi::_1 + 1)] + MAKE(storm::property::action::RangeAction<double>, qi::_1, qi::_1 + 1)] ); rangeAction.name("range action"); sortAction = ( (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1)] | + MAKE(storm::property::action::SortAction<double>, qi::_1)] | (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("ascending") | qi::lit("asc")) > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, true)] | + MAKE(storm::property::action::SortAction<double>, qi::_1, true)] | (qi::lit("sort") >> qi::lit("(") >> sortingCategory >> qi::lit(", ") >> (qi::lit("descending") | qi::lit("desc")) > qi::lit(")"))[qi::_val = - phoenix::new_<storm::property::action::SortAction<double>>(qi::_1, false)] + MAKE(storm::property::action::SortAction<double>, qi::_1, false)] ); sortAction.name("sort action"); @@ -210,12 +210,12 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, std::shared_ptr<storm:: qi::rule<Iterator, std::shared_ptr<storm::property::prctl::PrctlFilter<double>>(), Skipper> probabilisticNoBoundOperator; qi::rule<Iterator, std::shared_ptr<storm::property::prctl::PrctlFilter<double>>(), Skipper> rewardNoBoundOperator; - qi::rule<Iterator, storm::property::action::AbstractAction<double>*(), Skipper> abstractAction; - qi::rule<Iterator, storm::property::action::BoundAction<double>*(), Skipper> boundAction; - qi::rule<Iterator, storm::property::action::InvertAction<double>*(), Skipper> invertAction; - qi::rule<Iterator, storm::property::action::FormulaAction<double>*(), Skipper> formulaAction; - qi::rule<Iterator, storm::property::action::RangeAction<double>*(), Skipper> rangeAction; - qi::rule<Iterator, storm::property::action::SortAction<double>*(), Skipper> sortAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::AbstractAction<double>>(), Skipper> abstractAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::BoundAction<double>>(), Skipper> boundAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::InvertAction<double>>(), Skipper> invertAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::FormulaAction<double>>(), Skipper> formulaAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::RangeAction<double>>(), Skipper> rangeAction; + qi::rule<Iterator, std::shared_ptr<storm::property::action::SortAction<double>>(), Skipper> sortAction; qi::rule<Iterator, std::shared_ptr<storm::property::prctl::AbstractPrctlFormula<double>>(), Skipper> formula; qi::rule<Iterator, std::shared_ptr<storm::property::prctl::AbstractPrctlFormula<double>>(), Skipper> comment; diff --git a/test/functional/parser/PrctlParserTest.cpp b/test/functional/parser/PrctlParserTest.cpp index 7f482f63e..ee86d92e8 100644 --- a/test/functional/parser/PrctlParserTest.cpp +++ b/test/functional/parser/PrctlParserTest.cpp @@ -169,11 +169,11 @@ TEST(PrctlParserTest, parsePrctlFilterTest) { ASSERT_NE(formula, nullptr); ASSERT_EQ(5, formula->getActionCount()); - ASSERT_NE(dynamic_cast<storm::property::action::FormulaAction<double>*>(formula->getAction(0)), nullptr); - ASSERT_NE(dynamic_cast<storm::property::action::InvertAction<double>*>(formula->getAction(1)), nullptr); - ASSERT_NE(dynamic_cast<storm::property::action::BoundAction<double>*>(formula->getAction(2)), nullptr); - ASSERT_NE(dynamic_cast<storm::property::action::SortAction<double>*>(formula->getAction(3)), nullptr); - ASSERT_NE(dynamic_cast<storm::property::action::RangeAction<double>*>(formula->getAction(4)), nullptr); + ASSERT_NE(std::dynamic_pointer_cast<storm::property::action::FormulaAction<double>>(formula->getAction(0)).get(), nullptr); + ASSERT_NE(std::dynamic_pointer_cast<storm::property::action::InvertAction<double>>(formula->getAction(1)).get(), nullptr); + ASSERT_NE(std::dynamic_pointer_cast<storm::property::action::BoundAction<double>>(formula->getAction(2)).get(), nullptr); + ASSERT_NE(std::dynamic_pointer_cast<storm::property::action::SortAction<double>>(formula->getAction(3)).get(), nullptr); + ASSERT_NE(std::dynamic_pointer_cast<storm::property::action::RangeAction<double>>(formula->getAction(4)).get(), nullptr); // The input was parsed correctly. ASSERT_EQ("filter[formula(b); invert; bound(<, 0.500000); sort(value, ascending); range(0, 3)](F a)", formula->toString());