proj home

Files   Classes   Functions   Hierarchy  

lineoptimizergold< FN, XI, X, T > Class Template Reference

Minimize fn on x0+di*t. More...

#include <lineoptimizergold.h>

Collaboration diagram for lineoptimizergold< FN, XI, X, T >:

List of all members.

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_)
ostreamprint (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.
x0
 Line constant.
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.


Detailed Description

template<typename FN, typename XI, typename X, typename T>
class lineoptimizergold< FN, XI, X, T >

Minimize fn on x0+di*t.

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.

Usage
Construct the optimizer. Realize the initial position x0 and direction in memory.
Call reset(...) before executing the minimizer. This initializes the interval.

You can reuse the optimizer by writing to the direction and initial position and calling reset.

Example
  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.


Constructor & Destructor Documentation

template<typename FN , typename XI , typename X , typename T >
lineoptimizergold< FN, XI, X, T >::lineoptimizergold ( uintc  dim_,
typename typeop< FN >::Tref  fn_,
XI  xi_,
x0_,
di_ 
) [inline]

Definition at line 259 of file lineoptimizergold.h.

00266   : dim(dim_), fn(fn_), xi(xi_), x0(x0_), di(di_)
00267 {
00268 }


Member Function Documentation

template<typename FN, typename XI, typename X, typename T>
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   }

template<typename FN , typename XI , typename X , typename T >
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 }

template<typename FN , typename XI , typename X , typename T >
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 }

template<typename FN , typename XI , typename X , typename T >
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 }

template<typename FN, typename XI, typename X, typename T>
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   }

template<typename FN , typename XI , typename X , typename T >
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 }

template<typename FN , typename XI , typename X , typename T >
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 }


Member Data Documentation

template<typename FN, typename XI, typename X, typename T>
uint lineoptimizergold< FN, XI, X, T >::ai[4]

template<typename FN, typename XI, typename X, typename T>
X lineoptimizergold< FN, XI, X, T >::di

template<typename FN, typename XI, typename X, typename T>
uintc lineoptimizergold< FN, XI, X, T >::dim

template<typename FN, typename XI, typename X, typename T>
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().

template<typename FN, typename XI, typename X, typename T>
T lineoptimizergold< FN, XI, X, T >::fti[4]

template<typename FN, typename XI, typename X, typename T>
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().

template<typename FN, typename XI, typename X, typename T>
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().

template<typename FN, typename XI, typename X, typename T>
T lineoptimizergold< FN, XI, X, T >::ti[4]

template<typename FN, typename XI, typename X, typename T>
X lineoptimizergold< FN, XI, X, T >::x0

template<typename FN, typename XI, typename X, typename T>
XI lineoptimizergold< FN, XI, X, T >::xi


The documentation for this class was generated from the following file:

Generated on Fri Mar 4 00:50:04 2011 for Chelton Evans Source by  doxygen 1.5.8