Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include <df1b2fnl.h>
00012 #include <adrndeff.h>
00013 int pool_check_flag=0;
00014
00015
00016 extern int noboundepen_flag;
00017
00022 void laplace_approximation_calculator::do_separable_stuff(void)
00023 {
00024 df1b2variable& ff= *re_objective_function_value::pobjfun;
00025 if (block_diagonal_flag==0)
00026 {
00027 f1b2gradlist->reset();
00028 f1b2gradlist->list.initialize();
00029 f1b2gradlist->list2.initialize();
00030 f1b2gradlist->list3.initialize();
00031 f1b2gradlist->nlist.initialize();
00032 f1b2gradlist->nlist2.initialize();
00033 f1b2gradlist->nlist3.initialize();
00034 funnel_init_var::num_vars=0;
00035 funnel_init_var::num_active_parameters=0;
00036 funnel_init_var::num_inactive_vars=0;
00037 if (funnel_init_var::funnel_constraints_penalty)
00038 {
00039 delete funnel_init_var::funnel_constraints_penalty;
00040 funnel_init_var::funnel_constraints_penalty=0;
00041 }
00042 return;
00043 }
00044 if (funnel_init_var::funnel_constraints_penalty)
00045 {
00046 if (noboundepen_flag==0)
00047 {
00048 ff+=*funnel_init_var::funnel_constraints_penalty;
00049 }
00050 delete funnel_init_var::funnel_constraints_penalty;
00051 funnel_init_var::funnel_constraints_penalty=0;
00052 }
00053
00054
00055
00056
00057 switch (block_diagonal_flag)
00058 {
00059 case 1:
00060 switch(hesstype)
00061 {
00062 case 2:
00063 do_separable_stuff_newton_raphson_block_diagonal(ff);
00064 break;
00065 case 3:
00066 case 4:
00067 do_separable_stuff_newton_raphson_banded(ff);
00068
00069
00070 break;
00071 default:
00072 cerr << "Illegal value for hesstype" << endl;
00073 ad_exit(1);
00074 }
00075 break;
00076 case 2:
00077 switch(hesstype)
00078 {
00079 case 2:
00080 ++separable_calls_counter;
00081 if (saddlepointflag==2)
00082 {
00083 do_separable_stuff_x_u_block_diagonal(ff);
00084 }
00085 else
00086 {
00087 do_separable_stuff_laplace_approximation_block_diagonal(ff);
00088 }
00089 break;
00090 case 3:
00091 case 4:
00092 do_separable_stuff_laplace_approximation_banded(ff);
00093 break;
00094 default:
00095 cerr << "Illegal value for hesstype" << endl;
00096 ad_exit(1);
00097 }
00098 break;
00099 case 3:
00100 switch(hesstype)
00101 {
00102 case 2:
00103 do_separable_stuff_laplace_approximation_importance_sampling_adjoint(ff);
00104 break;
00105 case 3:
00106 case 4:
00107 do_separable_stuff_laplace_approximation_banded_adjoint(ff);
00108 break;
00109 default:
00110 cerr << "Illegal value for hesstype" << endl;
00111 ad_exit(1);
00112 }
00113 break;
00114 case 5:
00115 do_separable_stuff_hessian_type_information();
00116 break;
00117 case 6:
00118 get_block_diagonal_hessian(ff);
00119 break;
00120 default:
00121 cerr << "illegal value for block_diagonal_flag = "
00122 << block_diagonal_flag << endl;
00123 ad_exit(1);
00124 }
00125 df1b2variable::pool=df1b2variable::adpool_vector[0];
00126 df1b2variable::nvar=df1b2variable::pool->nvar;
00127 if (df1b2variable::pool->size<=0)
00128 {
00129 cerr << "this can't happen" << endl;
00130 ad_exit(1);
00131 }
00132 }
00133
00138 void laplace_approximation_calculator::
00139 do_separable_stuff_newton_raphson_block_diagonal(df1b2variable& ff)
00140 {
00141
00142
00143 set_dependent_variable(ff);
00144 df1b2_gradlist::set_no_derivatives();
00145 df1b2variable::passnumber=1;
00146 df1b2_gradcalc1();
00147
00148 init_df1b2vector & locy= *funnel_init_var::py;
00149 imatrix& list=*funnel_init_var::plist;
00150 int num_local_re=0;
00151 int num_fixed_effects=0;
00152
00153 int i;
00154
00155 ivector lre_index(1,funnel_init_var::num_active_parameters);
00156 ivector lfe_index(1,funnel_init_var::num_active_parameters);
00157
00158 for (i=1;i<=funnel_init_var::num_active_parameters;i++)
00159 {
00160 if (list(i,1)>xsize)
00161 {
00162 lre_index(++num_local_re)=i;
00163 }
00164 else if (list(i,1)>0)
00165 {
00166 lfe_index(++num_fixed_effects)=i;
00167 }
00168 }
00169
00170 if (num_local_re > 0)
00171 {
00172
00173
00174
00175
00176
00177
00178 dmatrix local_Hess(1,num_local_re,1,num_local_re);
00179 dvector local_grad(1,num_local_re);
00180
00181
00182
00183 local_Hess.initialize();
00184 int j;
00185
00186 for (i=1;i<=num_local_re;i++)
00187 {
00188 int lrei=lre_index(i);
00189 for (j=1;j<=num_local_re;j++)
00190 {
00191 int lrej=lre_index(j);
00192 int i2=list(lrei,2);
00193 int j2=list(lrej,2);
00194
00195 local_Hess(i,j)+=locy(i2).u_bar[j2-1];
00196 }
00197 }
00198
00199 for (i=1;i<=num_local_re;i++)
00200 {
00201 int lrei=lre_index(i);
00202
00203 int i2=list(lrei,2);
00204
00205
00206 local_grad(i)= ff.u_dot[i2-1];
00207 }
00208
00209
00210 have_bounded_random_effects=0;
00211 if (have_bounded_random_effects)
00212 {
00213
00214 for (i=1;i<=num_local_re;i++)
00215 {
00216 int lrei=lre_index(i);
00217 int i1=list(lrei,1);
00218 for (j=1;j<=num_local_re;j++)
00219 {
00220 int lrej=lre_index(j);
00221 int j1=list(lrej,1);
00222 local_Hess(i,j)*=scale(i1-xsize)*scale(j1-xsize);
00223 }
00224 }
00225
00226 for (i=1;i<=num_local_re;i++)
00227 {
00228 int lrei=lre_index(i);
00229 int i1=list(lrei,1);
00230 local_Hess(i,i)+=local_grad(i)*curv(i1-xsize);
00231 }
00232
00233 for (i=1;i<=num_local_re;i++)
00234 {
00235 int lrei=lre_index(i);
00236 int i1=list(lrei,1);
00237 local_grad(i)*=scale(i1-xsize);
00238 }
00239
00240 }
00241
00242 double mg=max(fabs(local_grad));
00243 if (max_separable_g< mg) max_separable_g=mg;
00244 dvector local_step=-solve(local_Hess,local_grad);
00245
00246 for (i=1;i<=num_local_re;i++)
00247 {
00248 int lrei=lre_index(i);
00249 int i1=list(lrei,1);
00250
00251 step(i1-xsize)=local_step(i);
00252 }
00253 }
00254
00255 f1b2gradlist->reset();
00256 f1b2gradlist->list.initialize();
00257 f1b2gradlist->list2.initialize();
00258 f1b2gradlist->list3.initialize();
00259 f1b2gradlist->nlist.initialize();
00260 f1b2gradlist->nlist2.initialize();
00261 f1b2gradlist->nlist3.initialize();
00262 funnel_init_var::num_vars=0;
00263 funnel_init_var::num_active_parameters=0;
00264 funnel_init_var::num_inactive_vars=0;
00265 }