proj home

Files   Classes   Functions   Hierarchy  

minpatternsearchorder2.h

Go to the documentation of this file.
00001 #ifndef MINPATTERSEARCHORDER2_H
00002 #define MINPATTERSEARCHORDER2_H
00003 
00004 #include <minexpdim.h>
00005 
00006 
00010 template< typename X >
00011 class minpatternsearchorder2 : public minexpdim<X>
00012 {
00013 public:
00014 
00016   funchistory<X> fh;
00017 
00019   minpatternsearchorder2
00020   (
00021     funcstate<X>& fn_, 
00022     X const h0step=20.0,
00023     uintc indexmax_=500,
00024     boolc mem_=true
00025   );
00026 
00028   virtual void reset();
00030   virtual void operator ++ ();
00031 
00032 
00033 };
00034 
00035 //----------------------------------------------------
00036 //  Implementation
00037 
00038 
00039 template < typename X >  
00040 minpatternsearchorder2<X>::minpatternsearchorder2
00041 (
00042   funcstate<X>& fn_, 
00043   X const h0step,
00044   uintc indexmax_,
00045   boolc mem_
00046 )
00047   : minexpdim<X>(fn_,h0step,indexmax_,mem_),
00048   fh(fn_)
00049 {
00050 }
00051 
00052 template < typename X >
00053 void minpatternsearchorder2<X>::operator ++ ()
00054 {
00055 //cout << "minpatternsearchorder2<X>::operator ++" << endl;
00056   if (!minexpdim<X>::valid)
00057     return;
00058 
00059   if (minexpdim<X>::index > minexpdim<X>::indexmax)
00060   {
00061     minexpdim<X>::valid=false;
00062     return;
00063   }
00064 
00065   assert( fh.xik.size() >= 3 );
00066 
00067   uintc dim = minexpdim<X>::fn->dim;
00068 
00069   // Algorithm on vectors
00070   // X* = 5/2*X[k] -2*X[k-1] + 1/2*X[k-2]
00071   X* XK0 = fh[0];
00072   X* XK1 = fh[1];
00073   X* XK2 = fh[2];
00074 
00075 //cout << "before pattern move" << endl;
00076 //cout << "fmin=" << minexpdim<X>::fmin << " xi[dim]=" << minexpdim<X>::xi[dim] << endl;
00077 
00078 //cout << "fmin=" << minexpdim<X>::fmin << " xi[dim]=" << minexpdim<X>::xi[dim] << endl;
00079   assert(minexpdim<X>::fmin==minexpdim<X>::xi[dim]);
00080 
00081   for (uint i=0; i<dim; ++i)
00082   {
00083     minexpdim<X>::xi[i] = XK0[i]*2.5 + XK1[i]*(-2.0) + XK2[i]*0.5; 
00084   }
00085   // Was the pattern + exploratory move successful
00086   if (minexpdim<X>::moveOrder1())
00087   {
00088     minexpdim<X>::xi[dim] = minexpdim<X>::fmin;
00089     assert(minexpdim<X>::xi[dim]<XK0[dim]);
00090     fh.del_back();
00091     fh.push();
00092   }
00093   else
00094   {
00095     fh.restore();
00096 //cout << "fmin=" << minexpdim<X>::fmin << " xi[dim]=" << minexpdim<X>::xi[dim] << endl;
00097     assert(minexpdim<X>::fmin==minexpdim<X>::xi[dim]);
00098 
00099     bool res=minexpdim<X>::moveOrder1(5); 
00100     assert(res); 
00101     if (res)
00102     {
00103       minexpdim<X>::xi[dim] = minexpdim<X>::fmin;
00104       fh.del_back();
00105       fh.push();
00106     }
00107   }
00108 }
00109 
00110 template < typename X >
00111 void minpatternsearchorder2<X>::reset()
00112 {
00113   minexpdim<X>::reset();
00114 
00115   static uint maxloop=20;
00116   for (uint j=0; j<3; ++j)
00117   {
00118     minexpdim<X>::moveOrder1(maxloop);
00119     assert(minexpdim<X>::hasminimized==true);
00120     fh.push();
00121     minexpdim<X>::hasminimized=false;
00122   }
00123 }
00124 
00125 
00126 #endif
00127 

Generated on Fri Mar 4 00:49:30 2011 for Chelton Evans Source by  doxygen 1.5.8