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