diff --git a/matlab/dynare_config.m b/matlab/dynare_config.m index 9a8ca5bb4f12f3af3c2df468eab7d77627c2c5bc..24543ddcde334346f71dd58a0ca71a3824859e18 100644 --- a/matlab/dynare_config.m +++ b/matlab/dynare_config.m @@ -59,6 +59,7 @@ addpath([dynareroot '/particle/']) addpath([dynareroot '/gsa/']) addpath([dynareroot '/ep/']) addpath([dynareroot '/lmmcp/']) +addpath([dynareroot '/optimization/']) addpath([dynareroot '/modules/dates/src/']) addpath([dynareroot '/modules/dseries/src/']) addpath([dynareroot '/modules/dseries/src/read']) diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m index 824562c56a186aff2150b9783ab34c738ed8838a..589a5010b486c02f174a3d89ba4c44e78eaf0f09 100644 --- a/matlab/dynare_estimation_1.m +++ b/matlab/dynare_estimation_1.m @@ -231,414 +231,57 @@ end % Estimation of the posterior mode or likelihood mode if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation - switch options_.mode_compute - case 1 - if isoctave - error('Option mode_compute=1 is not available under Octave') - elseif ~user_has_matlab_license('optimization_toolbox') - error('Option mode_compute=1 requires the Optimization Toolbox') - end - % Set default optimization options for fmincon. - optim_options = optimset('display','iter', 'LargeScale','off', 'MaxFunEvals',100000, 'TolFun',1e-8, 'TolX',1e-6); - if isfield(options_,'optim_opt') - eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); - end - if options_.analytic_derivation, - optim_options = optimset(optim_options,'GradObj','on','TolX',1e-7); - end - [xparam1,fval,exitflag,output,lamdba,grad,hessian_fmincon] = ... - fmincon(objective_function,xparam1,[],[],[],[],bounds.lb,bounds.ub,[],optim_options,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 2 - error('ESTIMATION: mode_compute=2 option (Lester Ingber''s Adaptive Simulated Annealing) is no longer available') - case 3 - if isoctave && ~user_has_octave_forge_package('optim') - error('Option mode_compute=3 requires the optim package') - elseif ~isoctave && ~user_has_matlab_license('optimization_toolbox') - error('Option mode_compute=3 requires the Optimization Toolbox') - end - % Set default optimization options for fminunc. - optim_options = optimset('display','iter','MaxFunEvals',100000,'TolFun',1e-8,'TolX',1e-6); - if isfield(options_,'optim_opt') - eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); - end - if options_.analytic_derivation, - optim_options = optimset(optim_options,'GradObj','on'); - end - if ~isoctave - [xparam1,fval,exitflag] = fminunc(objective_function,xparam1,optim_options,dataset_,dataset_info_,options_,M_,estim_params_,bayestopt_,bounds,oo_); - else - % Under Octave, use a wrapper, since fminunc() does not have a 4th arg - func = @(x) objective_function(x, dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - [xparam1,fval,exitflag] = fminunc(func,xparam1,optim_options); - end - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 4 - % Set default options. - H0 = 1e-4*eye(nx); - crit = 1e-7; - nit = 1000; - numgrad = options_.gradient_method; - epsilon = options_.gradient_epsilon; - % Change some options. + %prepare settings for newrat + if options_.mode_compute==5 + %get whether analytical Hessian with non-analytical mode-finding is requested + newratflag=[]; if isfield(options_,'optim_opt') options_list = read_key_value_string(options_.optim_opt); for i=1:rows(options_list) - switch options_list{i,1} - case 'MaxIter' - nit = options_list{i,2}; - case 'InitialInverseHessian' - H0 = eval(options_list{i,2}); - case 'TolFun' - crit = options_list{i,2}; - case 'NumgradAlgorithm' - numgrad = options_list{i,2}; - case 'NumgradEpsilon' - epsilon = options_list{i,2}; - otherwise - warning(['csminwel: Unknown option (' options_list{i,1} ')!']) + if strcmp(options_list{i,1},'Hessian') + newratflag=options_list{i,2}; end end end - % Set flag for analytical gradient. - if options_.analytic_derivation - analytic_grad=1; - else - analytic_grad=[]; - end - % Call csminwell. - [fval,xparam1,grad,hessian_csminwel,itct,fcount,retcodehat] = ... - csminwel1(objective_function, xparam1, H0, analytic_grad, crit, nit, numgrad, epsilon, dataset_, dataset_info, options_, M_, estim_params_, bayestopt_,bounds, oo_); - % Disp value at the mode. - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 5 - if isfield(options_,'hess') - flag = options_.hess; - else - flag = 1; - end - if isfield(options_,'ftol') - crit = options_.ftol; - else - crit = 1.e-5; - end if options_.analytic_derivation, - analytic_grad=1; - ana_deriv = options_.analytic_derivation; + options_analytic_derivation_old = options_.analytic_derivation; options_.analytic_derivation = -1; - crit = 1.e-7; - flag = 0; - else - analytic_grad=0; - end - if isfield(options_,'nit') - nit = options_.nit; - else - nit=1000; - end - [xparam1,hh,gg,fval,invhess] = newrat(objective_function,xparam1,analytic_grad,crit,nit,0,dataset_, dataset_info, options_,M_,estim_params_,bayestopt_,bounds,oo_); - if options_.analytic_derivation, - options_.analytic_derivation = ana_deriv; - else - if flag ==0, - options_.cova_compute = 1; - kalman_algo0 = options_.kalman_algo; - if ~((options_.kalman_algo == 2) || (options_.kalman_algo == 4)), - options_.kalman_algo=2; - if options_.lik_init == 3, - options_.kalman_algo=4; - end + if ~isempty(newratflag) && newratflag~=0 %gradient explicitly specified + error('newrat: analytic_derivation is incompatible with numerical Hessian.') + else %use default + newratflag=0; %use analytical gradient + end + elseif ~options_.analytic_derivation + if isempty(newratflag) + newratflag=options_.newrat.hess; %use default gradient + end + if newratflag==0 %Analytic Hessian wanted, but not automatically computed by newrat itself + if ~((options_.kalman_algo == 2) || (options_.kalman_algo == 4)) %kalman_algo not compatible + error('Analytical Hessian with non-analytical mode-finding requires kalman_algo=2 or 4.') end - hh = reshape(mr_hessian(0,xparam1,objective_function,1,crit,dataset_, dataset_info, options_,M_,estim_params_,bayestopt_,bounds,oo_), nx, nx); - options_.kalman_algo = kalman_algo0; end end - parameter_names = bayestopt_.name; - save([M_.fname '_mode.mat'],'xparam1','hh','parameter_names'); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 6 - % Set default options - gmhmaxlikOptions = options_.gmhmaxlik; - if ~isempty(hh); - gmhmaxlikOptions.varinit = 'previous'; - else - gmhmaxlikOptions.varinit = 'prior'; - end - if isfield(options_,'optim_opt') - options_list = read_key_value_string(options_.optim_opt); - for i=1:rows(options_list) - switch options_list{i,1} - case 'NumberOfMh' - gmhmaxlikOptions.iterations = options_list{i,2}; - case 'ncov-mh' - gmhmaxlikOptions.number = options_list{i,2}; - case 'nscale' - gmhmaxlikOptions.nscale = options_list{i,2}; - case 'nclimb' - gmhmaxlikOptions.nclimb = options_list{i,2}; - case 'InitialCovarianceMatrix' - switch options_list{i,2} - case 'previous' - if isempty(hh) - error('gmhmaxlik: No previous estimate of the Hessian matrix available!') - else - gmhmaxlikOptions.varinit = 'previous' - end - case {'prior', 'identity'} - gmhmaxlikOptions.varinit = options_list{i,2}; - otherwise - error('gmhmaxlik: Unknown value for option ''InitialCovarianceMatrix''!') - end - case 'AcceptanceRateTarget' - gmhmaxlikOptions.target = options_list{i,2}; - if gmhmaxlikOptions.target>1 || gmhmaxlikOptions.target<eps - error('gmhmaxlik: The value of option AcceptanceRateTarget should be a double between 0 and 1!') - end - otherwise - warning(['gmhmaxlik: Unknown option (' options_list{i,1} ')!']) - end - end - end - % Evaluate the objective function. - fval = feval(objective_function,xparam1,dataset_, dataset_info, options_,M_,estim_params_,bayestopt_,bounds,oo_); - OldMode = fval; - if ~exist('MeanPar','var') - MeanPar = xparam1; - end - switch gmhmaxlikOptions.varinit - case 'previous' - CovJump = inv(hh); - case 'prior' - % The covariance matrix is initialized with the prior - % covariance (a diagonal matrix) %%Except for infinite variances ;-) - stdev = bayestopt_.p2; - indx = find(isinf(stdev)); - stdev(indx) = ones(length(indx),1)*sqrt(10); - vars = stdev.^2; - CovJump = diag(vars); - case 'identity' - vars = ones(length(bayestopt_.p2),1)*0.1; - CovJump = diag(vars); - otherwise - error('gmhmaxlik: This is a bug! Please contact the developers.') - end - OldPostVar = CovJump; - Scale = options_.mh_jscale; - for i=1:gmhmaxlikOptions.iterations - if i == 1 - if gmhmaxlikOptions.iterations>1 - flag = ''; - else - flag = 'LastCall'; - end - [xparam1,PostVar,Scale,PostMean] = ... - gmhmaxlik(objective_function,xparam1,[bounds.lb bounds.ub],gmhmaxlikOptions,Scale,flag,MeanPar,CovJump,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fval = feval(objective_function,xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - options_.mh_jscale = Scale; - mouvement = max(max(abs(PostVar-OldPostVar))); - skipline() - disp('========================================================== ') - disp([' Change in the covariance matrix = ' num2str(mouvement) '.']) - disp([' Mode improvement = ' num2str(abs(OldMode-fval))]) - disp([' New value of jscale = ' num2str(Scale)]) - disp('========================================================== ') - OldMode = fval; - else - OldPostVar = PostVar; - if i<gmhmaxlikOptions.iterations - flag = ''; - else - flag = 'LastCall'; - end - [xparam1,PostVar,Scale,PostMean] = ... - gmhmaxlik(objective_function,xparam1,[bounds.lb bounds.ub],... - gmhmaxlikOptions,Scale,flag,PostMean,PostVar,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fval = feval(objective_function,xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - options_.mh_jscale = Scale; - mouvement = max(max(abs(PostVar-OldPostVar))); - fval = feval(objective_function,xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - skipline() - disp('========================================================== ') - disp([' Change in the covariance matrix = ' num2str(mouvement) '.']) - disp([' Mode improvement = ' num2str(abs(OldMode-fval))]) - disp([' New value of jscale = ' num2str(Scale)]) - disp('========================================================== ') - OldMode = fval; - end - hh = inv(PostVar); - parameter_names = bayestopt_.name; - save([M_.fname '_mode.mat'],'xparam1','hh','parameter_names'); - save([M_.fname '_optimal_mh_scale_parameter.mat'],'Scale'); - bayestopt_.jscale = ones(length(xparam1),1)*Scale; - end - skipline() - disp(['Optimal value of the scale parameter = ' num2str(Scale)]) - skipline() - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - skipline() - parameter_names = bayestopt_.name; - save([M_.fname '_mode.mat'],'xparam1','hh','parameter_names'); - case 7 - % Matlab's simplex (Optimization toolbox needed). - if isoctave && ~user_has_octave_forge_package('optim') - error('Option mode_compute=7 requires the optim package') - elseif ~isoctave && ~user_has_matlab_license('optimization_toolbox') - error('Option mode_compute=7 requires the Optimization Toolbox') - end - optim_options = optimset('display','iter','MaxFunEvals',1000000,'MaxIter',6000,'TolFun',1e-8,'TolX',1e-6); - if isfield(options_,'optim_opt') - eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); - end - [xparam1,fval,exitflag] = fminsearch(objective_function,xparam1,optim_options,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 8 - % Dynare implementation of the simplex algorithm. - simplexOptions = options_.simplex; - if isfield(options_,'optim_opt') - options_list = read_key_value_string(options_.optim_opt); - for i=1:rows(options_list) - switch options_list{i,1} - case 'MaxIter' - simplexOptions.maxiter = options_list{i,2}; - case 'TolFun' - simplexOptions.tolerance.f = options_list{i,2}; - case 'TolX' - simplexOptions.tolerance.x = options_list{i,2}; - case 'MaxFunEvals' - simplexOptions.maxfcall = options_list{i,2}; - case 'MaxFunEvalFactor' - simplexOptions.maxfcallfactor = options_list{i,2}; - case 'InitialSimplexSize' - simplexOptions.delta_factor = options_list{i,2}; - otherwise - warning(['simplex: Unknown option (' options_list{i,1} ')!']) - end - end - end - [xparam1,fval,exitflag] = simplex_optimization_routine(objective_function,xparam1,simplexOptions,bayestopt_.name,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 9 - % Set defaults - H0 = 1e-4*ones(nx,1); - cmaesOptions = options_.cmaes; - % Modify defaults - if isfield(options_,'optim_opt') - options_list = read_key_value_string(options_.optim_opt); - for i=1:rows(options_list) - switch options_list{i,1} - case 'MaxIter' - cmaesOptions.MaxIter = options_list{i,2}; - case 'TolFun' - cmaesOptions.TolFun = options_list{i,2}; - case 'TolX' - cmaesOptions.TolX = options_list{i,2}; - case 'MaxFunEvals' - cmaesOptions.MaxFunEvals = options_list{i,2}; - otherwise - warning(['cmaes: Unknown option (' options_list{i,1} ')!']) - end - end - end - warning('off','CMAES:NonfinitenessRange'); - warning('off','CMAES:InitialSigma'); - [x, fval, COUNTEVAL, STOPFLAG, OUT, BESTEVER] = cmaes(func2str(objective_function),xparam1,H0,cmaesOptions,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - xparam1=BESTEVER.x; - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', BESTEVER.f); - case 10 - simpsaOptions = options_.simpsa; - if isfield(options_,'optim_opt') - options_list = read_key_value_string(options_.optim_opt); - for i=1:rows(options_list) - switch options_list{i,1} - case 'MaxIter' - simpsaOptions.MAX_ITER_TOTAL = options_list{i,2}; - case 'TolFun' - simpsaOptions.TOLFUN = options_list{i,2}; - case 'TolX' - tolx = options_list{i,2}; - if tolx<0 - simpsaOptions = rmfield(simpsaOptions,'TOLX'); % Let simpsa choose the default. - else - simpsaOptions.TOLX = tolx; - end - case 'EndTemparature' - simpsaOptions.TEMP_END = options_list{i,2}; - case 'MaxFunEvals' - simpsaOptions.MAX_FUN_EVALS = options_list{i,2}; - otherwise - warning(['simpsa: Unknown option (' options_list{i,1} ')!']) - end - end - end - simpsaOptionsList = options2cell(simpsaOptions); - simpsaOptions = simpsaset(simpsaOptionsList{:}); - [xparam1, fval, exitflag] = simpsa(func2str(objective_function),xparam1,bounds.lb,bounds.ub,simpsaOptions,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 11 - options_.cova_compute = 0 ; - [xparam1,stdh,lb_95,ub_95,med_param] = online_auxiliary_filter(xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_) ; - case 101 - myoptions=soptions; - myoptions(2)=1e-6; %accuracy of argument - myoptions(3)=1e-6; %accuracy of function (see Solvopt p.29) - myoptions(5)= 1.0; - [xparam1,fval]=solvopt(xparam1,objective_function,[],myoptions,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - case 102 - %simulating annealing - % LB=zeros(size(xparam1))-20; - % UB=zeros(size(xparam1))+20; - LB = xparam1 - 1; - UB = xparam1 + 1; - neps=10; - % Set input parameters. - maxy=0; - epsilon=1.0e-9; - rt_=.10; - t=15.0; - ns=10; - nt=10; - maxevl=100000000; - idisp =1; - npar=length(xparam1); - - disp(['size of param',num2str(length(xparam1))]) - c=.1*ones(npar,1); - %* Set input values of the input/output parameters.* - - vm=1*ones(npar,1); - disp(['number of parameters= ' num2str(npar) 'max= ' num2str(maxy) 't= ' num2str(t)]); - disp(['rt_= ' num2str(rt_) 'eps= ' num2str(epsilon) 'ns= ' num2str(ns)]); - disp(['nt= ' num2str(nt) 'neps= ' num2str(neps) 'maxevl= ' num2str(maxevl)]); - % disp(['iprint= ' num2str(iprint) 'seed= ' num2str(seed)]); - disp ' '; - disp ' '; - disp(['starting values(x) ' num2str(xparam1')]); - disp(['initial step length(vm) ' num2str(vm')]); - disp(['lower bound(lb)', 'initial conditions', 'upper bound(ub)' ]); - disp([LB xparam1 UB]); - disp(['c vector ' num2str(c')]); - - [xparam1, fval, nacc, nfcnev, nobds, ier, t, vm] = sa(objective_function,xparam1,maxy,rt_,epsilon,ns,nt ... - ,neps,maxevl,LB,UB,c,idisp ,t,vm,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - otherwise - if ischar(options_.mode_compute) - [xparam1, fval, retcode ] = feval(options_.mode_compute,objective_function,xparam1,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); - else - error(['dynare_estimation:: mode_compute = ' int2str(options_.mode_compute) ' option is unknown!']) - end end + + [xparam1, fval, exitflag, hh, options_, Scale] = dynare_minimize_objective(objective_function,xparam1,options_.mode_compute,options_,[bounds.lb bounds.ub],bayestopt_.name,bayestopt_,hh,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); + fprintf('\nFinal value of minus the log posterior (or likelihood):%f \n', fval); + + if options_.mode_compute==5 && options_.analytic_derivation==-1 %reset options changed by newrat + options_.analytic_derivation = options_analytic_derivation_old; %reset + elseif options_.mode_compute==6 %save scaling factor + save([M_.fname '_optimal_mh_scale_parameter.mat'],'Scale'); + options_.mh_jscale = Scale; + bayestopt_.jscale = ones(length(xparam1),1)*Scale; + end if ~isequal(options_.mode_compute,6) %always already computes covariance matrix if options_.cova_compute == 1 %user did not request covariance not to be computed if options_.analytic_derivation && strcmp(func2str(objective_function),'dsge_likelihood'), - ana_deriv = options_.analytic_derivation; + ana_deriv_old = options_.analytic_derivation; options_.analytic_derivation = 2; [junk1, junk2, hh] = feval(objective_function,xparam1, ... dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - options_.analytic_derivation = ana_deriv; - elseif ~(isequal(options_.mode_compute,5) && flag==0), + options_.analytic_derivation = ana_deriv_old; + elseif ~(isequal(options_.mode_compute,5) && newratflag==0), % with flag==0, we force to use the hessian from outer % product gradient of optimizer 5 hh = reshape(hessian(objective_function,xparam1, ... @@ -647,17 +290,13 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation end end parameter_names = bayestopt_.name; - if options_.cova_compute + if options_.cova_compute || options_.mode_compute==5 || options_.mode_compute==6 save([M_.fname '_mode.mat'],'xparam1','hh','parameter_names'); else save([M_.fname '_mode.mat'],'xparam1','parameter_names'); end end -if options_.cova_compute == 0 - hh = [];%NaN(length(xparam1),length(xparam1)); -end - switch options_.MCMC_jumping_covariance case 'hessian' %Baseline %do nothing and use hessian from mode_compute @@ -721,10 +360,10 @@ if ~options_.mh_posterior_mode_estimation && options_.cova_compute end if options_.mode_check.status == 1 && ~options_.mh_posterior_mode_estimation - ana_deriv = options_.analytic_derivation; + ana_deriv_old = options_.analytic_derivation; options_.analytic_derivation = 0; mode_check(objective_function,xparam1,hh,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,bounds,oo_); - options_.analytic_derivation = ana_deriv; + options_.analytic_derivation = ana_deriv_old; end oo_.posterior.optimization.mode = xparam1; @@ -767,8 +406,6 @@ elseif ~any(bayestopt_.pshape > 0) && ~options_.mh_posterior_mode_estimation oo_=display_estimation_results_table(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_,pnames,'Maximum Likelihood','mle'); end -OutputDirectoryName = CheckPath('Output',M_.dname); - if np > 0 pindx = estim_params_.param_vals(:,1); save([M_.fname '_params.mat'],'pindx'); @@ -797,14 +434,14 @@ if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ... if options_.load_mh_file && options_.use_mh_covariance_matrix invhess = compute_mh_covariance_matrix; end - ana_deriv = options_.analytic_derivation; + ana_deriv_old = options_.analytic_derivation; options_.analytic_derivation = 0; if options_.cova_compute feval(options_.posterior_sampling_method,objective_function,options_.proposal_distribution,xparam1,invhess,bounds,dataset_,dataset_info,options_,M_,estim_params_,bayestopt_,oo_); else error('I Cannot start the MCMC because the Hessian of the posterior kernel at the mode was not computed.') end - options_.analytic_derivation = ana_deriv; + options_.analytic_derivation = ana_deriv_old; end if options_.mh_posterior_mode_estimation CutSample(M_, options_, estim_params_); diff --git a/matlab/get_prior_info.m b/matlab/get_prior_info.m index cea8ffe4658378f40365231662e93b1cd2735c6c..6a82442bf2d8d1abb12ea554bf9fec4fd5364dcf 100644 --- a/matlab/get_prior_info.m +++ b/matlab/get_prior_info.m @@ -53,6 +53,7 @@ order = options_.order; options_.order = 1; [xparam1,estim_params_,bayestopt_,lb,ub,M_] = set_prior(estim_params_,M_,options_); + if plt_flag plot_priors(bayestopt_,M_,estim_params_,options_) end @@ -100,37 +101,37 @@ if size(M_.param_names,1)==size(M_.param_names_tex,1)% All the parameters have a case { 1 , 5 } LowerBound = bayestopt_.p3(i); UpperBound = bayestopt_.p4(i); - if ~isinf(bayestopt_.lb(i)) - LowerBound=max(LowerBound,bayestopt_.lb(i)); + if ~isinf(lb(i)) + LowerBound=max(LowerBound,lb(i)); end - if ~isinf(bayestopt_.ub(i)) - UpperBound=min(UpperBound,bayestopt_.ub(i)); + if ~isinf(ub(i)) + UpperBound=min(UpperBound,ub(i)); end case { 2 , 4 , 6 } LowerBound = bayestopt_.p3(i); - if ~isinf(bayestopt_.lb(i)) - LowerBound=max(LowerBound,bayestopt_.lb(i)); + if ~isinf(lb(i)) + LowerBound=max(LowerBound,lb(i)); end - if ~isinf(bayestopt_.ub(i)) - UpperBound=bayestopt_.ub(i); + if ~isinf(ub(i)) + UpperBound=ub(i); else UpperBound = '$\infty$'; end case 3 - if isinf(bayestopt_.p3(i)) && isinf(bayestopt_.lb(i)) + if isinf(bayestopt_.p3(i)) && isinf(lb(i)) LowerBound = '$-\infty$'; else LowerBound = bayestopt_.p3(i); - if ~isinf(bayestopt_.lb(i)) - LowerBound=max(LowerBound,bayestopt_.lb(i)); + if ~isinf(lb(i)) + LowerBound=max(LowerBound,lb(i)); end end - if isinf(bayestopt_.p4(i)) && isinf(bayestopt_.ub(i)) + if isinf(bayestopt_.p4(i)) && isinf(ub(i)) UpperBound = '$\infty$'; else UpperBound = bayestopt_.p4(i); - if ~isinf(bayestopt_.ub(i)) - UpperBound=min(UpperBound,bayestopt_.ub(i)); + if ~isinf(ub(i)) + UpperBound=min(UpperBound,ub(i)); end end otherwise @@ -206,7 +207,7 @@ if info==2% Prior optimization. bayestopt_.p6, ... bayestopt_.p7, ... bayestopt_.p3, ... - bayestopt_.p4,options_,M_,estim_params_,oo_); + bayestopt_.p4,options_,M_,bayestopt_,estim_params_,oo_); % Display the results. skipline(2) disp('------------------') diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index d34f202e76ea2c8895b5d6bb61bf49ac1624b7ee..dec79b27b53c966047910f36744bdbe335c3fc71 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -103,6 +103,10 @@ options_.bvar_prior_omega = 1; options_.bvar_prior_flat = 0; options_.bvar_prior_train = 0; +% Initialize the field that will contain the optimization algorigthm's options declared in the +% estimation command (if anny). +options_.optim_opt = []; + % Optimization algorithm [6] gmhmaxlik gmhmaxlik.iterations = 3; gmhmaxlik.number = 20000; @@ -422,8 +426,8 @@ options_.student_degrees_of_freedom = 3; options_.posterior_max_subsample_draws = 1200; options_.sub_draws = []; options_.use_mh_covariance_matrix = 0; -options_.gradient_method = 2; -options_.gradient_epsilon = 1e-6; +options_.gradient_method = 2; %used by csminwel and newrat +options_.gradient_epsilon = 1e-6; %used by csminwel and newrat options_.posterior_sampling_method = 'random_walk_metropolis_hastings'; options_.proposal_distribution = 'rand_multivariate_normal'; options_.student_degrees_of_freedom = 3; @@ -469,6 +473,18 @@ options_.homotopy_mode = 0; options_.homotopy_steps = 1; options_.homotopy_force_continue = 0; +%csminwel optimization routine +csminwel.tolerance.f=1e-7; +csminwel.maxiter=1000; +options_.csminwel=csminwel; + +%newrat optimization routine +newrat.hess=1; %analytic hessian +newrat.tolerance.f=1e-5; +newrat.tolerance.f_analytic=1e-7; +newrat.maxiter=1000; +options_.newrat=newrat; + % Simplex optimization routine (variation on Nelder Mead algorithm). simplex.tolerance.x = 1e-4; simplex.tolerance.f = 1e-4; diff --git a/matlab/maximize_prior_density.m b/matlab/maximize_prior_density.m index 01e9ffc8db93af8c55f38de47f04e9a4a2bdd105..131e0422d2f7f6bb2913fd567cc3b4042d240f3a 100644 --- a/matlab/maximize_prior_density.m +++ b/matlab/maximize_prior_density.m @@ -1,5 +1,5 @@ function [xparams,lpd,hessian] = ... - maximize_prior_density(iparams, prior_shape, prior_hyperparameter_1, prior_hyperparameter_2, prior_inf_bound, prior_sup_bound,DynareOptions,DynareModel,EstimatedParams,DynareResults) + maximize_prior_density(iparams, prior_shape, prior_hyperparameter_1, prior_hyperparameter_2, prior_inf_bound, prior_sup_bound,DynareOptions,DynareModel,BayesInfo,EstimatedParams,DynareResults) % Maximizes the logged prior density using Chris Sims' optimization routine. % % INPUTS @@ -15,7 +15,7 @@ function [xparams,lpd,hessian] = ... % lpd [double] scalar, value of the logged prior density at the mode. % hessian [double] matrix, Hessian matrix at the prior mode. -% Copyright (C) 2009-2012 Dynare Team +% Copyright (C) 2009-2015 Dynare Team % % This file is part of Dynare. % @@ -32,15 +32,10 @@ function [xparams,lpd,hessian] = ... % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. -number_of_estimated_parameters = length(iparams); -H0 = 1e-4*eye(number_of_estimated_parameters); -crit = 1e-7; -nit = 1000; -gradient_method = 2; -gradient_epsilon = 1e-6; - -[lpd,xparams,grad,hessian,itct,fcount,retcodehat] = ... - csminwel1('minus_logged_prior_density',iparams,H0,[],crit,nit,gradient_method, gradient_epsilon, ... - prior_shape, prior_hyperparameter_1, prior_hyperparameter_2, prior_inf_bound, prior_sup_bound,DynareOptions,DynareModel,EstimatedParams,DynareResults); +[xparams, lpd, exitflag, hessian]=dynare_minimize_objective('minus_logged_prior_density', ... + iparams, DynareOptions.mode_compute, DynareOptions, [prior_inf_bound, prior_sup_bound], ... + BayesInfo.name, BayesInfo, [], ... + prior_shape, prior_hyperparameter_1, prior_hyperparameter_2, prior_inf_bound, prior_sup_bound, ... + DynareOptions,DynareModel,EstimatedParams,DynareResults); lpd = -lpd; diff --git a/matlab/cmaes.m b/matlab/optimization/cmaes.m similarity index 100% rename from matlab/cmaes.m rename to matlab/optimization/cmaes.m diff --git a/matlab/csminit1.m b/matlab/optimization/csminit1.m similarity index 100% rename from matlab/csminit1.m rename to matlab/optimization/csminit1.m diff --git a/matlab/csminwel1.m b/matlab/optimization/csminwel1.m similarity index 100% rename from matlab/csminwel1.m rename to matlab/optimization/csminwel1.m diff --git a/matlab/optimization/dynare_minimize_objective.m b/matlab/optimization/dynare_minimize_objective.m new file mode 100644 index 0000000000000000000000000000000000000000..452c6304af1a4af5f8d8b533a33efcf1ed62e58d --- /dev/null +++ b/matlab/optimization/dynare_minimize_objective.m @@ -0,0 +1,335 @@ +function [opt_par_values,fval,exitflag,hessian_mat,options_,Scale]=dynare_minimize_objective(objective_function,start_par_value,minimizer_algorithm,options_,bounds,parameter_names,prior_information,Initial_Hessian,varargin) + +% Calls a minimizer +% +% INPUTS +% objective_function [function handle] handle to the objective function +% start_par_value [n_params by 1] vector of doubles starting values for the parameters +% minimizer_algorithm [scalar double] code of the optimizer algorithm +% options_ [matlab structure] Dynare options structure +% bounds [n_params by 2] vector of doubles 2 row vectors containing lower and upper bound for parameters +% parameter_names [n_params by 1] cell array strings containing the parameters names +% prior_information [matlab structure] Dynare prior information structure (bayestopt_) provided for algorithm 6 +% Initial_Hessian [n_params by n_params] matrix initial hessian matrix provided for algorithm 6 +% varargin [cell array] Input arguments for objective function +% +% OUTPUTS +% opt_par_values [n_params by 1] vector of doubles optimal parameter values minimizing the objective +% fval [scalar double] value of the objective function at the minimum +% exitflag [scalar double] return code of the respective optimizer +% hessian_mat [n_params by n_params] matrix hessian matrix at the mode returned by optimizer +% options_ [matlab structure] Dynare options structure (to return options set by algorithms 5) +% Scale [scalar double] scaling parameter returned by algorith 6 +% +% SPECIAL REQUIREMENTS +% none. +% +% +% Copyright (C) 2014-2015 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + + +%% set bounds and parameter names if not already set +n_params=size(start_par_value,1); +if isempty(bounds) + if minimizer_algorithm==10 + error('Algorithm 10 (simpsa) requires upper and lower bounds') + else + bounds=[-Inf(n_params,1) Inf(n_params,1)]; + end +end + +if minimizer_algorithm==10 && any(any(isinf(bounds))) + error('Algorithm 10 (simpsa) requires finite upper and lower bounds') +end + +if isempty(parameter_names) + parameter_names=[repmat('parameter ',n_params,1),num2str((1:n_params)')]; +end + +%% initialize function outputs +hessian_mat=[]; +Scale=[]; +exitflag=1; +fval=NaN; +opt_par_values=NaN(size(start_par_value)); + + +switch minimizer_algorithm + case 1 + if isoctave + error('Optimization algorithm 1 is not available under Octave') + elseif ~user_has_matlab_license('optimization_toolbox') + error('Optimization algorithm 1 requires the Optimization Toolbox') + end + % Set default optimization options for fmincon. + optim_options = optimset('display','iter', 'LargeScale','off', 'MaxFunEvals',100000, 'TolFun',1e-8, 'TolX',1e-6); + if isfield(options_,'optim_opt') + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end + if options_.analytic_derivation, + optim_options = optimset(optim_options,'GradObj','on','TolX',1e-7); + end + [opt_par_values,fval,exitflag,output,lamdba,grad,hessian_mat] = ... + fmincon(objective_function,start_par_value,[],[],[],[],bounds(:,1),bounds(:,2),[],optim_options,varargin{:}); + case 2 + error('Optimization algorithm 1 option (Lester Ingber''s Adaptive Simulated Annealing) is no longer available') + case 3 + if isoctave && ~user_has_octave_forge_package('optim') + error('Optimization algorithm 3 requires the optim package') + elseif ~isoctave && ~user_has_matlab_license('optimization_toolbox') + error('Optimization algorithm 3 requires the Optimization Toolbox') + end + % Set default optimization options for fminunc. + optim_options = optimset('display','iter','MaxFunEvals',100000,'TolFun',1e-8,'TolX',1e-6); + if isfield(options_,'optim_opt') + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end + if options_.analytic_derivation, + optim_options = optimset(optim_options,'GradObj','on'); + end + if ~isoctave + [opt_par_values,fval,exitflag] = fminunc(objective_function,start_par_value,optim_options,varargin{:}); + else + % Under Octave, use a wrapper, since fminunc() does not have a 4th arg + func = @(x) objective_function(x,varargin{:}); + [opt_par_values,fval,exitflag] = fminunc(func,start_par_value,optim_options); + end + case 4 + % Set default options. + H0 = 1e-4*eye(n_params); + crit = options_.csminwel.tolerance.f; + nit = options_.csminwel.maxiter; + numgrad = options_.gradient_method; + epsilon = options_.gradient_epsilon; + % Change some options. + if isfield(options_,'optim_opt') + options_list = read_key_value_string(options_.optim_opt); + for i=1:rows(options_list) + switch options_list{i,1} + case 'MaxIter' + nit = options_list{i,2}; + case 'InitialInverseHessian' + H0 = eval(options_list{i,2}); + case 'TolFun' + crit = options_list{i,2}; + case 'NumgradAlgorithm' + numgrad = options_list{i,2}; + case 'NumgradEpsilon' + epsilon = options_list{i,2}; + otherwise + warning(['csminwel: Unknown option (' options_list{i,1} ')!']) + end + end + end + % Set flag for analytical gradient. + if options_.analytic_derivation + analytic_grad=1; + else + analytic_grad=[]; + end + % Call csminwell. + [fval,opt_par_values,grad,hessian_mat,itct,fcount,exitflag] = ... + csminwel1(objective_function, start_par_value, H0, analytic_grad, crit, nit, numgrad, epsilon, varargin{:}); + case 5 + if options_.analytic_derivation==-1 %set outside as code for use of analytic derivation + analytic_grad=1; + crit = options_.newrat.tolerance.f_analytic; + newratflag = 0; %analytical Hessian + else + analytic_grad=0; + crit=options_.newrat.tolerance.f; + newratflag = options_.newrat.hess; %default + end + nit=options_.newrat.maxiter; + + if isfield(options_,'optim_opt') + options_list = read_key_value_string(options_.optim_opt); + for i=1:rows(options_list) + switch options_list{i,1} + case 'MaxIter' + nit = options_list{i,2}; + case 'Hessian' + flag=options_list{i,2}; + if options_.analytic_derivation && flag~=0 + error('newrat: analytic_derivation is incompatible with numerical Hessian. Using analytic Hessian') + else + newratflag=flag; + end + case 'TolFun' + crit = options_list{i,2}; + otherwise + warning(['newrat: Unknown option (' options_list{i,1} ')!']) + end + end + end + [opt_par_values,hessian_mat,gg,fval,invhess] = newrat(objective_function,start_par_value,analytic_grad,crit,nit,0,varargin{:}); + if options_.analytic_derivation %Hessian is already analytic one, reset option + options_.analytic_derivation = ana_deriv; + elseif ~options_.analytic_derivation && newratflag ==0 %Analytic Hessian wanted, but not computed yet + hessian_mat = reshape(mr_hessian(0,opt_par_values,objective_function,1,crit,varargin{:}), n_params, n_params); + end + case 6 + [opt_par_values, hessian_mat, Scale, fval] = gmhmaxlik(objective_function, start_par_value, ... + Initial_Hessian, options_.mh_jscale, bounds, prior_information.p2, options_.gmhmaxlik, options_.optim_opt, varargin{:}); + case 7 + % Matlab's simplex (Optimization toolbox needed). + if isoctave && ~user_has_octave_forge_package('optim') + error('Option mode_compute=7 requires the optim package') + elseif ~isoctave && ~user_has_matlab_license('optimization_toolbox') + error('Option mode_compute=7 requires the Optimization Toolbox') + end + optim_options = optimset('display','iter','MaxFunEvals',1000000,'MaxIter',6000,'TolFun',1e-8,'TolX',1e-6); + if isfield(options_,'optim_opt') + eval(['optim_options = optimset(optim_options,' options_.optim_opt ');']); + end + [opt_par_values,fval,exitflag] = fminsearch(objective_function,start_par_value,optim_options,varargin{:}); + case 8 + % Dynare implementation of the simplex algorithm. + simplexOptions = options_.simplex; + if isfield(options_,'optim_opt') + options_list = read_key_value_string(options_.optim_opt); + for i=1:rows(options_list) + switch options_list{i,1} + case 'MaxIter' + simplexOptions.maxiter = options_list{i,2}; + case 'TolFun' + simplexOptions.tolerance.f = options_list{i,2}; + case 'TolX' + simplexOptions.tolerance.x = options_list{i,2}; + case 'MaxFunEvals' + simplexOptions.maxfcall = options_list{i,2}; + case 'MaxFunEvalFactor' + simplexOptions.maxfcallfactor = options_list{i,2}; + case 'InitialSimplexSize' + simplexOptions.delta_factor = options_list{i,2}; + otherwise + warning(['simplex: Unknown option (' options_list{i,1} ')!']) + end + end + end + [opt_par_values,fval,exitflag] = simplex_optimization_routine(objective_function,start_par_value,simplexOptions,parameter_names,varargin{:}); + case 9 + % Set defaults + H0 = 1e-4*ones(n_params,1); + cmaesOptions = options_.cmaes; + % Modify defaults + if isfield(options_,'optim_opt') + options_list = read_key_value_string(options_.optim_opt); + for i=1:rows(options_list) + switch options_list{i,1} + case 'MaxIter' + cmaesOptions.MaxIter = options_list{i,2}; + case 'TolFun' + cmaesOptions.TolFun = options_list{i,2}; + case 'TolX' + cmaesOptions.TolX = options_list{i,2}; + case 'MaxFunEvals' + cmaesOptions.MaxFunEvals = options_list{i,2}; + otherwise + warning(['cmaes: Unknown option (' options_list{i,1} ')!']) + end + end + end + warning('off','CMAES:NonfinitenessRange'); + warning('off','CMAES:InitialSigma'); + [x, fval, COUNTEVAL, STOPFLAG, OUT, BESTEVER] = cmaes(func2str(objective_function),start_par_value,H0,cmaesOptions,varargin{:}); + opt_par_values=BESTEVER.x; + fval=BESTEVER.f; + case 10 + simpsaOptions = options_.simpsa; + if isfield(options_,'optim_opt') + options_list = read_key_value_string(options_.optim_opt); + for i=1:rows(options_list) + switch options_list{i,1} + case 'MaxIter' + simpsaOptions.MAX_ITER_TOTAL = options_list{i,2}; + case 'TolFun' + simpsaOptions.TOLFUN = options_list{i,2}; + case 'TolX' + tolx = options_list{i,2}; + if tolx<0 + simpsaOptions = rmfield(simpsaOptions,'TOLX'); % Let simpsa choose the default. + else + simpsaOptions.TOLX = tolx; + end + case 'EndTemparature' + simpsaOptions.TEMP_END = options_list{i,2}; + case 'MaxFunEvals' + simpsaOptions.MAX_FUN_EVALS = options_list{i,2}; + otherwise + warning(['simpsa: Unknown option (' options_list{i,1} ')!']) + end + end + end + simpsaOptionsList = options2cell(simpsaOptions); + simpsaOptions = simpsaset(simpsaOptionsList{:}); + [opt_par_values, fval, exitflag] = simpsa(func2str(objective_function),start_par_value,bounds(:,1),bounds(:,2),simpsaOptions,varargin{:}); + case 11 + options_.cova_compute = 0 ; + [opt_par_values,stdh,lb_95,ub_95,med_param] = online_auxiliary_filter(start_par_value,varargin{:}) ; + case 101 + myoptions=soptions; + myoptions(2)=1e-6; %accuracy of argument + myoptions(3)=1e-6; %accuracy of function (see Solvopt p.29) + myoptions(5)= 1.0; + [opt_par_values,fval]=solvopt(start_par_value,objective_function,[],myoptions,varargin{:}); + case 102 + %simulating annealing + LB = start_par_value - 1; + UB = start_par_value + 1; + neps=10; + % Set input parameters. + maxy=0; + epsilon=1.0e-9; + rt_=.10; + t=15.0; + ns=10; + nt=10; + maxevl=100000000; + idisp =1; + npar=length(start_par_value); + + disp(['size of param',num2str(length(start_par_value))]) + c=.1*ones(npar,1); + %* Set input values of the input/output parameters.* + + vm=1*ones(npar,1); + disp(['number of parameters= ' num2str(npar) 'max= ' num2str(maxy) 't= ' num2str(t)]); + disp(['rt_= ' num2str(rt_) 'eps= ' num2str(epsilon) 'ns= ' num2str(ns)]); + disp(['nt= ' num2str(nt) 'neps= ' num2str(neps) 'maxevl= ' num2str(maxevl)]); + disp ' '; + disp ' '; + disp(['starting values(x) ' num2str(start_par_value')]); + disp(['initial step length(vm) ' num2str(vm')]); + disp(['lower bound(lb)', 'initial conditions', 'upper bound(ub)' ]); + disp([LB start_par_value UB]); + disp(['c vector ' num2str(c')]); + + [opt_par_values, fval, nacc, nfcnev, nobds, ier, t, vm] = sa(objective_function,xparstart_par_valueam1,maxy,rt_,epsilon,ns,nt ... + ,neps,maxevl,LB,UB,c,idisp ,t,vm,varargin{:}); + otherwise + if ischar(minimizer_algorithm) + if exist(options_.mode_compute) + [opt_par_values, fval, exitflag] = feval(options_.mode_compute,objective_function,start_par_value,varargin{:}); + else + error('No minimizer with the provided name detected.') + end + else + error(['Optimization algorithm ' int2str(minimizer_algorithm) ' is unknown!']) + end +end diff --git a/matlab/optimization/gmhmaxlik.m b/matlab/optimization/gmhmaxlik.m new file mode 100644 index 0000000000000000000000000000000000000000..4501f845c29ef1f6492937191faa60e1f38333bf --- /dev/null +++ b/matlab/optimization/gmhmaxlik.m @@ -0,0 +1,120 @@ +function [PostMode, HessianMatrix, Scale, ModeValue] = gmhmaxlik(fun, xinit, Hinit, iscale, bounds, priorstd, gmhmaxlikOptions, OptimizationOptions, varargin) + +% Copyright (C) 2006-2015 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +% Set default options + +if ~isempty(Hinit); + gmhmaxlikOptionsptions.varinit = 'previous'; +else + gmhmaxlikOptions.varinit = 'prior'; +end + +if ~isempty(OptimizationOptions) + DynareOptionslist = read_key_value_string(OptimizationOptions); + for i=1:rows(DynareOptionslist) + switch DynareOptionslist{i,1} + case 'NumberOfMh' + gmhmaxlikOptions.iterations = DynareOptionslist{i,2}; + case 'ncov-mh' + gmhmaxlikOptions.number = DynareOptionslist{i,2}; + case 'nscale' + gmhmaxlikOptions.nscale = DynareOptionslist{i,2}; + case 'nclimb' + gmhmaxlikOptions.nclimb = DynareOptionslist{i,2}; + case 'InitialCovarianceMatrix' + switch DynareOptionslist{i,2} + case 'previous' + if isempty(Hinit) + error('gmhmaxlik: No previous estimate of the Hessian matrix available! You cannot use the InitialCovarianceMatrix option!') + else + gmhmaxlikOptions.varinit = 'previous'; + end + case {'prior', 'identity'} + gmhmaxlikOptions.varinit = DynareOptionslist{i,2}; + otherwise + error('gmhmaxlik: Unknown value for option ''InitialCovarianceMatrix''!') + end + case 'AcceptanceRateTarget' + gmhmaxlikOptions.target = DynareOptionslist{i,2}; + if gmhmaxlikOptions.target>1 || gmhmaxlikOptions.target<eps + error('gmhmaxlik: The value of option AcceptanceRateTarget should be a double between 0 and 1!') + end + otherwise + warning(['gmhmaxlik: Unknown option (' DynareOptionslist{i,1} ')!']) + end + end +end + +% Evaluate the objective function. +OldModeValue = feval(fun,xinit,varargin{:}); + +if ~exist('MeanPar','var') + MeanPar = xinit; +end + +switch gmhmaxlikOptions.varinit + case 'previous' + CovJump = inv(Hinit); + case 'prior' + % The covariance matrix is initialized with the prior + % covariance (a diagonal matrix) %%Except for infinite variances ;-) + stdev = priorstd; + indx = find(isinf(stdev)); + stdev(indx) = ones(length(indx),1)*sqrt(10); + vars = stdev.^2; + CovJump = diag(vars); + case 'identity' + vars = ones(length(priorstd),1)*0.1; + CovJump = diag(vars); + otherwise + error('gmhmaxlik: This is a bug! Please contact the developers.') +end + +OldPostVariance = CovJump; +OldPostMean = xinit; +OldPostMode = xinit; +Scale = iscale; + +for i=1:gmhmaxlikOptions.iterations + if i<gmhmaxlikOptions.iterations + flag = ''; + else + flag = 'LastCall'; + end + [PostMode, PostVariance, Scale, PostMean] = gmhmaxlik_core(fun, OldPostMode, bounds, gmhmaxlikOptions, Scale, flag, MeanPar, OldPostVariance, varargin{:}); + ModeValue = feval(fun, PostMode, varargin{:}); + dVariance = max(max(abs(PostVariance-OldPostVariance))); + dMean = max(abs(PostMean-OldPostMean)); + skipline() + printline(58,'=') + disp([' Change in the posterior covariance matrix = ' num2str(dVariance) '.']) + disp([' Change in the posterior mean = ' num2str(dMean) '.']) + disp([' Mode improvement = ' num2str(abs(OldModeValue-ModeValue))]) + disp([' New value of jscale = ' num2str(Scale)]) + printline(58,'=') + OldModeValue = ModeValue; + OldPostMean = PostMean; + OldPostVariance = PostVariance; +end + +HessianMatrix = inv(PostVariance); + +skipline() +disp(['Optimal value of the scale parameter = ' num2str(Scale)]) +skipline() \ No newline at end of file diff --git a/matlab/gmhmaxlik.m b/matlab/optimization/gmhmaxlik_core.m similarity index 97% rename from matlab/gmhmaxlik.m rename to matlab/optimization/gmhmaxlik_core.m index b5789d230b844674846e7cf78d3479a73ff98f3e..2d7a3cb814fe1db262ff8ab597ecf24049e5bcff 100644 --- a/matlab/gmhmaxlik.m +++ b/matlab/optimization/gmhmaxlik_core.m @@ -1,8 +1,5 @@ -function [PostMod,PostVar,Scale,PostMean] = ... - gmhmaxlik(ObjFun,xparam1,mh_bounds,options,iScale,info,MeanPar,VarCov,varargin) +function [PostMod,PostVar,Scale,PostMean] = gmhmaxlik_core(ObjFun,xparam1,mh_bounds,options,iScale,info,MeanPar,VarCov,varargin) -%function [PostMod,PostVar,Scale,PostMean] = ... -%gmhmaxlik(ObjFun,xparam1,mh_bounds,num,iScale,info,MeanPar,VarCov,varargin) % (Dirty) Global minimization routine of (minus) a likelihood (or posterior density) function. % % INPUTS @@ -59,7 +56,7 @@ function [PostMod,PostVar,Scale,PostMean] = ... % SPECIAL REQUIREMENTS % None. -% Copyright (C) 2006-2012 Dynare Team +% Copyright (C) 2006-2015 Dynare Team % % This file is part of Dynare. % diff --git a/matlab/mr_gstep.m b/matlab/optimization/mr_gstep.m similarity index 100% rename from matlab/mr_gstep.m rename to matlab/optimization/mr_gstep.m diff --git a/matlab/mr_hessian.m b/matlab/optimization/mr_hessian.m similarity index 100% rename from matlab/mr_hessian.m rename to matlab/optimization/mr_hessian.m diff --git a/matlab/numgrad2.m b/matlab/optimization/numgrad2.m similarity index 100% rename from matlab/numgrad2.m rename to matlab/optimization/numgrad2.m diff --git a/matlab/numgrad3.m b/matlab/optimization/numgrad3.m similarity index 100% rename from matlab/numgrad3.m rename to matlab/optimization/numgrad3.m diff --git a/matlab/numgrad3_.m b/matlab/optimization/numgrad3_.m similarity index 100% rename from matlab/numgrad3_.m rename to matlab/optimization/numgrad3_.m diff --git a/matlab/numgrad5.m b/matlab/optimization/numgrad5.m similarity index 100% rename from matlab/numgrad5.m rename to matlab/optimization/numgrad5.m diff --git a/matlab/numgrad5_.m b/matlab/optimization/numgrad5_.m similarity index 100% rename from matlab/numgrad5_.m rename to matlab/optimization/numgrad5_.m diff --git a/matlab/simplex_optimization_routine.m b/matlab/optimization/simplex_optimization_routine.m similarity index 100% rename from matlab/simplex_optimization_routine.m rename to matlab/optimization/simplex_optimization_routine.m diff --git a/matlab/simpsa.m b/matlab/optimization/simpsa.m similarity index 100% rename from matlab/simpsa.m rename to matlab/optimization/simpsa.m diff --git a/matlab/simpsaget.m b/matlab/optimization/simpsaget.m similarity index 100% rename from matlab/simpsaget.m rename to matlab/optimization/simpsaget.m diff --git a/matlab/simpsaset.m b/matlab/optimization/simpsaset.m similarity index 100% rename from matlab/simpsaset.m rename to matlab/optimization/simpsaset.m