Files Classes Functions Hierarchy
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
1.5.8