Browse Source

making the logic formulas better

Former-commit-id: bd5dd26c51
tempestpy_adaptions
dehnert 9 years ago
parent
commit
016ab53f42
  1. 5
      src/logic/BinaryBooleanStateFormula.cpp
  2. 2
      src/logic/BinaryBooleanStateFormula.h
  3. 8
      src/logic/BinaryPathFormula.cpp
  4. 3
      src/logic/BinaryPathFormula.h
  5. 8
      src/logic/ConditionalFormula.cpp
  6. 3
      src/logic/ConditionalFormula.h
  7. 8
      src/logic/Formula.cpp
  8. 4
      src/logic/Formula.h
  9. 6
      src/logic/FragmentChecker.cpp
  10. 22
      src/logic/FragmentSpecification.cpp
  11. 8
      src/logic/FragmentSpecification.h
  12. 8
      src/logic/OperatorFormula.cpp
  13. 3
      src/logic/OperatorFormula.h
  14. 5
      src/logic/UnaryBooleanStateFormula.cpp
  15. 9
      src/logic/UnaryPathFormula.cpp
  16. 3
      src/logic/UnaryPathFormula.h

5
src/logic/BinaryBooleanStateFormula.cpp

@ -2,10 +2,13 @@
#include "src/logic/FormulaVisitor.h"
#include "src/utility/macros.h"
#include "src/exceptions/InvalidPropertyException.h"
namespace storm {
namespace logic {
BinaryBooleanStateFormula::BinaryBooleanStateFormula(OperatorType operatorType, std::shared_ptr<Formula const> const& leftSubformula, std::shared_ptr<Formula const> const& rightSubformula) : BinaryStateFormula(leftSubformula, rightSubformula), operatorType(operatorType) {
// Intentionally left empty.
STORM_LOG_THROW(this->getLeftSubformula().hasQualitativeResult() && this->getRightSubformula().hasQualitativeResult(), storm::exceptions::InvalidPropertyException, "Boolean formula must have subformulas with qualitative result.");
}
bool BinaryBooleanStateFormula::isBinaryBooleanStateFormula() const {

2
src/logic/BinaryBooleanStateFormula.h

@ -25,7 +25,7 @@ namespace storm {
virtual bool isAnd() const;
virtual bool isOr() const;
virtual std::ostream& writeToStream(std::ostream& out) const override;
virtual std::shared_ptr<Formula> substitute(std::map<storm::expressions::Variable, storm::expressions::Expression> const& substitution) const override;

8
src/logic/BinaryPathFormula.cpp

@ -32,5 +32,13 @@ namespace storm {
this->getLeftSubformula().gatherReferencedRewardModels(referencedRewardModels);
this->getRightSubformula().gatherReferencedRewardModels(referencedRewardModels);
}
bool BinaryPathFormula::hasQualitativeResult() const {
return false;
}
bool BinaryPathFormula::hasQuantitativeResult() const {
return true;
}
}
}

3
src/logic/BinaryPathFormula.h

@ -24,6 +24,9 @@ namespace storm {
virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override;
virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override;
virtual bool hasQualitativeResult() const override;
virtual bool hasQuantitativeResult() const override;
private:
std::shared_ptr<Formula const> leftSubformula;
std::shared_ptr<Formula const> rightSubformula;

8
src/logic/ConditionalFormula.cpp

@ -49,6 +49,14 @@ namespace storm {
this->getConditionFormula().gatherReferencedRewardModels(referencedRewardModels);
}
bool ConditionalFormula::hasQualitativeResult() const {
return false;
}
bool ConditionalFormula::hasQuantitativeResult() const {
return true;
}
std::ostream& ConditionalFormula::writeToStream(std::ostream& out) const {
this->getSubformula().writeToStream(out);
out << " || ";

3
src/logic/ConditionalFormula.h

@ -32,6 +32,9 @@ namespace storm {
virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override;
virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override;
virtual bool hasQualitativeResult() const override;
virtual bool hasQuantitativeResult() const override;
private:
std::shared_ptr<Formula const> subformula;
std::shared_ptr<Formula const> conditionFormula;

8
src/logic/Formula.cpp

@ -142,6 +142,14 @@ namespace storm {
return false;
}
bool Formula::hasQualitativeResult() const {
return true;
}
bool Formula::hasQuantitativeResult() const {
return false;
}
bool Formula::isInFragment(FragmentSpecification const& fragment) const {
FragmentChecker checker;
return checker.conformsToSpecification(*this, fragment);

4
src/logic/Formula.h

@ -84,6 +84,10 @@ namespace storm {
virtual bool isUnaryPathFormula() const;
virtual bool isUnaryStateFormula() const;
// Accessors for the return type of a formula.
virtual bool hasQualitativeResult() const;
virtual bool hasQuantitativeResult() const;
bool isInFragment(FragmentSpecification const& fragment) const;
FormulaInformation info() const;

6
src/logic/FragmentChecker.cpp

@ -110,6 +110,8 @@ namespace storm {
boost::any FragmentChecker::visit(TimeOperatorFormula const& f, boost::any const& data) const {
InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
bool result = inherited.getSpecification().areTimeOperatorsAllowed();
result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
result = result && f.getSubformula().isTimePathFormula();
result = result && (inherited.getSpecification().isVarianceMeasureTypeAllowed() || f.getMeasureType() == MeasureType::Expectation);
if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
@ -165,6 +167,8 @@ namespace storm {
boost::any FragmentChecker::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
bool result = inherited.getSpecification().areProbabilityOperatorsAllowed();
result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
result = result && (f.getSubformula().isProbabilityPathFormula() || f.getSubformula().isConditionalProbabilityFormula());
if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false))));
@ -177,6 +181,8 @@ namespace storm {
boost::any FragmentChecker::visit(RewardOperatorFormula const& f, boost::any const& data) const {
InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
bool result = inherited.getSpecification().areRewardOperatorsAllowed();
result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
result = result && (f.getSubformula().isRewardPathFormula() || f.getSubformula().isConditionalRewardFormula());
result = result && (inherited.getSpecification().isVarianceMeasureTypeAllowed() || f.getMeasureType() == MeasureType::Expectation);
if (!inherited.getSpecification().areNestedOperatorsAllowed()) {

22
src/logic/FragmentSpecification.cpp

@ -97,6 +97,9 @@ namespace storm {
stepBoundedUntilFormulas = false;
timeBoundedUntilFormulas = false;
varianceAsMeasureType = false;
qualitativeOperatorResults = true;
quantitativeOperatorResults = true;
}
FragmentSpecification FragmentSpecification::copy() const {
@ -364,6 +367,25 @@ namespace storm {
this->varianceAsMeasureType = newValue;
return *this;
}
bool FragmentSpecification::areQuantitativeOperatorResultsAllowed() const {
return this->quantitativeOperatorResults;
}
FragmentSpecification& FragmentSpecification::setQuantitativeOperatorResultsAllowed(bool newValue) {
this->quantitativeOperatorResults = newValue;
return *this;
}
bool FragmentSpecification::areQualitativeOperatorResultsAllowed() const {
return this->qualitativeOperatorResults;
}
FragmentSpecification& FragmentSpecification::setQualitativeOperatorResultsAllowed(bool newValue) {
this->qualitativeOperatorResults = newValue;
return *this;
}
}
}

8
src/logic/FragmentSpecification.h

@ -94,6 +94,12 @@ namespace storm {
bool isVarianceMeasureTypeAllowed() const;
FragmentSpecification& setVarianceMeasureTypeAllowed(bool newValue);
bool areQuantitativeOperatorResultsAllowed() const;
FragmentSpecification& setQuantitativeOperatorResultsAllowed(bool newValue);
bool areQualitativeOperatorResultsAllowed() const;
FragmentSpecification& setQualitativeOperatorResultsAllowed(bool newValue);
FragmentSpecification& setOperatorsAllowed(bool newValue);
FragmentSpecification& setTimeAllowed(bool newValue);
FragmentSpecification& setLongRunAverageProbabilitiesAllowed(bool newValue);
@ -134,6 +140,8 @@ namespace storm {
bool stepBoundedUntilFormulas;
bool timeBoundedUntilFormulas;
bool varianceAsMeasureType;
bool quantitativeOperatorResults;
bool qualitativeOperatorResults;
};
// Propositional.

8
src/logic/OperatorFormula.cpp

@ -69,6 +69,14 @@ namespace storm {
return true;
}
bool OperatorFormula::hasQualitativeResult() const {
return this->hasBound();
}
bool OperatorFormula::hasQuantitativeResult() const {
return !this->hasBound();
}
std::ostream& OperatorFormula::writeToStream(std::ostream& out) const {
out << "[" << this->operatorInformation.measureType << "]";
if (hasOptimalityType()) {

3
src/logic/OperatorFormula.h

@ -46,6 +46,9 @@ namespace storm {
// Measure-type-related accessors.
MeasureType getMeasureType() const;
virtual bool hasQualitativeResult() const override;
virtual bool hasQuantitativeResult() const override;
virtual std::ostream& writeToStream(std::ostream& out) const override;
protected:

5
src/logic/UnaryBooleanStateFormula.cpp

@ -2,10 +2,13 @@
#include "src/logic/FormulaVisitor.h"
#include "src/utility/macros.h"
#include "src/exceptions/InvalidPropertyException.h"
namespace storm {
namespace logic {
UnaryBooleanStateFormula::UnaryBooleanStateFormula(OperatorType operatorType, std::shared_ptr<Formula const> const& subformula) : UnaryStateFormula(subformula), operatorType(operatorType) {
// Intentionally left empty.
STORM_LOG_THROW(this->getSubformula().hasQualitativeResult(), storm::exceptions::InvalidPropertyException, "Boolean formula must have subformulas with qualitative result.");
}
bool UnaryBooleanStateFormula::isUnaryBooleanStateFormula() const {

9
src/logic/UnaryPathFormula.cpp

@ -25,5 +25,14 @@ namespace storm {
void UnaryPathFormula::gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const {
this->getSubformula().gatherReferencedRewardModels(referencedRewardModels);
}
bool UnaryPathFormula::hasQualitativeResult() const {
return false;
}
bool UnaryPathFormula::hasQuantitativeResult() const {
return true;
}
}
}

3
src/logic/UnaryPathFormula.h

@ -23,6 +23,9 @@ namespace storm {
virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override;
virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override;
virtual bool hasQualitativeResult() const override;
virtual bool hasQuantitativeResult() const override;
private:
std::shared_ptr<Formula const> subformula;
};
Loading…
Cancel
Save