proj home

Files   Classes   Functions   Hierarchy  

minpatternsearch.h

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

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