9 changed files with 199 additions and 1 deletions
			
			
		- 
					8src/storm/storage/expressions/BaseExpression.cpp
 - 
					4src/storm/storage/expressions/BaseExpression.h
 - 
					11src/storm/storage/expressions/ExpressionVisitor.cpp
 - 
					2src/storm/storage/expressions/ExpressionVisitor.h
 - 
					1src/storm/storage/expressions/Expressions.h
 - 
					3src/storm/storage/expressions/OperatorType.cpp
 - 
					5src/storm/storage/expressions/OperatorType.h
 - 
					100src/storm/storage/expressions/PredicateExpression.cpp
 - 
					66src/storm/storage/expressions/PredicateExpression.h
 
@ -0,0 +1,11 @@ | 
				
			|||
#include "storm/storage/expressions/ExpressionVisitor.h"
 | 
				
			|||
#include "storm/utility/macros.h"
 | 
				
			|||
#include "storm/exceptions/NotImplementedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        boost::any ExpressionVisitor::visit(PredicateExpression const&, boost::any const&) { | 
				
			|||
            STORM_LOG_THROW(false,storm::exceptions::NotImplementedException, "Predicate Expressions are not supported by this visitor"); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,100 @@ | 
				
			|||
 | 
				
			|||
#include "storm/storage/expressions/PredicateExpression.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/storage/expressions/ExpressionVisitor.h"
 | 
				
			|||
#include "storm/utility/macros.h"
 | 
				
			|||
#include "storm/storage/BitVector.h"
 | 
				
			|||
#include "storm/exceptions/InvalidTypeException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        OperatorType toOperatorType(PredicateExpression::PredicateType tp) { | 
				
			|||
            switch (tp) { | 
				
			|||
                case PredicateExpression::PredicateType::AtMostOneOf: return OperatorType::AtMostOneOf; | 
				
			|||
                case PredicateExpression::PredicateType::AtLeastOneOf: return OperatorType::AtLeastOneOf; | 
				
			|||
                case PredicateExpression::PredicateType::ExactlyOneOf: return OperatorType::ExactlyOneOf; | 
				
			|||
            } | 
				
			|||
            STORM_LOG_ASSERT(false, "Predicate type not supported"); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        PredicateExpression::PredicateExpression(ExpressionManager const &manager, Type const& type,  std::vector <std::shared_ptr<BaseExpression const>> const &operands, PredicateType predicateType) : BaseExpression(manager, type), predicate(predicateType), operands(operands) {} | 
				
			|||
 | 
				
			|||
        // Override base class methods.
 | 
				
			|||
        storm::expressions::OperatorType PredicateExpression::getOperator() const { | 
				
			|||
            return toOperatorType(predicate); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        bool PredicateExpression::evaluateAsBool(Valuation const *valuation) const { | 
				
			|||
            STORM_LOG_THROW(this->hasBooleanType(), storm::exceptions::InvalidTypeException, "Unable to evaluate expression as boolean."); | 
				
			|||
            storm::storage::BitVector results(operands.size()); | 
				
			|||
            uint64_t i = 0; | 
				
			|||
            for(auto const& operand : operands) { | 
				
			|||
                results.set(i, operand->evaluateAsBool(valuation)); | 
				
			|||
                ++i; | 
				
			|||
            } | 
				
			|||
            switch(predicate) { | 
				
			|||
                case PredicateType::ExactlyOneOf: return results.getNumberOfSetBits() == 1; | 
				
			|||
                case PredicateType::AtMostOneOf: return results.getNumberOfSetBits() <= 1; | 
				
			|||
                case PredicateType::AtLeastOneOf: return results.getNumberOfSetBits() >= 1; | 
				
			|||
            } | 
				
			|||
            STORM_LOG_ASSERT(false, "Unknown predicate type"); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        std::shared_ptr<BaseExpression const> PredicateExpression::simplify() const { | 
				
			|||
            std::vector<std::shared_ptr<BaseExpression const>> simplifiedOperands; | 
				
			|||
            for (auto const& operand : operands) { | 
				
			|||
                simplifiedOperands.push_back(operand->simplify()); | 
				
			|||
            } | 
				
			|||
            return std::shared_ptr<BaseExpression>(new PredicateExpression(this->getManager(), this->getType(), simplifiedOperands, predicate)); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        boost::any PredicateExpression::accept(ExpressionVisitor &visitor, boost::any const &data) const { | 
				
			|||
            return visitor.visit(*this, data); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        bool PredicateExpression::isPredicateExpression() const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        bool PredicateExpression::isFunctionApplication() const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        bool PredicateExpression::containsVariables() const { | 
				
			|||
            for(auto const& operand : operands) { | 
				
			|||
                if(operand->containsVariables()) { | 
				
			|||
                    return true; | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            return false; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        uint_fast64_t PredicateExpression::getArity() const { | 
				
			|||
            return operands.size(); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        std::shared_ptr<BaseExpression const> PredicateExpression::getOperand(uint_fast64_t operandIndex) const { | 
				
			|||
            STORM_LOG_ASSERT(operandIndex < this->getArity(), "Invalid operand access"); | 
				
			|||
            return operands[operandIndex]; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void PredicateExpression::gatherVariables(std::set<storm::expressions::Variable>& variables) const { | 
				
			|||
            for(auto const& operand : operands) { | 
				
			|||
                operand->gatherVariables(variables); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        /*!
 | 
				
			|||
         * Retrieves the relation associated with the expression. | 
				
			|||
         * | 
				
			|||
         * @return The relation associated with the expression. | 
				
			|||
         */ | 
				
			|||
        PredicateExpression::PredicateType PredicateExpression::getPredicateType() const { | 
				
			|||
            return predicate; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        void PredicateExpression::printToStream(std::ostream& stream) const { | 
				
			|||
 | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,66 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
#include "storm/storage/expressions/BaseExpression.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        /*! | 
				
			|||
         * The base class of all binary expressions. | 
				
			|||
         */ | 
				
			|||
        class PredicateExpression : public BaseExpression { | 
				
			|||
        public: | 
				
			|||
            enum class PredicateType { AtLeastOneOf, AtMostOneOf, ExactlyOneOf }; | 
				
			|||
 | 
				
			|||
            PredicateExpression(ExpressionManager const &manager,Type const& type, | 
				
			|||
                                std::vector <std::shared_ptr<BaseExpression const>> const &operands, | 
				
			|||
                                PredicateType predicateType); | 
				
			|||
 | 
				
			|||
            // Instantiate constructors and assignments with their default implementations. | 
				
			|||
            PredicateExpression(PredicateExpression const &other) = default; | 
				
			|||
 | 
				
			|||
            PredicateExpression &operator=(PredicateExpression const &other) = delete; | 
				
			|||
 | 
				
			|||
            PredicateExpression(PredicateExpression &&) = default; | 
				
			|||
 | 
				
			|||
            PredicateExpression &operator=(PredicateExpression &&) = delete; | 
				
			|||
 | 
				
			|||
            virtual ~PredicateExpression() = default; | 
				
			|||
 | 
				
			|||
            // Override base class methods. | 
				
			|||
            virtual storm::expressions::OperatorType getOperator() const override; | 
				
			|||
 | 
				
			|||
            virtual bool evaluateAsBool(Valuation const *valuation = nullptr) const override; | 
				
			|||
 | 
				
			|||
            virtual std::shared_ptr<BaseExpression const> simplify() const override; | 
				
			|||
 | 
				
			|||
            virtual boost::any accept(ExpressionVisitor &visitor, boost::any const &data) const override; | 
				
			|||
 | 
				
			|||
            virtual bool isPredicateExpression() const override; | 
				
			|||
 | 
				
			|||
            virtual bool isFunctionApplication() const override; | 
				
			|||
 | 
				
			|||
            virtual bool containsVariables() const override; | 
				
			|||
 | 
				
			|||
            virtual uint_fast64_t getArity() const override; | 
				
			|||
 | 
				
			|||
            virtual std::shared_ptr<BaseExpression const> getOperand(uint_fast64_t operandIndex) const override; | 
				
			|||
 | 
				
			|||
            virtual void gatherVariables(std::set<storm::expressions::Variable>& variables) const override; | 
				
			|||
 | 
				
			|||
            /*! | 
				
			|||
             * Retrieves the relation associated with the expression. | 
				
			|||
             * | 
				
			|||
             * @return The relation associated with the expression. | 
				
			|||
             */ | 
				
			|||
            PredicateType getPredicateType() const; | 
				
			|||
 | 
				
			|||
        protected: | 
				
			|||
            // Override base class method. | 
				
			|||
            virtual void printToStream(std::ostream& stream) const override; | 
				
			|||
 | 
				
			|||
        private: | 
				
			|||
            PredicateType predicate; | 
				
			|||
            std::vector<std::shared_ptr<BaseExpression const>> operands; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue