diff --git a/src/logic/EventuallyFormula.cpp b/src/logic/EventuallyFormula.cpp index 67699cfb9..56c9decff 100644 --- a/src/logic/EventuallyFormula.cpp +++ b/src/logic/EventuallyFormula.cpp @@ -7,7 +7,7 @@ namespace storm { namespace logic { EventuallyFormula::EventuallyFormula(std::shared_ptr const& subformula, FormulaContext context) : UnaryPathFormula(subformula), context(context) { - STORM_LOG_THROW(context == FormulaContext::Probability || context == FormulaContext::Reward || context == FormulaContext::ExpectedTime, storm::exceptions::InvalidPropertyException, "Invalid context for formula."); + STORM_LOG_THROW(context == FormulaContext::Probability || context == FormulaContext::Reward || context == FormulaContext::Time, storm::exceptions::InvalidPropertyException, "Invalid context for formula."); } bool EventuallyFormula::isEventuallyFormula() const { @@ -22,8 +22,8 @@ namespace storm { return context == FormulaContext::Reward; } - bool EventuallyFormula::isReachabilityExpectedTimeFormula() const { - return context == FormulaContext::ExpectedTime; + bool EventuallyFormula::isReachabilityTimeFormula() const { + return context == FormulaContext::Time; } bool EventuallyFormula::isProbabilityPathFormula() const { @@ -34,8 +34,8 @@ namespace storm { return this->isReachabilityRewardFormula(); } - bool EventuallyFormula::isExpectedTimePathFormula() const { - return this->isReachabilityExpectedTimeFormula(); + bool EventuallyFormula::isTimePathFormula() const { + return this->isReachabilityTimeFormula(); } boost::any EventuallyFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const { diff --git a/src/logic/EventuallyFormula.h b/src/logic/EventuallyFormula.h index 5cca412a9..f3716fee9 100644 --- a/src/logic/EventuallyFormula.h +++ b/src/logic/EventuallyFormula.h @@ -17,10 +17,10 @@ namespace storm { virtual bool isEventuallyFormula() const override; virtual bool isReachabilityProbabilityFormula() const override; virtual bool isReachabilityRewardFormula() const override; - virtual bool isReachabilityExpectedTimeFormula() const override; + virtual bool isReachabilityTimeFormula() const override; virtual bool isProbabilityPathFormula() const override; virtual bool isRewardPathFormula() const override; - virtual bool isExpectedTimePathFormula() const override; + virtual bool isTimePathFormula() const override; virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; diff --git a/src/logic/ExpectedTimeOperatorFormula.cpp b/src/logic/ExpectedTimeOperatorFormula.cpp deleted file mode 100644 index fb61b8bbd..000000000 --- a/src/logic/ExpectedTimeOperatorFormula.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "src/logic/ExpectedTimeOperatorFormula.h" - -#include "src/logic/FormulaVisitor.h" - -#include "src/utility/macros.h" -#include "src/exceptions/InvalidPropertyException.h" - -namespace storm { - namespace logic { - ExpectedTimeOperatorFormula::ExpectedTimeOperatorFormula(std::shared_ptr const& subformula, OperatorInformation const& operatorInformation) : OperatorFormula(subformula, operatorInformation) { - STORM_LOG_THROW(this->getMeasureType() == MeasureType::Expectation || this->getMeasureType() == MeasureType::Variance, storm::exceptions::InvalidPropertyException, "Invalid measure type in ET-operator."); - } - - bool ExpectedTimeOperatorFormula::isExpectedTimeOperatorFormula() const { - return true; - } - - boost::any ExpectedTimeOperatorFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const { - return visitor.visit(*this, data); - } - - std::shared_ptr ExpectedTimeOperatorFormula::substitute(std::map const& substitution) const { - return std::make_shared(this->getSubformula().substitute(substitution), this->operatorInformation); - } - - std::ostream& ExpectedTimeOperatorFormula::writeToStream(std::ostream& out) const { - out << "ET"; - OperatorFormula::writeToStream(out); - return out; - } - } -} \ No newline at end of file diff --git a/src/logic/Formula.cpp b/src/logic/Formula.cpp index 3a14b7db8..03ee2793d 100644 --- a/src/logic/Formula.cpp +++ b/src/logic/Formula.cpp @@ -94,7 +94,7 @@ namespace storm { return false; } - bool Formula::isExpectedTimePathFormula() const { + bool Formula::isTimePathFormula() const { return false; } @@ -106,7 +106,7 @@ namespace storm { return false; } - bool Formula::isExpectedTimeOperatorFormula() const { + bool Formula::isTimeOperatorFormula() const { return false; } @@ -126,7 +126,7 @@ namespace storm { return false; } - bool Formula::isReachabilityExpectedTimeFormula() const { + bool Formula::isReachabilityTimeFormula() const { return false; } @@ -276,11 +276,11 @@ namespace storm { return dynamic_cast(*this); } - EventuallyFormula& Formula::asReachabilityExpectedTimeFormula() { + EventuallyFormula& Formula::asReachabilityTimeFormula() { return dynamic_cast(*this); } - EventuallyFormula const& Formula::asReachabilityExpectedTimeFormula() const { + EventuallyFormula const& Formula::asReachabilityTimeFormula() const { return dynamic_cast(*this); } @@ -324,12 +324,12 @@ namespace storm { return dynamic_cast(*this); } - ExpectedTimeOperatorFormula& Formula::asExpectedTimeOperatorFormula() { - return dynamic_cast(*this); + TimeOperatorFormula& Formula::asTimeOperatorFormula() { + return dynamic_cast(*this); } - ExpectedTimeOperatorFormula const& Formula::asExpectedTimeOperatorFormula() const { - return dynamic_cast(*this); + TimeOperatorFormula const& Formula::asTimeOperatorFormula() const { + return dynamic_cast(*this); } CumulativeRewardFormula& Formula::asCumulativeRewardFormula() { diff --git a/src/logic/Formula.h b/src/logic/Formula.h index f7916f400..85ee131f7 100644 --- a/src/logic/Formula.h +++ b/src/logic/Formula.h @@ -42,7 +42,7 @@ namespace storm { virtual bool isProbabilityPathFormula() const; virtual bool isRewardPathFormula() const; - virtual bool isExpectedTimePathFormula() const; + virtual bool isTimePathFormula() const; virtual bool isBinaryBooleanStateFormula() const; virtual bool isUnaryBooleanStateFormula() const; @@ -50,7 +50,7 @@ namespace storm { // Operator formulas. virtual bool isOperatorFormula() const; virtual bool isLongRunAverageOperatorFormula() const; - virtual bool isExpectedTimeOperatorFormula() const; + virtual bool isTimeOperatorFormula() const; virtual bool isProbabilityOperatorFormula() const; virtual bool isRewardOperatorFormula() const; @@ -76,7 +76,7 @@ namespace storm { virtual bool isLongRunAverageRewardFormula() const; // Expected time formulas. - virtual bool isReachabilityExpectedTimeFormula() const; + virtual bool isReachabilityTimeFormula() const; // Type checks for abstract intermediate classes. virtual bool isBinaryPathFormula() const; @@ -133,8 +133,8 @@ namespace storm { EventuallyFormula& asReachabilityRewardFormula(); EventuallyFormula const& asReachabilityRewardFormula() const; - EventuallyFormula& asReachabilityExpectedTimeFormula(); - EventuallyFormula const& asReachabilityExpectedTimeFormula() const; + EventuallyFormula& asReachabilityTimeFormula(); + EventuallyFormula const& asReachabilityTimeFormula() const; GloballyFormula& asGloballyFormula(); GloballyFormula const& asGloballyFormula() const; @@ -154,8 +154,8 @@ namespace storm { LongRunAverageOperatorFormula& asLongRunAverageOperatorFormula(); LongRunAverageOperatorFormula const& asLongRunAverageOperatorFormula() const; - ExpectedTimeOperatorFormula& asExpectedTimeOperatorFormula(); - ExpectedTimeOperatorFormula const& asExpectedTimeOperatorFormula() const; + TimeOperatorFormula& asTimeOperatorFormula(); + TimeOperatorFormula const& asTimeOperatorFormula() const; CumulativeRewardFormula& asCumulativeRewardFormula(); CumulativeRewardFormula const& asCumulativeRewardFormula() const; diff --git a/src/logic/FormulaContext.h b/src/logic/FormulaContext.h index 41113cb8d..70ab01a3d 100644 --- a/src/logic/FormulaContext.h +++ b/src/logic/FormulaContext.h @@ -4,7 +4,7 @@ namespace storm { namespace logic { - enum class FormulaContext { Undefined, Probability, Reward, LongRunAverage, ExpectedTime }; + enum class FormulaContext { Undefined, Probability, Reward, LongRunAverage, Time }; } } diff --git a/src/logic/FormulaInformationVisitor.cpp b/src/logic/FormulaInformationVisitor.cpp index f8ef57f92..b44045766 100644 --- a/src/logic/FormulaInformationVisitor.cpp +++ b/src/logic/FormulaInformationVisitor.cpp @@ -41,7 +41,7 @@ namespace storm { return f.getSubformula().accept(*this); } - boost::any FormulaInformationVisitor::visit(ExpectedTimeOperatorFormula const& f, boost::any const& data) const { + boost::any FormulaInformationVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const { return f.getSubformula().accept(*this); } diff --git a/src/logic/FormulaInformationVisitor.h b/src/logic/FormulaInformationVisitor.h index 2e2cc0d6d..8e706cabf 100644 --- a/src/logic/FormulaInformationVisitor.h +++ b/src/logic/FormulaInformationVisitor.h @@ -19,7 +19,7 @@ namespace storm { 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(ExpectedTimeOperatorFormula 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; diff --git a/src/logic/FormulaVisitor.h b/src/logic/FormulaVisitor.h index a2e5b1a4f..1208b63a6 100644 --- a/src/logic/FormulaVisitor.h +++ b/src/logic/FormulaVisitor.h @@ -18,7 +18,7 @@ namespace storm { virtual boost::any visit(ConditionalFormula const& f, boost::any const& data) const = 0; virtual boost::any visit(CumulativeRewardFormula const& f, boost::any const& data) const = 0; virtual boost::any visit(EventuallyFormula const& f, boost::any const& data) const = 0; - virtual boost::any visit(ExpectedTimeOperatorFormula const& f, boost::any const& data) const = 0; + virtual boost::any visit(TimeOperatorFormula const& f, boost::any const& data) const = 0; virtual boost::any visit(GloballyFormula const& f, boost::any const& data) const = 0; virtual boost::any visit(InstantaneousRewardFormula const& f, boost::any const& data) const = 0; virtual boost::any visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const = 0; diff --git a/src/logic/Formulas.h b/src/logic/Formulas.h index a5218eeb8..7183dcb01 100644 --- a/src/logic/Formulas.h +++ b/src/logic/Formulas.h @@ -18,7 +18,7 @@ #include "src/logic/RewardOperatorFormula.h" #include "src/logic/StateFormula.h" #include "src/logic/LongRunAverageOperatorFormula.h" -#include "src/logic/ExpectedTimeOperatorFormula.h" +#include "src/logic/TimeOperatorFormula.h" #include "src/logic/UnaryBooleanStateFormula.h" #include "src/logic/UnaryPathFormula.h" #include "src/logic/UnaryStateFormula.h" diff --git a/src/logic/FormulasForwardDeclarations.h b/src/logic/FormulasForwardDeclarations.h index 13b4c326c..43fcf0ab9 100644 --- a/src/logic/FormulasForwardDeclarations.h +++ b/src/logic/FormulasForwardDeclarations.h @@ -15,7 +15,7 @@ namespace storm { class ConditionalFormula; class CumulativeRewardFormula; class EventuallyFormula; - class ExpectedTimeOperatorFormula; + class TimeOperatorFormula; class GloballyFormula; class InstantaneousRewardFormula; class LongRunAverageOperatorFormula; diff --git a/src/logic/FragmentChecker.cpp b/src/logic/FragmentChecker.cpp index fb400fc5b..50c5d3115 100644 --- a/src/logic/FragmentChecker.cpp +++ b/src/logic/FragmentChecker.cpp @@ -99,18 +99,18 @@ namespace storm { } else if (f.isReachabilityRewardFormula()) { result = result && inherited.getSpecification().areReachabilityRewardFormulasAllowed(); result = result && f.getSubformula().isStateFormula(); - } else if (f.isReachabilityExpectedTimeFormula()) { - result = result && inherited.getSpecification().areReachbilityExpectedTimeFormulasAllowed(); + } else if (f.isReachabilityTimeFormula()) { + result = result && inherited.getSpecification().areReachbilityTimeFormulasAllowed(); result = result && f.getSubformula().isStateFormula(); } result = result && boost::any_cast(f.getSubformula().accept(*this, data)); return result; } - boost::any FragmentChecker::visit(ExpectedTimeOperatorFormula const& f, boost::any const& data) const { + boost::any FragmentChecker::visit(TimeOperatorFormula const& f, boost::any const& data) const { InheritedInformation const& inherited = boost::any_cast(data); - bool result = inherited.getSpecification().areExpectedTimeOperatorsAllowed(); - result = result && f.getSubformula().isExpectedTimePathFormula(); + bool result = inherited.getSpecification().areTimeOperatorsAllowed(); + result = result && f.getSubformula().isTimePathFormula(); result = result && (inherited.getSpecification().isVarianceMeasureTypeAllowed() || f.getMeasureType() == MeasureType::Expectation); if (!inherited.getSpecification().areNestedOperatorsAllowed()) { result = result && boost::any_cast(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false)))); diff --git a/src/logic/FragmentChecker.h b/src/logic/FragmentChecker.h index 3d22390e6..9b0377aba 100644 --- a/src/logic/FragmentChecker.h +++ b/src/logic/FragmentChecker.h @@ -20,7 +20,7 @@ namespace storm { 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(ExpectedTimeOperatorFormula 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; diff --git a/src/logic/FragmentSpecification.cpp b/src/logic/FragmentSpecification.cpp index e243562e8..c2e396ec9 100644 --- a/src/logic/FragmentSpecification.cpp +++ b/src/logic/FragmentSpecification.cpp @@ -89,7 +89,7 @@ namespace storm { conditionalProbabilityFormula = false; conditionalRewardFormula = false; - reachabilityExpectedTimeFormula = false; + reachabilityTimeFormula = false; nestedOperators = true; nestedPathFormulas = false; @@ -121,11 +121,11 @@ namespace storm { return *this; } - bool FragmentSpecification::areExpectedTimeOperatorsAllowed() const { + bool FragmentSpecification::areTimeOperatorsAllowed() const { return expectedTimeOperator; } - FragmentSpecification& FragmentSpecification::setExpectedTimeOperatorsAllowed(bool newValue) { + FragmentSpecification& FragmentSpecification::setTimeOperatorsAllowed(bool newValue) { this->expectedTimeOperator = newValue; return *this; } @@ -283,12 +283,12 @@ namespace storm { return *this; } - bool FragmentSpecification::areReachbilityExpectedTimeFormulasAllowed() const { - return reachabilityExpectedTimeFormula; + bool FragmentSpecification::areReachbilityTimeFormulasAllowed() const { + return reachabilityTimeFormula; } - FragmentSpecification& FragmentSpecification::setReachbilityExpectedTimeFormulasAllowed(bool newValue) { - this->reachabilityExpectedTimeFormula = newValue; + FragmentSpecification& FragmentSpecification::setReachbilityTimeFormulasAllowed(bool newValue) { + this->reachabilityTimeFormula = newValue; return *this; } @@ -341,13 +341,13 @@ namespace storm { this->setProbabilityOperatorsAllowed(newValue); this->setRewardOperatorsAllowed(newValue); this->setLongRunAverageOperatorsAllowed(newValue); - this->setExpectedTimeOperatorsAllowed(newValue); + this->setTimeOperatorsAllowed(newValue); return *this; } - FragmentSpecification& FragmentSpecification::setExpectedTimeAllowed(bool newValue) { - this->setExpectedTimeOperatorsAllowed(newValue); - this->setReachbilityExpectedTimeFormulasAllowed(newValue); + FragmentSpecification& FragmentSpecification::setTimeAllowed(bool newValue) { + this->setTimeOperatorsAllowed(newValue); + this->setReachbilityTimeFormulasAllowed(newValue); return *this; } diff --git a/src/logic/FragmentSpecification.h b/src/logic/FragmentSpecification.h index e850fb172..d9ae9e45d 100644 --- a/src/logic/FragmentSpecification.h +++ b/src/logic/FragmentSpecification.h @@ -19,8 +19,8 @@ namespace storm { bool areRewardOperatorsAllowed() const; FragmentSpecification& setRewardOperatorsAllowed(bool newValue); - bool areExpectedTimeOperatorsAllowed() const; - FragmentSpecification& setExpectedTimeOperatorsAllowed(bool newValue); + bool areTimeOperatorsAllowed() const; + FragmentSpecification& setTimeOperatorsAllowed(bool newValue); bool areLongRunAverageOperatorsAllowed() const; FragmentSpecification& setLongRunAverageOperatorsAllowed(bool newValue); @@ -73,8 +73,8 @@ namespace storm { bool areConditionalRewardFormulasFormulasAllowed() const; FragmentSpecification& setConditionalRewardFormulasAllowed(bool newValue); - bool areReachbilityExpectedTimeFormulasAllowed() const; - FragmentSpecification& setReachbilityExpectedTimeFormulasAllowed(bool newValue); + bool areReachbilityTimeFormulasAllowed() const; + FragmentSpecification& setReachbilityTimeFormulasAllowed(bool newValue); bool areNestedOperatorsAllowed() const; FragmentSpecification& setNestedOperatorsAllowed(bool newValue); @@ -95,7 +95,7 @@ namespace storm { FragmentSpecification& setVarianceMeasureTypeAllowed(bool newValue); FragmentSpecification& setOperatorsAllowed(bool newValue); - FragmentSpecification& setExpectedTimeAllowed(bool newValue); + FragmentSpecification& setTimeAllowed(bool newValue); FragmentSpecification& setLongRunAverageProbabilitiesAllowed(bool newValue); private: @@ -125,7 +125,7 @@ namespace storm { bool conditionalProbabilityFormula; bool conditionalRewardFormula; - bool reachabilityExpectedTimeFormula; + bool reachabilityTimeFormula; // Members that indicate certain restrictions. bool nestedOperators; diff --git a/src/logic/TimeOperatorFormula.cpp b/src/logic/TimeOperatorFormula.cpp new file mode 100644 index 000000000..0b77c0f1e --- /dev/null +++ b/src/logic/TimeOperatorFormula.cpp @@ -0,0 +1,32 @@ +#include "src/logic/TimeOperatorFormula.h" + +#include "src/logic/FormulaVisitor.h" + +#include "src/utility/macros.h" +#include "src/exceptions/InvalidPropertyException.h" + +namespace storm { + namespace logic { + TimeOperatorFormula::TimeOperatorFormula(std::shared_ptr const& subformula, OperatorInformation const& operatorInformation) : OperatorFormula(subformula, operatorInformation) { + STORM_LOG_THROW(this->getMeasureType() == MeasureType::Expectation || this->getMeasureType() == MeasureType::Variance, storm::exceptions::InvalidPropertyException, "Invalid measure type in ET-operator."); + } + + bool TimeOperatorFormula::isTimeOperatorFormula() const { + return true; + } + + boost::any TimeOperatorFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const { + return visitor.visit(*this, data); + } + + std::shared_ptr TimeOperatorFormula::substitute(std::map const& substitution) const { + return std::make_shared(this->getSubformula().substitute(substitution), this->operatorInformation); + } + + std::ostream& TimeOperatorFormula::writeToStream(std::ostream& out) const { + out << "T"; + OperatorFormula::writeToStream(out); + return out; + } + } +} \ No newline at end of file diff --git a/src/logic/ExpectedTimeOperatorFormula.h b/src/logic/TimeOperatorFormula.h similarity index 63% rename from src/logic/ExpectedTimeOperatorFormula.h rename to src/logic/TimeOperatorFormula.h index a6e7d3fbd..cde1c0d34 100644 --- a/src/logic/ExpectedTimeOperatorFormula.h +++ b/src/logic/TimeOperatorFormula.h @@ -7,15 +7,15 @@ namespace storm { namespace logic { - class ExpectedTimeOperatorFormula : public OperatorFormula { + class TimeOperatorFormula : public OperatorFormula { public: - ExpectedTimeOperatorFormula(std::shared_ptr const& subformula, OperatorInformation const& operatorInformation = OperatorInformation()); + TimeOperatorFormula(std::shared_ptr const& subformula, OperatorInformation const& operatorInformation = OperatorInformation()); - virtual ~ExpectedTimeOperatorFormula() { + virtual ~TimeOperatorFormula() { // Intentionally left empty. } - virtual bool isExpectedTimeOperatorFormula() const override; + virtual bool isTimeOperatorFormula() const override; virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; diff --git a/src/modelchecker/AbstractModelChecker.cpp b/src/modelchecker/AbstractModelChecker.cpp index f79fa373b..e360454a0 100644 --- a/src/modelchecker/AbstractModelChecker.cpp +++ b/src/modelchecker/AbstractModelChecker.cpp @@ -21,6 +21,8 @@ namespace storm { return this->computeProbabilities(checkTask); } else if (formula.isRewardPathFormula()) { return this->computeRewards(checkTask); + } else if (formula.isTimePathFormula()) { + return this->computeTimes(checkTask); } } else if (formula.isConditionalProbabilityFormula()) { return this->computeConditionalProbabilities(checkTask.substituteFormula(formula.asConditionalFormula())); @@ -114,7 +116,15 @@ namespace storm { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "This model checker does not support the formula: " << checkTask.getFormula() << "."); } - std::unique_ptr AbstractModelChecker::computeExpectedTimes(CheckTask const& checkTask) { + std::unique_ptr AbstractModelChecker::computeTimes(CheckTask const& checkTask) { + storm::logic::Formula const& timeFormula = checkTask.getFormula(); + if (timeFormula.isReachabilityTimeFormula()) { + return this->computeReachabilityTimes(checkTask.substituteFormula(timeFormula.asReachabilityTimeFormula())); + } + STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "This model checker does not support the formula: " << checkTask.getFormula() << "."); + } + + std::unique_ptr AbstractModelChecker::computeReachabilityTimes(CheckTask const& checkTask) { STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "This model checker does not support the formula: " << checkTask.getFormula() << "."); } @@ -130,8 +140,8 @@ namespace storm { return this->checkProbabilityOperatorFormula(checkTask.substituteFormula(stateFormula.asProbabilityOperatorFormula())); } else if (stateFormula.isRewardOperatorFormula()) { return this->checkRewardOperatorFormula(checkTask.substituteFormula(stateFormula.asRewardOperatorFormula())); - } else if (stateFormula.isExpectedTimeOperatorFormula()) { - return this->checkExpectedTimeOperatorFormula(checkTask.substituteFormula(stateFormula.asExpectedTimeOperatorFormula())); + } else if (stateFormula.isTimeOperatorFormula()) { + return this->checkTimeOperatorFormula(checkTask.substituteFormula(stateFormula.asTimeOperatorFormula())); } else if (stateFormula.isLongRunAverageOperatorFormula()) { return this->checkLongRunAverageOperatorFormula(checkTask.substituteFormula(stateFormula.asLongRunAverageOperatorFormula())); } else if (stateFormula.isAtomicExpressionFormula()) { @@ -203,11 +213,11 @@ namespace storm { } } - std::unique_ptr AbstractModelChecker::checkExpectedTimeOperatorFormula(CheckTask const& checkTask) { - storm::logic::ExpectedTimeOperatorFormula const& stateFormula = checkTask.getFormula(); - STORM_LOG_THROW(stateFormula.getSubformula().isReachabilityExpectedTimeFormula(), storm::exceptions::InvalidArgumentException, "The given formula is invalid."); + std::unique_ptr AbstractModelChecker::checkTimeOperatorFormula(CheckTask const& checkTask) { + storm::logic::TimeOperatorFormula const& stateFormula = checkTask.getFormula(); + STORM_LOG_THROW(stateFormula.getSubformula().isReachabilityTimeFormula(), storm::exceptions::InvalidArgumentException, "The given formula is invalid."); - std::unique_ptr result = this->computeExpectedTimes(checkTask.substituteFormula(stateFormula.getSubformula().asEventuallyFormula())); + std::unique_ptr result = this->computeTimes(checkTask.substituteFormula(stateFormula.getSubformula())); if (checkTask.isBoundSet()) { STORM_LOG_THROW(result->isQuantitative(), storm::exceptions::InvalidOperationException, "Unable to perform comparison operation on non-quantitative result."); diff --git a/src/modelchecker/AbstractModelChecker.h b/src/modelchecker/AbstractModelChecker.h index c63f00a3c..5bba5f33e 100644 --- a/src/modelchecker/AbstractModelChecker.h +++ b/src/modelchecker/AbstractModelChecker.h @@ -51,9 +51,10 @@ namespace storm { virtual std::unique_ptr computeReachabilityRewards(CheckTask const& checkTask); virtual std::unique_ptr computeLongRunAverageRewards(CheckTask const& checkTask); - // The methods to compute the long-run average and expected time. + // The methods to compute the long-run average probabilities and timing measures. virtual std::unique_ptr computeLongRunAverageProbabilities(CheckTask const& checkTask); - virtual std::unique_ptr computeExpectedTimes(CheckTask const& checkTask); + virtual std::unique_ptr computeTimes(CheckTask const& checkTask); + virtual std::unique_ptr computeReachabilityTimes(CheckTask const& checkTask); // The methods to check state formulas. virtual std::unique_ptr checkStateFormula(CheckTask const& stateFormula); @@ -63,7 +64,7 @@ namespace storm { virtual std::unique_ptr checkBooleanLiteralFormula(CheckTask const& checkTask); virtual std::unique_ptr checkProbabilityOperatorFormula(CheckTask const& checkTask); virtual std::unique_ptr checkRewardOperatorFormula(CheckTask const& checkTask); - virtual std::unique_ptr checkExpectedTimeOperatorFormula(CheckTask const& checkTask); + virtual std::unique_ptr checkTimeOperatorFormula(CheckTask const& checkTask); virtual std::unique_ptr checkLongRunAverageOperatorFormula(CheckTask const& checkTask); virtual std::unique_ptr checkUnaryBooleanStateFormula(CheckTask const& checkTask); }; diff --git a/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp b/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp index 9892eb530..2d89745ce 100644 --- a/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp +++ b/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp @@ -33,7 +33,7 @@ namespace storm { bool SparseMarkovAutomatonCslModelChecker::canHandle(CheckTask const& checkTask) const { storm::logic::Formula const& formula = checkTask.getFormula(); storm::logic::FragmentSpecification fragment = storm::logic::csl().setGloballyFormulasAllowed(false).setNextFormulasAllowed(false).setReachabilityRewardFormulasAllowed(true); - fragment.setExpectedTimeAllowed(true).setLongRunAverageProbabilitiesAllowed(true); + fragment.setTimeAllowed(true).setLongRunAverageProbabilitiesAllowed(true); return formula.isInFragment(fragment); } @@ -88,14 +88,14 @@ namespace storm { } template - std::unique_ptr SparseMarkovAutomatonCslModelChecker::computeExpectedTimes(CheckTask const& checkTask) { + std::unique_ptr SparseMarkovAutomatonCslModelChecker::computeReachabilityTimes(CheckTask const& checkTask) { storm::logic::EventuallyFormula const& eventuallyFormula = checkTask.getFormula(); STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(), storm::exceptions::InvalidPropertyException, "Formula needs to specify whether minimal or maximal values are to be computed on nondeterministic model."); STORM_LOG_THROW(this->getModel().isClosed(), storm::exceptions::InvalidPropertyException, "Unable to compute expected times in non-closed Markov automaton."); std::unique_ptr subResultPointer = this->check(eventuallyFormula.getSubformula()); ExplicitQualitativeCheckResult& subResult = subResultPointer->asExplicitQualitativeCheckResult(); - std::vector result = storm::modelchecker::helper::SparseMarkovAutomatonCslHelper::computeExpectedTimes(checkTask.getOptimizationDirection(), this->getModel().getTransitionMatrix(), this->getModel().getBackwardTransitions(), this->getModel().getExitRates(), this->getModel().getMarkovianStates(), subResult.getTruthValuesVector(), checkTask.isQualitativeSet(), *minMaxLinearEquationSolverFactory); + std::vector result = storm::modelchecker::helper::SparseMarkovAutomatonCslHelper::computeTimes(checkTask.getOptimizationDirection(), this->getModel().getTransitionMatrix(), this->getModel().getBackwardTransitions(), this->getModel().getExitRates(), this->getModel().getMarkovianStates(), subResult.getTruthValuesVector(), checkTask.isQualitativeSet(), *minMaxLinearEquationSolverFactory); return std::unique_ptr(new ExplicitQuantitativeCheckResult(std::move(result))); } diff --git a/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.h b/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.h index 4e4f60850..847646282 100644 --- a/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.h +++ b/src/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.h @@ -25,7 +25,7 @@ namespace storm { virtual std::unique_ptr computeUntilProbabilities(CheckTask const& checkTask) override; virtual std::unique_ptr computeReachabilityRewards(CheckTask const& checkTask) override; virtual std::unique_ptr computeLongRunAverageProbabilities(CheckTask const& checkTask) override; - virtual std::unique_ptr computeExpectedTimes(CheckTask const& checkTask) override; + virtual std::unique_ptr computeReachabilityTimes(CheckTask const& checkTask); private: // An object that is used for retrieving solvers for systems of linear equations that are the result of nondeterministic choices. diff --git a/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.cpp b/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.cpp index d926917a5..c03b01871 100644 --- a/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.cpp +++ b/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.cpp @@ -349,7 +349,7 @@ namespace storm { } template - std::vector SparseMarkovAutomatonCslHelper::computeExpectedTimes(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, storm::storage::SparseMatrix const& backwardTransitions, std::vector const& exitRateVector, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& psiStates, bool qualitative, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory) { + std::vector SparseMarkovAutomatonCslHelper::computeTimes(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, storm::storage::SparseMatrix const& backwardTransitions, std::vector const& exitRateVector, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& psiStates, bool qualitative, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory) { uint_fast64_t numberOfStates = transitionMatrix.getRowGroupCount(); std::vector rewardValues(numberOfStates, storm::utility::zero()); storm::utility::vector::setVectorValues(rewardValues, markovianStates, storm::utility::one()); diff --git a/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.h b/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.h index 5b24fe569..534f1d272 100644 --- a/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.h +++ b/src/modelchecker/csl/helper/SparseMarkovAutomatonCslHelper.h @@ -24,7 +24,7 @@ namespace storm { static std::vector computeLongRunAverageProbabilities(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, storm::storage::SparseMatrix const& backwardTransitions, std::vector const& exitRateVector, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& psiStates, bool qualitative, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory); - static std::vector computeExpectedTimes(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, storm::storage::SparseMatrix const& backwardTransitions, std::vector const& exitRateVector, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& psiStates, bool qualitative, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory); + static std::vector computeTimes(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, storm::storage::SparseMatrix const& backwardTransitions, std::vector const& exitRateVector, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& psiStates, bool qualitative, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory); private: static void computeBoundedReachabilityProbabilities(OptimizationDirection dir, storm::storage::SparseMatrix const& transitionMatrix, std::vector const& exitRates, storm::storage::BitVector const& markovianStates, storm::storage::BitVector const& goalStates, storm::storage::BitVector const& markovianNonGoalStates, storm::storage::BitVector const& probabilisticNonGoalStates, std::vector& markovianNonGoalValues, std::vector& probabilisticNonGoalValues, ValueType delta, uint_fast64_t numberOfSteps, storm::utility::solver::MinMaxLinearEquationSolverFactory const& minMaxLinearEquationSolverFactory); diff --git a/src/parser/FormulaParser.cpp b/src/parser/FormulaParser.cpp index 7a78b797b..2fa666265 100644 --- a/src/parser/FormulaParser.cpp +++ b/src/parser/FormulaParser.cpp @@ -113,7 +113,7 @@ namespace storm { qi::rule measureType; qi::rule(), Skipper> probabilityOperator; qi::rule(), Skipper> rewardOperator; - qi::rule(), Skipper> expectedTimeOperator; + qi::rule(), Skipper> timeOperator; qi::rule(), Skipper> longRunAverageOperator; qi::rule(), Skipper> simpleFormula; @@ -163,7 +163,7 @@ namespace storm { storm::logic::OperatorInformation createOperatorInformation(storm::logic::MeasureType const& measureType, boost::optional const& optimizationDirection, boost::optional const& comparisonType, boost::optional const& threshold) const; std::shared_ptr createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; std::shared_ptr createRewardOperatorFormula(boost::optional const& rewardModelName, storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; - std::shared_ptr createExpectedTimeOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; + std::shared_ptr createTimeOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const; std::shared_ptr createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula); std::shared_ptr createBinaryBooleanStateFormula(std::shared_ptr const& leftSubformula, std::shared_ptr const& rightSubformula, storm::logic::BinaryBooleanStateFormula::OperatorType operatorType); std::shared_ptr createUnaryBooleanStateFormula(std::shared_ptr const& subformula, boost::optional const& operatorType); @@ -329,8 +329,8 @@ namespace storm { rewardOperator = (qi::lit("R") > -rewardModelName > operatorInformation(storm::logic::MeasureType::Expectation) > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createRewardOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2, qi::_3)]; rewardOperator.name("reward operator"); - expectedTimeOperator = (qi::lit("ET") > operatorInformation(storm::logic::MeasureType::Expectation) > qi::lit("[") > eventuallyFormula(storm::logic::FormulaContext::ExpectedTime) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createExpectedTimeOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; - expectedTimeOperator.name("expected time operator"); + timeOperator = (qi::lit("T") > operatorInformation(storm::logic::MeasureType::Expectation) > qi::lit("[") > eventuallyFormula(storm::logic::FormulaContext::Time) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createTimeOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; + timeOperator.name("time operator"); probabilityOperator = (qi::lit("P") > operatorInformation(storm::logic::MeasureType::Value) > qi::lit("[") > pathFormula(storm::logic::FormulaContext::Probability) > qi::lit("]"))[qi::_val = phoenix::bind(&FormulaParserGrammar::createProbabilityOperatorFormula, phoenix::ref(*this), qi::_1, qi::_2)]; probabilityOperator.name("probability operator"); @@ -491,8 +491,8 @@ namespace storm { return std::shared_ptr(new storm::logic::RewardOperatorFormula(subformula, rewardModelName, operatorInformation)); } - std::shared_ptr FormulaParserGrammar::createExpectedTimeOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { - return std::shared_ptr(new storm::logic::ExpectedTimeOperatorFormula(subformula, operatorInformation)); + std::shared_ptr FormulaParserGrammar::createTimeOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) const { + return std::shared_ptr(new storm::logic::TimeOperatorFormula(subformula, operatorInformation)); } std::shared_ptr FormulaParserGrammar::createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation, std::shared_ptr const& subformula) {