Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 # include <admodel.h>
00012 # include <df1b2fun.h>
00013 # include <adrndeff.h>
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00041 dvector laplace_approximation_calculator::local_minimization
00042 (dvector& s,dmatrix& H,dvector& grad,double lambda)
00043 {
00044 dvector vbest(1,usize);
00045 vbest.initialize();
00046
00047 int better_flag=0;
00048 int counter=0;
00049 s.initialize();
00050 s(1)=1.0;
00051 double fbest=evaluate_function_no_derivatives(uhat,pmin);
00052 do
00053 {
00054 dvector v=local_minimization_routine(s,H,grad,lambda);
00055 dvector xx=uhat+v;
00056 double f2=evaluate_function_no_derivatives(xx,pmin);
00057 cout << endl << fbest-f2 << endl;
00058 if(f2<fbest)
00059 {
00060 better_flag=1;
00061 fbest=f2;
00062 lambda*=5.0;
00063 vbest=v;
00064 s=v;
00065 }
00066 else
00067 {
00068 if (better_flag==1)
00069 {
00070
00071 break;
00072 }
00073 else
00074 {
00075
00076 lambda/=5;
00077 s=vbest;
00078 }
00079 }
00080 }
00081 while (counter<20);
00082
00083 if (better_flag==0)
00084 {
00085 cerr << "Error cannot find better value to try and get a"
00086 " positive definite hessian" << endl;
00087 }
00088
00089 return vbest;
00090 }
00091
00096 dvector laplace_approximation_calculator::local_minimization_routine
00097 (dvector& s,dmatrix& H,dvector& grad,double lambda)
00098 {
00099 double f=0.0;
00100 double fb=1.e+100;
00101 dvector g(1,usize);
00102 dvector ub(1,usize);
00103 fmc1.itn=0;
00104 fmc1.ifn=0;
00105 fmc1.ireturn=0;
00106 fmc1.ialph=0;
00107 fmc1.ihang=0;
00108 fmc1.ihflag=0;
00109 fmc1.crit=1.e-12;
00110 long fmsave = fmc1.maxfn;
00111 fmc1.maxfn=1000;;
00112
00113 fmc1.dfn=1.e-2;
00114 while (fmc1.ireturn>=0)
00115 {
00116 fmc1.fmin(f,s,g);
00117 if (fmc1.ireturn>0)
00118 {
00119 double ns=norm(s);
00120 double ns2=square(ns);
00121 dvector v=s/ns;
00122
00123 dvector z=H*v;
00124 double vHv=v*z;
00125
00126 double gradv=grad*v;
00127 f=lambda*gradv+0.5*lambda*lambda*vHv+ square(ns2-1.0);
00128
00129 if (f<fb)
00130 {
00131 fb=f;
00132 ub=s;
00133 }
00134 g=lambda*grad/ns -lambda * gradv*s/ns2
00135 + lambda * lambda * z/ns
00136 - lambda * lambda * vHv*s/ns2 + 4.0*(ns2-1.0)*s;
00137 }
00138 }
00139 s=ub;
00140 cout << " inner maxg = " << fmc1.gmax;
00141
00142 fmc1.maxfn=fmsave;
00143 fmc1.ireturn=0;
00144 fmc1.fbest=fb;
00145 return ub;
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198