Files Classes Functions Hierarchy
#include <lineoptimizergold.h>
Public Member Functions | |
| void | fneval (T &fval, T const t) |
| Evaluate the function on the line at t. | |
| lineoptimizergold (uintc dim_, typename typeop< FN >::Tref fn_, XI xi_, X x0_, X di_) | |
| ostream & | print (ostream &os) const |
| Printing the objects state. | |
| void | printstate () const |
| Print out the four consecutive positions and their values. | |
| void | reset (T const t0, T const t1) |
| x0+di*[t0,t1] search interval initialized. | |
| void | operator++ () |
| One iteration of the line minimization algorithm. | |
| bool const | verify () const |
| Make sure the ti[ai[]] are consecutive (monotonic). | |
| T const | minimumrealize () |
| Realize the minimum state by setting xi to the lowest state. | |
Public Attributes | |
| uintc | dim |
| Dimension. | |
| typeop< FN >::Tref | fn |
| The function being minimized. | |
| XI | xi |
| The function state. | |
| X | x0 |
| Line constant. | |
| X | di |
| Direction. | |
| T | ti [4] |
| The t values on the line correspond to index positions. | |
| T | fti [4] |
| The value of the function at the index position. | |
| uint | ai [4] |
| Indexes to vectors. | |
| T | lengthgold |
| Interval length*goldratio. | |
Static Public Attributes | |
| static T | goldratio = 0.61803398875 |
| The client could assign the golden ratio themselves if needed. | |
A linear line minimization algorithm. The golden ratio is used to choose the next best interval point.
The function has been templated as FN. The function state has been templated as XI. The initial position and direction templated with X type.
While XI and X are both N dimensional vectors with elements of the same type they are different types to support complex functions fn. For most applications this generality will not be needed.
You can reuse the optimizer by writing to the direction and initial position and calling reset.
double d1[] = {0.0,1.0,1.0};
double x0[] = {0.0,0.0,0.0};
parab2 fn;
lineoptimizergold<parab2&,double*,double*,double>
opt(3,fn,fn.xi,x0,d1);
opt.reset(0.0,5.0);
for (uint i=0; i<10; ++i)
{
++opt;
opt.printstate();
}
Definition at line 54 of file lineoptimizergold.h.
| lineoptimizergold< FN, XI, X, T >::lineoptimizergold | ( | uintc | dim_, | |
| typename typeop< FN >::Tref | fn_, | |||
| XI | xi_, | |||
| X | x0_, | |||
| X | di_ | |||
| ) | [inline] |
| void lineoptimizergold< FN, XI, X, T >::fneval | ( | T & | fval, | |
| T const | t | |||
| ) | [inline] |
Evaluate the function on the line at t.
Definition at line 86 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::di, lineoptimizergold< FN, XI, X, T >::dim, lineoptimizergold< FN, XI, X, T >::fn, lineoptimizergold< FN, XI, X, T >::x0, and lineoptimizergold< FN, XI, X, T >::xi.
Referenced by lineoptimizergold< FN, XI, X, T >::operator++(), and lineoptimizergold< FN, XI, X, T >::reset().
00087 { 00088 for (uint i=0; i<dim; ++i) 00089 xi[i] = x0[i]+di[i]*t; 00090 //cout << "***"; 00091 //cout << printvecfunc(xi,dim) << endl; 00092 fn(fval); 00093 }
| T const lineoptimizergold< FN, XI, X, T >::minimumrealize | ( | ) | [inline] |
Realize the minimum state by setting xi to the lowest state.
Definition at line 166 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::di, lineoptimizergold< FN, XI, X, T >::dim, lineoptimizergold< FN, XI, X, T >::fti, lineoptimizergold< FN, XI, X, T >::ti, lineoptimizergold< FN, XI, X, T >::x0, and lineoptimizergold< FN, XI, X, T >::xi.
00167 { 00168 T t = ti[0]; 00169 T f = fti[0]; 00170 for (uint i=1; i<4; ++i) 00171 { 00172 if (fti[i]<f) 00173 { 00174 t = ti[i]; 00175 f = fti[i]; 00176 } 00177 } 00178 00179 for (uint i=0; i<dim; ++i) 00180 xi[i] = x0[i]+di[i]*t; 00181 00182 return f; 00183 }
| void lineoptimizergold< FN, XI, X, T >::operator++ | ( | ) | [inline] |
One iteration of the line minimization algorithm.
Definition at line 219 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::ai, lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::fti, lineoptimizergold< FN, XI, X, T >::goldratio, lineoptimizergold< FN, XI, X, T >::lengthgold, lineoptimizergold< FN, XI, X, T >::ti, and lineoptimizergold< FN, XI, X, T >::verify().
00220 { 00221 lengthgold *= goldratio; 00222 //cout << SHOW(lengthgold) << endl; 00223 00224 // Minimization 00225 uint rej; 00226 00227 //printstate(); 00228 00229 // Test - reject x0 if successful. 00230 if (fti[ai[2]]<fti[ai[1]]) 00231 { 00232 //cout << "Reject x0" << endl; 00233 rej = ai[0]; 00234 ai[0] = ai[1]; 00235 ai[1] = ai[2]; 00236 ai[2] = rej; 00237 ti[ai[2]] = ti[ai[3]]-lengthgold; 00238 //printstate(); 00239 assert(verify()); 00240 fneval(fti[ai[2]],ti[ai[2]]); 00241 } 00242 else 00243 { 00244 //cout << "Reject x3" << endl; 00245 rej = ai[3]; 00246 ai[3] = ai[2]; 00247 ai[2] = ai[1]; 00248 ai[1] = rej; 00249 ti[ai[1]] = ti[ai[0]]+lengthgold; 00250 //printstate(); 00251 assert(verify()); 00252 fneval(fti[ai[1]],ti[ai[1]]); 00253 } 00254 00255 }
| ostream & lineoptimizergold< FN, XI, X, T >::print | ( | ostream & | os | ) | const [inline] |
Printing the objects state.
Definition at line 274 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::ai, lineoptimizergold< FN, XI, X, T >::di, lineoptimizergold< FN, XI, X, T >::dim, lineoptimizergold< FN, XI, X, T >::fti, lineoptimizergold< FN, XI, X, T >::goldratio, SHOW, lineoptimizergold< FN, XI, X, T >::ti, lineoptimizergold< FN, XI, X, T >::x0, and lineoptimizergold< FN, XI, X, T >::xi.
00275 { 00276 os << "dim=" << dim << endl; 00277 //os << "xi[]=" << printvecfunc(xi,dim) << endl; 00278 os << "xi[]=" << print(xi,xi+dim) << endl; 00279 //os << "x0[]=" << printvecfunc(x0,dim) << endl; 00280 os << "x0[]=" << print(x0,x0+dim) << endl; 00281 //os << "di[]=" << printvecfunc(di,dim) << endl; 00282 os << "di[]=" << print(di,di+dim) << endl; 00283 //os << "ti[]=" << printvecfunc(ti,4) << endl; 00284 os << "ti[]=" << print(ti,ti+4) << endl; 00285 //os << "fti[]=" << printvecfunc(fti,4) << endl; 00286 os << "fti[]=" << print(fti,fti+4) << endl; 00287 //os << "ai[]=" << printvecfunc(ai,4) << endl; 00288 os << "ai[]=" << print(ai,ai+4) << endl; 00289 os << SHOW(goldratio) << endl; 00290 00291 return os; 00292 }
| void lineoptimizergold< FN, XI, X, T >::printstate | ( | ) | const [inline] |
Print out the four consecutive positions and their values.
Definition at line 109 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::ai, lineoptimizergold< FN, XI, X, T >::fti, and lineoptimizergold< FN, XI, X, T >::ti.
Referenced by lineoptimizergoldtest01().
00110 { 00111 cout << "ti: "; 00112 for (uint i=0; i<4; ++i) 00113 cout << ti[ai[i]] << " "; 00114 cout << endl; 00115 cout << "fti: "; 00116 for (uint i=0; i<4; ++i) 00117 cout << fti[ai[i]] << " "; 00118 cout << endl; 00119 }
| void lineoptimizergold< FN, XI, X, T >::reset | ( | T const | t0, | |
| T const | t1 | |||
| ) | [inline] |
x0+di*[t0,t1] search interval initialized.
Definition at line 140 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::ai, lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::fti, lineoptimizergold< FN, XI, X, T >::goldratio, lineoptimizergold< FN, XI, X, T >::lengthgold, and lineoptimizergold< FN, XI, X, T >::ti.
Referenced by lineoptimizergoldtest01().
00141 { 00142 assert(t1>t0); 00143 00144 ti[0] = t0; 00145 fneval(fti[0],ti[0]); 00146 //cout << SHOW(fti[0]) << endl; 00147 ti[3] = t1; 00148 fneval(fti[3],ti[3]); 00149 //cout << SHOW(fti[3]) << endl; 00150 00151 lengthgold = goldratio*(t1-t0); 00152 ti[1] = ti[3]-lengthgold; 00153 fneval(fti[1],ti[1]); 00154 ti[2] = ti[0]+lengthgold; 00155 fneval(fti[2],ti[2]); 00156 00157 for (uint i=0; i<4; ++i) 00158 ai[i] = i; 00159 00160 lengthgold *= goldratio; 00161 }
| bool const lineoptimizergold< FN, XI, X, T >::verify | ( | ) | const [inline] |
Make sure the ti[ai[]] are consecutive (monotonic).
Definition at line 186 of file lineoptimizergold.h.
References lineoptimizergold< FN, XI, X, T >::ai, and lineoptimizergold< FN, XI, X, T >::ti.
Referenced by lineoptimizergold< FN, XI, X, T >::operator++().
00187 { 00188 bool valid=true; 00189 00190 if ( ti[ai[1]] < ti[ai[0]] ) 00191 valid=false; 00192 if ( ti[ai[2]] < ti[ai[0]] ) 00193 valid=false; 00194 if ( ti[ai[3]] < ti[ai[0]] ) 00195 valid=false; 00196 00197 if ( ti[ai[2]] < ti[ai[1]] ) 00198 valid=false; 00199 if ( ti[ai[3]] < ti[ai[1]] ) 00200 valid=false; 00201 00202 if ( ti[ai[3]] < ti[ai[2]] ) 00203 valid=false; 00204 00205 if (valid==false) 00206 { 00207 cout << "error: ti invalid" << endl; 00208 for (uint i=0; i<4; ++i) 00209 cout << ti[ai[i]] << " "; 00210 cout << endl; 00211 } 00212 00213 return valid; 00214 }
| uint lineoptimizergold< FN, XI, X, T >::ai[4] |
Indexes to vectors.
Definition at line 77 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::operator++(), lineoptimizergold< FN, XI, X, T >::print(), lineoptimizergold< FN, XI, X, T >::printstate(), lineoptimizergold< FN, XI, X, T >::reset(), and lineoptimizergold< FN, XI, X, T >::verify().
| X lineoptimizergold< FN, XI, X, T >::di |
Direction.
Definition at line 68 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::minimumrealize(), and lineoptimizergold< FN, XI, X, T >::print().
| uintc lineoptimizergold< FN, XI, X, T >::dim |
Dimension.
Definition at line 59 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::minimumrealize(), and lineoptimizergold< FN, XI, X, T >::print().
| typeop<FN>::Tref lineoptimizergold< FN, XI, X, T >::fn |
The function being minimized.
Definition at line 62 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::fneval().
| T lineoptimizergold< FN, XI, X, T >::fti[4] |
The value of the function at the index position.
Definition at line 74 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::minimumrealize(), lineoptimizergold< FN, XI, X, T >::operator++(), lineoptimizergold< FN, XI, X, T >::print(), lineoptimizergold< FN, XI, X, T >::printstate(), and lineoptimizergold< FN, XI, X, T >::reset().
T lineoptimizergold< FN, XI, X, T >::goldratio = 0.61803398875 [inline, static] |
The client could assign the golden ratio themselves if needed.
Definition at line 83 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::operator++(), lineoptimizergold< FN, XI, X, T >::print(), and lineoptimizergold< FN, XI, X, T >::reset().
| T lineoptimizergold< FN, XI, X, T >::lengthgold |
Interval length*goldratio.
Definition at line 80 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::operator++(), and lineoptimizergold< FN, XI, X, T >::reset().
| T lineoptimizergold< FN, XI, X, T >::ti[4] |
The t values on the line correspond to index positions.
Definition at line 71 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::minimumrealize(), lineoptimizergold< FN, XI, X, T >::operator++(), lineoptimizergold< FN, XI, X, T >::print(), lineoptimizergold< FN, XI, X, T >::printstate(), lineoptimizergold< FN, XI, X, T >::reset(), and lineoptimizergold< FN, XI, X, T >::verify().
| X lineoptimizergold< FN, XI, X, T >::x0 |
Line constant.
Definition at line 66 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::minimumrealize(), and lineoptimizergold< FN, XI, X, T >::print().
| XI lineoptimizergold< FN, XI, X, T >::xi |
The function state.
Definition at line 64 of file lineoptimizergold.h.
Referenced by lineoptimizergold< FN, XI, X, T >::fneval(), lineoptimizergold< FN, XI, X, T >::minimumrealize(), and lineoptimizergold< FN, XI, X, T >::print().
1.5.8