diff --git a/App/src/TestFittingModule2.cpp b/App/src/TestFittingModule2.cpp index 93d59eb2865e19322dc8304347b2c70e50b0abb5..f5e80c3de9021ac3ed005565c44240c49466fd17 100644 --- a/App/src/TestFittingModule2.cpp +++ b/App/src/TestFittingModule2.cpp @@ -19,7 +19,7 @@ #include "Exceptions.h" #include "FitSuite.h" #include "FitSuiteObserverFactory.h" -#include "IFitSuiteStrategy.h" +#include "FitStrategyAdjustData.h" #include "FormFactors.h" #include "Simulation.h" #include "IIntensityFunction.h" @@ -178,10 +178,10 @@ void TestFittingModule2::fit_example_strategies() AttLimits::fixed()); // Applying fit strategy: resizing real data - m_fitSuite->addFitStrategy(new FitSuiteStrategyAdjustData(3)); - m_fitSuite->addFitStrategy(new FitSuiteStrategyAdjustData(2)); - m_fitSuite->addFitStrategy(new FitSuiteStrategyAdjustData(1)); - m_fitSuite->addFitStrategy(new FitSuiteStrategyDefault()); + m_fitSuite->addFitStrategy(new FitStrategyAdjustData(3)); + m_fitSuite->addFitStrategy(new FitStrategyAdjustData(2)); + m_fitSuite->addFitStrategy(new FitStrategyAdjustData(1)); + m_fitSuite->addFitStrategy(new FitStrategyDefault()); m_fitSuite->addSimulationAndRealData(*mp_simulation, *mp_real_data); diff --git a/App/src/TestMesoCrystal2.cpp b/App/src/TestMesoCrystal2.cpp index 2cfe2c10920b544feddfe0308774ea9954ab0552..6c129d6617cd3931bc354e460422aa48dc0a6322 100644 --- a/App/src/TestMesoCrystal2.cpp +++ b/App/src/TestMesoCrystal2.cpp @@ -17,6 +17,7 @@ #include "AttLimits.h" #include "Crystal.h" #include "DrawHelper.h" +#include "FitStrategyAdjustParameters.h" #include "FitSuite.h" #include "FitSuiteObserverFactory.h" #include "FormFactorDecoratorDebyeWaller.h" @@ -278,21 +279,21 @@ void TestMesoCrystal2::fitsuite_config4() for( size_t i_plan=0; i_plan<fixplan.size(); ++i_plan) { std::ostringstream ostr; ostr << "strategy" <<i_plan; - FitSuiteStrategyAdjustParameters *strategy = new FitSuiteStrategyAdjustParameters(ostr.str()); + FitStrategyAdjustParameters *strategy = new FitStrategyAdjustParameters(ostr.str()); strategy->fix_all(); for(size_t i_par=0; i_par<fixplan[i_plan].size(); ++i_par) { strategy->release(fixplan[i_plan][i_par]); } m_fitSuite->addFitStrategy(strategy); } - FitSuiteStrategyAdjustParameters *strategy_all = new FitSuiteStrategyAdjustParameters("strategy_all"); + FitStrategyAdjustParameters *strategy_all = new FitStrategyAdjustParameters("strategy_all"); strategy_all->release_all(); m_fitSuite->addFitStrategy(strategy_all); // fitpreserve=1 - preserve original values // fitpreserve=0 - return always to previous fit values for(FitSuiteStrategies::iterator it = m_fitSuite->getFitStrategies()->begin(); it!= m_fitSuite->getFitStrategies()->end(); ++it) { - FitSuiteStrategyAdjustParameters *strategy = dynamic_cast<FitSuiteStrategyAdjustParameters *>( (*it) ); + FitStrategyAdjustParameters *strategy = dynamic_cast<FitStrategyAdjustParameters *>( (*it) ); assert(strategy); strategy->setPreserveOriginalValues( (*mp_options)["fitpreserve"].as<int>() ); } @@ -349,21 +350,21 @@ void TestMesoCrystal2::fitsuite_config3() for( size_t i_plan=0; i_plan<fixplan.size(); ++i_plan) { std::ostringstream ostr; ostr << "strategy" <<i_plan; - FitSuiteStrategyAdjustParameters *strategy = new FitSuiteStrategyAdjustParameters(ostr.str()); + FitStrategyAdjustParameters *strategy = new FitStrategyAdjustParameters(ostr.str()); strategy->fix_all(); for(size_t i_par=0; i_par<fixplan[i_plan].size(); ++i_par) { strategy->release(fixplan[i_plan][i_par]); } m_fitSuite->addFitStrategy(strategy); } - FitSuiteStrategyAdjustParameters *strategy_all = new FitSuiteStrategyAdjustParameters("strategy_all"); + FitStrategyAdjustParameters *strategy_all = new FitStrategyAdjustParameters("strategy_all"); strategy_all->release_all(); m_fitSuite->addFitStrategy(strategy_all); // fitpreserve=1 - preserve original values // fitpreserve=0 - return always to previous fit values for(FitSuiteStrategies::iterator it = m_fitSuite->getFitStrategies()->begin(); it!= m_fitSuite->getFitStrategies()->end(); ++it) { - FitSuiteStrategyAdjustParameters *strategy = dynamic_cast<FitSuiteStrategyAdjustParameters *>( (*it) ); + FitStrategyAdjustParameters *strategy = dynamic_cast<FitStrategyAdjustParameters *>( (*it) ); assert(strategy); strategy->setPreserveOriginalValues( (*mp_options)["fitpreserve"].as<int>() ); } @@ -421,7 +422,7 @@ void TestMesoCrystal2::fitsuite_config2() for( size_t i_plan=0; i_plan<fixplan.size(); ++i_plan) { std::ostringstream ostr; ostr << "strategy" <<i_plan; - FitSuiteStrategyAdjustParameters *strategy = new FitSuiteStrategyAdjustParameters(ostr.str()); + FitStrategyAdjustParameters *strategy = new FitStrategyAdjustParameters(ostr.str()); strategy->fix_all(); strategy->setPreserveOriginalValues(true); // initial values of parameters will be restored after each fit for(size_t i_par=0; i_par<fixplan[i_plan].size(); ++i_par) { @@ -429,14 +430,14 @@ void TestMesoCrystal2::fitsuite_config2() } m_fitSuite->addFitStrategy(strategy); } - FitSuiteStrategyAdjustParameters *strategy_all = new FitSuiteStrategyAdjustParameters("strategy_all"); + FitStrategyAdjustParameters *strategy_all = new FitStrategyAdjustParameters("strategy_all"); strategy_all->release_all(); m_fitSuite->addFitStrategy(strategy_all); // fitpreserve=1 - preserve original values // fitpreserve=0 - return always to previous fit values for(FitSuiteStrategies::iterator it = m_fitSuite->getFitStrategies()->begin(); it!= m_fitSuite->getFitStrategies()->end(); ++it) { - FitSuiteStrategyAdjustParameters *strategy = dynamic_cast<FitSuiteStrategyAdjustParameters *>( (*it) ); + FitStrategyAdjustParameters *strategy = dynamic_cast<FitStrategyAdjustParameters *>( (*it) ); assert(strategy); strategy->setPreserveOriginalValues( (*mp_options)["fitpreserve"].as<int>() ); } @@ -483,7 +484,7 @@ void TestMesoCrystal2::fitsuite_config1() for( size_t i_plan=0; i_plan<fixplan.size(); ++i_plan) { std::ostringstream ostr; ostr << "strategy" <<i_plan; - FitSuiteStrategyAdjustParameters *strategy = new FitSuiteStrategyAdjustParameters(ostr.str()); + FitStrategyAdjustParameters *strategy = new FitStrategyAdjustParameters(ostr.str()); strategy->fix_all(); strategy->setPreserveOriginalValues(true); // initial values of parameters will be restored after each fit for(size_t i_par=0; i_par<fixplan[i_plan].size(); ++i_par) { @@ -491,14 +492,14 @@ void TestMesoCrystal2::fitsuite_config1() } m_fitSuite->addFitStrategy(strategy); } - FitSuiteStrategyAdjustParameters *strategy_all = new FitSuiteStrategyAdjustParameters("strategy_all"); + FitStrategyAdjustParameters *strategy_all = new FitStrategyAdjustParameters("strategy_all"); strategy_all->release_all(); m_fitSuite->addFitStrategy(strategy_all); // fitpreserve=1 - preserve original values // fitpreserve=0 - return always to previous fit values for(FitSuiteStrategies::iterator it = m_fitSuite->getFitStrategies()->begin(); it!= m_fitSuite->getFitStrategies()->end(); ++it) { - FitSuiteStrategyAdjustParameters *strategy = dynamic_cast<FitSuiteStrategyAdjustParameters *>( (*it) ); + FitStrategyAdjustParameters *strategy = dynamic_cast<FitStrategyAdjustParameters *>( (*it) ); assert(strategy); strategy->setPreserveOriginalValues( (*mp_options)["fitpreserve"].as<int>() ); } diff --git a/Fit/FitKernel/inc/FitStrategyAdjustData.h b/Fit/FitKernel/inc/FitStrategyAdjustData.h new file mode 100644 index 0000000000000000000000000000000000000000..c8546ec33d7f2ee9c5c47f8a7d9ad9844763a85c --- /dev/null +++ b/Fit/FitKernel/inc/FitStrategyAdjustData.h @@ -0,0 +1,57 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file FitKernel/inc/FitStrategyAdjustData.h +//! @brief Defines class FitStrategyAdjustData +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef FITSTRATEGYADJUSTDATA_H +#define FITSTRATEGYADJUSTDATA_H + +#include "IFitStrategy.h" + +//! @class FitStrategyAdjustData +//! @ingroup fitting +//! @brief Strategy modifies data before running minimization round + +class BA_CORE_API_ FitStrategyAdjustData : public IFitStrategy +{ +public: + FitStrategyAdjustData(int power_of_two = 1, + bool preserve_original=true, bool call_minimize=true) + : IFitStrategy("FitStrategyAdjustData") + , m_power_of_two(power_of_two) + , m_preserve_original_data(preserve_original) + , m_call_minimize(call_minimize) { } + + virtual FitStrategyAdjustData *clone() const { return new FitStrategyAdjustData(*this); } + + void setPreserveOriginalData(bool preserve_original) { + m_preserve_original_data = preserve_original; + } + void setCallMinimize(bool call_minimize) { + m_call_minimize = call_minimize; + } + virtual void execute(); +protected: + FitStrategyAdjustData(const FitStrategyAdjustData &other); + + size_t m_power_of_two; + //! if it is true, strategy will restore original data in FitSuite + //! before exiting + bool m_preserve_original_data; + //! if it's true, modify data and then call FitSuite's minimizer, + //! if false - simply modify the data + bool m_call_minimize; +}; + +#endif // FITSTRATEGYADJUSTDATA_H + diff --git a/Fit/FitKernel/inc/FitStrategyAdjustMinimizer.h b/Fit/FitKernel/inc/FitStrategyAdjustMinimizer.h new file mode 100644 index 0000000000000000000000000000000000000000..aa3645f1dca5d5de4e28c0e03204fc5775bde222 --- /dev/null +++ b/Fit/FitKernel/inc/FitStrategyAdjustMinimizer.h @@ -0,0 +1,31 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file FitKernel/inc/FitStrategyAdjustMinimizer.h +//! @brief Defines class FitStrategyAdjustMinimizer +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef FITSTRATEGYADJUSTMINIMIZER_H +#define FITSTRATEGYADJUSTMINIMIZER_H + +#include "IFitStrategy.h" + +//! @class FitStrategyAdjustMinimizer +//! @ingroup fitting +//! @brief Strategy modifies mimimizer settings before running minimization round + +class BA_CORE_API_ FitStrategyAdjustMinimizer : public IFitStrategy +{ +public: +}; + +#endif // FITSTRATEGYADJUSTMINIMIZER_H + diff --git a/Fit/FitKernel/inc/FitStrategyAdjustParameters.h b/Fit/FitKernel/inc/FitStrategyAdjustParameters.h new file mode 100644 index 0000000000000000000000000000000000000000..0fdf4e58d50a9ff704c367a8c9d51a553a059a20 --- /dev/null +++ b/Fit/FitKernel/inc/FitStrategyAdjustParameters.h @@ -0,0 +1,74 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file FitKernel/inc/FitStrategyAdjustParameters.h +//! @brief Defines classes FitStrategyAdjustParameters and related +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef FITSTRATEGYADJUSTPARAMETERS_H +#define FITSTRATEGYADJUSTPARAMETERS_H + +#include "IFitStrategy.h" + +//! @class FitStrategyAdjustParameters +//! @ingroup fitting_internal +//! @brief Strategy which fixes/releases fit parameters and call minimizer + +class BA_CORE_API_ FitStrategyAdjustParameters : public IFitStrategy +{ +public: + FitStrategyAdjustParameters(const std::string& name) + : IFitStrategy(name) + , m_fix_all(false) + , m_release_all(false) + , m_preserve_original_values(false) { } + FitStrategyAdjustParameters() + : IFitStrategy("FitSuiteStrategyAdjustParameters") + , m_fix_all(false) + , m_release_all(false) + , m_preserve_original_values(false) { } + virtual ~FitStrategyAdjustParameters(){} + + virtual FitStrategyAdjustParameters *clone() const { return new FitStrategyAdjustParameters(*this); } + + virtual void execute(); + FitStrategyAdjustParameters& fix_all() { + m_fix_all = true; return *this; + } + FitStrategyAdjustParameters& release_all() { + m_release_all = true; return *this; + } + FitStrategyAdjustParameters& fix(std::string parname ) { + m_pars_to_fix.push_back(parname); + return *this; + } + FitStrategyAdjustParameters& release(std::string parname ) { + m_pars_to_release.push_back(parname); + return *this; + } + void setPreserveOriginalValues(bool preserve_values) { + m_preserve_original_values = preserve_values; + } + +protected: + FitStrategyAdjustParameters(const FitStrategyAdjustParameters &other); + + bool m_fix_all; + bool m_release_all; + std::vector<std::string > m_pars_to_fix; + std::vector<std::string > m_pars_to_release; + //! if it's true, strategy will set back values of parameters as they were + //! before minimization round + bool m_preserve_original_values; +}; + + +#endif // FITSTRATEGYADJUSTPARAMETERS_H diff --git a/Fit/FitKernel/inc/FitSuite.h b/Fit/FitKernel/inc/FitSuite.h index 0a44f14ccf96c6f35e1d9e52c77b9f5fd1ae9406..72ebf07fd3e259f62c247ba83b8d58aa8dff493a 100644 --- a/Fit/FitKernel/inc/FitSuite.h +++ b/Fit/FitKernel/inc/FitSuite.h @@ -53,7 +53,8 @@ class BA_CORE_API_ FitSuite : public IObservable void addFitParameter(const std::string& name, double value, const AttLimits& attlim=AttLimits::limitless(), double error=0.0); //! Adds fit strategy - void addFitStrategy(IFitSuiteStrategy *strategy); + void addFitStrategy(IFitStrategy *strategy); + void addFitStrategy(const IFitStrategy &strategy); //! Sets minimizer void setMinimizer(IMinimizer *minimizer) { delete m_minimizer; m_minimizer = minimizer; } diff --git a/Fit/FitKernel/inc/FitSuiteStrategies.h b/Fit/FitKernel/inc/FitSuiteStrategies.h index d03ddb62f14d29b7317b4e51482728a8f9491fc8..01b713289432597ba9caf98869846b21afe24bfa 100644 --- a/Fit/FitKernel/inc/FitSuiteStrategies.h +++ b/Fit/FitKernel/inc/FitSuiteStrategies.h @@ -17,7 +17,7 @@ #define FITSUITESTRATEGIES_H #include "SafePointerVector.h" -#include "IFitSuiteStrategy.h" +#include "IFitStrategy.h" class FitSuite; @@ -28,7 +28,7 @@ class FitSuite; class BA_CORE_API_ FitSuiteStrategies { public: - typedef SafePointerVector<IFitSuiteStrategy > strategies_t; + typedef SafePointerVector<IFitStrategy > strategies_t; typedef strategies_t::iterator iterator; FitSuiteStrategies(); @@ -36,7 +36,7 @@ class BA_CORE_API_ FitSuiteStrategies void init(FitSuite *fit_suite) { m_fit_suite = fit_suite; } - void addStrategy(IFitSuiteStrategy *strategy); + void addStrategy(IFitStrategy *strategy); void minimize(); diff --git a/Fit/FitKernel/inc/IFitStrategy.h b/Fit/FitKernel/inc/IFitStrategy.h new file mode 100644 index 0000000000000000000000000000000000000000..bf59228e274aa02b2452cbaaaf59a92202dbb36d --- /dev/null +++ b/Fit/FitKernel/inc/IFitStrategy.h @@ -0,0 +1,74 @@ +// ************************************************************************** // +// +// BornAgain: simulate and fit scattering at grazing incidence +// +//! @file FitKernel/inc/IFitStrategy.h +//! @brief Defines interface class IFitStrategy +//! +//! @homepage http://apps.jcns.fz-juelich.de/BornAgain +//! @license GNU General Public License v3 or higher (see COPYING) +//! @copyright Forschungszentrum Jülich GmbH 2013 +//! @authors Scientific Computing Group at MLZ Garching +//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke +// +// ************************************************************************** // + +#ifndef IFITSTRATEGY_H +#define IFITSTRATEGY_H + +#include "INamed.h" +#include "Types.h" +#include "OutputData.h" +class FitSuite; + +#include <string> +#include <vector> +#include <map> + + +//! @class IFitStrategy +//! @ingroup fitting_internal +//! @brief Interface to concrete fit strategy. +//! +//! Concrete implementation should manipulate with fit parameters/data +//! and then call minimizer. + +class BA_CORE_API_ IFitStrategy : public INamed +{ +public: + IFitStrategy() : m_fit_suite(0) {} + IFitStrategy(const std::string& name) : INamed(name), m_fit_suite(0) {} + virtual IFitStrategy *clone() const = 0; + + virtual ~IFitStrategy(){} + virtual void init(FitSuite *fit_suite) { m_fit_suite = fit_suite; } + virtual void execute() = 0; +protected: + FitSuite *m_fit_suite; + IFitStrategy(const IFitStrategy &other) : INamed(other) + { + m_fit_suite = other.m_fit_suite; + } + +private: + IFitStrategy& operator=(const IFitStrategy& ); + +}; + + +//! @class FitStrategyDefault +//! @ingroup fitting +//! @brief Default fit strategy just let FitSuite to run it's minimization round + +class BA_CORE_API_ FitStrategyDefault : public IFitStrategy +{ + public: + FitStrategyDefault() : IFitStrategy("FitStrategyDefault") { } + virtual IFitStrategy *clone() const { return new FitStrategyDefault(); } + virtual void execute(); +}; + + +#endif // FITSTRATEGY_H + + diff --git a/Fit/FitKernel/inc/IFitSuiteStrategy.h b/Fit/FitKernel/inc/IFitSuiteStrategy.h deleted file mode 100644 index 0ee01764e56016f80216abc1008dcd58f7b8523e..0000000000000000000000000000000000000000 --- a/Fit/FitKernel/inc/IFitSuiteStrategy.h +++ /dev/null @@ -1,194 +0,0 @@ -// ************************************************************************** // -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file FitKernel/inc/IFitSuiteStrategy.h -//! @brief Defines classes IFitSuiteStrategy -//! -//! @homepage http://apps.jcns.fz-juelich.de/BornAgain -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2013 -//! @authors Scientific Computing Group at MLZ Garching -//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke -// -// ************************************************************************** // - -#ifndef FITSUITESTRATEGY_H -#define FITSUITESTRATEGY_H - -#include "INamed.h" -#include "Types.h" -#include "OutputData.h" -class FitSuite; - -#include <string> -#include <vector> -#include <map> - - -//! @class IFitSuiteStrategy -//! @ingroup fitting_internal -//! @brief Interface to concrete fit strategy. -//! -//! Concrete implementation should manipulate with fit parameters/data -//! and then call minimizer. - -class BA_CORE_API_ IFitSuiteStrategy : public INamed -{ - public: - // TODO refactor all strategies (decorator, policies?) to change the way - // of calling FitSuite's minimizer: simple call, clear parameters/matrices - // before the call, no call at all, see FitSuiteStrategyAdjustData - - IFitSuiteStrategy() : m_fit_suite(0) {} - IFitSuiteStrategy(const std::string& name) : INamed(name), m_fit_suite(0) {} - virtual IFitSuiteStrategy *clone() const { - throw NotImplementedException("IFitSuiteStrategy::clone() ->" - " Error! Not implemented"); - } - - virtual ~IFitSuiteStrategy(){} - virtual void init(FitSuite *fit_suite) { m_fit_suite = fit_suite; } - virtual void execute() = 0; - protected: - FitSuite *m_fit_suite; -}; - - -//! @class FitSuiteStrategyDefault -//! @ingroup fitting_internal -//! @brief Default fit strategy just let FitSuite to run it's minimization round - -class BA_CORE_API_ FitSuiteStrategyDefault : public IFitSuiteStrategy -{ - public: - FitSuiteStrategyDefault() : IFitSuiteStrategy("FitSuiteStrategyDefault") { } - virtual void execute(); -}; - - -//! @class FitSuiteStrategyAdjustData -//! @ingroup fitting_internal -//! @brief Strategy modifies data before running minimization round - -class BA_CORE_API_ FitSuiteStrategyAdjustData : public IFitSuiteStrategy -{ - public: - FitSuiteStrategyAdjustData(int power_of_two = 1, - bool preserve_original=true, bool call_minimize=true) - : IFitSuiteStrategy("FitSuiteStrategyAdjustData") - , m_power_of_two(power_of_two) - , m_preserve_original_data(preserve_original) - , m_call_minimize(call_minimize) { } - void setPreserveOriginalData(bool preserve_original) { - m_preserve_original_data = preserve_original; - } - void setCallMinimize(bool call_minimize) { - m_call_minimize = call_minimize; - } - virtual void execute(); - private: - size_t m_power_of_two; - //! if it is true, strategy will restore original data in FitSuite - //! before exiting - bool m_preserve_original_data; - //! if it's true, modify data and then call FitSuite's minimizer, - //! if false - simply modify the data - bool m_call_minimize; -}; - - -//! @class FitSuiteStrategyAdjustParameters -//! @ingroup fitting_internal -//! @brief Strategy which fixes/releases fit parameters and call minimizer - -class BA_CORE_API_ FitSuiteStrategyAdjustParameters : public IFitSuiteStrategy -{ - public: - FitSuiteStrategyAdjustParameters(const std::string& name) - : IFitSuiteStrategy(name) - , m_fix_all(false) - , m_release_all(false) - , m_preserve_original_values(false) { } - FitSuiteStrategyAdjustParameters() - : IFitSuiteStrategy("FitSuiteStrategyAdjustParameters") - , m_fix_all(false) - , m_release_all(false) - , m_preserve_original_values(false) { } - virtual ~FitSuiteStrategyAdjustParameters(){} - virtual void execute(); - FitSuiteStrategyAdjustParameters& fix_all() { - m_fix_all = true; return *this; - } - FitSuiteStrategyAdjustParameters& release_all() { - m_release_all = true; return *this; - } - FitSuiteStrategyAdjustParameters& fix(std::string parname ) { - m_pars_to_fix.push_back(parname); - return *this; - } - FitSuiteStrategyAdjustParameters& release(std::string parname ) { - m_pars_to_release.push_back(parname); - return *this; - } - void setPreserveOriginalValues(bool preserve_values) { - m_preserve_original_values = preserve_values; - } - private: - bool m_fix_all; - bool m_release_all; - std::vector<std::string > m_pars_to_fix; - std::vector<std::string > m_pars_to_release; - //! if it's true, strategy will set back values of parameters as they were - //! before minimization round - bool m_preserve_original_values; -}; - - -//! @class FitSuiteStrategyBootstrap -//! @ingroup fitting_internal -//! @brief Helps minimizer get out of local minima by disturbing real data - -class BA_CORE_API_ FitSuiteStrategyBootstrap : public IFitSuiteStrategy -{ - public: - FitSuiteStrategyBootstrap(int n_iterations = 5) - : IFitSuiteStrategy("FitStrategyBootstrap") - , m_n_iterations(n_iterations) { } - virtual ~FitSuiteStrategyBootstrap(){} - virtual void execute(); - - // to save results of minimization rounds - class FitResult { - public: - int niter; - double chi2_last; - double chi2_noisy; - double chi2_current; - vdouble1d_t param_values; - vdouble1d_t param_values_noisy; - vdouble1d_t param_values_last; - bool takethis; - void clear() - { - niter=-1; - chi2_last=0; - chi2_noisy=0; - chi2_current=0; - param_values.clear(); - param_values_noisy.clear(); - param_values_last.clear(); - } - }; - - //! generate noisy data - OutputData<double> *generateNoisyData(double noise_factor, - const OutputData<double>& source) const; - - private: - int m_n_iterations; -}; - -#endif // FITSTRATEGY_H - - diff --git a/Fit/FitKernel/src/FitStrategyAdjustData.cpp b/Fit/FitKernel/src/FitStrategyAdjustData.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4e696ed96d82aa30a9992c6375aabfc10b142e0 --- /dev/null +++ b/Fit/FitKernel/src/FitStrategyAdjustData.cpp @@ -0,0 +1,65 @@ +#include "FitStrategyAdjustData.h" +#include "FitSuite.h" +#include "OutputDataFunctions.h" +#include "MessageService.h" + + + +FitStrategyAdjustData::FitStrategyAdjustData(const FitStrategyAdjustData &other) + : IFitStrategy(other) + , m_power_of_two(other.m_power_of_two) + , m_preserve_original_data(other.m_preserve_original_data) + , m_call_minimize(other.m_call_minimize) +{ + +} + + +//! adjust (rebin) data before running fit suite minimization round +void FitStrategyAdjustData::execute() +{ + if( !m_fit_suite ) throw NullPointerException("FitStrategyAdjustData::execute() -> FitSuite doesn't exists"); + + // if no data rediction was requested, just call FitSuite's minimization + if( m_power_of_two == 0 ) { + if(m_call_minimize) { + m_fit_suite->minimize(); + } + return; + } + + // adjusting real data for every simulation defined + std::vector<OutputData<double > *> original_data_collection; + for(size_t i_exp = 0; i_exp<m_fit_suite->getFitObjects()->size(); ++i_exp) { + // saving original data + OutputData<double > *orig_data = m_fit_suite->getFitObjects()->getRealData()->clone(); + original_data_collection.push_back(orig_data); + + // create adjusted data which will have doubled (2,4,8,...) bin size + OutputData<double> *adjusted_data = orig_data; + for(size_t i=0; i<m_power_of_two; ++i) { + OutputData<double> *new_data = OutputDataFunctions::doubleBinSize(*adjusted_data); + if(i!=0) { + delete adjusted_data; + } + adjusted_data = new_data; + } + m_fit_suite->getFitObjects()->setRealData(*adjusted_data, i_exp); + delete adjusted_data; + } + + // calling minimization + if(m_call_minimize) { + m_fit_suite->getMinimizer()->clear(); // clear minimizer's parameters and error matrixes + m_fit_suite->minimize(); + } + + // setting back original data + if(m_preserve_original_data) { + msglog(MSG::INFO) << "FitSuiteStrategyAdjustData::execute() -> Returning original data back "; + for(size_t i_exp = 0; i_exp<m_fit_suite->getFitObjects()->size(); ++i_exp) { + m_fit_suite->getFitObjects()->setRealData(*original_data_collection[i_exp], i_exp); + delete original_data_collection[i_exp]; + } + } +} diff --git a/Fit/FitKernel/src/FitStrategyAdjustMinimizer.cpp b/Fit/FitKernel/src/FitStrategyAdjustMinimizer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6ceafc542c4a6423f226ece7023e3dd1bb43826b --- /dev/null +++ b/Fit/FitKernel/src/FitStrategyAdjustMinimizer.cpp @@ -0,0 +1,2 @@ +#include "FitStrategyAdjustMinimizer.h" +#include "FitSuite.h" diff --git a/Fit/FitKernel/src/FitStrategyAdjustParameters.cpp b/Fit/FitKernel/src/FitStrategyAdjustParameters.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d4c385d0ab6601ab67c43a379ed3b1022dbcb9a4 --- /dev/null +++ b/Fit/FitKernel/src/FitStrategyAdjustParameters.cpp @@ -0,0 +1,63 @@ +#include "FitStrategyAdjustParameters.h" +#include "FitSuite.h" +#include "MessageService.h" + + +FitStrategyAdjustParameters::FitStrategyAdjustParameters(const FitStrategyAdjustParameters &other) + : IFitStrategy(other) + , m_fix_all(other.m_fix_all) + , m_release_all(other.m_release_all) + , m_pars_to_fix(other.m_pars_to_fix) + , m_pars_to_release(other.m_pars_to_release) + , m_preserve_original_values(other.m_preserve_original_values) +{ + +} + + +//! strategy which fixes/releases fit parameters and then call minimizer +void FitStrategyAdjustParameters::execute() +{ + if( !m_fit_suite ) throw NullPointerException("FitSuiteStrategyAdjustParameters::execute() -> FitSuite doesn't exists"); + FitSuiteParameters *fitParameters = m_fit_suite->getFitParameters(); + + // fixing all parameters at they current values + if( m_fix_all ) { + for(FitSuiteParameters::iterator it = fitParameters->begin(); it!=fitParameters->end(); ++it) { + (*it)->setFixed(true); + } + } + + // releasing all parameters + if( m_release_all ) { + for(FitSuiteParameters::iterator it = fitParameters->begin(); it!=fitParameters->end(); ++it) { + msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> releasing " << (*it)->getName(); + (*it)->setFixed(false); + } + } + + // fixing dedicated list of fit parameters + for(std::vector<std::string >::iterator it = m_pars_to_fix.begin(); it!= m_pars_to_fix.end(); ++it) { + msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> fixing " << (*it); + fitParameters->getParameter((*it))->setFixed(true); + } + + // releasing dedicated list of fit parameters + for(std::vector<std::string >::iterator it = m_pars_to_release.begin(); it!= m_pars_to_release.end(); ++it) { + msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> releasing " << (*it); + fitParameters->getParameter((*it))->setFixed(false); + } + + // saving original param values + std::vector<double > original_param_values = fitParameters->getValues(); + + // calling minimization + m_fit_suite->minimize(); + + // returning parameters to original values as they were before minimization + if(m_preserve_original_values) { + fitParameters->setValues(original_param_values); + } +} + + diff --git a/Fit/FitKernel/src/FitSuite.cpp b/Fit/FitKernel/src/FitSuite.cpp index 208d87cd34dfe392b78a39edb53634dc4b80e1cb..9bb29627b5e4f5c66810ff634bb3c5a933abfddd 100644 --- a/Fit/FitKernel/src/FitSuite.cpp +++ b/Fit/FitKernel/src/FitSuite.cpp @@ -66,11 +66,17 @@ void FitSuite::addFitParameter(const std::string& name, double value, const AttL } //! Adds fit strategy -void FitSuite::addFitStrategy(IFitSuiteStrategy *strategy) +void FitSuite::addFitStrategy(IFitStrategy *strategy) { m_fit_strategies.addStrategy(strategy); } +void FitSuite::addFitStrategy(const IFitStrategy &strategy) +{ + addFitStrategy(strategy.clone()); +} + + //! link FitMultiParameters with simulation parameters void FitSuite::link_fit_parameters() { @@ -102,16 +108,14 @@ void FitSuite::runFit() // running minimization using strategies m_fit_strategies.minimize(); - // setting parameters to the optimum values found by the minimizer + // setting found values to the parameters (FIXME move to strategies) m_fit_parameters.setValues(m_minimizer->getValueOfVariablesAtMinimum()); + m_fit_parameters.setErrors(m_minimizer->getErrorOfVariables()); // calling observers to let them to get results m_is_last_iteration = true; notifyObservers(); - // setting the error - m_fit_parameters.setErrors(m_minimizer->getErrorOfVariables()); - } diff --git a/Fit/FitKernel/src/FitSuiteStrategies.cpp b/Fit/FitKernel/src/FitSuiteStrategies.cpp index 55c943e01813c54caf3534b7593e0ee37ebb3ad2..69a39c7de9c7181af84387191c622ec0c240f53a 100644 --- a/Fit/FitKernel/src/FitSuiteStrategies.cpp +++ b/Fit/FitKernel/src/FitSuiteStrategies.cpp @@ -33,7 +33,7 @@ void FitSuiteStrategies::clear() m_current_strategy_index = 0; } -void FitSuiteStrategies::addStrategy(IFitSuiteStrategy *strategy) +void FitSuiteStrategies::addStrategy(IFitStrategy *strategy) { assert(m_fit_suite); strategy->init(m_fit_suite); diff --git a/Fit/FitKernel/src/IFitStrategy.cpp b/Fit/FitKernel/src/IFitStrategy.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0c1329bae56dc1a1861a4ce8d245c2582d8a9f93 --- /dev/null +++ b/Fit/FitKernel/src/IFitStrategy.cpp @@ -0,0 +1,12 @@ +#include "IFitStrategy.h" +#include "FitSuite.h" + +void FitStrategyDefault::execute() +{ + if( !m_fit_suite ) throw NullPointerException("FitStrategyDefault::execute() -> FitSuite doesn't exists"); + + // calling minimization + m_fit_suite->minimize(); +} + + diff --git a/Fit/FitKernel/src/IFitSuiteStrategy.cpp b/Fit/FitKernel/src/IFitSuiteStrategy.cpp deleted file mode 100644 index af713618449ec1f68abd9149cd0b900440ce9ec4..0000000000000000000000000000000000000000 --- a/Fit/FitKernel/src/IFitSuiteStrategy.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// ************************************************************************** // -// -// BornAgain: simulate and fit scattering at grazing incidence -// -//! @file FitKernel/src/IFitSuiteStrategy.cpp -//! @brief Implements classes FitSuiteStrategy... -//! -//! @homepage http://apps.jcns.fz-juelich.de/BornAgain -//! @license GNU General Public License v3 or higher (see COPYING) -//! @copyright Forschungszentrum Jülich GmbH 2013 -//! @authors Scientific Computing Group at MLZ Garching -//! @authors C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke -// -// ************************************************************************** // - -#include "IFitSuiteStrategy.h" -#include "FitSuite.h" -#include "FitSuiteParameters.h" -#include "Exceptions.h" -#include "OutputData.h" -#include "Simulation.h" -#include "Simulation.h" -#include "IMinimizer.h" -#include "MathFunctions.h" -#include "OutputDataFunctions.h" -#include "MessageService.h" -#include <iostream> - -//! Default fit strategy just let FitSuite to run it's minimization round -void FitSuiteStrategyDefault::execute() -{ - if( !m_fit_suite ) throw NullPointerException("FitSuiteStrategyDefault::execute() -> FitSuite doesn't exists"); - - // calling minimization - m_fit_suite->minimize(); -} - -//! adjust (rebin) data before running fit suite minimization round -// TODO: refactor this all -void FitSuiteStrategyAdjustData::execute() -{ - if( !m_fit_suite ) throw NullPointerException("FitSuiteStrategyAdjustData::execute() -> FitSuite doesn't exists"); - - // if no data rediction was requested, just call FitSuite's minimization - if( m_power_of_two == 0 ) { - if(m_call_minimize) { - m_fit_suite->minimize(); - } - return; - } - - // adjusting real data for every simulation defined - std::vector<OutputData<double > *> original_data_collection; - for(size_t i_exp = 0; i_exp<m_fit_suite->getFitObjects()->size(); ++i_exp) { - // saving original data - OutputData<double > *orig_data = m_fit_suite->getFitObjects()->getRealData()->clone(); - original_data_collection.push_back(orig_data); - - // create adjusted data which will have doubled (2,4,8,...) bin size - OutputData<double> *adjusted_data = orig_data; - for(size_t i=0; i<m_power_of_two; ++i) { - OutputData<double> *new_data = OutputDataFunctions::doubleBinSize(*adjusted_data); - if(i!=0) { - delete adjusted_data; - } - adjusted_data = new_data; - } - m_fit_suite->getFitObjects()->setRealData(*adjusted_data, i_exp); - delete adjusted_data; - } - - // calling minimization - if(m_call_minimize) { - m_fit_suite->getMinimizer()->clear(); // clear minimizer's parameters and error matrixes - m_fit_suite->minimize(); - } - - // setting back original data - if(m_preserve_original_data) { - msglog(MSG::INFO) << "FitSuiteStrategyAdjustData::execute() -> Returning original data back "; - for(size_t i_exp = 0; i_exp<m_fit_suite->getFitObjects()->size(); ++i_exp) { - m_fit_suite->getFitObjects()->setRealData(*original_data_collection[i_exp], i_exp); - delete original_data_collection[i_exp]; - } - } -} - - -//! strategy which fixes/releases fit parameters and then call minimizer -void FitSuiteStrategyAdjustParameters::execute() -{ - if( !m_fit_suite ) throw NullPointerException("FitSuiteStrategyAdjustParameters::execute() -> FitSuite doesn't exists"); - FitSuiteParameters *fitParameters = m_fit_suite->getFitParameters(); - - // fixing all parameters at they current values - if( m_fix_all ) { - for(FitSuiteParameters::iterator it = fitParameters->begin(); it!=fitParameters->end(); ++it) { - (*it)->setFixed(true); - } - } - - // releasing all parameters - if( m_release_all ) { - for(FitSuiteParameters::iterator it = fitParameters->begin(); it!=fitParameters->end(); ++it) { - msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> releasing " << (*it)->getName(); - (*it)->setFixed(false); - } - } - - // fixing dedicated list of fit parameters - for(std::vector<std::string >::iterator it = m_pars_to_fix.begin(); it!= m_pars_to_fix.end(); ++it) { - msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> fixing " << (*it); - fitParameters->getParameter((*it))->setFixed(true); - } - - // releasing dedicated list of fit parameters - for(std::vector<std::string >::iterator it = m_pars_to_release.begin(); it!= m_pars_to_release.end(); ++it) { - msglog(MSG::DEBUG) << "FitSuiteStrategyAdjustParameters::execute() -> releasing " << (*it); - fitParameters->getParameter((*it))->setFixed(false); - } - - // saving original param values - std::vector<double > original_param_values = fitParameters->getValues(); - - // calling minimization - m_fit_suite->minimize(); - - // returning parameters to original values as they were before minimization - if(m_preserve_original_values) { - fitParameters->setValues(original_param_values); - } -} - -//! Helps minimizer get out of local minima by disturbing real data -void FitSuiteStrategyBootstrap::execute() -{ - (void)m_n_iterations; - throw NotImplementedException("FitSuiteStrategyBootstrap::execute()"); - -// if( !m_fit_suite ) throw NullPointerException("FitSuiteStrategyBootsrap::execute() -> FitSuite doesn't exists"); - -// std::vector<FitResult > fitHistory; - -// // minimizing first time and saving initial parameters -// m_fit_suite->getMinimizer()->clear(); -// m_fit_suite->minimize(); - -// vdouble1d_t param_values = getFitSuiteParameterValues(); -// double chi2_last = m_fit_suite->getMinimizer()->getMinValue(); - -// FitResult fitResult; -// OutputData<double > *orig_data = m_fit_suite->getChiSquaredModule()->getRealData()->clone(); -// for(int i_iter=0; i_iter<m_n_iterations; ++i_iter) { -// OutputData<double > *noisy_data = generateNoisyData(10, *orig_data); - -// fitResult.clear(); -// fitResult.niter = i_iter; -// fitResult.chi2_last = chi2_last; -// fitResult.param_values = param_values; - -// std::cout << "FitSuiteStrategyBootstrap::execute() -> 1.1 Iter: " << i_iter << " chi2_last:" << chi2_last; -// for(size_t i=0; i<param_values.size(); ++i) std::cout << " " << param_values[i]; -// std::cout << std::endl; - -// setFitSuiteParameterValues(param_values); - -// // minimizing noisy data -// m_fit_suite->setRealData(*noisy_data); -// m_fit_suite->getMinimizer()->clear(); -// m_fit_suite->minimize(); -// double chi2_noisy = m_fit_suite->getMinimizer()->getMinValue(); -// std::cout << "FitSuiteStrategyBootstrap::execute() -> 1.2 Iter: " << i_iter << " chi2_noisy:" << chi2_noisy; -// vdouble1d_t param_values_noisy = getFitSuiteParameterValues(); -// for(size_t i=0; i<param_values_noisy.size(); ++i) std::cout << " " << param_values_noisy[i]; -// std::cout << std::endl; - -// // minimizing original data (last parameters will be used as a starting value) -// m_fit_suite->setRealData(*orig_data); -// setFitSuiteParameterValues(param_values_noisy); -// m_fit_suite->getMinimizer()->clear(); -// m_fit_suite->minimize(); -// double chi2_current = m_fit_suite->getMinimizer()->getMinValue(); - -// std::cout << "FitSuiteStrategyBootstrap::execute() -> 1.3 Iter: " << i_iter << " chi2_last:" << chi2_last << " chi2_noisy:" << chi2_noisy << " chi2_current:" << chi2_current; -// vdouble1d_t param_values_last = getFitSuiteParameterValues(); -// for(size_t i=0; i<param_values_last.size(); ++i) std::cout << " " << param_values_last[i]; -// std::cout << std::endl; - -// fitResult.takethis = false; -// if(chi2_current <= chi2_last) { -// param_values = getFitSuiteParameterValues(); -// std::cout << "FitSuiteStrategyBootstrap::execute() -> 1.4 Iter: " << i_iter << " TAKING PARS:"; -// for(size_t i=0; i<param_values.size(); ++i) std::cout << " " << param_values[i]; -// std::cout << std::endl; -// fitResult.takethis = true; - -// } - -// fitResult.chi2_current = chi2_current; -// fitResult.chi2_noisy = chi2_noisy; -// fitResult.param_values_noisy = param_values_noisy; -// fitResult.param_values_last = param_values_last; -// fitHistory.push_back(fitResult); - -// chi2_last = chi2_current; - -// delete noisy_data; -// } - -// std::cout << "FitSuiteStrategyBootstrap::execute() -> Results" << std::endl; -// for(size_t i=0; i<fitHistory.size(); ++i) { -// std::cout << "i:" << i << " niter:" << fitHistory[i].niter << std::endl; -// std::cout << " chi2_last :" << fitHistory[i].chi2_last << " | "; -// for(size_t j=0; j<fitHistory[i].param_values.size(); ++j) std::cout << fitHistory[i].param_values[j] << " "; -// std::cout << std::endl; - -// std::cout << " chi2_noisy :" << fitHistory[i].chi2_noisy << " | "; -// for(size_t j=0; j<fitHistory[i].param_values_noisy.size(); ++j) std::cout << fitHistory[i].param_values_noisy[j] << " "; -// std::cout << std::endl; - -// std::cout << " chi2_current:" << fitHistory[i].chi2_current << " | "; -// for(size_t j=0; j<fitHistory[i].param_values_last.size(); ++j) std::cout << fitHistory[i].param_values_last[j] << " "; -// std::cout << std::endl; -// std::cout << " take this:" << fitHistory[i].takethis << std::endl; -// std::cout << "--------------" << std::endl; -// } - -} - -//! generate noisy data -OutputData<double> *FitSuiteStrategyBootstrap::generateNoisyData(double noise_factor, const OutputData<double>& source) const -{ - OutputData<double> *p_result = source.clone(); - OutputData<double>::iterator it = p_result->begin(); - while (it != p_result->end()) { - double current = *it; - double sigma = noise_factor*std::sqrt(current); - double random = MathFunctions::GenerateNormalRandom(current, sigma); - if (random<0.0) random = 0.0; - *it = random; - ++it; - } - return p_result; -} - - diff --git a/Tests/FunctionalTests/TestPyFit/testfit02.py b/Tests/FunctionalTests/TestPyFit/testfit02.py index 4caee78f393733604839a01b4c7dacaa621bae74..d27b9655bd0cb6e5011eb828fec675bc8711c848 100644 --- a/Tests/FunctionalTests/TestPyFit/testfit02.py +++ b/Tests/FunctionalTests/TestPyFit/testfit02.py @@ -57,7 +57,7 @@ def runTest(): fitSuite.addFitParameter("*SampleBuilder/cylinder_ratio", 0.2, 0.1, AttLimits.fixed()); chiModule = ChiSquaredModule() - chiModule.setChiSquaredFunction( SquaredFunctionWithSystematicError() ) + chiModule.setChiSquaredFunction( SquaredFunctionMeanSquaredError() ) fitSuite.addSimulationAndRealData(simulation, real_data, chiModule) fitSuite.runFit()