diff --git a/lib/LatAnalyze/Numerical/CompositeMinimizer.cpp b/lib/LatAnalyze/Numerical/CompositeMinimizer.cpp new file mode 100644 index 0000000..452818a --- /dev/null +++ b/lib/LatAnalyze/Numerical/CompositeMinimizer.cpp @@ -0,0 +1,71 @@ +/* + * CompositeMinimizer.cpp, part of LatAnalyze 3 + * + * Copyright (C) 2013 - 2024 Antonin Portelli + * + * LatAnalyze 3 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LatAnalyze 3 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LatAnalyze 3. If not, see . + */ + +#include +#include +#include "CompositeMinimizer.hpp" + +using namespace std; +using namespace Latan; + +/****************************************************************************** + * CompositeMinimizer implementation * + ******************************************************************************/ +// constructor //////////////////////////////////////////////////////////////// +CompositeMinimizer::CompositeMinimizer(const std::vector &minimizer) +: minVec_(minimizer) +{ + if (minVec_.size() == 0) + { + LATAN_ERROR(Size, "minimizer vector has size 0"); + } +} + +// access ///////////////////////////////////////////////////////////////////// +bool CompositeMinimizer::supportLimits(void) const +{ + return false; +} + +// minimization /////////////////////////////////////////////////////////////// +const DVec &CompositeMinimizer::operator()(const DoubleFunction &f) +{ + DVec &x = getState(); + DVec tmp; + unsigned int i = 1, nMin = minVec_.size(); + + // resize minimizer state to match function number of arguments + if (f.getNArg() != x.size()) + { + resize(f.getNArg()); + } + + for (auto &m: minVec_) + { + if (getVerbosity() >= Verbosity::Normal) + { + cout << "********** Composite minimizer step " << i << "/" << nMin << endl; + } + m->setInit(x); + x = (*m)(f); + i++; + } + + return x; +} diff --git a/lib/LatAnalyze/Numerical/CompositeMinimizer.hpp b/lib/LatAnalyze/Numerical/CompositeMinimizer.hpp new file mode 100644 index 0000000..e5dda04 --- /dev/null +++ b/lib/LatAnalyze/Numerical/CompositeMinimizer.hpp @@ -0,0 +1,68 @@ +/* + * CompositeMinimizer.hpp, part of LatAnalyze 3 + * + * Copyright (C) 2013 - 2024 Antonin Portelli + * + * LatAnalyze 3 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LatAnalyze 3 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LatAnalyze 3. If not, see . + */ + +#ifndef Latan_CompositeMinimizer_hpp_ +#define Latan_CompositeMinimizer_hpp_ + +#include +#include +#include + +BEGIN_LATAN_NAMESPACE + +/****************************************************************************** + * Class for chaining minimizers * + ******************************************************************************/ +class CompositeMinimizer: public Minimizer +{ +public: + // constructors + explicit CompositeMinimizer(const std::vector &minimizer); + template + CompositeMinimizer(Minimizer &min, Ts & ... minimisers); + // destructor + virtual ~CompositeMinimizer(void) = default; + // access + virtual bool supportLimits(void) const; + // minimization + virtual const DVec & operator()(const DoubleFunction &f); +private: + std::vector minVec_; +}; + +/****************************************************************************** + * CompositeMinimizer template implementation * + ******************************************************************************/ +template +CompositeMinimizer::CompositeMinimizer(Minimizer &min, Ts & ... minimisers) +{ + static_assert(static_or::value...>::value, + "model arguments are not compatible with Minimizer"); + + + minVec_ = {&min, &minimisers...}; + if (minVec_.size() == 0) + { + LATAN_ERROR(Size, "minimizer vector has size 0"); + } +} + +END_LATAN_NAMESPACE + +#endif // Latan_CompositeMinimizer_hpp_ diff --git a/lib/source-list.cmake b/lib/source-list.cmake index 2c64aa9..112d138 100644 --- a/lib/source-list.cmake +++ b/lib/source-list.cmake @@ -25,6 +25,7 @@ set(LATAN_HEADERS LatAnalyze/Io/IoObject.hpp LatAnalyze/Io/Xml/tinyxml2.hpp LatAnalyze/Io/XmlReader.hpp + LatAnalyze/Numerical/CompositeMinimizer.hpp LatAnalyze/Numerical/DWT.hpp LatAnalyze/Numerical/DWTFilters.hpp LatAnalyze/Numerical/Derivative.hpp @@ -77,6 +78,7 @@ set(LATAN_SOURCES LatAnalyze/Io/Hdf5File.cpp LatAnalyze/Io/Io.cpp LatAnalyze/Io/XmlReader.cpp + LatAnalyze/Numerical/CompositeMinimizer.cpp LatAnalyze/Numerical/DWT.cpp LatAnalyze/Numerical/DWTFilters.cpp LatAnalyze/Numerical/Derivative.cpp