Files Classes Functions Hierarchy
#include <lineopgold.h>
Public Types | |
| typedef typeop< EXP >::Tbare::Ttype | T |
| typedef typeop< EXP >::Tref | EXP2 |
| typedef T const | Tconst |
Public Member Functions | |
| lineopgold (EXP2 _exp) | |
| Pass in an explorer. | |
| ~lineopgold () | |
| Cleanup memory. | |
| T const | hlarge () const |
| Find the largest h value and return it as a positive number. | |
| bool const | minimize (T const hstep, uintc kiterations) |
| Minimize about exp.fn.xi in direction di with k iteration. | |
Public Attributes | |
| EXP2 | exp |
| The exploratory mover. | |
| uintc | N |
| T * | di |
| The direction. | |
Protected Member Functions | |
| bool const | verifyti (uintc ai0, uintc ai1, uintc ai2, uintc ai3) const |
Protected Attributes | |
| T * | X0 |
| The original X is saved when minimize is called. | |
| T | X0fmin |
| Save the function value. | |
| T | ti [4] |
| The t values on the line correspond to index positions. | |
| T | fxk [4] |
| The value of the function at the index position. | |
Static Protected Attributes | |
| static T | goldratio = 0.61803398875 |
| The client could assign the golden ratio themselves if needed. | |
Definition at line 13 of file lineopgold.h.
| typedef typeop<EXP>::Tref lineopgold< EXP >::EXP2 |
Definition at line 21 of file lineopgold.h.
| typedef typeop<EXP>::Tbare::Ttype lineopgold< EXP >::T |
Definition at line 20 of file lineopgold.h.
| typedef T const lineopgold< EXP >::Tconst |
Definition at line 23 of file lineopgold.h.
| lineopgold< EXP >::lineopgold | ( | EXP2 | _exp | ) | [inline] |
| lineopgold< EXP >::~lineopgold | ( | ) | [inline] |
Cleanup memory.
Definition at line 188 of file lineopgold.h.
References lineopgold< EXP >::di, and lineopgold< EXP >::X0.
| lineopgold< EXP >::T const lineopgold< EXP >::hlarge | ( | ) | const [inline] |
Find the largest h value and return it as a positive number.
Definition at line 196 of file lineopgold.h.
References lineopgold< EXP >::exp, and lineopgold< EXP >::N.
00197 { 00198 T h = exp.hi[0]; 00199 if (h<0) 00200 h *= -1.0; 00201 T y; 00202 for (uint i=1; i<N; ++i) 00203 { 00204 y = exp.hi[0]; 00205 if (y<0) 00206 y += -1.0; 00207 00208 if (y>h) 00209 h=y; 00210 } 00211 00212 return h; 00213 }
| bool const lineopgold< EXP >::minimize | ( | T const | hstep, | |
| uintc | kiterations | |||
| ) | [inline] |
Minimize about exp.fn.xi in direction di with k iteration.
Definition at line 72 of file lineopgold.h.
References lineopgold< EXP >::di, lineopgold< EXP >::exp, lineopgold< EXP >::fxk, lineopgold< EXP >::goldratio, lineopgold< EXP >::N, lineopgold< EXP >::ti, lineopgold< EXP >::verifyti(), lineopgold< EXP >::X0, and lineopgold< EXP >::X0fmin.
00073 { 00074 assert( kiterations>6); // Make minimization effective, min 4+k function evaluations. 00075 // Save the current state. 00076 uint k; 00077 for ( k=0; k<N; ++k) 00078 X0[k] = exp.xi[k]; 00079 X0fmin = exp.fn.fmin; 00080 00081 // Indexes to vectors. 00082 uint ai0=0; 00083 uint ai1=1; 00084 uint ai2=2; 00085 uint ai3=3; 00086 uint rej; 00087 00088 // these are the 4 points about xi which are being sampled. 00089 T len = goldratio*hstep*2.0; 00090 ti[0] = -hstep; 00091 ti[3] = hstep; 00092 ti[1] = ti[3]-len; 00093 ti[2] = ti[0]+len; 00094 00095 // Evaluate the function at the 4 points. 00096 for ( k=0; k<N; ++k) 00097 exp.xi[k] = X0[k] + di[k]*ti[ai0]; 00098 exp.fn(fxk[ai0]); 00099 00100 for ( k=0; k<N; ++k) 00101 exp.xi[k] = X0[k] + di[k]*ti[ai3]; 00102 exp.fn(fxk[ai3]); 00103 00104 for ( k=0; k<N; ++k) 00105 exp.xi[k] = X0[k] + di[k]*ti[ai1]; 00106 exp.fn(fxk[ai1]); 00107 00108 for ( k=0; k<N; ++k) 00109 exp.xi[k] = X0[k] + di[k]*ti[ai2]; 00110 exp.fn(fxk[ai2]); 00111 00112 // Minimization 00113 for (uint i=0; i<kiterations; ++i) 00114 { 00115 len *= goldratio; 00116 00117 // Test - reject x0 if successful. 00118 if (fxk[ai2]<fxk[ai1]) 00119 { 00120 // Reject x0 00121 rej = ai0; 00122 ai0 = ai1; 00123 ai1 = ai2; 00124 ai2 = rej; 00125 ti[ai2] = ti[ai3]-len; 00126 assert(verifyti(ai0,ai1,ai2,ai3)); 00127 for ( k=0; k<N; ++k) 00128 exp.xi[k] = X0[k] + di[k]*ti[ai2]; 00129 exp.fn(fxk[ai2]); 00130 } 00131 else 00132 { 00133 // Reject x3 00134 rej = ai3; 00135 ai3 = ai2; 00136 ai2 = ai1; 00137 ai1 = rej; 00138 ti[ai1] = ti[ai0]+len; 00139 assert(verifyti(ai0,ai1,ai2,ai3)); 00140 for ( k=0; k<N; ++k) 00141 exp.xi[k] = X0[k] + di[k]*ti[ai1]; 00142 exp.fn(fxk[ai1]); 00143 } 00144 } 00145 00146 // Find the new minimum. 00147 if (fxk[ai1]<fxk[ai2]) 00148 { 00149 if (fxk[ai1]<X0fmin) 00150 { 00151 for ( k=0; k<N; ++k) 00152 exp.xi[k] = X0[k] + di[k]*ti[ai1]; 00153 exp.fmin = fxk[ai1]; 00154 00155 return true; 00156 } 00157 } 00158 else 00159 { 00160 if (fxk[ai2]<X0fmin) 00161 { 00162 for ( k=0; k<N; ++k) 00163 exp.xi[k] = X0[k] + di[k]*ti[ai2]; 00164 exp.fmin = fxk[ai2]; 00165 00166 return true; 00167 } 00168 } 00169 00170 // Restore the original position, no change. 00171 for ( k=0; k<N; ++k) 00172 exp.xi[k] = X0[k]; 00173 exp.fmin = X0fmin; 00174 00175 return false; 00176 }
| bool const lineopgold< EXP >::verifyti | ( | uintc | ai0, | |
| uintc | ai1, | |||
| uintc | ai2, | |||
| uintc | ai3 | |||
| ) | const [inline, protected] |
Definition at line 218 of file lineopgold.h.
References SHOW.
Referenced by lineopgold< EXP >::minimize().
00224 { 00225 bool valid=true; 00226 00227 if ( ti[ai1] < ti[ai0] ) 00228 valid=false; 00229 if ( ti[ai2] < ti[ai0] ) 00230 valid=false; 00231 if ( ti[ai3] < ti[ai0] ) 00232 valid=false; 00233 00234 if ( ti[ai2] < ti[ai1] ) 00235 valid=false; 00236 if ( ti[ai3] < ti[ai1] ) 00237 valid=false; 00238 00239 if ( ti[ai3] < ti[ai2] ) 00240 valid=false; 00241 00242 if (valid==false) 00243 { 00244 cout << "error: ai indexes incorrect" << endl; 00245 cout << SHOW(ai0) << " " << SHOW(ai1) << " "; 00246 cout << SHOW(ai2) << " " << SHOW(ai3) << endl; 00247 00248 cout << SHOW(ti[0]) << " " << SHOW(ti[1]) << " "; 00249 cout << SHOW(ti[2]) << " " << SHOW(ti[3]) << endl; 00250 } 00251 00252 return valid; 00253 }
| T* lineopgold< EXP >::di |
The direction.
Definition at line 31 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize(), and lineopgold< EXP >::~lineopgold().
| EXP2 lineopgold< EXP >::exp |
The exploratory mover.
Definition at line 26 of file lineopgold.h.
Referenced by lineopgold< EXP >::hlarge(), and lineopgold< EXP >::minimize().
T lineopgold< EXP >::fxk[4] [protected] |
The value of the function at the index position.
Definition at line 55 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize().
lineopgold< EXP >::T lineopgold< EXP >::goldratio = 0.61803398875 [inline, static, protected] |
The client could assign the golden ratio themselves if needed.
Definition at line 58 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize().
| uintc lineopgold< EXP >::N |
Definition at line 28 of file lineopgold.h.
Referenced by lineopgold< EXP >::hlarge(), and lineopgold< EXP >::minimize().
T lineopgold< EXP >::ti[4] [protected] |
The t values on the line correspond to index positions.
Definition at line 52 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize().
T* lineopgold< EXP >::X0 [protected] |
The original X is saved when minimize is called.
Definition at line 47 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize(), and lineopgold< EXP >::~lineopgold().
T lineopgold< EXP >::X0fmin [protected] |
Save the function value.
Definition at line 49 of file lineopgold.h.
Referenced by lineopgold< EXP >::minimize().
1.5.8