From 16dfd44ab5cb8f91af00f0865f830733acdf847e Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Wed, 30 Sep 2015 10:47:41 +0200
Subject: [PATCH] Vector of FitElement is introduced with the idea to refactor
 ChiSquaredModule

---
 Core/Algorithms/inc/FitElement.h           | 33 +++++++++++++++++++-
 Core/Algorithms/src/ChiSquaredModule.cpp   | 23 +++++++++++++-
 Core/Algorithms/src/FitElement.cpp         |  1 +
 Fit/FitKernel/inc/FitSuite.h               |  5 ++++
 Fit/FitKernel/inc/FitSuiteObjects.h        |  2 ++
 Fit/FitKernel/src/FitObject.cpp            |  1 +
 Fit/FitKernel/src/FitSuite.cpp             |  5 ++++
 Fit/FitKernel/src/FitSuiteObjects.cpp      | 35 +++++++++++++++++-----
 Fit/PythonAPI/src/FitSuite.pypp.cpp        |  6 ++--
 Fit/PythonAPI/src/FitSuiteObjects.pypp.cpp | 10 +++++++
 dev-tools/python-bindings/settings_fit.py  | 10 +++++--
 11 files changed, 116 insertions(+), 15 deletions(-)

diff --git a/Core/Algorithms/inc/FitElement.h b/Core/Algorithms/inc/FitElement.h
index b9e0ad35503..eb8069d98b3 100644
--- a/Core/Algorithms/inc/FitElement.h
+++ b/Core/Algorithms/inc/FitElement.h
@@ -35,6 +35,13 @@ public:
 
     double getRealValue() const;
 
+    double getWeight() const;
+
+    double getSquaredDifference() const;
+    void setSquaredDifference(double value);
+
+    double getResidual() const;
+    void setResidual(double value);
 
 private:
     void swapContent(FitElement &other);
@@ -49,7 +56,7 @@ private:
 
 inline double FitElement::getSimulValue() const
 {
-    return m_real_value;
+    return m_simul_value;
 }
 
 inline double FitElement::getRealValue() const
@@ -57,6 +64,30 @@ inline double FitElement::getRealValue() const
     return m_real_value;
 }
 
+inline double FitElement::getWeight() const
+{
+    return m_weight;
+}
+
+inline double FitElement::getSquaredDifference() const
+{
+    return m_squared_difference;
+}
+
+inline void FitElement::setSquaredDifference(double value)
+{
+    m_squared_difference = value;
+}
+
+inline double FitElement::getResidual() const
+{
+    return m_residual;
+}
+
+inline void FitElement::setResidual(double value)
+{
+    m_residual = value;
+}
 
 #endif
 
diff --git a/Core/Algorithms/src/ChiSquaredModule.cpp b/Core/Algorithms/src/ChiSquaredModule.cpp
index 360eee5b6e2..3be21e5b572 100644
--- a/Core/Algorithms/src/ChiSquaredModule.cpp
+++ b/Core/Algorithms/src/ChiSquaredModule.cpp
@@ -159,8 +159,29 @@ OutputData<double>* ChiSquaredModule::createChi2DifferenceMap() const
 void ChiSquaredModule::processFitElements(std::vector<FitElement>::iterator first,
                                           std::vector<FitElement>::iterator last)
 {
+    assert(mp_squared_function);
+
     for (std::vector<FitElement>::iterator it = first; it != last; ++it) {
-        std::cout << it->getRealValue() << " " << it->getSimulValue() << std::endl;
+        double value_simu = it->getSimulValue();
+        double value_real = it->getRealValue();
+        double weight = it->getWeight();
+
+        if(mp_intensity_function) {
+            value_simu = mp_intensity_function->evaluate(value_simu);
+            value_real = mp_intensity_function->evaluate(value_real);
+        }
+
+        double squared_difference =
+            mp_squared_function->calculateSquaredDifference(
+                value_real, value_simu)*weight;
+
+        it->setSquaredDifference(squared_difference);
+
+        double squared_error = mp_squared_function->calculateSquaredError(value_real, value_simu);
+        double residual = std::sqrt(weight)*(value_simu - value_real)/std::sqrt(squared_error);
+
+        it->setResidual(residual);
+
     }
 }
 
diff --git a/Core/Algorithms/src/FitElement.cpp b/Core/Algorithms/src/FitElement.cpp
index ea2e3e1ed4c..8727e2e8478 100644
--- a/Core/Algorithms/src/FitElement.cpp
+++ b/Core/Algorithms/src/FitElement.cpp
@@ -54,6 +54,7 @@ FitElement &FitElement::operator=(const FitElement &other)
     return *this;
 }
 
+
 void FitElement::swapContent(FitElement &other)
 {
     std::swap(this->m_simul_value, other.m_simul_value);
diff --git a/Fit/FitKernel/inc/FitSuite.h b/Fit/FitKernel/inc/FitSuite.h
index 36138877ed9..c99407d2451 100644
--- a/Fit/FitKernel/inc/FitSuite.h
+++ b/Fit/FitKernel/inc/FitSuite.h
@@ -59,9 +59,14 @@ class BA_CORE_API_ FitSuite : public IObservable
 
     //! Sets minimizer
     void setMinimizer(IMinimizer *minimizer);
+
+    void setMinimizer(std::string& minimizer, const std::string& algorithm = std::string(), const std::string& options=std::string());
+
     //! Returns minimizer
     IMinimizer *getMinimizer() { return m_minimizer; }
 
+
+
     //! link fitting parameters to parameters defined in simulations
     virtual void link_fit_parameters();
 
diff --git a/Fit/FitKernel/inc/FitSuiteObjects.h b/Fit/FitKernel/inc/FitSuiteObjects.h
index 4b5d0169eab..18c9dfdff56 100644
--- a/Fit/FitKernel/inc/FitSuiteObjects.h
+++ b/Fit/FitKernel/inc/FitSuiteObjects.h
@@ -60,6 +60,8 @@ class BA_CORE_API_  FitSuiteObjects : public IParameterized
     //! Returns sum of chi squared values for all fit objects
     double calculateChiSquaredValue();
 
+    double calculateChiSquaredValueNew();
+
     //! Returns residuals for single data element
     //! @pars global_index index accross all OutputData defined
     double getResidualValue(size_t global_index);
diff --git a/Fit/FitKernel/src/FitObject.cpp b/Fit/FitKernel/src/FitObject.cpp
index 227e618bf1d..6635fbc3c5e 100644
--- a/Fit/FitKernel/src/FitObject.cpp
+++ b/Fit/FitKernel/src/FitObject.cpp
@@ -118,5 +118,6 @@ std::vector<FitElement> FitObject::calculateFitElements()
         result.push_back(element);
     }
 
+    m_chi2_module->processFitElements(result.begin(), result.end());
     return result;
 }
diff --git a/Fit/FitKernel/src/FitSuite.cpp b/Fit/FitKernel/src/FitSuite.cpp
index bea043d8c0e..a81eab0bb9f 100644
--- a/Fit/FitKernel/src/FitSuite.cpp
+++ b/Fit/FitKernel/src/FitSuite.cpp
@@ -85,6 +85,11 @@ void FitSuite::setMinimizer(IMinimizer *minimizer)
     }
 }
 
+void FitSuite::setMinimizer(std::string &minimizer, const std::string &algorithm, const std::string &options)
+{
+    setMinimizer(MinimizerFactory::createMinimizer(minimizer, algorithm, options));
+}
+
 //! link FitMultiParameters with simulation parameters
 void FitSuite::link_fit_parameters()
 {
diff --git a/Fit/FitKernel/src/FitSuiteObjects.cpp b/Fit/FitKernel/src/FitSuiteObjects.cpp
index 348950f33ac..a83234d7213 100644
--- a/Fit/FitKernel/src/FitSuiteObjects.cpp
+++ b/Fit/FitKernel/src/FitSuiteObjects.cpp
@@ -46,20 +46,24 @@ void FitSuiteObjects::add(
 //! loop through all defined simulations and run them
 void FitSuiteObjects::runSimulations()
 {
-//    for(FitObjects_t::iterator it =
-//            m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
-//        (*it)->getSimulation()->runSimulation();
-////        if(m_simulation_normalize) {
-////            (*it)->getSimulation()->normalize();
-////        }
-//    }
-//    m_chi_squared_value = calculateChiSquaredValue();
+    for(FitObjects_t::iterator it =
+            m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
+        (*it)->getSimulation()->runSimulation();
+//        if(m_simulation_normalize) {
+//            (*it)->getSimulation()->normalize();
+//        }
+    }
+    m_chi_squared_value = calculateChiSquaredValue();
+    std::cout << "aaa " << m_chi_squared_value;
 
     for(FitObjects_t::iterator it =
             m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
         m_fit_elements = (*it)->calculateFitElements();
     }
 
+    m_chi_squared_value = calculateChiSquaredValueNew();
+    std::cout << "aaa2 " << m_chi_squared_value << std::endl;
+
 }
 
 //! Returns total number of data points
@@ -117,6 +121,21 @@ double FitSuiteObjects::calculateChiSquaredValue()
     return result;
 }
 
+double FitSuiteObjects::calculateChiSquaredValueNew()
+{
+    double result(0);
+    for(std::vector<FitElement>::iterator it=m_fit_elements.begin(); it!=m_fit_elements.end(); ++it) {
+        result += it->getSquaredDifference();
+    }
+
+    int fnorm = m_fit_elements.size() - m_nfree_parameters;
+    if(fnorm <=0) {
+        throw LogicErrorException("FitSuiteObjects::calculateChiSquaredValueNew() -> Error. Normalization is 0");
+    }
+
+    return result/fnorm;
+}
+
 double FitSuiteObjects::getResidualValue(size_t global_index)
 {
     size_t index(0);
diff --git a/Fit/PythonAPI/src/FitSuite.pypp.cpp b/Fit/PythonAPI/src/FitSuite.pypp.cpp
index da3c54783f0..1784eb3e9a3 100644
--- a/Fit/PythonAPI/src/FitSuite.pypp.cpp
+++ b/Fit/PythonAPI/src/FitSuite.pypp.cpp
@@ -231,7 +231,7 @@ void register_FitSuite_class(){
                 "getMinimizer"
                 , getMinimizer_function_type( &::FitSuite::getMinimizer )
                 , bp::return_value_policy< bp::reference_existing_object >()
-                , "Sets minimizer." );
+                , "Returns minimizer." );
         
         }
         { //::FitSuite::getNCalls
@@ -350,12 +350,12 @@ void register_FitSuite_class(){
         }
         { //::FitSuite::setMinimizer
         
-            typedef void ( ::FitSuite::*setMinimizer_function_type)( ::IMinimizer * ) ;
+            typedef void ( ::FitSuite::*setMinimizer_function_type)( ::std::string &,::std::string const &,::std::string const & ) ;
             
             FitSuite_exposer.def( 
                 "setMinimizer"
                 , setMinimizer_function_type( &::FitSuite::setMinimizer )
-                , ( bp::arg("minimizer") )
+                , ( bp::arg("minimizer"), bp::arg("algorithm")=std::basic_string<char, std::char_traits<char>, std::allocator<char> >(), bp::arg("options")=std::basic_string<char, std::char_traits<char>, std::allocator<char> >() )
                 , "Sets minimizer." );
         
         }
diff --git a/Fit/PythonAPI/src/FitSuiteObjects.pypp.cpp b/Fit/PythonAPI/src/FitSuiteObjects.pypp.cpp
index 8bb01a8eba6..cb92262f92f 100644
--- a/Fit/PythonAPI/src/FitSuiteObjects.pypp.cpp
+++ b/Fit/PythonAPI/src/FitSuiteObjects.pypp.cpp
@@ -135,6 +135,16 @@ void register_FitSuiteObjects_class(){
                 , calculateChiSquaredValue_function_type( &::FitSuiteObjects::calculateChiSquaredValue )
                 , "Returns sum of chi squared values for all fit objects." );
         
+        }
+        { //::FitSuiteObjects::calculateChiSquaredValueNew
+        
+            typedef double ( ::FitSuiteObjects::*calculateChiSquaredValueNew_function_type)(  ) ;
+            
+            FitSuiteObjects_exposer.def( 
+                "calculateChiSquaredValueNew"
+                , calculateChiSquaredValueNew_function_type( &::FitSuiteObjects::calculateChiSquaredValueNew )
+                , "Returns sum of chi squared values for all fit objects." );
+        
         }
         { //::FitSuiteObjects::clear
         
diff --git a/dev-tools/python-bindings/settings_fit.py b/dev-tools/python-bindings/settings_fit.py
index 04b949d631a..d8d3d9cf3ec 100644
--- a/dev-tools/python-bindings/settings_fit.py
+++ b/dev-tools/python-bindings/settings_fit.py
@@ -144,9 +144,9 @@ def ManualClassTunings(mb):
     #for fun in cl.member_functions(allow_empty=True):
       #if "addFitParameter" in fun.name:
           #fun.include()
-    cl.member_function("getMinimizer").include()
+    # cl.member_function("getMinimizer").include()
     cl.member_function( "getMinimizer" ).call_policies = call_policies.return_value_policy( call_policies.reference_existing_object )
-    cl.member_function("setMinimizer").include()
+    # cl.member_function("setMinimizer").include()
     #cl.member_function("addSimulationAndRealData").include()
     #cl.member_function("runFit").include()
     #cl.member_function("printResults").include()
@@ -188,6 +188,12 @@ def ManualClassTunings(mb):
     cl.member_function("getChiSquaredMap").call_policies = \
         call_policies.return_value_policy(call_policies.manage_new_object)
 
+    cl = mb.class_("ChiSquaredModule")
+    cl.member_function("processFitElements").exclude()
+    cl = mb.class_("IChiSquaredModule")
+    cl.member_function("processFitElements").exclude()
+    cl = mb.class_("FitObject")
+    cl.member_function("calculateFitElements").exclude()
 
 
 # excluding specific member functions
-- 
GitLab