From cb31d50a1edddf1e7604c5d7997c8ccb6f819095 Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de> Date: Wed, 20 Apr 2016 08:56:06 +0200 Subject: [PATCH] IMinimizer: keep catalogue out of interface --- Fit/FitKernel/MinimizerFactory.cpp | 49 ++++++++++++++++++++++-------- Fit/FitKernel/MinimizerFactory.h | 29 ++++-------------- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/Fit/FitKernel/MinimizerFactory.cpp b/Fit/FitKernel/MinimizerFactory.cpp index 487450e4cca..7d1d479f432 100644 --- a/Fit/FitKernel/MinimizerFactory.cpp +++ b/Fit/FitKernel/MinimizerFactory.cpp @@ -23,12 +23,29 @@ #include "ROOTGeneticMinimizer.h" #include <iomanip> -MinimizerFactory::Catalogue MinimizerFactory::m_catalogue = - MinimizerFactory::Catalogue(); +// ************************************************************************** // +// auxiliary class MinimizerCatalogue +// ************************************************************************** // + +//! @class map of minimizer names holding list of defined algorithms for every minimizer +class MinimizerCatalogue { +public: + typedef std::map<std::string, std::vector<std::string > > catalogue_t; + typedef catalogue_t::const_iterator const_iterator; + MinimizerCatalogue(); + const_iterator begin() const { return m_data.begin(); } + const_iterator end() const { return m_data.end(); } + bool isValid(const std::string& minimizer, const std::string& algorithm) const; + friend std::ostream& operator<<(std::ostream& ostr, const MinimizerCatalogue& m) + { m.print(ostr); return ostr; } +private: + void print(std::ostream& ostr) const; + catalogue_t m_data; +}; // constructing map of minimizer names holding list of defined algorithms // for every minimizer -MinimizerFactory::Catalogue::Catalogue() +MinimizerCatalogue::MinimizerCatalogue() { // our minimizers //m_data["Test"] = {""}; @@ -43,9 +60,9 @@ MinimizerFactory::Catalogue::Catalogue() } -void MinimizerFactory::Catalogue::print(std::ostream& ostr) const +void MinimizerCatalogue::print(std::ostream& ostr) const { - for(MinimizerFactory::Catalogue::const_iterator it=m_data.begin(); it!=m_data.end(); ++it) { + for(MinimizerCatalogue::const_iterator it=m_data.begin(); it!=m_data.end(); ++it) { ostr << std::setw(20) << std::left<< it->first << " : "; for(size_t i=0; i<it->second.size(); ++i ) { ostr << it->second[i] << " "; @@ -56,10 +73,10 @@ void MinimizerFactory::Catalogue::print(std::ostream& ostr) const } -bool MinimizerFactory::Catalogue::isValid(const std::string& minimizer, const std::string& algorithm) const +bool MinimizerCatalogue::isValid(const std::string& minimizer, const std::string& algorithm) const { // check minimizers names - MinimizerFactory::Catalogue::const_iterator it = m_data.find(minimizer); + MinimizerCatalogue::const_iterator it = m_data.find(minimizer); if(it != m_data.end() ) { // check minimizer's algorithm type for(size_t i=0; i<it->second.size(); ++i ) if(it->second[i] == algorithm ) return true; @@ -67,19 +84,25 @@ bool MinimizerFactory::Catalogue::isValid(const std::string& minimizer, const st return false; } +// ************************************************************************** // +// class MinimizerFactory +// ************************************************************************** // + +static MinimizerCatalogue catalogue; + void MinimizerFactory::printCatalogue() { - std::cout << m_catalogue; + std::cout << catalogue; } IMinimizer *MinimizerFactory::createMinimizer(const std::string& minimizer, const std::string& algorithm, const std::string& options) { - if( !m_catalogue.isValid(minimizer, algorithm) ) { + if( !catalogue.isValid(minimizer, algorithm) ) { std::ostringstream ostr; ostr << "MinimizerFactory::MinimizerFactory() -> Error! Wrong minimizer name '" << minimizer << "' or algorithm '" << algorithm << "'" << std::endl; ostr << "Possible names are:" << std::endl; - ostr << m_catalogue; + ostr << catalogue; throw LogicErrorException(ostr.str()); } @@ -126,9 +149,9 @@ IMinimizer *MinimizerFactory::createMinimizer(const std::string& minimizer, cons //! This method serves as a kind of 'shallow' clone for minimizer. //! The reason why the minimizer doesn't have own clone method is because of complicate structure of //! ROOT minimizer internals. -IMinimizer *MinimizerFactory::createMinimizer(const IMinimizer *minimizer) +IMinimizer *MinimizerFactory::createMinimizer(const IMinimizer *other) { - IMinimizer *result = createMinimizer(minimizer->getMinimizerName(), minimizer->getAlgorithmName()); - result->setOptions(*minimizer->getOptions()); + IMinimizer *result = createMinimizer(other->getMinimizerName(), other->getAlgorithmName()); + result->setOptions(*other->getOptions()); return result; } diff --git a/Fit/FitKernel/MinimizerFactory.h b/Fit/FitKernel/MinimizerFactory.h index 5b2eb15d191..4b05c20f6d2 100644 --- a/Fit/FitKernel/MinimizerFactory.h +++ b/Fit/FitKernel/MinimizerFactory.h @@ -29,30 +29,13 @@ class BA_CORE_API_ MinimizerFactory { public: - static IMinimizer *createMinimizer(const std::string& minimizer, const std::string& algorithm = std::string(), const std::string& options=std::string() ); + static IMinimizer *createMinimizer( + const std::string& minimizer, + const std::string& algorithm="", + const std::string& options="" ); static void printCatalogue(); - - //! Create minimizer using existing one. Only minimizer type and minimizer settings are propagated. - static IMinimizer *createMinimizer(const IMinimizer *minimizer); - - private: - - //! @class map of minimizer names holding list of defined algorithms for every minimizer - class Catalogue { - public: - typedef std::map<std::string, std::vector<std::string > > catalogue_t; - typedef catalogue_t::const_iterator const_iterator; - Catalogue(); - const_iterator begin() const { return m_data.begin(); } - const_iterator end() const { return m_data.end(); } - bool isValid(const std::string& minimizer, const std::string& algorithm) const; - friend std::ostream& operator<<(std::ostream& ostr, const Catalogue& m) { m.print(ostr); return ostr; } - private: - void print(std::ostream& ostr) const; - catalogue_t m_data; - }; - - static Catalogue m_catalogue; + //! Returns copy of minimizer type and settings. No full clone, would be too heavy! + static IMinimizer *createMinimizer(const IMinimizer *other); }; #endif // MINIMIZERFACTORY_H -- GitLab