Unfit  3.1.1
Data fitting and optimization software
GenericOptimizer.hpp
1 // Unfit: Data fitting and optimization software
2 //
3 // Copyright (C) 2012- Dr Martin Buist & Dr Alberto Corrias
4 // Contacts: martin.buist _at_ nus.edu.sg; alberto _at_ nus.edu.sg
5 //
6 // See the 'Contributors' file for a list of those who have contributed
7 // to this work.
8 //
9 // This program is free software: you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 3 of the License, or
12 // (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program. If not, see <http://www.gnu.org/licenses/>.
21 //
22 #ifndef UNFIT_INCLUDE_GENERICOPTIMIZER_HPP_
23 #define UNFIT_INCLUDE_GENERICOPTIMIZER_HPP_
24 
25 #include <atomic>
26 #include <random>
27 #include <vector>
28 #include "Bounds.hpp"
29 #include "Options.hpp"
30 
31 namespace Unfit
32 {
33 class GenericCostFunction; // Forward declaration, see GenericCostFunction.hpp
34 
42 {
43  public:
49 
55  virtual ~GenericOptimizer();
56 
67  virtual int FindMin(GenericCostFunction &cost_function,
68  std::vector<double> &coordinates) = 0;
69 
74  virtual void Reset() = 0;
75 
81  void ResetGenericOptimizer();
82 
98  virtual double GetCost(std::size_t index = 0) const noexcept;
99 
106  virtual bool GetIsPopulationBased() const noexcept;
107 
114  virtual std::size_t GetNumberOfIterations() const noexcept;
115 
122  virtual std::size_t GetNumberOfFunctionEvaluations() const noexcept;
123 
130  virtual std::vector<std::vector<double>> GetPopulation() const;
131 
148  virtual std::vector<double> GetSolution(std::size_t index = 0) const;
149 
162  virtual void SetPopulation(
163  const std::vector<std::vector<double>> &population);
164 
169 
175 
176  protected:
189  virtual bool CalculateCost(GenericCostFunction &CostFunction,
190  std::vector<double> &x);
191 
204  void GeneratePopulation(GenericCostFunction &CostFunction,
205  std::size_t dimensions);
206 
214  void GenerateRandomEngines();
215 
248  virtual bool IsConverged(const std::vector<double> &best_member,
249  std::size_t truncated_index = 0) const;
250 
257  virtual void PrintInitialOutput(double best_cost) const;
258 
267  virtual void PrintIterationOutput(double best_cost) const;
268 
273  virtual void PrintFinalOutput() const;
274 
280  virtual void SortPopulation() noexcept;
281 
287  std::vector<std::vector<double>> population_;
289  std::vector<std::mt19937> random_engines_;
291  std::atomic<std::size_t> function_evaluations_;
293  std::atomic<std::size_t> iterations_;
296 
297  private:
311  std::vector<double> GeneratePopulationMember(
312  GenericCostFunction &CostFunction,
313  std::vector<std::uniform_real_distribution<double>> &distributions,
314  std::size_t dimensions, std::size_t mem);
315 };
316 
317 } // namespace Unfit
318 
319 #endif
320 
void GenerateRandomEngines()
Definition: GenericOptimizer.cpp:172
bool is_population_based_
Definition: GenericOptimizer.hpp:295
virtual bool IsConverged(const std::vector< double > &best_member, std::size_t truncated_index=0) const
Checks to see if the population has converged.
Definition: GenericOptimizer.cpp:184
void GeneratePopulation(GenericCostFunction &CostFunction, std::size_t dimensions)
Definition: GenericOptimizer.cpp:127
STL namespace.
Definition: GenericOptimizer.hpp:41
Definition: Bounds.hpp:27
std::atomic< std::size_t > function_evaluations_
Definition: GenericOptimizer.hpp:291
virtual std::size_t GetNumberOfFunctionEvaluations() const noexcept
Definition: GenericOptimizer.cpp:77
virtual void Reset()=0
std::atomic< std::size_t > iterations_
Definition: GenericOptimizer.hpp:293
virtual void PrintFinalOutput() const
Definition: GenericOptimizer.cpp:259
std::vector< std::vector< double > > population_
Definition: GenericOptimizer.hpp:287
void ResetGenericOptimizer()
Definition: GenericOptimizer.cpp:50
Unfit::Bounds bounds
Definition: GenericOptimizer.hpp:168
virtual void SetPopulation(const std::vector< std::vector< double >> &population)
Definition: GenericOptimizer.cpp:97
Definition: GenericCostFunction.hpp:36
virtual void SortPopulation() noexcept
Definition: GenericOptimizer.cpp:284
Unfit::Options options
Definition: GenericOptimizer.hpp:174
virtual double GetCost(std::size_t index=0) const noexcept
Definition: GenericOptimizer.cpp:61
virtual std::size_t GetNumberOfIterations() const noexcept
Definition: GenericOptimizer.cpp:72
virtual void PrintInitialOutput(double best_cost) const
Definition: GenericOptimizer.cpp:230
std::vector< double > GeneratePopulationMember(GenericCostFunction &CostFunction, std::vector< std::uniform_real_distribution< double >> &distributions, std::size_t dimensions, std::size_t mem)
Definition: GenericOptimizer.cpp:292
virtual bool CalculateCost(GenericCostFunction &CostFunction, std::vector< double > &x)
Definition: GenericOptimizer.cpp:105
virtual void PrintIterationOutput(double best_cost) const
Definition: GenericOptimizer.cpp:243
virtual ~GenericOptimizer()
Definition: GenericOptimizer.cpp:47
virtual int FindMin(GenericCostFunction &cost_function, std::vector< double > &coordinates)=0
GenericOptimizer()
Definition: GenericOptimizer.cpp:37
virtual std::vector< double > GetSolution(std::size_t index=0) const
Definition: GenericOptimizer.cpp:87
virtual std::vector< std::vector< double > > GetPopulation() const
Definition: GenericOptimizer.cpp:82
Definition: Bounds.hpp:39
virtual bool GetIsPopulationBased() const noexcept
Definition: GenericOptimizer.cpp:67
Definition: Options.hpp:36
std::vector< std::mt19937 > random_engines_
Definition: GenericOptimizer.hpp:289