31 #ifndef FLANN_SIMPLEX_DOWNHILL_H_
32 #define FLANN_SIMPLEX_DOWNHILL_H_
44 for (
int i=0; i<n; ++i) {
50 while (j>0 && vals[j]<vals[j-1]) {
51 swap(vals[j],vals[j-1]);
52 for (
int i=0; i<n; ++i) {
68 template <
typename T,
typename F>
71 const int MAX_ITERATIONS = 10;
86 vals =
new float[n+1];
87 for (
int i=0; i<n+1; ++i) {
88 float val = func(
points+i*n);
96 if (iterations++ > MAX_ITERATIONS)
break;
99 for (
int j=0; j<n; ++j) {
101 for (
int i=0; i<n; ++i) {
105 for (
int i=0; i<n; ++i) {
109 bool converged =
true;
110 for (
int i=0; i<n; ++i) {
111 if (p_o[i] !=
points[nn+i]) {
115 if (converged)
break;
118 for (
int i=0; i<n; ++i) {
119 p_r[i] = p_o[i] + alpha*(p_o[i]-
points[nn+i]);
121 float val_r = func(p_r);
123 if ((val_r>=vals[0])&&(val_r<vals[n])) {
135 for (
int i=0; i<n; ++i) {
136 p_e[i] = 2*p_r[i]-p_o[i];
138 float val_e = func(p_e);
150 if (val_r>=vals[n]) {
151 for (
int i=0; i<n; ++i) {
152 p_e[i] = (p_o[i]+
points[nn+i])/2;
154 float val_e = func(p_e);
164 for (
int j=1; j<=n; ++j) {
165 for (
int i=0; i<n; ++i) {
168 float val = func(
points+j*n);
174 float bestVal = vals[0];
179 if (ownVals)
delete[] vals;
static int info(const char *fmt,...)
void swap(optional< T > &x, optional< T > &y) noexcept(noexcept(x.swap(y)))
void addValue(int pos, float val, float *vals, T *point, T *points, int n)
float optimizeSimplexDownhill(T *points, int n, F func, float *vals=NULL)