4 changed files with 405 additions and 0 deletions
-
3src/formula/Formulas.h
-
133src/formula/TimeBoundedEventually.h
-
101src/formula/TimeBoundedOperator.h
-
168src/formula/TimeBoundedUntil.h
@ -0,0 +1,133 @@ |
|||||
|
/* |
||||
|
* TimeBoundedEventually.h |
||||
|
* |
||||
|
* Created on: 10.04.2013 |
||||
|
* Author: thomas |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STORM_FORMULA_TIMEBOUNDEDEVENTUALLY_H_ |
||||
|
#define STORM_FORMULA_TIMEBOUNDEDEVENTUALLY_H_ |
||||
|
|
||||
|
#include "TimeBoundedOperator.h" |
||||
|
#include "AbstractStateFormula.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace formula { |
||||
|
|
||||
|
template<class T> class TimeBoundedEventually; |
||||
|
|
||||
|
/*! |
||||
|
* @brief Interface class for model checkers that support TimeBoundedEventually. |
||||
|
* |
||||
|
* All model checkers that support the formula class BoundedEventually must inherit |
||||
|
* this pure virtual class. |
||||
|
*/ |
||||
|
template <class T> |
||||
|
class ITimeBoundedEventuallyModelChecker { |
||||
|
public: |
||||
|
/*! |
||||
|
* @brief Evaluates TimeBoundedUntil formula within a model checker. |
||||
|
* |
||||
|
* @param obj Formula object with subformulas. |
||||
|
* @return Result of the formula for every node. |
||||
|
*/ |
||||
|
virtual std::vector<T>* checkTimeBoundedEventually(const TimeBoundedEventually<T>& obj, bool qualitative) const = 0; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
template<class T> |
||||
|
class TimeBoundedEventually: public storm::formula::TimeBoundedOperator<T> { |
||||
|
public: |
||||
|
/** |
||||
|
* Simple constructor: Only sets the bounds |
||||
|
* |
||||
|
* @param lowerBound |
||||
|
* @param upperBound |
||||
|
*/ |
||||
|
TimeBoundedEventually(T lowerBound, T upperBound) : TimeBoundedOperator<T>(lowerBound, upperBound) { |
||||
|
child = nullptr; |
||||
|
} |
||||
|
|
||||
|
TimeBoundedEventually(T lowerBound, T upperBound, AbstractStateFormula<T>* child) : |
||||
|
TimeBoundedOperator<T>(lowerBound, upperBound) { |
||||
|
this->child = child; |
||||
|
} |
||||
|
|
||||
|
virtual ~TimeBoundedEventually() { |
||||
|
if (child != nullptr) { |
||||
|
delete child; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*! |
||||
|
* @returns the child node |
||||
|
*/ |
||||
|
const AbstractStateFormula<T>& getChild() const { |
||||
|
return *child; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Sets the subtree |
||||
|
* @param child the new child node |
||||
|
*/ |
||||
|
void setChild(AbstractStateFormula<T>* child) { |
||||
|
this->child = child; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @returns a string representation of the formula |
||||
|
*/ |
||||
|
virtual std::string toString() const { |
||||
|
std::string result = "F"; |
||||
|
result += TimeBoundedOperator<T>::toString(); |
||||
|
result += " "; |
||||
|
result += child->toString(); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Clones the called object. |
||||
|
* |
||||
|
* Performs a "deep copy", i.e. the subtrees of the new object are clones of the original ones |
||||
|
* |
||||
|
* @returns a new BoundedUntil-object that is identical the called object. |
||||
|
*/ |
||||
|
virtual AbstractPathFormula<T>* clone() const { |
||||
|
TimeBoundedEventually<T>* result = new TimeBoundedEventually<T>(this->getLowerBound(), this->getUpperBound()); |
||||
|
if (child != nullptr) { |
||||
|
result->setChild(child->clone()); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Calls the model checker to check this formula. |
||||
|
* Needed to infer the correct type of formula class. |
||||
|
* |
||||
|
* @note This function should only be called in a generic check function of a model checker class. For other uses, |
||||
|
* the methods of the model checker should be used. |
||||
|
* |
||||
|
* @returns A vector indicating the probability that the formula holds for each state. |
||||
|
*/ |
||||
|
virtual std::vector<T>* check(const storm::modelchecker::AbstractModelChecker<T>& modelChecker, bool qualitative) const { |
||||
|
return modelChecker.template as<ITimeBoundedEventuallyModelChecker>()->checkTimeBoundedEventually(*this, qualitative); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @brief Checks if the subtree conforms to some logic. |
||||
|
* |
||||
|
* @param checker Formula checker object. |
||||
|
* @return true iff the subtree conforms to some logic. |
||||
|
*/ |
||||
|
virtual bool conforms(const AbstractFormulaChecker<T>& checker) const { |
||||
|
return checker.conforms(this->child); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
AbstractStateFormula<T>* child; |
||||
|
}; |
||||
|
|
||||
|
} /* namespace formula */ |
||||
|
} /* namespace storm */ |
||||
|
#endif /* STORM_FORMULA_TIMEBOUNDEDEVENTUALLY_H_ */ |
@ -0,0 +1,101 @@ |
|||||
|
/* |
||||
|
* TimeBoundedOperator.h |
||||
|
* |
||||
|
* Created on: 10.04.2013 |
||||
|
* Author: thomas |
||||
|
*/ |
||||
|
|
||||
|
#ifndef TIMEBOUNDEDOPERATOR_H_ |
||||
|
#define TIMEBOUNDEDOPERATOR_H_ |
||||
|
|
||||
|
#include "AbstractPathFormula.h" |
||||
|
#include "exceptions/InvalidArgumentException.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace formula { |
||||
|
|
||||
|
/*! |
||||
|
* @brief |
||||
|
* Class for a Abstract formula tree with a operator node as root that uses a time interval |
||||
|
* (with upper and lower bound) |
||||
|
* |
||||
|
* This class does not provide support for sub formulas; this has to be done in concretizations of this abstract class. |
||||
|
* |
||||
|
* |
||||
|
* @see AbstractStateFormula |
||||
|
* @see AbstractPathFormula |
||||
|
* @see AbstractFormula |
||||
|
*/ |
||||
|
template<class T> |
||||
|
class TimeBoundedOperator: public storm::formula::AbstractPathFormula<T> { |
||||
|
public: |
||||
|
/** |
||||
|
* Constructor |
||||
|
* |
||||
|
* @param lowerBound The lower bound |
||||
|
* @param upperBound The upper bound |
||||
|
* @throw InvalidArgumentException if the lower bound is larger than the upper bound. |
||||
|
*/ |
||||
|
TimeBoundedOperator(T lowerBound, T upperBound) { |
||||
|
setInterval(lowerBound, upperBound); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Destructor |
||||
|
*/ |
||||
|
virtual ~TimeBoundedOperator() { |
||||
|
// Intentionally left empty |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Getter for lowerBound attribute |
||||
|
* |
||||
|
* @return lower bound of the operator. |
||||
|
*/ |
||||
|
T getLowerBound() const { |
||||
|
return lowerBound; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Getter for upperBound attribute |
||||
|
* @return upper bound of the operator. |
||||
|
*/ |
||||
|
T getUpperBound() const { |
||||
|
return upperBound; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set the time interval for the time bounded operator |
||||
|
* |
||||
|
* @param lowerBound |
||||
|
* @param upperBound |
||||
|
* @throw InvalidArgumentException if the lower bound is larger than the upper bound. |
||||
|
*/ |
||||
|
void setInterval(T lowerBound, T upperBound) { |
||||
|
if (lowerBound > upperBound) { |
||||
|
throw new storm::exceptions::InvalidArgumentException("Lower bound is larger than upper bound"); |
||||
|
} |
||||
|
this->lowerBound = lowerBound; |
||||
|
this->upperBound = upperBound; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*! |
||||
|
* @returns a string representation of the Interval of the formula |
||||
|
* May be used in subclasses to simplify string output. |
||||
|
*/ |
||||
|
virtual std::string toString() const { |
||||
|
std::string result = "["; |
||||
|
result += std::to_string(lowerBound); |
||||
|
result += ";"; |
||||
|
result += "]"; |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
T lowerBound, upperBound; |
||||
|
}; |
||||
|
|
||||
|
} /* namespace formula */ |
||||
|
} /* namespace storm */ |
||||
|
#endif /* TIMEBOUNDEDOPERATOR_H_ */ |
@ -0,0 +1,168 @@ |
|||||
|
/* |
||||
|
* TimeBoundedUntil.h |
||||
|
* |
||||
|
* Created on: 10.04.2013 |
||||
|
* Author: thomas |
||||
|
*/ |
||||
|
|
||||
|
#ifndef STORM_FORMULA_TIMEBOUNDEDUNTIL_H_ |
||||
|
#define STORM_FORMULA_TIMEBOUNDEDUNTIL_H_ |
||||
|
|
||||
|
#include "TimeBoundedOperator.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace formula { |
||||
|
|
||||
|
template <class T> class TimeBoundedUntil; |
||||
|
|
||||
|
/*! |
||||
|
* @brief Interface class for model checkers that support TimeBoundedUntil. |
||||
|
* |
||||
|
* All model checkers that support the formula class BoundedEventually must inherit |
||||
|
* this pure virtual class. |
||||
|
*/ |
||||
|
template <class T> |
||||
|
class ITimeBoundedUntilModelChecker { |
||||
|
public: |
||||
|
/*! |
||||
|
* @brief Evaluates TimeBoundedUntil formula within a model checker. |
||||
|
* |
||||
|
* @param obj Formula object with subformulas. |
||||
|
* @return Result of the formula for every node. |
||||
|
*/ |
||||
|
virtual std::vector<T>* checkTimeBoundedUntil(const TimeBoundedUntil<T>& obj, bool qualitative) const = 0; |
||||
|
}; |
||||
|
|
||||
|
template <class T> |
||||
|
class TimeBoundedUntil: public storm::formula::TimeBoundedOperator<T> { |
||||
|
public: |
||||
|
/** |
||||
|
* Constructor providing bounds only; |
||||
|
* Sub formulas are set to null. |
||||
|
* |
||||
|
* @param lowerBound |
||||
|
* @param upperBound |
||||
|
*/ |
||||
|
TimeBoundedUntil(T lowerBound, T upperBound) : |
||||
|
TimeBoundedOperator<T>(lowerBound, upperBound) { |
||||
|
this->left = nullptr; |
||||
|
this->right = nullptr; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Full constructor |
||||
|
* @param lowerBound |
||||
|
* @param upperBound |
||||
|
* @param left |
||||
|
* @param right |
||||
|
*/ |
||||
|
TimeBoundedUntil(T lowerBound, T upperBound, AbstractStateFormula<T>* left, AbstractStateFormula<T>* right) : |
||||
|
TimeBoundedOperator<T>(lowerBound, upperBound) { |
||||
|
this->left = left; |
||||
|
this->right = right; |
||||
|
} |
||||
|
|
||||
|
virtual ~TimeBoundedUntil() { |
||||
|
if (left != nullptr) { |
||||
|
delete left; |
||||
|
} |
||||
|
if (right != nullptr) { |
||||
|
delete right; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Sets the left child node. |
||||
|
* |
||||
|
* @param newLeft the new left child. |
||||
|
*/ |
||||
|
void setLeft(AbstractStateFormula<T>* newLeft) { |
||||
|
left = newLeft; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Sets the right child node. |
||||
|
* |
||||
|
* @param newRight the new right child. |
||||
|
*/ |
||||
|
void setRight(AbstractStateFormula<T>* newRight) { |
||||
|
right = newRight; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @returns a pointer to the left child node |
||||
|
*/ |
||||
|
const AbstractStateFormula<T>& getLeft() const { |
||||
|
return *left; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @returns a pointer to the right child node |
||||
|
*/ |
||||
|
const AbstractStateFormula<T>& getRight() const { |
||||
|
return *right; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @returns a string representation of the formula |
||||
|
*/ |
||||
|
virtual std::string toString() const { |
||||
|
std::string result = left->toString(); |
||||
|
result += " U"; |
||||
|
result += TimeBoundedOperator<T>::toString(); |
||||
|
result += " "; |
||||
|
result += right->toString(); |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Clones the called object. |
||||
|
* |
||||
|
* Performs a "deep copy", i.e. the subtrees of the new object are clones of the original ones |
||||
|
* |
||||
|
* @returns a new BoundedUntil-object that is identical the called object. |
||||
|
*/ |
||||
|
virtual AbstractPathFormula<T>* clone() const { |
||||
|
TimeBoundedUntil<T>* result = new TimeBoundedUntil<T>(this->getLowerBound(), this->getUpperBound()); |
||||
|
if (left != nullptr) { |
||||
|
result->setLeft(left->clone()); |
||||
|
} |
||||
|
if (right != nullptr) { |
||||
|
result->setRight(right->clone()); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*! |
||||
|
* Calls the model checker to check this formula. |
||||
|
* Needed to infer the correct type of formula class. |
||||
|
* |
||||
|
* @note This function should only be called in a generic check function of a model checker class. For other uses, |
||||
|
* the methods of the model checker should be used. |
||||
|
* |
||||
|
* @returns A vector indicating the probability that the formula holds for each state. |
||||
|
*/ |
||||
|
virtual std::vector<T>* check(const storm::modelchecker::AbstractModelChecker<T>& modelChecker, bool qualitative) const { |
||||
|
return modelChecker.template as<ITimeBoundedUntilModelChecker>()->checkTimeBoundedUntil(*this, qualitative); |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* @brief Checks if the subtree conforms to some logic. |
||||
|
* |
||||
|
* @param checker Formula checker object. |
||||
|
* @return true iff the subtree conforms to some logic. |
||||
|
*/ |
||||
|
virtual bool conforms(const AbstractFormulaChecker<T>& checker) const { |
||||
|
return checker.conforms(this->left) && checker.conforms(this->right); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
AbstractStateFormula<T>* left; |
||||
|
AbstractStateFormula<T>* right; |
||||
|
}; |
||||
|
|
||||
|
} /* namespace formula */ |
||||
|
} /* namespace storm */ |
||||
|
#endif /* STORM_FORMULA_TIMEBOUNDEDUNTIL_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue