You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.9 KiB

  1. #include "src/logic/MultiObjectiveFormula.h"
  2. #include "src/logic/FormulaVisitor.h"
  3. #include "src/utility/macros.h"
  4. #include "src/exceptions/InvalidArgumentException.h"
  5. namespace storm {
  6. namespace logic {
  7. MultiObjectiveFormula::MultiObjectiveFormula(std::vector<std::shared_ptr<Formula const>> const& subformulas) : subformulas(subformulas) {
  8. //Intentionally left empty
  9. }
  10. MultiObjectiveFormula::~MultiObjectiveFormula() {
  11. //Intentionally left empty
  12. }
  13. bool MultiObjectiveFormula::isMultiObjectiveFormula() const {
  14. return true;
  15. }
  16. bool MultiObjectiveFormula::hasQualitativeResult() const {
  17. for(auto const& subformula : this->subformulas){
  18. if(subformula->hasQuantitativeResult()){
  19. return false;
  20. }
  21. }
  22. return true;
  23. }
  24. bool MultiObjectiveFormula::hasQuantitativeResult() const {
  25. return !hasQualitativeResult();
  26. }
  27. bool MultiObjectiveFormula::hasNumericalResult() const {
  28. bool hasExactlyOneQualitativeSubformula = false;
  29. for(auto const& subformula : this->subformulas){
  30. if(subformula->hasQualitativeResult()){
  31. if(hasExactlyOneQualitativeSubformula){
  32. return false;
  33. }
  34. hasExactlyOneQualitativeSubformula=true;
  35. }
  36. }
  37. return hasExactlyOneQualitativeSubformula;
  38. }
  39. bool MultiObjectiveFormula::hasParetoCurveResult() const {
  40. return hasQuantitativeResult() && !hasNumericalResult();
  41. }
  42. Formula const& MultiObjectiveFormula::getSubformula(uint_fast64_t index) const {
  43. STORM_LOG_THROW(index < getNumberOfSubformulas(), storm::exceptions::InvalidArgumentException, "Tried to access subformula with index " << index << " but there are only " << this->getNumberOfSubformulas() << " subformulas.");
  44. return *this->subformulas[index];
  45. }
  46. uint_fast64_t MultiObjectiveFormula::getNumberOfSubformulas() const {
  47. return this->subformulas.size();
  48. }
  49. std::vector<std::shared_ptr<Formula const>> const& MultiObjectiveFormula::getSubFormulas() const {
  50. return this->subformulas;
  51. }
  52. boost::any MultiObjectiveFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const {
  53. return visitor.visit(*this, data);
  54. }
  55. void MultiObjectiveFormula::gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const {
  56. for(auto const& subformula : this->subformulas){
  57. subformula->gatherAtomicExpressionFormulas(atomicExpressionFormulas);
  58. }
  59. }
  60. void MultiObjectiveFormula::gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const {
  61. for(auto const& subformula : this->subformulas){
  62. subformula->gatherAtomicLabelFormulas(atomicLabelFormulas);
  63. }
  64. }
  65. void MultiObjectiveFormula::gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const {
  66. for(auto const& subformula : this->subformulas){
  67. subformula->gatherReferencedRewardModels(referencedRewardModels);
  68. }
  69. }
  70. std::ostream& MultiObjectiveFormula::writeToStream(std::ostream &out) const {
  71. out << "multi(";
  72. for(uint_fast64_t index = 0; index < this->getNumberOfSubformulas(); ++index){
  73. if(index>0){
  74. out << ", ";
  75. }
  76. this->getSubformula(index).writeToStream(out);
  77. }
  78. out << ")";
  79. return out;
  80. }
  81. }
  82. }