00001
00002
00003
00004
00005
00006
00007 #if defined(USE_LAPLACE)
00008 # include <df1b2fun.h>
00009 #else
00010 # include <admodel.h>
00011 #endif
00012
00013
00014 #ifdef __GNUDOS__
00015 #include <gccmanip.h>
00016 #endif
00017
00018 void hess_calcreport(int i,int nvar);
00019 void hess_errorreport(void);
00020 void set_labels_for_hess(int);
00021
00022 class admb_javapointers;
00023 extern admb_javapointers * adjm_ptr;
00024 void useless(const double& sdelta2);
00025
00026 void ad_update_hess_stats_report(int i,int nvar);
00027
00028 void function_minimizer::hess_routine(void)
00029 {
00030 #if defined(USE_LAPLACE)
00031 if (random_effects_flag && lapprox !=0 )
00032 {
00033 hess_routine_random_effects();
00034 }
00035 else
00036 {
00037 #endif
00038 # if !defined(USE_ADPVM)
00039 hess_routine_noparallel();
00040 # else
00041
00042 if (!ad_comm::pvm_manager)
00043 {
00044 hess_routine_noparallel();
00045 }
00046 else
00047 {
00048 switch (ad_comm::pvm_manager->mode)
00049 {
00050 case 1:
00051 hess_routine_master();
00052 break;
00053 case 2:
00054 hess_routine_slave();
00055 break;
00056 default:
00057 cerr << "error illega value for pvm_manager->mode" << endl;
00058 ad_exit(1);
00059 }
00060 cout << "finished hess routine" << endl;
00061 }
00062 # endif
00063 #if defined(USE_LAPLACE)
00064 }
00065 #endif
00066 }
00067
00068 void function_minimizer::hess_routine_noparallel(void)
00069 {
00070
00071 int nvar=initial_params::nvarcalc();
00072
00073 independent_variables x(1,nvar);
00074 initial_params::xinit(x);
00075 double f;
00076 double delta=1.e-5;
00077 dvector g1(1,nvar);
00078 dvector g2(1,nvar);
00079 dvector gbest(1,nvar);
00080 dvector hess(1,nvar);
00081 dvector hess1(1,nvar);
00082 dvector hess2(1,nvar);
00083 double eps=.1;
00084 gradient_structure::set_YES_DERIVATIVES();
00085 gbest.fill_seqadd(1.e+50,0.);
00086
00087 adstring tmpstring="admodel.hes";
00088 if (ad_comm::wd_flag)
00089 tmpstring = ad_comm::adprogram_name + ".hes";
00090 uostream ofs((char*)tmpstring);
00091
00092 ofs << nvar;
00093 {
00094 {
00095 dvariable vf=0.0;
00096 vf=initial_params::reset(dvar_vector(x));
00097 *objective_function_value::pobjfun=0.0;
00098 pre_userfunction();
00099 vf+=*objective_function_value::pobjfun;
00100 f=value(vf);
00101 gradcalc(nvar,g1);
00102 }
00103 double sdelta1;
00104 double sdelta2;
00105 for (int i=1;i<=nvar;i++)
00106 {
00107 #if defined (__SPDLL__)
00108 hess_calcreport(i,nvar);
00109 #else
00110 cout << "Estimating row " << i << " out of " << nvar
00111 << " for hessian" << endl;
00112 #endif
00113
00114 double f=0.0;
00115 double xsave=x(i);
00116 sdelta1=x(i)+delta;
00117 useless(sdelta1);
00118 sdelta1-=x(i);
00119 x(i)=xsave+sdelta1;
00120 dvariable vf=0.0;
00121 vf=initial_params::reset(dvar_vector(x));
00122 *objective_function_value::pobjfun=0.0;
00123 pre_userfunction();
00124 vf+=*objective_function_value::pobjfun;
00125 f=value(vf);
00126 gradcalc(nvar,g1);
00127
00128 sdelta2=x(i)-delta;
00129 useless(sdelta2);
00130 sdelta2-=x(i);
00131 x(i)=xsave+sdelta2;
00132 vf=0.0;
00133 vf=initial_params::reset(dvar_vector(x));
00134 *objective_function_value::pobjfun=0.0;
00135 pre_userfunction();
00136 vf+=*objective_function_value::pobjfun;
00137 f=value(vf);
00138 gradcalc(nvar,g2);
00139 x(i)=xsave;
00140 hess1=(g1-g2)/(sdelta1-sdelta2);
00141
00142 sdelta1=x(i)+eps*delta;
00143 useless(sdelta1);
00144 sdelta1-=x(i);
00145 x(i)=xsave+sdelta1;
00146 vf=0.0;
00147 vf=initial_params::reset(dvar_vector(x));
00148 *objective_function_value::pobjfun=0.0;
00149 pre_userfunction();
00150 vf+=*objective_function_value::pobjfun;
00151 f=value(vf);
00152 gradcalc(nvar,g1);
00153
00154 x(i)=xsave-eps*delta;
00155 sdelta2=x(i)-eps*delta;
00156 useless(sdelta2);
00157 sdelta2-=x(i);
00158 x(i)=xsave+sdelta2;
00159 vf=0.0;
00160 vf=0.0;
00161 vf=initial_params::reset(dvar_vector(x));
00162 *objective_function_value::pobjfun=0.0;
00163 pre_userfunction();
00164 vf+=*objective_function_value::pobjfun;
00165 f=value(vf);
00166 gradcalc(nvar,g2);
00167 x(i)=xsave;
00168
00169 vf=initial_params::reset(dvar_vector(x));
00170 double eps2=eps*eps;
00171 hess2=(g1-g2)/(sdelta1-sdelta2);
00172 hess=(eps2*hess1-hess2) /(eps2-1.);
00173
00174 ofs << hess;
00175
00176 }
00177 }
00178 ofs << gradient_structure::Hybrid_bounded_flag;
00179 dvector tscale(1,nvar);
00180 initial_params::stddev_scale(tscale,x);
00181 ofs << tscale;
00182 }
00183
00184 void function_minimizer::hess_routine_and_constraint(int iprof, const dvector& g,
00185 dvector& fg)
00186 {
00187 int nvar=initial_params::nvarcalc();
00188 independent_variables x(1,nvar);
00189 initial_params::xinit(x);
00190 double f;
00191 double delta=1.e-6;
00192 dvector g1(1,nvar);
00193 dvector g2(1,nvar);
00194 dvector gbest(1,nvar);
00195 dvector hess(1,nvar);
00196 dvector hess1(1,nvar);
00197 dvector hess2(1,nvar);
00198
00199 gradient_structure::set_YES_DERIVATIVES();
00200 gbest.fill_seqadd(1.e+50,0.);
00201 uostream ofs("admodel.hes");
00202
00203 double lambda=fg*g/norm2(g);
00204 cout << fg-lambda*g << endl;
00205 cout << norm(fg-lambda*g) << " " << fg*g/(norm(g)*norm(fg)) << endl;
00206 ofs << nvar;
00207 {
00208 {
00209 dvariable vf=0.0;
00210 vf=initial_params::reset(dvar_vector(x));
00211 *objective_function_value::pobjfun=0.0;
00212 pre_userfunction();
00213 vf+=*objective_function_value::pobjfun;
00214 vf-=lambda*likeprof_params::likeprofptr[iprof]->variable();
00215 f=value(vf);
00216 gradcalc(nvar,g1);
00217 }
00218 double sdelta1;
00219 double sdelta2;
00220
00221 for (int i=1;i<=nvar;i++)
00222 {
00223 #if defined (__SPDLL__)
00224 hess_calcreport(i,nvar);
00225 #else
00226 cout << "Estimating row " << i << " out of " << nvar
00227 << " for hessian" << endl;
00228 #endif
00229
00230 double f=0.0;
00231 double xsave=x(i);
00232 sdelta1=x(i)+delta;
00233 useless(sdelta1);
00234 sdelta1-=x(i);
00235 x(i)=xsave+sdelta1;
00236 dvariable vf=0.0;
00237 vf=initial_params::reset(dvar_vector(x));
00238 *objective_function_value::pobjfun=0.0;
00239 pre_userfunction();
00240 vf+=*objective_function_value::pobjfun;
00241 vf-=lambda*likeprof_params::likeprofptr[iprof]->variable();
00242 f=value(vf);
00243 gradcalc(nvar,g1);
00244
00245 sdelta2=x(i)-delta;
00246 useless(sdelta2);
00247 sdelta2-=x(i);
00248 x(i)=xsave+sdelta2;
00249 vf=0.0;
00250 vf=initial_params::reset(dvar_vector(x));
00251 *objective_function_value::pobjfun=0.0;
00252 pre_userfunction();
00253 vf+=*objective_function_value::pobjfun;
00254 vf-=lambda*likeprof_params::likeprofptr[iprof]->variable();
00255 f=value(vf);
00256 gradcalc(nvar,g2);
00257 x(i)=xsave;
00258 hess1=(g1-g2)/(sdelta1-sdelta2);
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 hess=hess1;
00294 ofs << hess;
00295 }
00296 }
00297 gradient_structure::set_NO_DERIVATIVES();
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472 void function_minimizer::depvars_routine(void)
00473 {
00474 reset_gradient_stack();
00475 dvector ggg(1,1);
00476 gradcalc(0,ggg);
00477 gradient_structure::set_YES_DERIVATIVES();
00478 initial_params::restore_start_phase();
00479 int nvar=initial_params::nvarcalc();
00480 int ndvar=stddev_params::num_stddev_calc();
00481 independent_variables x(1,nvar);
00482 initial_params::xinit(x);
00483
00484
00485 adstring tmpstring="admodel.dep";
00486 if (ad_comm::wd_flag)
00487 tmpstring = ad_comm::adprogram_name + ".dep";
00488 ofstream ofs((char*)tmpstring);
00489 #if defined(USE_LAPLACE)
00490 if (lapprox)
00491 {
00492 lapprox->no_function_component_flag=1;
00493 }
00494 #endif
00495
00496 dvariable vf;
00497 vf=initial_params::reset(dvar_vector(x));
00498 *objective_function_value::pobjfun=0.0;
00499 pre_userfunction();
00500 vf+=*objective_function_value::pobjfun;
00501
00502 ofs << nvar << " " << ndvar << endl;
00503 int i;
00504 for (i=0;i< stddev_params::num_stddev_params;i++)
00505 {
00506 stddev_params::stddevptr[i]->set_dependent_variables();
00507 }
00508 gradient_structure::jacobcalc(nvar,ofs);
00509 for (i=0;i< stddev_params::num_stddev_params;i++)
00510 {
00511 ofs << stddev_params::stddevptr[i]->label() << " ";
00512 ofs << stddev_params::stddevptr[i]->size_count() << endl;
00513 }
00514 #if defined(USE_LAPLACE)
00515 if (lapprox)
00516 {
00517 lapprox->no_function_component_flag=0;
00518 }
00519 #endif
00520 gradient_structure::set_NO_DERIVATIVES();
00521 }
00522
00523
00524 void function_minimizer::hess_inv(void)
00525 {
00526 initial_params::set_inactive_only_random_effects();
00527 int nvar=initial_params::nvarcalc();
00528 independent_variables x(1,nvar);
00529
00530 initial_params::xinit(x);
00531
00532 dmatrix hess(1,nvar,1,nvar);
00533 uistream ifs("admodel.hes");
00534 int file_nvar;
00535 ifs >> file_nvar;
00536 if (nvar !=file_nvar)
00537 {
00538 cerr << "Number of active variables in file mod_hess.rpt is wrong"
00539 << endl;
00540 }
00541
00542 for (int i = 1;i <= nvar; i++)
00543 {
00544 ifs >> hess(i);
00545 if (!ifs)
00546 {
00547 cerr << "Error reading line " << i << " of the hessian"
00548 << " in routine hess_inv()" << endl;
00549 exit(1);
00550 }
00551 }
00552 int hybflag;
00553 ifs >> hybflag;
00554 dvector sscale(1,nvar);
00555 ifs >> sscale;
00556 if (!ifs)
00557 {
00558 cerr << "Error reading sscale"
00559 << " in routine hess_inv()" << endl;
00560 }
00561
00562 double maxerr=0.0;
00563 for (int i = 1;i <= nvar; i++)
00564 {
00565 for (int j=1;j<i;j++)
00566 {
00567 double tmp=(hess(i,j)+hess(j,i))/2.;
00568 double tmp1=fabs(hess(i,j)-hess(j,i));
00569 tmp1/=(1.e-4+fabs(hess(i,j))+fabs(hess(j,i)));
00570 if (tmp1>maxerr) maxerr=tmp1;
00571 hess(i,j)=tmp;
00572 hess(j,i)=tmp;
00573 }
00574 }
00575
00576
00577
00578
00579
00580
00581
00582 for (int i = 1;i <= nvar; i++)
00583 {
00584 int zero_switch=0;
00585 for (int j=1;j<=nvar;j++)
00586 {
00587 if (hess(i,j)!=0.0)
00588 {
00589 zero_switch=1;
00590 }
00591 }
00592 if (!zero_switch)
00593 {
00594 cerr << " Hessian is 0 in row " << i << endl;
00595 cerr << " This means that the derivative if probably identically 0 "
00596 " for this parameter" << endl;
00597 }
00598 }
00599
00600 int ssggnn;
00601 double llss=ln_det(hess,ssggnn);
00602 int on1=0;
00603 useless(llss);
00604 {
00605 ofstream ofs3((char*)(ad_comm::adprogram_name + adstring(".eva")));
00606 {
00607 dvector se=eigenvalues(hess);
00608 ofs3 << setshowpoint() << setw(14) << setprecision(10)
00609 << "unsorted:\t" << se << endl;
00610 se=sort(se);
00611 ofs3 << setshowpoint() << setw(14) << setprecision(10)
00612 << "sorted:\t" << se << endl;
00613 if (se(se.indexmin())<=0.0)
00614 {
00615 #if defined(USE_LAPLACE)
00616 negative_eigenvalue_flag=1;
00617 #endif
00618 cout << "Warning -- Hessian does not appear to be"
00619 " positive definite" << endl;
00620 }
00621 }
00622 int on=0;
00623 ivector negflags(0,hess.indexmax());
00624 int num_negflags=0;
00625 int on2;
00626 {
00627 on=option_match(ad_comm::argc,ad_comm::argv,"-eigvec");
00628 on1=option_match(ad_comm::argc,ad_comm::argv,"-spmin");
00629 on2=option_match(ad_comm::argc,ad_comm::argv,"-cross");
00630 if (on > -1 || on1 >-1 )
00631 {
00632 ofs3 << setshowpoint() << setw(14) << setprecision(10)
00633 << eigenvalues(hess) << endl;
00634 dmatrix ev=trans(eigenvectors(hess));
00635 ofs3 << setshowpoint() << setw(14) << setprecision(10)
00636 << ev << endl;
00637 for (int i=1;i<=ev.indexmax();i++)
00638 {
00639 double lam=ev(i)*hess*ev(i);
00640 ofs3 << setshowpoint() << setw(14) << setprecision(10)
00641 << lam << " " << ev(i)*ev(i) << endl;
00642 if (lam<0.0)
00643 {
00644 num_negflags++;
00645 negflags(num_negflags)=i;
00646 }
00647 }
00648 if ( (on1>-1) && (num_negflags>0))
00649 {
00650 negative_eigenvalue_flag=0;
00651 spminflag=1;
00652 if(negdirections)
00653 {
00654 delete negdirections;
00655 }
00656 negdirections = new dmatrix(1,num_negflags);
00657 for (int i=1;i<=num_negflags;i++)
00658 {
00659 (*negdirections)(i)=ev(negflags(i));
00660 }
00661 }
00662 if (on2>-1)
00663 {
00664 dmatrix cross(1,ev.indexmax(),1,ev.indexmax());
00665 for (int i = 1;i <= ev.indexmax(); i++)
00666 {
00667 for (int j=1;j<=ev.indexmax();j++)
00668 {
00669 cross(i,j)=ev(i)*ev(j);
00670 }
00671 }
00672 ofs3 << endl << " e(i)*e(j) ";
00673 ofs3 << endl << cross << endl;
00674 }
00675 }
00676 }
00677
00678 if (spminflag==0)
00679 {
00680 if (num_negflags==0)
00681 {
00682 hess=inv(hess);
00683 int on=0;
00684 if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-eigvec"))>-1)
00685 {
00686 int i;
00687 ofs3 << "choleski decomp of correlation" << endl;
00688 dmatrix ch=choleski_decomp(hess);
00689 for (i=1;i<=ch.indexmax();i++)
00690 ofs3 << ch(i)/norm(ch(i)) << endl;
00691 ofs3 << "parameterization of choleski decomnp of correlation" << endl;
00692 for (i=1;i<=ch.indexmax();i++)
00693 {
00694 dvector tmp=ch(i)/norm(ch(i));
00695 ofs3 << tmp(1,i)/tmp(i) << endl;
00696 }
00697 }
00698 }
00699 }
00700 }
00701 if (spminflag==0)
00702 {
00703 if (on1<0)
00704 {
00705 for (int i = 1;i <= nvar; i++)
00706 {
00707 if (hess(i,i) <= 0.0)
00708 {
00709 #if defined (__SPDLL__)
00710 hess_errorreport();
00711 #endif
00712 ad_exit(1);
00713 }
00714 }
00715 }
00716 {
00717 adstring tmpstring="admodel.cov";
00718 if (ad_comm::wd_flag)
00719 tmpstring = ad_comm::adprogram_name + ".cov";
00720 uostream ofs((char*)tmpstring);
00721 ofs << nvar << hess;
00722 ofs << gradient_structure::Hybrid_bounded_flag;
00723 ofs << sscale;
00724 }
00725 }
00726 }
00727
00728 void useless(const double& sdelta2){}
00729
00730 #if defined (__SPDLL__)
00731 void hess_calcreport(int i,int nvar)
00732 {
00733 if (ad_printf) (*ad_printf)("Estimating row %d out of %d for hessian\n",i,nvar);
00734 }
00735 void hess_errorreport(void)
00736 {
00737 if (ad_printf) (*ad_printf)("Hessian does not appear to be positive definite\n");
00738 }
00739 #endif
00740
00741