21 changed files with 236 additions and 1 deletions
			
			
		- 
					5src/storm/logic/CloneVisitor.cpp
 - 
					1src/storm/logic/CloneVisitor.h
 - 
					4src/storm/logic/Formula.cpp
 - 
					1src/storm/logic/Formula.h
 - 
					4src/storm/logic/FormulaInformationVisitor.cpp
 - 
					1src/storm/logic/FormulaInformationVisitor.h
 - 
					1src/storm/logic/FormulaVisitor.h
 - 
					1src/storm/logic/Formulas.h
 - 
					1src/storm/logic/FormulasForwardDeclarations.h
 - 
					11src/storm/logic/FragmentChecker.cpp
 - 
					1src/storm/logic/FragmentChecker.h
 - 
					43src/storm/logic/FragmentSpecification.cpp
 - 
					11src/storm/logic/FragmentSpecification.h
 - 
					4src/storm/logic/LiftableTransitionRewardsVisitor.cpp
 - 
					1src/storm/logic/LiftableTransitionRewardsVisitor.h
 - 
					96src/storm/logic/QuantileFormula.cpp
 - 
					41src/storm/logic/QuantileFormula.h
 - 
					4src/storm/logic/ToExpressionVisitor.cpp
 - 
					1src/storm/logic/ToExpressionVisitor.h
 - 
					4src/storm/storage/jani/JSONExporter.cpp
 - 
					1src/storm/storage/jani/JSONExporter.h
 
@ -0,0 +1,96 @@ | 
				
			|||
#include "storm/logic/QuantileFormula.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/logic/FormulaVisitor.h"
 | 
				
			|||
#include "storm/utility/macros.h"
 | 
				
			|||
#include "storm/exceptions/InvalidArgumentException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace logic { | 
				
			|||
     | 
				
			|||
        QuantileFormula::QuantileFormula(std::vector<std::pair<storm::solver::OptimizationDirection, storm::expressions::Variable>> const& boundVariables, std::shared_ptr<Formula const> subformula) : boundVariables(boundVariables), subformula(subformula) { | 
				
			|||
            STORM_LOG_THROW(!boundVariables.empty(), storm::exceptions::InvalidArgumentException, "Quantile formula without bound variables are invalid."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        QuantileFormula::~QuantileFormula() { | 
				
			|||
            // Intentionally left empty
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool QuantileFormula::isQuantileFormula() const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool QuantileFormula::hasQuantitativeResult() const { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool QuantileFormula::hasNumericalResult() const { | 
				
			|||
            return !isMultiDimensional(); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool QuantileFormula::hasParetoCurveResult() const { | 
				
			|||
            return isMultiDimensional(); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        Formula const& QuantileFormula::getSubformula() const { | 
				
			|||
            return *subformula; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        uint64_t QuantileFormula::getDimension() const { | 
				
			|||
            return boundVariables.size(); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool QuantileFormula::isMultiDimensional() const { | 
				
			|||
            return getDimension() > 1; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        storm::expressions::Variable const& QuantileFormula::getBoundVariable() const { | 
				
			|||
            STORM_LOG_THROW(boundVariables.size() == 1, storm::exceptions::InvalidArgumentException, "Requested unique bound variables. However, there are multiple bound variables defined."); | 
				
			|||
            return boundVariables.front().second; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        storm::expressions::Variable const& QuantileFormula::getBoundVariable(uint64_t index) const { | 
				
			|||
            STORM_LOG_THROW(index < boundVariables.size(), storm::exceptions::InvalidArgumentException, "Requested bound variable with index" << index << ". However, there are only " << boundVariables.size() << " bound variables."); | 
				
			|||
            return boundVariables[index].second; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::vector<std::pair<storm::solver::OptimizationDirection, storm::expressions::Variable>> const& QuantileFormula::getBoundVariables() const { | 
				
			|||
            return boundVariables; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        storm::solver::OptimizationDirection const& QuantileFormula::getOptimizationDirection() const { | 
				
			|||
            STORM_LOG_THROW(boundVariables.size() == 1, storm::exceptions::InvalidArgumentException, "Requested unique optimization direction of the bound variables. However, there are multiple bound variables defined."); | 
				
			|||
            return boundVariables.front().first; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        storm::solver::OptimizationDirection const& QuantileFormula::getOptimizationDirection(uint64_t index) const { | 
				
			|||
            STORM_LOG_THROW(index < boundVariables.size(), storm::exceptions::InvalidArgumentException, "Requested optimization direction with index" << index << ". However, there are only " << boundVariables.size() << " bound variables."); | 
				
			|||
            return boundVariables[index].first; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        boost::any QuantileFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const { | 
				
			|||
            return visitor.visit(*this, data); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void QuantileFormula::gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const { | 
				
			|||
            subformula->gatherAtomicExpressionFormulas(atomicExpressionFormulas); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void QuantileFormula::gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const { | 
				
			|||
            subformula->gatherAtomicLabelFormulas(atomicLabelFormulas); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void QuantileFormula::gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const { | 
				
			|||
            subformula->gatherReferencedRewardModels(referencedRewardModels); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::ostream& QuantileFormula::writeToStream(std::ostream& out) const { | 
				
			|||
            out << "quantile("; | 
				
			|||
            for (auto const& bv : boundVariables) { | 
				
			|||
                out << bv.first << " " << bv.second.getName() << ", "; | 
				
			|||
            } | 
				
			|||
            subformula->writeToStream(out); | 
				
			|||
            out << ")"; | 
				
			|||
            return out; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,41 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
#include "storm/logic/Formula.h" | 
				
			|||
#include "storm/solver/OptimizationDirection.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace logic { | 
				
			|||
        class QuantileFormula : public Formula { | 
				
			|||
        public: | 
				
			|||
            QuantileFormula(std::vector<std::pair<storm::solver::OptimizationDirection, storm::expressions::Variable>> const& boundVariables, std::shared_ptr<Formula const> subformula); | 
				
			|||
             | 
				
			|||
            virtual ~QuantileFormula(); | 
				
			|||
             | 
				
			|||
            virtual bool isQuantileFormula() const override; | 
				
			|||
             | 
				
			|||
            virtual bool hasQuantitativeResult() const override; // Result is numerical or a pareto curve | 
				
			|||
            virtual bool hasNumericalResult() const; // Result is numerical | 
				
			|||
            virtual bool hasParetoCurveResult() const; // Result is a pareto curve | 
				
			|||
             | 
				
			|||
            Formula const& getSubformula() const; | 
				
			|||
            uint64_t getDimension() const; | 
				
			|||
            bool isMultiDimensional() const; | 
				
			|||
             | 
				
			|||
            storm::expressions::Variable const& getBoundVariable() const; | 
				
			|||
            storm::expressions::Variable const& getBoundVariable(uint64_t index) const; | 
				
			|||
            std::vector<std::pair<storm::solver::OptimizationDirection, storm::expressions::Variable>> const& getBoundVariables() const; | 
				
			|||
            storm::solver::OptimizationDirection const& getOptimizationDirection() const; | 
				
			|||
            storm::solver::OptimizationDirection const& getOptimizationDirection(uint64_t index) const; | 
				
			|||
             | 
				
			|||
            virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; | 
				
			|||
            virtual void gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const override; | 
				
			|||
            virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; | 
				
			|||
            virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; | 
				
			|||
             | 
				
			|||
            virtual std::ostream& writeToStream(std::ostream& out) const override; | 
				
			|||
        private: | 
				
			|||
            std::vector<std::pair<storm::solver::OptimizationDirection, storm::expressions::Variable>> boundVariables; | 
				
			|||
            std::shared_ptr<Formula const> subformula; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue