Browse Source
			
			
			Made bound/no-bound operators more consistent to reduce similar code. Changed bound operators to have a single bound and a comparison operator instead of an interval.
			
			
				main
			
			
		
		Made bound/no-bound operators more consistent to reduce similar code. Changed bound operators to have a single bound and a comparison operator instead of an interval.
	
		
	
			
			
				main
			
			
		
				 11 changed files with 398 additions and 393 deletions
			
			
		- 
					6CMakeLists.txt
- 
					104src/formula/BoundOperator.h
- 
					8src/formula/Formulas.h
- 
					46src/formula/NoBoundOperator.h
- 
					96src/formula/ProbabilisticBoundOperator.h
- 
					83src/formula/ProbabilisticNoBoundOperator.h
- 
					95src/formula/RewardBoundOperator.h
- 
					171src/formula/RewardIntervalOperator.h
- 
					55src/formula/RewardNoBoundOperator.h
- 
					109src/modelChecker/DtmcPrctlModelChecker.h
- 
					18src/storm.cpp
| @ -0,0 +1,96 @@ | |||
| /* | |||
|  * ProbabilisticBoundOperator.h | |||
|  * | |||
|  *  Created on: 19.10.2012 | |||
|  *      Author: Thomas Heinemann | |||
|  */ | |||
| 
 | |||
| #ifndef STORM_FORMULA_PROBABILISTICBOUNDOPERATOR_H_ | |||
| #define STORM_FORMULA_PROBABILISTICBOUNDOPERATOR_H_ | |||
| 
 | |||
| #include "PctlStateFormula.h" | |||
| #include "PctlPathFormula.h" | |||
| #include "BoundOperator.h" | |||
| #include "utility/ConstTemplates.h" | |||
| 
 | |||
| namespace storm { | |||
| 
 | |||
| namespace formula { | |||
| 
 | |||
| /*! | |||
|  * @brief | |||
|  * Class for a PCTL formula tree with a P (probablistic) operator node over a probability interval | |||
|  * as root. | |||
|  * | |||
|  * Has one PCTL path formula as sub formula/tree. | |||
|  * | |||
|  * @par Semantics | |||
|  * 	  The formula holds iff the probability that the path formula holds is inside the bounds | |||
|  * 	  specified in this operator | |||
|  * | |||
|  * The subtree is seen as part of the object and deleted with it | |||
|  * (this behavior can be prevented by setting them to NULL before deletion) | |||
|  * | |||
|  * | |||
|  * @see PctlStateFormula | |||
|  * @see PctlPathFormula | |||
|  * @see ProbabilisticOperator | |||
|  * @see ProbabilisticNoBoundsOperator | |||
|  * @see PctlFormula | |||
|  */ | |||
| template<class T> | |||
| class ProbabilisticBoundOperator : public BoundOperator<T> { | |||
| 
 | |||
| public: | |||
| 	/*! | |||
| 	 * Empty constructor | |||
| 	 */ | |||
| 	ProbabilisticBoundOperator() : BoundOperator<T>(storm::utility::constGetZero<T>(), storm::utility::constGetZero<T>(), nullptr) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Constructor | |||
| 	 * | |||
| 	 * @param lowerBound The lower bound for the probability | |||
| 	 * @param upperBound The upper bound for the probability | |||
| 	 * @param pathFormula The child node | |||
| 	 */ | |||
| 	ProbabilisticBoundOperator(T lowerBound, T upperBound, PctlPathFormula<T>& pathFormula) : BoundOperator<T>(lowerBound, upperBound, pathFormula) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns a string representation of the formula | |||
| 	 */ | |||
| 	virtual std::string toString() const { | |||
| 		std::string result = "P ["; | |||
| 		result += std::to_string(this->getLowerBound()); | |||
| 		result += ","; | |||
| 		result += std::to_string(this->getUpperBound()); | |||
| 		result += "] ("; | |||
| 		result += this->getPathFormula()->toString(); | |||
| 		result += ")"; | |||
| 		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 AND-object that is identical the called object. | |||
| 	 */ | |||
| 	virtual PctlStateFormula<T>* clone() const { | |||
| 		ProbabilisticBoundOperator<T>* result = new ProbabilisticBoundOperator<T>(); | |||
| 		result->setInterval(this->getLowerBound(), this->getUpperBound()); | |||
| 		result->setPathFormula(this->getPathFormula()->clone()); | |||
| 		return result; | |||
| 	} | |||
| }; | |||
| 
 | |||
| } //namespace formula | |||
| 
 | |||
| } //namespace storm | |||
| 
 | |||
| #endif /* STORM_FORMULA_PROBABILISTICBOUNDOPERATOR_H_ */ | |||
| @ -0,0 +1,83 @@ | |||
| /* | |||
|  * ProbabilisticNoBoundOperator.h | |||
|  * | |||
|  *  Created on: 12.12.2012 | |||
|  *      Author: thomas | |||
|  */ | |||
| 
 | |||
| #ifndef STORM_FORMULA_PROBABILISTICNOBOUNDOPERATOR_H_ | |||
| #define STORM_FORMULA_PROBABILISTICNOBOUNDOPERATOR_H_ | |||
| 
 | |||
| #include "PctlFormula.h" | |||
| #include "PctlPathFormula.h" | |||
| #include "NoBoundOperator.h" | |||
| 
 | |||
| namespace storm { | |||
| 
 | |||
| namespace formula { | |||
| 
 | |||
| /*! | |||
|  * @brief | |||
|  * Class for a PCTL formula tree with a P (probablistic) operator without declaration of probabilities | |||
|  * as root. | |||
|  * | |||
|  * Checking a formula with this operator as root returns the probabilities that the path formula holds | |||
|  * (for each state) | |||
|  * | |||
|  * Has one PCTL path formula as sub formula/tree. | |||
|  * | |||
|  * @note | |||
|  * 	This class is a hybrid of a state and path formula, and may only appear as the outermost operator. | |||
|  * 	Hence, it is seen as neither a state nor a path formula, but is directly derived from PctlFormula. | |||
|  * | |||
|  * @note | |||
|  * 	This class does not contain a check() method like the other formula classes. | |||
|  * 	The check method should only be called by the model checker to infer the correct check function for sub | |||
|  * 	formulas. As this operator can only appear at the root, the method is not useful here. | |||
|  * 	Use the checkProbabilisticNoBoundOperator method from the DtmcPrctlModelChecker class instead. | |||
|  * | |||
|  * The subtree is seen as part of the object and deleted with it | |||
|  * (this behavior can be prevented by setting them to NULL before deletion) | |||
|  * | |||
|  * | |||
|  * @see PctlStateFormula | |||
|  * @see PctlPathFormula | |||
|  * @see ProbabilisticOperator | |||
|  * @see ProbabilisticIntervalOperator | |||
|  * @see PctlFormula | |||
|  */ | |||
| template <class T> | |||
| class ProbabilisticNoBoundOperator: public NoBoundOperator<T> { | |||
| public: | |||
| 	/*! | |||
| 	 * Empty constructor | |||
| 	 */ | |||
| 	ProbabilisticNoBoundOperator() : NoBoundOperator<T>(nullptr) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Constructor | |||
| 	 * | |||
| 	 * @param pathFormula The child node. | |||
| 	 */ | |||
| 	ProbabilisticNoBoundOperator(PctlPathFormula<T>* pathFormula) : NoBoundOperator<T>(pathFormula) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns a string representation of the formula | |||
| 	 */ | |||
| 	virtual std::string toString() const { | |||
| 		std::string result = " P=? ["; | |||
| 		result += this->getPathFormula().toString(); | |||
| 		result += "]"; | |||
| 		return result; | |||
| 	} | |||
| }; | |||
| 
 | |||
| } /* namespace formula */ | |||
| 
 | |||
| } /* namespace storm */ | |||
| 
 | |||
| #endif /* STORM_FORMULA_PROBABILISTICNOBOUNDOPERATOR_H_ */ | |||
| @ -0,0 +1,95 @@ | |||
| /* | |||
|  * RewardBoundOperator.h | |||
|  * | |||
|  *  Created on: 19.10.2012 | |||
|  *      Author: Thomas Heinemann | |||
|  */ | |||
| 
 | |||
| #ifndef STORM_FORMULA_REWARDBOUNDOPERATOR_H_ | |||
| #define STORM_FORMULA_REWARDBOUNDOPERATOR_H_ | |||
| 
 | |||
| #include "PctlStateFormula.h" | |||
| #include "PctlPathFormula.h" | |||
| #include "BoundOperator.h" | |||
| #include "utility/ConstTemplates.h" | |||
| 
 | |||
| namespace storm { | |||
| 
 | |||
| namespace formula { | |||
| 
 | |||
| /*! | |||
|  * @brief | |||
|  * Class for a PCTL formula tree with a R (reward) operator node over a reward interval as root. | |||
|  * | |||
|  * Has a reward path formula as sub formula/tree. | |||
|  * | |||
|  * @par Semantics | |||
|  * 	  The formula holds iff the reward of the reward path formula is inside the bounds | |||
|  * 	  specified in this operator | |||
|  * | |||
|  * The subtree is seen as part of the object and deleted with it | |||
|  * (this behavior can be prevented by setting them to NULL before deletion) | |||
|  * | |||
|  * | |||
|  * @see PctlStateFormula | |||
|  * @see PctlPathFormula | |||
|  * @see ProbabilisticOperator | |||
|  * @see ProbabilisticNoBoundsOperator | |||
|  * @see PctlFormula | |||
|  */ | |||
| template<class T> | |||
| class RewardBoundOperator : public BoundOperator<T> { | |||
| 
 | |||
| public: | |||
| 	/*! | |||
| 	 * Empty constructor | |||
| 	 */ | |||
| 	RewardBoundOperator() : BoundOperator<T>(storm::utility::constGetZero<T>(), storm::utility::constGetZero<T>(), nullptr) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Constructor | |||
| 	 * | |||
| 	 * @param lowerBound The lower bound for the probability | |||
| 	 * @param upperBound The upper bound for the probability | |||
| 	 * @param pathFormula The child node | |||
| 	 */ | |||
| 	RewardBoundOperator(T lowerBound, T upperBound, PctlPathFormula<T>& pathFormula) : BoundOperator<T>(lowerBound, upperBound, pathFormula) { | |||
| 		// Intentionally left empty | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns a string representation of the formula | |||
| 	 */ | |||
| 	virtual std::string toString() const { | |||
| 		std::string result = "R ["; | |||
| 		result += std::to_string(this->getLowerBound()); | |||
| 		result += ", "; | |||
| 		result += std::to_string(this->getUpperBound()); | |||
| 		result += "] ["; | |||
| 		result += this->getPathFormula()->toString(); | |||
| 		result += "]"; | |||
| 		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 AND-object that is identical the called object. | |||
| 	 */ | |||
| 	virtual PctlStateFormula<T>* clone() const { | |||
| 		RewardBoundOperator<T>* result = new RewardBoundOperator<T>(); | |||
| 		result->setBound(this->getLowerBound(), this->getUpperBound()); | |||
| 		result->setPathFormula(this->getPathFormula()->clone()); | |||
| 		return result; | |||
| 	} | |||
| }; | |||
| 
 | |||
| } //namespace formula | |||
| 
 | |||
| } //namespace storm | |||
| 
 | |||
| #endif /* STORM_FORMULA_REWARDBOUNDOPERATOR_H_ */ | |||
| @ -1,171 +0,0 @@ | |||
| /* | |||
|  * ProbabilisticOperator.h | |||
|  * | |||
|  *  Created on: 19.10.2012 | |||
|  *      Author: Thomas Heinemann | |||
|  */ | |||
| 
 | |||
| #ifndef STORM_FORMULA_REWARDINTERVALOPERATOR_H_ | |||
| #define STORM_FORMULA_REWARDINTERVALOPERATOR_H_ | |||
| 
 | |||
| #include "PctlStateFormula.h" | |||
| #include "PctlPathFormula.h" | |||
| #include "utility/ConstTemplates.h" | |||
| 
 | |||
| namespace storm { | |||
| 
 | |||
| namespace formula { | |||
| 
 | |||
| /*! | |||
|  * @brief | |||
|  * Class for a PCTL formula tree with a R (reward) operator node over a reward interval as root. | |||
|  * | |||
|  * Has a reward path formula as sub formula/tree. | |||
|  * | |||
|  * @par Semantics | |||
|  * 	  The formula holds iff the reward of the reward path formula is inside the bounds | |||
|  * 	  specified in this operator | |||
|  * | |||
|  * The subtree is seen as part of the object and deleted with it | |||
|  * (this behavior can be prevented by setting them to NULL before deletion) | |||
|  * | |||
|  * | |||
|  * @see PctlStateFormula | |||
|  * @see PctlPathFormula | |||
|  * @see ProbabilisticOperator | |||
|  * @see ProbabilisticNoBoundsOperator | |||
|  * @see PctlFormula | |||
|  */ | |||
| template<class T> | |||
| class RewardIntervalOperator : public PctlStateFormula<T> { | |||
| 
 | |||
| public: | |||
| 	/*! | |||
| 	 * Empty constructor | |||
| 	 */ | |||
| 	RewardIntervalOperator() { | |||
| 		upper = storm::utility::constGetZero<T>(); | |||
| 		lower = storm::utility::constGetZero<T>(); | |||
| 		pathFormula = nullptr; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Constructor | |||
| 	 * | |||
| 	 * @param lowerBound The lower bound for the probability | |||
| 	 * @param upperBound The upper bound for the probability | |||
| 	 * @param pathFormula The child node | |||
| 	 */ | |||
| 	RewardIntervalOperator(T lowerBound, T upperBound, PctlPathFormula<T>& pathFormula) { | |||
| 		this->lower = lowerBound; | |||
| 		this->upper = upperBound; | |||
| 		this->pathFormula = &pathFormula; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Destructor | |||
| 	 * | |||
| 	 * The subtree is deleted with the object | |||
| 	 * (this behavior can be prevented by setting them to NULL before deletion) | |||
| 	 */ | |||
| 	virtual ~RewardIntervalOperator() { | |||
| 	 if (pathFormula != nullptr) { | |||
| 		 delete pathFormula; | |||
| 	 } | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns the child node (representation of a PCTL path formula) | |||
| 	 */ | |||
| 	const PctlPathFormula<T>& getPathFormula () const { | |||
| 		return *pathFormula; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns the lower bound for the probability | |||
| 	 */ | |||
| 	const T& getLowerBound() const { | |||
| 		return lower; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns the upper bound for the probability | |||
| 	 */ | |||
| 	const T& getUpperBound() const { | |||
| 		return upper; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Sets the child node | |||
| 	 * | |||
| 	 * @param pathFormula the path formula that becomes the new child node | |||
| 	 */ | |||
| 	void setPathFormula(PctlPathFormula<T>* pathFormula) { | |||
| 		this->pathFormula = pathFormula; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * Sets the interval in which the probability that the path formula holds may lie in. | |||
| 	 * | |||
| 	 * @param lowerBound The lower bound for the probability | |||
| 	 * @param upperBound The upper bound for the probability | |||
| 	 */ | |||
| 	void setInterval(T lowerBound, T upperBound) { | |||
| 		this->lower = lowerBound; | |||
| 		this->upper = upperBound; | |||
| 	} | |||
| 
 | |||
| 	/*! | |||
| 	 * @returns a string representation of the formula | |||
| 	 */ | |||
| 	virtual std::string toString() const { | |||
| 		std::string result = "R ["; | |||
| 		result += std::to_string(lower); | |||
| 		result += ", "; | |||
| 		result += std::to_string(upper); | |||
| 		result += "] ["; | |||
| 		result += pathFormula->toString(); | |||
| 		result += "]"; | |||
| 		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 AND-object that is identical the called object. | |||
| 	 */ | |||
| 	virtual PctlStateFormula<T>* clone() const { | |||
| 		RewardIntervalOperator<T>* result = new RewardIntervalOperator<T>(); | |||
| 		result->setInterval(lower, upper); | |||
| 		if (pathFormula != nullptr) { | |||
| 			result->setPathFormula(pathFormula->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 bit vector indicating all states that satisfy the formula represented by the called object. | |||
| 	 */ | |||
| 	virtual storm::storage::BitVector *check(const storm::modelChecker::DtmcPrctlModelChecker<T>& modelChecker) const { | |||
| 	  return modelChecker.checkRewardIntervalOperator(*this); | |||
| 	} | |||
| 
 | |||
| private: | |||
| 	T lower; | |||
| 	T upper; | |||
| 	PctlPathFormula<T>* pathFormula; | |||
| }; | |||
| 
 | |||
| } //namespace formula | |||
| 
 | |||
| } //namespace storm | |||
| 
 | |||
| #endif /* STORM_FORMULA_REWARDINTERVALOPERATOR_H_ */ | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue