ADMB Documentation  11.1.1015
 All Classes Files Functions Variables Typedefs Friends Defines
mod_hess.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: mod_hess.cpp 545 2012-07-16 23:22:25Z tamar $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California
00006  */
00007 #if defined(USE_LAPLACE)
00008 #  include <df1b2fun.h>
00009 #else
00010 #  include <admodel.h>
00011 #endif
00012 //#include <parallel.h>
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 // estimate the matrix of second derivatives
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: // master
00051         hess_routine_master();
00052         break;
00053       case 2: // slave
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(); // get the number of active parameters
00072   //if (adjm_ptr) set_labels_for_hess(nvar);
00073   independent_variables x(1,nvar);
00074   initial_params::xinit(x);        // get the initial values into the x vector
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       //if (adjm_ptr) ad_update_hess_stats_report(nvar,i);
00176     }
00177   }
00178   ofs << gradient_structure::Hybrid_bounded_flag;
00179   dvector tscale(1,nvar);   // need to get scale from somewhere
00180   /*int check=*/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(); // get the number of active parameters
00188   independent_variables x(1,nvar);
00189   initial_params::xinit(x);        // get the initial values into the x vector
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   //double eps=.1;
00199   gradient_structure::set_YES_DERIVATIVES();
00200   gbest.fill_seqadd(1.e+50,0.);
00201   uostream ofs("admodel.hes");
00202   //ofstream ofs5("tmphess");
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       sdelta1=x(i)+eps*delta;
00261       useless(sdelta1);
00262       sdelta1-=x(i);
00263       x(i)=xsave+sdelta1;
00264       vf=0.0;
00265       vf=initial_params::reset(dvar_vector(x));
00266       *objective_function_value::pobjfun=0.0;
00267       pre_userfunction();
00268       vf+=*objective_function_value::pobjfun;
00269       vf-=lambda*likeprof_params::likeprofptr[iprof]->variable();
00270       f=value(vf);
00271       gradcalc(nvar,g1);
00272 
00273       x(i)=xsave-eps*delta;
00274       sdelta2=x(i)-eps*delta;
00275       useless(sdelta2);
00276       sdelta2-=x(i);
00277       x(i)=xsave+sdelta2;
00278       vf=0.0;
00279       vf=0.0;
00280       vf=initial_params::reset(dvar_vector(x));
00281       *objective_function_value::pobjfun=0.0;
00282       pre_userfunction();
00283       vf+=*objective_function_value::pobjfun;
00284       vf-=lambda*likeprof_params::likeprofptr[iprof]->variable();
00285       f=value(vf);
00286       gradcalc(nvar,g2);
00287       x(i)=xsave;
00288 
00289       double eps2=eps*eps;
00290       hess2=(g1-g2)/(sdelta1-sdelta2);
00291       hess=(eps2*hess1-hess2) /(eps2-1.);
00292     */
00293       hess=hess1;
00294       ofs << hess;
00295     }
00296   }
00297   gradient_structure::set_NO_DERIVATIVES();
00298 }
00299 /*
00300 void function_minimizer::hess_routine_and_constraint(int iprof)
00301 {
00302   int nvar=initial_params::nvarcalc(); // get the number of active parameters
00303   independent_variables x(1,nvar);
00304   initial_params::xinit(x);        // get the initial values into the x vector
00305   double f;
00306   double delta=1.e-6;
00307   dvector g1(1,nvar);
00308   dvector g2(1,nvar);
00309   dvector gbest(1,nvar);
00310   dvector hess(1,nvar);
00311   dvector hess1(1,nvar);
00312   dvector hess2(1,nvar);
00313   double eps=.1;
00314   gradient_structure::set_YES_DERIVATIVES();
00315   gbest.fill_seqadd(1.e+50,0.);
00316   uostream ofs("admodel.hes");
00317   //ofstream ofs5("tmphess");
00318   ofs << nvar;
00319   {
00320     {
00321       dvariable vf=0.0;
00322       vf=initial_params::reset(dvar_vector(x));
00323       *objective_function_value::pobjfun=0.0;
00324       pre_userfunction();
00325       vf+=*objective_function_value::pobjfun;
00326       f=value(vf);
00327       gradcalc(nvar,g1);
00328     }
00329     double sdelta1;
00330     double sdelta2;
00331 
00332     for (int i=1;i<=nvar;i++)
00333     {
00334       cout << "Estimating row " << i << " out of " << nvar
00335      << " for hessian" << endl;
00336 
00337       double f=0.0;
00338       double xsave=x(i);
00339       sdelta1=x(i)+delta;
00340       useless(sdelta1);
00341       sdelta1-=x(i);
00342       x(i)=xsave+sdelta1;
00343       dvariable vf=0.0;
00344       vf=initial_params::reset(dvar_vector(x));
00345       *objective_function_value::pobjfun=0.0;
00346       pre_userfunction();
00347       vf+=*objective_function_value::pobjfun;
00348       f=value(vf);
00349       gradcalc(nvar,g1);
00350 
00351       sdelta2=x(i)-delta;
00352       useless(sdelta2);
00353       sdelta2-=x(i);
00354       x(i)=xsave+sdelta2;
00355       vf=0.0;
00356       vf=initial_params::reset(dvar_vector(x));
00357       *objective_function_value::pobjfun=0.0;
00358       pre_userfunction();
00359       vf+=*objective_function_value::pobjfun;
00360       f=value(vf);
00361       gradcalc(nvar,g2);
00362       x(i)=xsave;
00363       hess1=(g1-g2)/(sdelta1-sdelta2);
00364 
00365       sdelta1=x(i)+eps*delta;
00366       useless(sdelta1);
00367       sdelta1-=x(i);
00368       x(i)=xsave+sdelta1;
00369       vf=0.0;
00370       vf=initial_params::reset(dvar_vector(x));
00371       *objective_function_value::pobjfun=0.0;
00372       pre_userfunction();
00373       vf+=*objective_function_value::pobjfun;
00374       f=value(vf);
00375       gradcalc(nvar,g1);
00376 
00377       x(i)=xsave-eps*delta;
00378       sdelta2=x(i)-eps*delta;
00379       useless(sdelta2);
00380       sdelta2-=x(i);
00381       x(i)=xsave+sdelta2;
00382       vf=0.0;
00383       vf=0.0;
00384       vf=initial_params::reset(dvar_vector(x));
00385       *objective_function_value::pobjfun=0.0;
00386       pre_userfunction();
00387       vf+=*objective_function_value::pobjfun;
00388       f=value(vf);
00389       gradcalc(nvar,g2);
00390       x(i)=xsave;
00391 
00392       double eps2=eps*eps;
00393       hess2=(g1-g2)/(sdelta1-sdelta2);
00394       hess=(eps2*hess1-hess2) /(eps2-1.);
00395       ofs << hess;
00396     }
00397     // do the hessian for the constraint function
00398     uostream cofs("constrnt.hes");
00399     cofs << nvar;
00400     for (i=1;i<=nvar;i++)
00401     {
00402       cout << "Estimating row " << i << " out of " << nvar
00403      << " for hessian" << endl;
00404 
00405       double f=0.0;
00406       double xsave=x(i);
00407       sdelta1=x(i)+delta;
00408       useless(sdelta1);
00409       sdelta1-=x(i);
00410       x(i)=xsave+sdelta1;
00411       dvariable vf=0.0;
00412       vf=initial_params::reset(dvar_vector(x));
00413       *objective_function_value::pobjfun=0.0;
00414       pre_userfunction();
00415       vf=likeprof_params::likeprofptr[iprof]->variable();
00416       f=value(vf);
00417       gradcalc(nvar,g1);
00418 
00419       sdelta2=x(i)-delta;
00420       useless(sdelta2);
00421       sdelta2-=x(i);
00422       x(i)=xsave+sdelta2;
00423       vf=0.0;
00424       vf=initial_params::reset(dvar_vector(x));
00425       *objective_function_value::pobjfun=0.0;
00426       pre_userfunction();
00427       vf=likeprof_params::likeprofptr[iprof]->variable();
00428       f=value(vf);
00429       gradcalc(nvar,g2);
00430       x(i)=xsave;
00431       hess1=(g1-g2)/(sdelta1-sdelta2);
00432 
00433       sdelta1=x(i)+eps*delta;
00434       useless(sdelta1);
00435       sdelta1-=x(i);
00436       x(i)=xsave+sdelta1;
00437       vf=0.0;
00438       vf=initial_params::reset(dvar_vector(x));
00439       *objective_function_value::pobjfun=0.0;
00440       pre_userfunction();
00441       vf=likeprof_params::likeprofptr[iprof]->variable();
00442       f=value(vf);
00443       gradcalc(nvar,g1);
00444 
00445       x(i)=xsave-eps*delta;
00446       sdelta2=x(i)-eps*delta;
00447       useless(sdelta2);
00448       sdelta2-=x(i);
00449       x(i)=xsave+sdelta2;
00450       vf=0.0;
00451       vf=initial_params::reset(dvar_vector(x));
00452       *objective_function_value::pobjfun=0.0;
00453       pre_userfunction();
00454       vf=likeprof_params::likeprofptr[iprof]->variable();
00455       f=value(vf);
00456       gradcalc(nvar,g2);
00457       x(i)=xsave;
00458 
00459       double eps2=eps*eps;
00460       hess2=(g1-g2)/(sdelta1-sdelta2);
00461       hess=(eps2*hess1-hess2) /(eps2-1.);
00462       cofs << hess;
00463     }
00464   }
00465   gradient_structure::set_NO_DERIVATIVES();
00466 }
00467 */
00468 
00469 // calculate the derivatives of dependent variables with respect to
00470 // the independent variables
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(); // get the number of active parameters
00480   int ndvar=stddev_params::num_stddev_calc();
00481   independent_variables x(1,nvar);
00482   initial_params::xinit(x);        // get the initial values into the x vector
00483   //double f;
00484   //double delta=1.e-7;
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 // symmetrize and invert the hessian
00524 void function_minimizer::hess_inv(void)
00525 {
00526   initial_params::set_inactive_only_random_effects();
00527   int nvar=initial_params::nvarcalc(); // get the number of active parameters
00528   independent_variables x(1,nvar);
00529 
00530   initial_params::xinit(x);        // get the initial values into the x vector
00531   //double f;
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   if (maxerr>1.e-2)
00577   {
00578     cerr << "warning -- hessian aprroximation is poor" << endl;
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))   // we will try to get away from
00649         {                                     // saddle point
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         {                                     // saddle point
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){/*int i=0;*/}
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