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; |
|||
}; |
|||
} |
|||
} |
Reference in new issue
xxxxxxxxxx