/** * Description not yet available. * \param */ dmatrix laplace_approximation_calculator::get_gradient_for_hessian_calcs (const dmatrix& local_Hess,double & f) { int us=local_Hess.indexmax(); int nvar=us*us; independent_variables cy(1,nvar); cy.initialize(); int ii=1; int i,j; for (i=1;i<=us;i++) for (j=1;j<=us;j++) cy(ii++)=local_Hess(i,j); dvar_vector vy=dvar_vector(cy); dvar_matrix vHess(1,us,1,us); ii=1; for (i=1;i<=us;i++) for (j=1;j<=us;j++) vHess(i,j)=vy(ii++); dvariable vf=0.0; int sgn=0; vf+=0.5*ln_det(vHess,sgn); f=value(vf); dvector g(1,nvar); gradcalc(nvar,g); dmatrix hessadjoint(1,us,1,us); ii=1; for (i=1;i<=us;i++) for (j=1;j<=us;j++) hessadjoint(i,j)=g(ii++); return hessadjoint; }
double function_minimizer::get_monte_carlo_value(int nvar, const dvector& x) { //initial_params::xinit(x); double f=0.0; { dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; userfunction(); vf+=*objective_function_value::pobjfun; f=value(vf); } return f; }
void param_init_vector::allocate( const ad_integer& imin, const ad_integer& imax, const ad_integer& _phase_start, const char* s) { named_dvar_vector::allocate(imin, imax, s); if (!(!(*this))) { initial_params::allocate(_phase_start); if (ad_comm::global_bparfile) { *(ad_comm::global_bparfile) >> dvar_vector(*this); } else if (ad_comm::global_parfile)
/** Calculate the derivatives of dependent variables with respect to the independent variables. */ void function_minimizer::depvars_routine(void) { reset_gradient_stack(); dvector ggg(1,1); gradcalc(0,ggg); gradient_structure::set_YES_DERIVATIVES(); initial_params::restore_start_phase(); int nvar=initial_params::nvarcalc(); // get the number of active parameters int ndvar=stddev_params::num_stddev_calc(); independent_variables x(1,nvar); initial_params::xinit(x); // get the initial values into the x vector //double f; //double delta=1.e-7; adstring tmpstring="admodel.dep"; if (ad_comm::wd_flag) tmpstring = ad_comm::adprogram_name + ".dep"; ofstream ofs((char*)tmpstring); if (lapprox) { lapprox->no_function_component_flag=1; } dvariable vf; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; ofs << nvar << " " << ndvar << endl; int i; for (i=0;i< stddev_params::num_stddev_params;i++) { stddev_params::stddevptr[i]->set_dependent_variables(); } gradient_structure::jacobcalc(nvar,ofs); for (i=0;i< stddev_params::num_stddev_params;i++) { ofs << stddev_params::stddevptr[i]->label() << " "; ofs << stddev_params::stddevptr[i]->size_count() << endl; } if (lapprox) { lapprox->no_function_component_flag=0; } gradient_structure::set_NO_DERIVATIVES(); }
double function_minimizer::pvm_master_get_monte_carlo_value(int nvar, const dvector& x) { double f=0.0; { dvariable vf=0.0; dvar_vector vx=dvar_vector(x); vf=initial_params::reset(vx); send_x_to_slaves(vx); *objective_function_value::pobjfun=0.0; userfunction(); vf+=*objective_function_value::pobjfun; dvar_matrix fslave=get_f_from_slaves(); vf+=sum(fslave); f=value(vf); } return f; }
double function_minimizer::get_monte_carlo_value(int nvar, const independent_variables& x) { //initial_params::xinit(x); double f=0.0; if (mcmc2_flag==0 && lapprox) { dvector g=(*lapprox)(x,f,this); } else { dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; userfunction(); vf+=*objective_function_value::pobjfun; f=value(vf); } return f; }
/** * Description not yet available. * \param */ void function_minimizer::constraints_minimize(void) { //initial_params::read(); // read in the values for the initial parameters if (initial_params::restart_phase) { initial_params::current_phase = initial_params::restart_phase; initial_params::restart_phase=0; } int nopt=0; int on=0; int allphases=initial_params::max_number_phases; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-maxph",nopt))>-1) { if (!nopt) { cerr << "Usage -maxph uerton needs integer -- ignored" << endl; } else { int jj=atoi(ad_comm::argv[on+1]); if (jj<=0) { cerr << "Usage -maxph uerton needs positive integer -- ignored\n."; } else { if (jj>allphases) { allphases=jj; } } } } // set the maximum number of function evaluations by command line if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-maxfn",nopt))>-1) { if (!nopt) { cerr << "Usage -maxph uerton needs integer -- ignored" << endl; } else { int _maxfn=atoi(ad_comm::argv[on+1]); if (_maxfn<=0) { cerr << "Usage -maxfn uerton needs positive integer -- ignored\n"; } else { maxfn=_maxfn; } } } double _crit=0; // set the maximum number of function evaluations by command line if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-crit",nopt))>-1) { if (!nopt) { cerr << "Usage -crit uerton needs number -- ignored" << endl; } else { istrstream ist(ad_comm::argv[on+1]); ist >> _crit; if (_crit<=0) { cerr << "Usage -crit uerton needs positive number -- ignored" << endl; _crit=0.0; } } } if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-phase"))>-1) { int jj=atoi(ad_comm::argv[on+1]); if (jj <=0) { cerr << " Inwwuq4 uerton followinumberv command line uerton -phase -- " << endl << " phase set equal to 1" << endl; } if (jj>allphases) { jj=allphases; } if (jj<=0) { jj=1; } initial_params::current_phase = jj; cout << "Set current phase to " << jj << endl; } while (initial_params::current_phase <= allphases) { between_phases_calculations(); int nvar=initial_params::nvarcalc(); // get the number of active // parameters if (!nvar) { cerr << "Error -- no active parameters. There must be at least 1" << endl; exit(1); } pfm=this; int numberw=0; if (function_minimizer::ph) numberw=function_minimizer::ph->indexmax() -function_minimizer::ph->indexmin()+1; int numberv=0; if (function_minimizer::pg) numberv=function_minimizer::pg->indexmax() -function_minimizer::pg->indexmin()+1; dvector x(1,nvar); initial_params::xinit(x); make_all_classes(nvar,numberw,numberv); constrained_minimization2(nvar,numberw,numberv,x); gradient_structure::set_NO_DERIVATIVES(); initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; userfunction(); initial_params::save(); report(); constraint_report(); // in case the user chanumberves some initial_params in the report section // call reset again initial_params::reset(dvar_vector(x)); // in case the user chanumberves some initial_params in the report section // call reset again initial_params::reset(dvar_vector(x)); report_function_minimizer_stats(); if (quit_flag=='Q') break; if (!quit_flag || quit_flag == 'N') { initial_params::current_phase++; } } if (initial_params::current_phase > initial_params::max_number_phases) { initial_params::current_phase = initial_params::max_number_phases; } }
/** * Description not yet available. * \param */ dvector laplace_approximation_calculator::get_uhat_quasi_newton_block_diagonal (const dvector& x,function_minimizer * pfmin) { if (separable_function_difference) { delete separable_function_difference; separable_function_difference=0; } #ifndef OPT_LIB assert(num_separable_calls > 0); #endif separable_function_difference = new dvector(1,num_separable_calls); fmm** pfmc1 = new pfmm[static_cast<unsigned int>(num_separable_calls)]; pfmc1--; ivector ishape(1,num_separable_calls); dvector gmax(1,num_separable_calls); gmax.initialize(); for (int i=1;i<=num_separable_calls;i++) { int m=(*derindex)(i).indexmax(); ishape(i)=m; if (m>0) { pfmc1[i] = new fmm(m); pfmc1[i]->iprint=0; pfmc1[i]->crit=inner_crit; pfmc1[i]->ireturn=0; pfmc1[i]->itn=0; pfmc1[i]->ifn=0; pfmc1[i]->ialph=0; pfmc1[i]->ihang=0; pfmc1[i]->ihflag=0; pfmc1[i]->maxfn=100; pfmc1[i]->gmax=1.e+100; pfmc1[i]->use_control_c=0; } else { pfmc1[i]= (fmm *)(0); } } dmatrix gg(1,num_separable_calls,1,ishape); dmatrix ggb(1,num_separable_calls,1,ishape); dmatrix uu(1,num_separable_calls,1,ishape); dmatrix uub(1,num_separable_calls,1,ishape); dvector ff(1,num_separable_calls); dvector ffb(1,num_separable_calls); ivector icon(1,num_separable_calls); icon.initialize(); ffb=1.e+100; double f=0.0; double fb=1.e+100; dvector g(1,usize); dvector ub(1,usize); independent_variables u(1,usize); gradcalc(0,g); fmc1.itn=0; fmc1.ifn=0; fmc1.ireturn=0; initial_params::xinit(u); // get the initial values into the fmc1.ialph=0; fmc1.ihang=0; fmc1.ihflag=0; if (init_switch) { u.initialize(); } for (int ii=1;ii<=2;ii++) { // get the initial u into the uu's for (int i=1;i<=num_separable_calls;i++) { int m=(*derindex)(i).indexmax(); for (int j=1;j<=m;j++) { uu(i,j)=u((*derindex)(i)(j)); } } #ifdef DIAG bool loop_flag = false; int loop_counter = 0; #endif fmc1.dfn=1.e-2; dvariable pen=0.0; int converged=0; int initrun_flag=1; while (converged==0) { #ifdef DIAG if (loop_flag) loop_counter++; if (loop_counter > 18) { cout << loop_counter; } #endif if (!initrun_flag) { converged=1; } for (int i=1;i<=num_separable_calls;i++) { if (ishape(i)>0) //check to see if there are any active randoem effects { // in this function call if (!icon(i)) { independent_variables& uuu=*(independent_variables*)(&(uu(i))); (pfmc1[i])->fmin(ff[i],uuu,gg(i)); gmax(i)=fabs(pfmc1[i]->gmax); if (!initrun_flag) { if (gmax(i)<1.e-4 || pfmc1[i]->ireturn<=0) { icon(i)=1; } else { converged=0; } } } } } initrun_flag=0; for (int i2=1;i2<=num_separable_calls;i2++) { int m=(*derindex)(i2).indexmax(); for (int j=1;j<=m;j++) { u((*derindex)(i2)(j))=uu(i2,j); } } // put the //if (fmc1.ireturn>0) { dvariable vf=0.0; pen=initial_params::reset(dvar_vector(u)); *objective_function_value::pobjfun=0.0; //num_separable_calls=0; pmin->inner_opt_flag=1; pfmin->AD_uf_inner(); pmin->inner_opt_flag=0; if (saddlepointflag) { *objective_function_value::pobjfun*=-1.0; } if ( no_stuff==0 && quadratic_prior::get_num_quadratic_prior()>0) { quadratic_prior::get_M_calculations(); } vf+=*objective_function_value::pobjfun; objective_function_value::fun_without_pen=value(vf); vf+=pen; gradcalc(usize,g); for (int i=1;i<=num_separable_calls;i++) { int m=(*derindex)(i).indexmax(); for (int j=1;j<=m;j++) { gg(i,j)=g((*derindex)(i)(j)); } } { ofstream ofs("l:/temp1.dat"); ofs << g.indexmax() << " " << setprecision(15) << g << endl; } if (saddlepointflag==2) { ff[1]=-(*separable_function_difference)(1); for (int i=2;i<=num_separable_calls;i++) { ff[i]=-(*separable_function_difference)(i); //ff[i]=-(*separable_function_difference)(i) // +(*separable_function_difference)(i-1); if (ff[i] < ffb[i]) { ffb[i]=ff[i]; uub[i]=uu[i]; ggb[i]=gg[i]; } } } else { ff[1]=(*separable_function_difference)(1); for (int i=2;i<=num_separable_calls;i++) { ff[i]=(*separable_function_difference)(i); //ff[i]=(*separable_function_difference)(i) // -(*separable_function_difference)(i-1); if (ff[i] < ffb[i]) { ffb[i]=ff[i]; uub[i]=uu[i]; ggb[i]=gg[i]; } } } f=0.0; for (int i2=1;i2<=num_separable_calls;i2++) { f+=ff[i2]; } if (f<fb) { fb=f; ub=u; } } u=ub; } double tmax=max(gmax); cout << " inner maxg = " << tmax << endl; if (tmax< 1.e-4) break; } fmc1.ireturn=0; fmc1.fbest=fb; gradient_structure::set_NO_DERIVATIVES(); //num_separable_calls=0; pmin->inner_opt_flag=1; pfmin->AD_uf_inner(); pmin->inner_opt_flag=0; if ( no_stuff==0 && quadratic_prior::get_num_quadratic_prior()>0) { quadratic_prior::get_M_calculations(); } gradient_structure::set_YES_DERIVATIVES(); for (int i=1;i<=num_separable_calls;i++) { if (pfmc1[i]) { delete pfmc1[i]; } } pfmc1++; delete [] pfmc1; pfmc1 = 0; return u; }
void function_minimizer::hess_routine_master() { int nvar=initial_params::nvarcalc(); // get the number of active parameters //if (adjm_ptr) set_labels_for_hess(nvar); independent_variables x(1,nvar); initial_params::xinit(x); // get the initial values into the x vector double f; double delta=1.e-6; dvector g1(1,nvar); dvector g2(1,nvar); dvector gbest(1,nvar); dvector hess(1,nvar); dvector hess1(1,nvar); dvector hess2(1,nvar); double eps=.1; gradient_structure::set_YES_DERIVATIVES(); gbest.fill_seqadd(1.e+50,0.); adstring tmpstring="admodel.hes"; if (ad_comm::wd_flag) tmpstring = ad_comm::adprogram_name + ".hes"; uostream ofs((char*)tmpstring); ofs << nvar; { pvm_master_function_evaluation(f,x,g1,nvar); double sdelta1; double sdelta2; for (int i=1;i<=nvar;i++) { hess_calcreport(i,nvar); double f=0.0; double xsave=x(i); sdelta1=x(i)+delta; useless(sdelta1); sdelta1-=x(i); x(i)=xsave+sdelta1; pvm_master_function_evaluation(f,x,g1,nvar); sdelta2=x(i)-delta; useless(sdelta2); sdelta2-=x(i); x(i)=xsave+sdelta2; pvm_master_function_evaluation(f,x,g2,nvar); x(i)=xsave; hess1=(g1-g2)/(sdelta1-sdelta2); sdelta1=x(i)+eps*delta; useless(sdelta1); sdelta1-=x(i); x(i)=xsave+sdelta1; pvm_master_function_evaluation(f,x,g1,nvar); x(i)=xsave-eps*delta; sdelta2=x(i)-eps*delta; useless(sdelta2); sdelta2-=x(i); x(i)=xsave+sdelta2; pvm_master_function_evaluation(f,x,g2,nvar); x(i)=xsave; dvariable vf=initial_params::reset(dvar_vector(x)); double eps2=eps*eps; hess2=(g1-g2)/(sdelta1-sdelta2); hess=(eps2*hess1-hess2) /(eps2-1.); ofs << hess; //if (adjm_ptr) ad_update_hess_stats_report(nvar,i); } } gradient_structure::set_NO_DERIVATIVES(); }
void param_stddev_vector::set_dependent_variables(void) { dvar_vector(*this) << dvar_vector(*this); }
void function_minimizer::hess_routine_noparallel(void) { int nvar=initial_params::nvarcalc(); // get the number of active parameters //if (adjm_ptr) set_labels_for_hess(nvar); independent_variables x(1,nvar); initial_params::xinit(x); // get the initial values into the x vector double delta=1.e-5; dvector g1(1,nvar); dvector g2(1,nvar); dvector gbest(1,nvar); dvector hess(1,nvar); dvector hess1(1,nvar); dvector hess2(1,nvar); double eps=.1; gradient_structure::set_YES_DERIVATIVES(); gbest.fill_seqadd(1.e+50,0.); adstring tmpstring="admodel.hes"; if (ad_comm::wd_flag) tmpstring = ad_comm::adprogram_name + ".hes"; uostream ofs((char*)tmpstring); ofs << nvar; { { dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; gradcalc(nvar, g1, vf); } double sdelta1; double sdelta2; for (int i=1;i<=nvar;i++) { hess_calcreport(i,nvar); double xsave=x(i); sdelta1=x(i)+delta; sdelta1-=x(i); x(i)=xsave+sdelta1; dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; gradcalc(nvar, g1, vf); sdelta2=x(i)-delta; sdelta2-=x(i); x(i)=xsave+sdelta2; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; gradcalc(nvar, g2, vf); x(i)=xsave; hess1=(g1-g2)/(sdelta1-sdelta2); sdelta1=x(i)+eps*delta; sdelta1-=x(i); x(i)=xsave+sdelta1; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; gradcalc(nvar, g1, vf); x(i)=xsave-eps*delta; sdelta2=x(i)-eps*delta; sdelta2-=x(i); x(i)=xsave+sdelta2; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; gradcalc(nvar, g2, vf); x(i)=xsave; vf=initial_params::reset(dvar_vector(x)); double eps2=eps*eps; hess2=(g1-g2)/(sdelta1-sdelta2); hess=(eps2*hess1-hess2) /(eps2-1.); ofs << hess; //if (adjm_ptr) ad_update_hess_stats_report(nvar,i); } } ofs << gradient_structure::Hybrid_bounded_flag; dvector tscale(1,nvar); // need to get scale from somewhere /*int check=*/initial_params::stddev_scale(tscale,x); ofs << tscale; }
void function_minimizer::hess_routine_and_constraint(int iprof, const dvector& g, dvector& fg) { int nvar=initial_params::nvarcalc(); // get the number of active parameters independent_variables x(1,nvar); initial_params::xinit(x); // get the initial values into the x vector double delta=1.e-6; dvector g1(1,nvar); dvector g2(1,nvar); dvector gbest(1,nvar); dvector hess(1,nvar); dvector hess1(1,nvar); dvector hess2(1,nvar); //double eps=.1; gradient_structure::set_YES_DERIVATIVES(); gbest.fill_seqadd(1.e+50,0.); uostream ofs("admodel.hes"); //ofstream ofs5("tmphess"); double lambda=fg*g/norm2(g); cout << fg-lambda*g << endl; cout << norm(fg-lambda*g) << " " << fg*g/(norm(g)*norm(fg)) << endl; ofs << nvar; { { dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; vf-=lambda*likeprof_params::likeprofptr[iprof]->variable(); gradcalc(nvar, g1, vf); } double sdelta1; double sdelta2; for (int i=1;i<=nvar;i++) { hess_calcreport(i,nvar); double xsave=x(i); sdelta1=x(i)+delta; sdelta1-=x(i); x(i)=xsave+sdelta1; dvariable vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; vf-=lambda*likeprof_params::likeprofptr[iprof]->variable(); gradcalc(nvar, g1, vf); sdelta2=x(i)-delta; sdelta2-=x(i); x(i)=xsave+sdelta2; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; vf-=lambda*likeprof_params::likeprofptr[iprof]->variable(); gradcalc(nvar, g2, vf); x(i)=xsave; hess1=(g1-g2)/(sdelta1-sdelta2); /* sdelta1=x(i)+eps*delta; sdelta1-=x(i); x(i)=xsave+sdelta1; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; vf-=lambda*likeprof_params::likeprofptr[iprof]->variable(); f=value(vf); gradcalc(nvar,g1); x(i)=xsave-eps*delta; sdelta2=x(i)-eps*delta; sdelta2-=x(i); x(i)=xsave+sdelta2; vf=0.0; vf=0.0; vf=initial_params::reset(dvar_vector(x)); *objective_function_value::pobjfun=0.0; pre_userfunction(); vf+=*objective_function_value::pobjfun; vf-=lambda*likeprof_params::likeprofptr[iprof]->variable(); f=value(vf); gradcalc(nvar,g2); x(i)=xsave; double eps2=eps*eps; hess2=(g1-g2)/(sdelta1-sdelta2); hess=(eps2*hess1-hess2) /(eps2-1.); */ hess=hess1; ofs << hess; } } gradient_structure::set_NO_DERIVATIVES(); }
/** * Description not yet available. * \param */ double do_gauss_hermite_block_diagonal_multi(const dvector& x, const dvector& u0,const dmatrix& Hess,const dvector& _xadjoint, const dvector& _uadjoint,const dmatrix& _Hessadjoint, function_minimizer * pmin) { ADUNCONST(dvector,xadjoint) ADUNCONST(dvector,uadjoint) //ADUNCONST(dmatrix,Hessadjoint) dvector & w= *(pmin->multinomial_weights); const int xs=x.size(); const int us=u0.size(); gradient_structure::set_NO_DERIVATIVES(); int nsc=pmin->lapprox->num_separable_calls; const ivector lrea = (*pmin->lapprox->num_local_re_array)(1,nsc); int hroom = sum(square(lrea)); int nvar=x.size()+u0.size()+hroom; independent_variables y(1,nvar); // need to set random effects active together with whatever // init parameters should be active in this phase initial_params::set_inactive_only_random_effects(); initial_params::set_active_random_effects(); /*int onvar=*/initial_params::nvarcalc(); initial_params::xinit(y); // get the initial values into the // do we need this next line? y(1,xs)=x; int i,j; // contribution for quadratic prior if (quadratic_prior::get_num_quadratic_prior()>0) { //Hess+=quadratic_prior::get_cHessian_contribution(); int & vxs = (int&)(xs); quadratic_prior::get_cHessian_contribution(Hess,vxs); } // Here need hooks for sparse matrix structures dvar3_array & block_diagonal_vhessian= *pmin->lapprox->block_diagonal_vhessian; block_diagonal_vhessian.initialize(); dvar3_array& block_diagonal_ch= *pmin->lapprox->block_diagonal_vch; //dvar3_array(*pmin->lapprox->block_diagonal_ch); int ii=xs+us+1; d3_array& bdH=(*pmin->lapprox->block_diagonal_hessian); int ic; for (ic=1;ic<=nsc;ic++) { int lus=lrea(ic); for (i=1;i<=lus;i++) for (j=1;j<=lus;j++) y(ii++)=bdH(ic)(i,j); } dvector g(1,nvar); gradcalc(0,g); gradient_structure::set_YES_DERIVATIVES(); dvar_vector vy=dvar_vector(y); //initial_params::stddev_vscale(d,vy); ii=xs+us+1; if (initial_df1b2params::have_bounded_random_effects) { cerr << "can't do importance sampling with bounded random effects" " at present" << endl; ad_exit(1); } else { for (int ic=1;ic<=nsc;ic++) { int lus=lrea(ic); if (lus>0) { for (i=1;i<=lus;i++) { for (j=1;j<=lus;j++) { block_diagonal_vhessian(ic,i,j)=vy(ii++); } } block_diagonal_ch(ic)= choleski_decomp(inv(block_diagonal_vhessian(ic))); } } } int nsamp=pmin->lapprox->use_gauss_hermite; pmin->lapprox->in_gauss_hermite_phase=1; dvar_vector sample_value(1,nsamp); sample_value.initialize(); dvar_vector tau(1,us);; // !!! This only works for one random efect in each separable call // at present. if (pmin->lapprox->gh->mi) { delete pmin->lapprox->gh->mi; pmin->lapprox->gh->mi=0; } pmin->lapprox->gh->mi=new multi_index(1,nsamp, pmin->lapprox->multi_random_effects); multi_index & mi = *(pmin->lapprox->gh->mi); //for (int is=1;is<=nsamp;is++) dvector& xx=pmin->lapprox->gh->x; do { int offset=0; pmin->lapprox->num_separable_calls=0; //pmin->lapprox->gh->is=is; for (ic=1;ic<=nsc;ic++) { int lus=lrea(ic); // will need vector stuff here when more than one random effect if (lus>0) { //tau(offset+1,offset+lus).shift(1)=block_diagonal_ch(ic)(1,1)* // pmin->lapprox->gh->x(is); dvector xv(1,lus); for (int iu=1;iu<=lus;iu++) { xv(iu)= xx(mi()(iu)); } tau(offset+1,offset+lus).shift(1)=block_diagonal_ch(ic)*xv; offset+=lus; } } // have to reorder the terms to match the block diagonal hessian imatrix & ls=*(pmin->lapprox->block_diagonal_re_list); int mmin=ls.indexmin(); int mmax=ls.indexmax(); int ii=1; int i; for (i=mmin;i<=mmax;i++) { int cmin=ls(i).indexmin(); int cmax=ls(i).indexmax(); for (int j=cmin;j<=cmax;j++) { vy(ls(i,j))+=tau(ii++); } } if (ii-1 != us) { cerr << "error in interface" << endl; ad_exit(1); } initial_params::reset(vy); // get the values into the model ii=1; for (i=mmin;i<=mmax;i++) { int cmin=ls(i).indexmin(); int cmax=ls(i).indexmax(); for (int j=cmin;j<=cmax;j++) { vy(ls(i,j))-=tau(ii++); } } *objective_function_value::pobjfun=0.0; pmin->AD_uf_outer(); ++mi; } while(mi.get_depth()<=pmin->lapprox->multi_random_effects); nsc=pmin->lapprox->num_separable_calls; dvariable vf=pmin->do_gauss_hermite_integration(); int sgn=0; dvariable ld=0.0; if (ad_comm::no_ln_det_choleski_flag) { for (int ic=1;ic<=nsc;ic++) { if (allocated(block_diagonal_vhessian(ic))) { ld+=w(2*ic)*ln_det(block_diagonal_vhessian(ic),sgn); } } ld*=0.5; } else { for (int ic=1;ic<=nsc;ic++) { if (allocated(block_diagonal_vhessian(ic))) { ld+=w(2*ic)*ln_det_choleski(block_diagonal_vhessian(ic)); } } ld*=0.5; } vf+=ld; //vf+=us*0.91893853320467241; double f=value(vf); gradcalc(nvar,g); // put uhat back into the model gradient_structure::set_NO_DERIVATIVES(); vy(xs+1,xs+us).shift(1)=u0; initial_params::reset(vy); // get the values into the model gradient_structure::set_YES_DERIVATIVES(); pmin->lapprox->in_gauss_hermite_phase=0; ii=1; for (i=1;i<=xs;i++) xadjoint(i)=g(ii++); for (i=1;i<=us;i++) uadjoint(i)=g(ii++); for (ic=1;ic<=nsc;ic++) { int lus=lrea(ic); for (i=1;i<=lus;i++) { for (j=1;j<=lus;j++) { (*pmin->lapprox->block_diagonal_vhessianadjoint)(ic)(i,j)=g(ii++); } } } return f; }
void function_minimizer::pvm_master_mcmc_routine(int nmcmc,int iseed0,double dscale, int restart_flag) { uostream * pofs_psave=NULL; dmatrix mcmc_display_matrix; int mcmc_save_index=1; int mcmc_wrap_flag=0; int mcmc_gui_length=10000; int no_sd_mcmc=0; int on2=-1; if ( (on2=option_match(ad_comm::argc,ad_comm::argv,"-nosdmcmc"))>-1) no_sd_mcmc=1; if (stddev_params::num_stddev_params==0) { cerr << " You must declare at least one object of type sdreport " << endl << " to do the mcmc calculations" << endl; return; } { //ofstream of_bf("testbf"); //if (adjm_ptr) set_labels_for_mcmc(); ivector number_offsets; dvector lkvector; //double current_bf=0; double lcurrent_bf=0; double size_scale=1.0; double total_spread=200; //double total_spread=2500; uostream * pofs_sd = NULL; int nvar=initial_params::nvarcalc(); // get the number of active parameters int scov_option=0; dmatrix s_covar; dvector s_mean; int on=-1; int ncsim=25000; int nslots=800; //int nslots=3600; int initial_nsim=4800; int ntmp=0; int ncor=0; double bfsum=0; int ibfcount=0; double llbest; double lbmax; //if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcscov",ntmp))>-1) //{ scov_option=1; s_covar.allocate(1,nvar,1,nvar); s_mean.allocate(1,nvar); s_mean.initialize(); s_covar.initialize(); int ndvar=stddev_params::num_stddev_calc(); int numdvar=stddev_params::num_stddev_number_calc(); /* if (adjm_ptr) { mcmc_display_matrix.allocate(1,numdvar,1,mcmc_gui_length); number_offsets.allocate(1,numdvar); number_offsets=stddev_params::copy_all_number_offsets(); } */ dvector x(1,nvar); dvector scale(1,nvar); dmatrix values; int have_hist_flag=0; initial_params::xinit(x); dvector pen_vector(1,nvar); { initial_params::reset(dvar_vector(x),pen_vector); cout << pen_vector << endl << endl; } initial_params::mc_phase=0; initial_params::stddev_scale(scale,x); initial_params::mc_phase=1; dvector bmn(1,nvar); dvector mean_mcmc_values(1,ndvar); dvector s(1,ndvar); dvector h(1,ndvar); //dvector h; dvector square_mcmc_values(1,ndvar); square_mcmc_values.initialize(); mean_mcmc_values.initialize(); bmn.initialize(); int use_empirical_flag=0; int diag_option=0; int topt=0; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcdiag"))>-1) { diag_option=1; cout << " Setting covariance matrix to diagonal with entries " << dscale << endl; } dmatrix S(1,nvar,1,nvar); dvector sscale(1,nvar); if (!diag_option) { int on,nopt; int rescale_bounded_flag=0; double rescale_bounded_power=0.5; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcrb",nopt))>-1) { if (nopt) { int iii=atoi(ad_comm::argv[on+1]); if (iii < 1 || iii > 9) { cerr << " -mcrb argument must be integer between 1 and 9 --" " using default of 5" << endl; rescale_bounded_power=0.5; } else rescale_bounded_power=iii/10.0; } else { rescale_bounded_power=0.5; } rescale_bounded_flag=1; } if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcec"))>-1) { use_empirical_flag=1; } if (use_empirical_flag) { read_empirical_covariance_matrix(nvar,S,ad_comm::adprogram_name); } else if (!rescale_bounded_flag) { int tmp; read_covariance_matrix(S,nvar,tmp,sscale); } else { read_hessian_matrix_and_scale1(nvar,S,rescale_bounded_power, mcmc2_flag); //read_hessian_matrix_and_scale(nvar,S,pen_vector); } { // scale covariance matrix for model space dmatrix tmp(1,nvar,1,nvar); for (int i=1;i<=nvar;i++) { tmp(i,i)=S(i,i)*(scale(i)*scale(i)); for (int j=1;j<i;j++) { tmp(i,j)=S(i,j)*(scale(i)*scale(j)); tmp(j,i)=tmp(i,j); } } S=tmp; } } else { S.initialize(); for (int i=1;i<=nvar;i++) { S(i,i)=dscale; } } cout << sort(eigenvalues(S)) << endl; dmatrix chd = choleski_decomp( (dscale*2.4/sqrt(double(nvar))) * S); dmatrix chdinv=inv(chd); int sgn; dmatrix symbds(1,2,1,nvar); initial_params::set_all_simulation_bounds(symbds); ofstream ofs_sd1((char*)(ad_comm::adprogram_name + adstring(".mc2"))); { long int iseed=0; int number_sims; if (nmcmc<=0) { number_sims= 100000; } else { number_sims= nmcmc; } //cin >> iseed; if (iseed0<=0) { iseed=-36519; } else { iseed=-iseed0; } if (iseed>0) { iseed=-iseed; } cout << "Initial seed value " << iseed << endl; random_number_generator rng(iseed); rng.better_rand(); //better_rand(iseed); double lprob=0.0; double lpinv=0.0; double lprob3=0.0; // get lower and upper bounds independent_variables y(1,nvar); independent_variables parsave(1,nvar); // read in the mcmc values to date int ii=1; dmatrix hist; if (restart_flag) { int tmp=0; if (!no_sd_mcmc) { hist.allocate(1,ndvar,-nslots,nslots); tmp=read_hist_data(hist,h,mean_mcmc_values,s,parsave,iseed, size_scale); values.allocate(1,ndvar,-nslots,nslots); for (int i=1;i<=ndvar;i++) { values(i).fill_seqadd(mean_mcmc_values(i)-0.5*total_spread*s(i) +.5*h(i),h(i)); } } if (iseed>0) { iseed=-iseed; } double br=rng.better_rand(); if (tmp) have_hist_flag=1; chd=size_scale*chd; chdinv=chdinv/size_scale; } else { int on=-1; int nopt=0; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcpin",nopt))>-1) { if (nopt) { cifstream cif((char *)ad_comm::argv[on+1]); if (!cif) { cerr << "Error trying to open mcmc par input file " << ad_comm::argv[on+1] << endl; exit(1); } cif >> parsave; if (!cif) { cerr << "Error reading from mcmc par input file " << ad_comm::argv[on+1] << endl; exit(1); } } else { cerr << "Illegal option with -mcpin" << endl; } } else { ii=1; initial_params::copy_all_values(parsave,ii); } } ii=1; initial_params::restore_all_values(parsave,ii); gradient_structure::set_NO_DERIVATIVES(); ofstream ogs("sims"); ogs << nvar << " " << number_sims << endl; initial_params::xinit(y); send_int_to_slaves(1); double llc=-pvm_master_get_monte_carlo_value(nvar,y); send_int_to_slaves(1); llbest=-pvm_master_get_monte_carlo_value(nvar,y); lbmax=llbest; // store current mcmc variable values in param_values //dmatrix store_mcmc_values(1,number_sims,1,ndvar); #if defined(USE_BAYES_FACTORS) lkvector.allocate(1,number_sims); #endif dvector mcmc_values(1,ndvar); dvector mcmc_number_values; //if (adjm_ptr) mcmc_number_values.allocate(1,numdvar); int offs=1; stddev_params::copy_all_values(mcmc_values,offs); /* if (adjm_ptr) { offs=1; stddev_params::copy_all_number_values(mcmc_number_values,offs); } */ int change_ball=2500; int nopt; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcscale",nopt))>-1) { if (nopt) { int iii=atoi(ad_comm::argv[on+1]); if (iii <=0) { cerr << " Invalid option following command line option -mcball -- " << endl << " ignored" << endl; } else change_ball=iii; } } int iac=0; int liac=0; int isim=0; int itmp=0; double logr; int u_option=0; double ll; int s_option=1; int psvflag=0; if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcu"))>-1) { u_option=1; } if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcnoscale"))>-1) { s_option=0; } //cout << llc << " " << llc << endl; int iac_old=0; int i_old=0; { if (!restart_flag) { pofs_sd = new uostream((char*)(ad_comm::adprogram_name + adstring(".mcm"))); } int mcsave_flag=0; int mcrestart_flag=option_match(ad_comm::argc,ad_comm::argv,"-mcr"); if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcsave"))>-1) { int jj=(int)atof(ad_comm::argv[on+1]); if (jj <=0) { cerr << " Invalid option following command line option -mcsave -- " << endl; } else { mcsave_flag=jj; if ( mcrestart_flag>-1) { // check that nvar is correct { uistream uis((char*)(ad_comm::adprogram_name + adstring(".psv"))); if (!uis) { cerr << "Error trying to open file" << ad_comm::adprogram_name + adstring(".psv") << " for mcrestart" << endl; cerr << " I am starting a new file " << endl; psvflag=1; } else { int nv1; uis >> nv1; if (nv1 !=nvar) { cerr << "wrong number of independent variables in" << ad_comm::adprogram_name + adstring(".psv") << cerr << " I am starting a new file " << endl; psvflag=1; } } } if (!psvflag) { pofs_psave= new uostream( (char*)(ad_comm::adprogram_name + adstring(".psv")),ios::app); } else { pofs_psave= new uostream((char*)(ad_comm::adprogram_name + adstring(".psv"))); } } else {