From 9bfb1fedc247618fb1e3b54538dc74b80169dcce Mon Sep 17 00:00:00 2001
From: TimQu <tim.quatmann@cs.rwth-aachen.de>
Date: Tue, 11 Jul 2017 14:48:54 +0200
Subject: [PATCH] requiring that multi objective queries have a multi(..)
 formula at top level.

---
 src/storm/logic/FragmentChecker.cpp                   |  3 +++
 src/storm/logic/FragmentSpecification.cpp             | 11 +++++++++++
 src/storm/logic/FragmentSpecification.h               |  4 ++++
 .../csl/SparseMarkovAutomatonCslModelChecker.cpp      |  4 ++--
 .../modelchecker/prctl/SparseMdpPrctlModelChecker.cpp |  4 ++--
 5 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/storm/logic/FragmentChecker.cpp b/src/storm/logic/FragmentChecker.cpp
index ee0967d22..6fc458796 100644
--- a/src/storm/logic/FragmentChecker.cpp
+++ b/src/storm/logic/FragmentChecker.cpp
@@ -24,6 +24,9 @@ namespace storm {
             if (specification.isOperatorAtTopLevelRequired()) {
                 result &= f.isOperatorFormula();
             }
+            if (specification.isMultiObjectiveFormulaAtTopLevelRequired()) {
+                result &= f.isMultiObjectiveFormula();
+            }
             
             return result;
         }
diff --git a/src/storm/logic/FragmentSpecification.cpp b/src/storm/logic/FragmentSpecification.cpp
index 19c4116aa..11a3ac2f4 100644
--- a/src/storm/logic/FragmentSpecification.cpp
+++ b/src/storm/logic/FragmentSpecification.cpp
@@ -88,6 +88,7 @@ namespace storm {
             FragmentSpecification multiObjective = propositional();
             
             multiObjective.setMultiObjectiveFormulasAllowed(true);
+            multiObjective.setMultiObjectiveFormulaAtTopLevelRequired(true);
             multiObjective.setOperatorsAtTopLevelOfMultiObjectiveFormulasRequired(true);
             multiObjective.setProbabilityOperatorsAllowed(true);
             multiObjective.setUntilFormulasAllowed(true);
@@ -148,6 +149,7 @@ namespace storm {
             quantitativeOperatorResults = true;
             
             operatorAtTopLevelRequired = false;
+            multiObjectiveFormulaAtTopLevelRequired = false;
             operatorsAtTopLevelOfMultiObjectiveFormulasRequired = false;
         }
         
@@ -489,6 +491,15 @@ namespace storm {
             return *this;
         }
 
+        bool FragmentSpecification::isMultiObjectiveFormulaAtTopLevelRequired() const {
+            return multiObjectiveFormulaAtTopLevelRequired;
+        }
+        
+        FragmentSpecification& FragmentSpecification::setMultiObjectiveFormulaAtTopLevelRequired(bool newValue) {
+            multiObjectiveFormulaAtTopLevelRequired = newValue;
+            return *this;
+        }
+
         bool FragmentSpecification::areOperatorsAtTopLevelOfMultiObjectiveFormulasRequired() const {
             return operatorsAtTopLevelOfMultiObjectiveFormulasRequired;
         }
diff --git a/src/storm/logic/FragmentSpecification.h b/src/storm/logic/FragmentSpecification.h
index 619394189..74d420f5b 100644
--- a/src/storm/logic/FragmentSpecification.h
+++ b/src/storm/logic/FragmentSpecification.h
@@ -118,6 +118,9 @@ namespace storm {
             bool isOperatorAtTopLevelRequired() const;
             FragmentSpecification& setOperatorAtTopLevelRequired(bool newValue);
             
+            bool isMultiObjectiveFormulaAtTopLevelRequired() const;
+            FragmentSpecification& setMultiObjectiveFormulaAtTopLevelRequired(bool newValue);
+            
             bool areOperatorsAtTopLevelOfMultiObjectiveFormulasRequired() const;
             FragmentSpecification& setOperatorsAtTopLevelOfMultiObjectiveFormulasRequired(bool newValue);
             
@@ -170,6 +173,7 @@ namespace storm {
             bool quantitativeOperatorResults;
             bool qualitativeOperatorResults;
             bool operatorAtTopLevelRequired;
+            bool multiObjectiveFormulaAtTopLevelRequired;
             bool operatorsAtTopLevelOfMultiObjectiveFormulasRequired;
         };
         
diff --git a/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp b/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp
index 2f90c23d5..1bd826c7f 100644
--- a/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp
+++ b/src/storm/modelchecker/csl/SparseMarkovAutomatonCslModelChecker.cpp
@@ -39,8 +39,8 @@ namespace storm {
             } else {
                 // Check whether we consider a multi-objective formula
                 // For multi-objective model checking, each initial state  requires an individual scheduler (in contrast to single objective model checking). Let's exclude multiple initial states.
-                if(this->getModel().getInitialStates().getNumberOfSetBits() > 1) return false;
-                if(!checkTask.isOnlyInitialStatesRelevantSet()) return false;
+                if (this->getModel().getInitialStates().getNumberOfSetBits() > 1) return false;
+                if (!checkTask.isOnlyInitialStatesRelevantSet()) return false;
                 return formula.isInFragment(storm::logic::multiObjective().setTimeAllowed(true).setTimeBoundedUntilFormulasAllowed(true));
             }
         }
diff --git a/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp b/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp
index 4aaee1400..a40d04f08 100644
--- a/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp
+++ b/src/storm/modelchecker/prctl/SparseMdpPrctlModelChecker.cpp
@@ -48,8 +48,8 @@ namespace storm {
             } else {
                 // Check whether we consider a multi-objective formula
                 // For multi-objective model checking, each initial state requires an individual scheduler (in contrast to single-objective model checking). Let's exclude multiple initial states.
-                if(this->getModel().getInitialStates().getNumberOfSetBits() > 1) return false;
-                if(!checkTask.isOnlyInitialStatesRelevantSet()) return false;
+                if (this->getModel().getInitialStates().getNumberOfSetBits() > 1) return false;
+                if (!checkTask.isOnlyInitialStatesRelevantSet()) return false;
                 return formula.isInFragment(storm::logic::multiObjective().setCumulativeRewardFormulasAllowed(true));
             }
         }