From 06255ef08ee2a350fb0835060e43804e875cad27 Mon Sep 17 00:00:00 2001
From: Jip Spel <jip.spel@cs.rwth-aachen.de>
Date: Fri, 14 Sep 2018 11:06:28 +0200
Subject: [PATCH] Use BinaryRelationExpression to check on samples

---
 src/storm-pars/analysis/AssumptionChecker.cpp | 34 ++++++++---
 src/storm-pars/analysis/AssumptionChecker.h   | 15 +++--
 src/storm-pars/analysis/AssumptionMaker.cpp   | 60 +++++++++----------
 3 files changed, 64 insertions(+), 45 deletions(-)

diff --git a/src/storm-pars/analysis/AssumptionChecker.cpp b/src/storm-pars/analysis/AssumptionChecker.cpp
index 6727793c0..bba77fb37 100644
--- a/src/storm-pars/analysis/AssumptionChecker.cpp
+++ b/src/storm-pars/analysis/AssumptionChecker.cpp
@@ -2,15 +2,16 @@
 // Created by Jip Spel on 12.09.18.
 //
 
-#include <storm-pars/utility/ModelInstantiator.h>
-#include <storm/modelchecker/prctl/SparseDtmcPrctlModelChecker.h>
-#include <storm/exceptions/NotSupportedException.h>
+#include "storm-pars/utility/ModelInstantiator.h"
+#include "storm/modelchecker/prctl/SparseDtmcPrctlModelChecker.h"
+#include "storm/exceptions/NotSupportedException.h"
 #include "AssumptionChecker.h"
 #include "storm/modelchecker/CheckTask.h"
 #include "storm/environment/Environment.h"
 #include "storm/modelchecker/results/CheckResult.h"
 #include "storm/modelchecker/results/ExplicitQuantitativeCheckResult.h"
-
+#include "storm/storage/expressions/SimpleValuation.h"
+#include "storm/storage/expressions/ExpressionManager.h"
 
 
 
@@ -23,8 +24,6 @@ namespace storm {
             auto instantiator = storm::utility::ModelInstantiator<storm::models::sparse::Dtmc<ValueType>, storm::models::sparse::Dtmc<double>>(*model.get());
             auto matrix = model->getTransitionMatrix();
             std::set<storm::RationalFunctionVariable> variables =  storm::models::sparse::getProbabilityParameters(*model);
-
-
             for (auto i = 0; i < numberOfSamples; ++i) {
                 auto valuation = storm::utility::parametric::Valuation<ValueType>();
                 for (auto itr = variables.begin(); itr != variables.end(); ++itr) {
@@ -52,8 +51,8 @@ namespace storm {
                 std::vector<double> values = quantitativeResult.getValueVector();
                 results.push_back(values);
             }
-            this->numberOfStates = model->getNumberOfStates();
-            this->initialStates = model->getInitialStates();
+//            this->numberOfStates = model->getNumberOfStates();
+//            this->initialStates = model->getInitialStates();
         }
 
         template <typename ValueType>
@@ -67,6 +66,25 @@ namespace storm {
             return result;
         }
 
+        template <typename ValueType>
+        bool AssumptionChecker<ValueType>::checkOnSamples(std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption) {
+            bool result = true;
+            std::set<storm::expressions::Variable> vars = std::set<storm::expressions::Variable>({});
+            assumption->gatherVariables(vars);
+            for (auto itr = results.begin(); result && itr != results.end(); ++itr) {
+                std::shared_ptr<storm::expressions::ExpressionManager const> manager = assumption->getManager().getSharedPointer();
+                auto valuation = storm::expressions::SimpleValuation(manager);
+                auto values = (*itr);
+                for (auto var = vars.begin(); result && var != vars.end(); ++var) {
+                    storm::expressions::Variable par = *var;
+                    auto index = std::stoi(par.getName());
+                    valuation.setRationalValue(par, values[index]);
+                }
+                result &= assumption->evaluateAsBool(&valuation);
+            }
+            return result;
+        }
+
         template class AssumptionChecker<storm::RationalFunction>;
     }
 }
\ No newline at end of file
diff --git a/src/storm-pars/analysis/AssumptionChecker.h b/src/storm-pars/analysis/AssumptionChecker.h
index 7bd8cc916..78e209ab2 100644
--- a/src/storm-pars/analysis/AssumptionChecker.h
+++ b/src/storm-pars/analysis/AssumptionChecker.h
@@ -5,9 +5,11 @@
 #ifndef STORM_ASSUMPTIONCHECKER_H
 #define STORM_ASSUMPTIONCHECKER_H
 
-#include <storm/logic/Formula.h>
-#include <storm/models/sparse/Dtmc.h>
+#include "storm/logic/Formula.h"
+#include "storm/models/sparse/Dtmc.h"
 #include "storm/environment/Environment.h"
+#include "storm/storage/expressions/BinaryRelationExpression.h"
+
 
 namespace storm {
     namespace analysis {
@@ -17,16 +19,17 @@ namespace storm {
             AssumptionChecker(std::shared_ptr<storm::logic::Formula const> formula, std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> model, uint_fast64_t numberOfSamples);
 
             bool checkOnSamples(uint_fast64_t val1, uint_fast64_t val2);
+            bool checkOnSamples(std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption);
         private:
             std::shared_ptr<storm::logic::Formula const> formula;
 
-            std::vector<storm::models::sparse::Dtmc<double>> sampleModels;
+//            std::vector<storm::models::sparse::Dtmc<double>> sampleModels;
 
             std::vector<std::vector<double>> results;
 
-            uint_fast64_t numberOfStates;
-
-            storm::storage::BitVector initialStates;
+//            uint_fast64_t numberOfStates;
+//
+//            storm::storage::BitVector initialStates;
         };
     }
 }
diff --git a/src/storm-pars/analysis/AssumptionMaker.cpp b/src/storm-pars/analysis/AssumptionMaker.cpp
index d61b5ef28..db98a3498 100644
--- a/src/storm-pars/analysis/AssumptionMaker.cpp
+++ b/src/storm-pars/analysis/AssumptionMaker.cpp
@@ -13,7 +13,7 @@ namespace storm {
             this->assumptionChecker = assumptionChecker;
             this->expressionManager = std::make_shared<storm::expressions::ExpressionManager>(storm::expressions::ExpressionManager());
             for (uint_fast64_t i = 0; i < this->numberOfStates; ++i) {
-                expressionManager->declareIntegerVariable(std::to_string(i));
+                expressionManager->declareRationalVariable(std::to_string(i));
             }
         }
 
@@ -29,19 +29,14 @@ namespace storm {
                 storm::expressions::Variable var1 = expressionManager->getVariable(std::to_string(critical1));
                 storm::expressions::Variable var2 = expressionManager->getVariable(std::to_string(critical2));
 
-                if (assumptionChecker->checkOnSamples(critical1, critical2)) {
-                    auto latticeCopy = new Lattice(lattice);
-                    std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions;
-                    auto myMap = createAssumptions(var1, var2, latticeCopy, assumptions);
-                    result.insert(myMap.begin(), myMap.end());
-                }
-                if (assumptionChecker->checkOnSamples(critical2, critical1)) {
-                    std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions;
-                    auto myMap = createAssumptions(var2, var1, lattice, assumptions);
-                    result.insert(myMap.begin(), myMap.end());
-                } else {
-                    delete lattice;
-                }
+                auto latticeCopy = new Lattice(lattice);
+                std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions;
+                auto myMap = createAssumptions(var1, var2, latticeCopy, assumptions);
+                result.insert(myMap.begin(), myMap.end());
+
+                std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions2;
+                myMap = createAssumptions(var2, var1, lattice, assumptions2);
+                result.insert(myMap.begin(), myMap.end());
             }
             return result;
         }
@@ -59,31 +54,34 @@ namespace storm {
                 storm::expressions::Variable var1 = expressionManager->getVariable(std::to_string(val1));
                 storm::expressions::Variable var2 = expressionManager->getVariable(std::to_string(val2));
 
-                if (assumptionChecker->checkOnSamples(val1, val2)) {
-                    auto latticeCopy = new Lattice(lattice);
-                    std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptionsCopy = std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>>(assumptions);
-                    auto myMap = createAssumptions(var1, var2, latticeCopy, assumptionsCopy);
-                    result.insert(myMap.begin(), myMap.end());
-                }
-
-                if (assumptionChecker->checkOnSamples(val2, val1)) {
-                    auto myMap = createAssumptions(var2, var1, lattice, assumptions);
-                    result.insert(myMap.begin(), myMap.end());
-                } else {
-                    delete lattice;
-                }
+                auto latticeCopy = new Lattice(lattice);
+                std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptionsCopy = std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>>(
+                        assumptions);
+                auto myMap = createAssumptions(var1, var2, latticeCopy, assumptionsCopy);
+                result.insert(myMap.begin(), myMap.end());
+
+                myMap = createAssumptions(var2, var1, lattice, assumptions);
+                result.insert(myMap.begin(), myMap.end());
             }
             return result;
         }
 
         template <typename ValueType>
         std::map<storm::analysis::Lattice*, std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>>> AssumptionMaker<ValueType>::createAssumptions(storm::expressions::Variable var1, storm::expressions::Variable var2, storm::analysis::Lattice* lattice, std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions) {
-            std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption1
-                = std::make_shared<storm::expressions::BinaryRelationExpression>(storm::expressions::BinaryRelationExpression(*expressionManager, var1.getType(),
+            std::map<storm::analysis::Lattice*, std::set<std::shared_ptr<storm::expressions::BinaryRelationExpression>>> result;
+
+            std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption
+                = std::make_shared<storm::expressions::BinaryRelationExpression>(storm::expressions::BinaryRelationExpression(*expressionManager, expressionManager->getBooleanType(),
                         var1.getExpression().getBaseExpressionPointer(), var2.getExpression().getBaseExpressionPointer(),
                         storm::expressions::BinaryRelationExpression::RelationType::GreaterOrEqual));
-            assumptions.insert(assumption1);
-            return (runRecursive(lattice, assumptions));
+            if (assumptionChecker->checkOnSamples(assumption)) {
+                assumptions.insert(assumption);
+                result = (runRecursive(lattice, assumptions));
+            } else {
+                delete lattice;
+            }
+
+            return result;
         }