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