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