18 #ifndef PIC_NELDER_MEAD_OPT_BASE_HPP 19 #define PIC_NELDER_MEAD_OPT_BASE_HPP 30 template <
class Scalar>
39 std::vector< std::pair<Scalar, Scalar *> >
simplex;
51 Scalar *vertex_0 =
new Scalar[n];
52 Scalar function_vertex_0;
53 memcpy(vertex_0, x0,
sizeof(Scalar) * n);
54 function_vertex_0 =
function(vertex_0, n);
56 simplex.push_back(std::make_pair(function_vertex_0, vertex_0));
59 for(
unsigned int i = 0; i < n; i++) {
60 Scalar *vertex =
new Scalar[n];
61 memcpy(vertex, x0,
sizeof(Scalar) * n);
63 if(vertex[i] != 0.0f) {
64 vertex[i] += x0[i] *
delta;
69 Scalar function_vertex =
function(vertex, n);
71 simplex.push_back(std::make_pair(function_vertex, vertex));
84 Scalar n_f = Scalar(n);
87 for(
unsigned int i = 0; i < n; i++) {
88 x_mean[i] = Scalar(0);
91 for(
unsigned int j = 0; j < n; j++) {
92 Scalar *vertex =
simplex[j].second;
94 for(
unsigned int i = 0; i < n; i++) {
95 x_mean[i] += vertex[i];
99 for(
unsigned int i = 0; i < n; i++) {
113 Scalar *x_n =
simplex[n].second;
115 for(
unsigned int i = 0; i < n; i++) {
116 x_r[i] = x_mean[i] +
alpha * (x_mean[i] - x_n[i]);
119 return function(x_r, n);
131 Scalar *x_n =
simplex[n].second;
133 for(
unsigned int i = 0; i < n; i++) {
134 x_e[i] = x_mean[i] +
gamma * (x_mean[i] - x_n[i]);
137 return function(x_e, n);
149 Scalar *x_n =
simplex[n].second;
151 for(
unsigned int i = 0; i < n; i++) {
152 x_c[i] = x_mean[i] +
lambda * (x_mean[i] - x_n[i]);
155 return function(x_c, n);
164 Scalar *x_0 =
simplex[0].second;
166 for(
unsigned int i = 1; i < (n + 1); i++) {
168 Scalar *x_i =
simplex[i].second;
170 for(
unsigned int j = 0; j < n ; j++) {
171 x_i[j] = x_0[j] +
sigma * (x_i[j] - x_0[j]);
174 simplex[i].first =
function(x_i, n);
190 Scalar *x_mean =
new Scalar[n];
191 Scalar *x_r =
new Scalar[n];
192 Scalar *x_e =
new Scalar[n];
193 Scalar *x_c =
new Scalar[n];
197 size_t n_size =
sizeof(Scalar) * n;
208 Scalar function_vertex_x_mean =
function(x_mean, n);
210 Scalar err = Scalar(0);
211 for(
unsigned int j = 0; j < n; j++) {
212 Scalar tmp =
simplex[j].first - function_vertex_x_mean;
216 err = sqrt( err / Scalar(n));
224 Scalar err_f = Scalar(0);
225 Scalar err_v = Scalar(0);
227 for(
unsigned int j = 1; j < (n + 1); j++) {
230 for(
unsigned int i = 0; i < n; i++) {
235 if((err_f <= epsilon) && (err_v <= epsilon)) {
243 if((
simplex[0].first <= function_vertex_r) &&
244 (function_vertex_r <
simplex[n - 1].first)) {
246 simplex[n].first = function_vertex_r;
247 memcpy(
simplex[n].second, x_r, n_size);
249 if(function_vertex_r <
simplex[0].first) {
252 if(function_vertex_e < function_vertex_r) {
253 simplex[n].first = function_vertex_e;
254 memcpy(
simplex[n].second, x_e, n_size);
257 simplex[n].first = function_vertex_r;
258 memcpy(
simplex[n].second, x_r, n_size);
264 if(function_vertex_c <
simplex[n].first) {
265 simplex[n].first = function_vertex_c;
266 memcpy(
simplex[n].second, x_c, n_size);
278 printf(
"\nNelder-Mead iterations: %d Err: %f\n", i,
simplex[0].first);
283 memcpy(x,
simplex[0].second, n_size);
312 delta = Scalar(0.05);
328 virtual Scalar
function(Scalar *x,
unsigned int n)
333 virtual Scalar *
run(Scalar *x_start,
unsigned int n, Scalar epsilon = 1e-4f,
int max_iterations = 1000, Scalar *x = NULL)
346 #endif // PIC_NELDER_MEAD_OPT_BASE_HPP Scalar output_error
Definition: nelder_mead_opt_base.hpp:296
Scalar ComputeReflected(Scalar *x_r, Scalar *x_mean, unsigned int n)
ComputeReflected.
Definition: nelder_mead_opt_base.hpp:111
Scalar gamma
Definition: nelder_mead_opt_base.hpp:36
int max_iterations
Definition: nelder_mead_opt_base.hpp:295
Scalar ComputeExpansion(Scalar *x_e, Scalar *x_mean, unsigned int n)
ComputeExpansion.
Definition: nelder_mead_opt_base.hpp:129
std::vector< std::pair< Scalar, Scalar * > > simplex
Definition: nelder_mead_opt_base.hpp:39
void GlobalSettings()
GlobalSettings.
Definition: nelder_mead_opt_base.hpp:309
void ComputeMean(Scalar *x_mean, unsigned int n)
ComputeMean.
Definition: nelder_mead_opt_base.hpp:82
Scalar ComputeContractionInside(Scalar *x_c, Scalar *x_mean, unsigned int n)
ComputeContractionInside.
Definition: nelder_mead_opt_base.hpp:147
NelderMeadOptBase()
NelderMeadOptBase.
Definition: nelder_mead_opt_base.hpp:301
Scalar sigma
Definition: nelder_mead_opt_base.hpp:36
void InitSimplex(Scalar *x0, unsigned int n)
InitSimplex.
Definition: nelder_mead_opt_base.hpp:46
Scalar lambda
Definition: nelder_mead_opt_base.hpp:36
Scalar alpha
Definition: nelder_mead_opt_base.hpp:36
virtual Scalar * run(Scalar *x_start, unsigned int n, Scalar epsilon=1e-4f, int max_iterations=1000, Scalar *x=NULL)
Definition: nelder_mead_opt_base.hpp:333
The NelderMeadOptBase class.
Definition: nelder_mead_opt_base.hpp:31
Scalar * run_aux(Scalar *x_start, unsigned int n, Scalar epsilon, int max_iterations=1000, Scalar *x=NULL)
run_aux
Definition: nelder_mead_opt_base.hpp:186
void ComputeReduction(unsigned int n)
ComputeReduction.
Definition: nelder_mead_opt_base.hpp:162
Scalar delta_zero
Definition: nelder_mead_opt_base.hpp:35
Definition: bilateral_separation.hpp:25
#define MAX(a, b)
Definition: math.hpp:73
bool bStopMean
Definition: nelder_mead_opt_base.hpp:34
Scalar delta
Definition: nelder_mead_opt_base.hpp:35