Skip to content
Snippets Groups Projects
Commit 2ee11fa8 authored by Stéphane Adjemian's avatar Stéphane Adjemian
Browse files

Changed the handling of optimization options in dynare_estimation_1.m. Removed...

Changed the handling of optimization options in dynare_estimation_1.m. Removed calls to strsplit. Closes #605.
parent 4b4de410
Branches
No related tags found
No related merge requests found
...@@ -281,25 +281,22 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -281,25 +281,22 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
epsilon = options_.gradient_epsilon; epsilon = options_.gradient_epsilon;
% Change some options. % Change some options.
if isfield(options_,'optim_opt') if isfield(options_,'optim_opt')
options_list = strsplit(options_.optim_opt,','); options_list = read_key_value_string(options_.optim_opt);
number_of_options = length(options_list)/2; for i=1:rows(options_list)
o = 1; switch options_list{i,1}
while o<=number_of_options case 'MaxIter'
switch strtrim(options_list{2*(o-1)+1}) nit = options_list{i,2};
case '''MaxIter''' case 'InitialInverseHessian'
nit = str2num(options_list{2*(o-1)+2}); H0 = eval(options_list{i,2});
case '''InitialInverseHessian'''
H0 = eval(eval(options_list{2*(o-1)+2}));
case '''TolFun''' case '''TolFun'''
crit = str2double(options_list{2*(o-1)+2}); crit = options_list{i,2};
case '''NumgradAlgorithm''' case 'NumgradAlgorithm'
numgrad = str2num(options_list{2*(o-1)+2}); numgrad = options_list{i,2};
case '''NumgradEpsilon''' case 'NumgradEpsilon'
epsilon = str2double(options_list{2*(o-1)+2}); epsilon = options_list{i,2};
otherwise otherwise
warning(['csminwel: Unknown option (' options_list{2*(o-1)+1} ')!']) warning(['csminwel: Unknown option (' options_list{i,1} ')!'])
end end
o = o + 1;
end end
end end
% Set flag for analytical gradient. % Set flag for analytical gradient.
...@@ -353,21 +350,19 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -353,21 +350,19 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
gmhmaxlikOptions.varinit = 'prior'; gmhmaxlikOptions.varinit = 'prior';
end end
if isfield(options_,'optim_opt') if isfield(options_,'optim_opt')
options_list = strsplit(options_.optim_opt,','); options_list = read_key_value_string(options_.optim_opt);
number_of_options = length(options_list)/2; for i=1:rows(options_list)
o = 1; switch options_list{i,1}
while o<=number_of_options case 'NumberOfMh'
switch strtrim(options_list{2*(o-1)+1}) gmhmaxlikOptions.iterations = options_list{i,2};
case '''NumberOfMh''' case 'ncov-mh'
gmhmaxlikOptions.iterations = str2num(options_list{2*(o-1)+2}); gmhmaxlikOptions.number = options_list{i,2};
case '''ncov-mh''' case 'nscale'
gmhmaxlikOptions.number = str2num(options_list{2*(o-1)+2}); gmhmaxlikOptions.nscale = options_list{i,2};
case '''nscale''' case 'nclimb'
gmhmaxlikOptions.nscale = str2double(options_list{2*(o-1)+2}); gmhmaxlikOptions.nclimb = options_list{i,2};
case '''nclimb''' case 'InitialCovarianceMatrix'
gmhmaxlikOptions.nclimb = str2num(options_list{2*(o-1)+2}); switch options_list{i,2}
case '''InitialCovarianceMatrix'''
switch eval(options_list{2*(o-1)+2})
case 'previous' case 'previous'
if isempty(hh) if isempty(hh)
error('gmhmaxlik: No previous estimate of the Hessian matrix available!') error('gmhmaxlik: No previous estimate of the Hessian matrix available!')
...@@ -375,19 +370,18 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -375,19 +370,18 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
gmhmaxlikOptions.varinit = 'previous' gmhmaxlikOptions.varinit = 'previous'
end end
case {'prior', 'identity'} case {'prior', 'identity'}
gmhmaxlikOptions.varinit = eval(options_list{2*(o-1)+2}); gmhmaxlikOptions.varinit = options_list{i,2};
otherwise otherwise
error('gmhmaxlik: Unknown value for option ''InitialCovarianceMatrix''!') error('gmhmaxlik: Unknown value for option ''InitialCovarianceMatrix''!')
end end
case '''AcceptanceRateTarget''' case 'AcceptanceRateTarget'
gmhmaxlikOptions.target = str2num(options_list{2*(o-1)+2}); gmhmaxlikOptions.target = options_list{i,2};
if gmhmaxlikOptions.target>1 || gmhmaxlikOptions.target<eps if gmhmaxlikOptions.target>1 || gmhmaxlikOptions.target<eps
error('gmhmaxlik: The value of option AcceptanceRateTarget should be a double between 0 and 1!') error('gmhmaxlik: The value of option AcceptanceRateTarget should be a double between 0 and 1!')
end end
otherwise otherwise
Warning(['gmhmaxlik: Unknown option (' options_list{2*(o-1)+1} ')!']) Warning(['gmhmaxlik: Unknown option (' options_list{i,1} ')!'])
end end
o = o + 1;
end end
end end
% Evaluate the objective function. % Evaluate the objective function.
...@@ -485,27 +479,24 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -485,27 +479,24 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
% Dynare implementation of the simplex algorithm. % Dynare implementation of the simplex algorithm.
simplexOptions = options_.simplex; simplexOptions = options_.simplex;
if isfield(options_,'optim_opt') if isfield(options_,'optim_opt')
options_list = strsplit(options_.optim_opt,','); options_list = read_key_value_string(options_.optim_opt);
number_of_options = length(options_list)/2; for i=1:rows(options_list)
o = 1; switch options_list{i,1}
while o<=number_of_options case 'MaxIter'
switch strtrim(options_list{2*(o-1)+1}) simplexOptions.maxiter = options_list{i,2};
case '''MaxIter''' case 'TolFun'
simplexOptions.maxiter = str2num(options_list{2*(o-1)+2}); simplexOptions.tolerance.f = options_list{i,2};
case '''TolFun''' case 'TolX'
simplexOptions.tolerance.f = str2double(options_list{2*(o-1)+2}); simplexOptions.tolerance.x = options_list{i,2};
case '''TolX''' case 'MaxFunEvals'
simplexOptions.tolerance.x = str2double(options_list{2*(o-1)+2}); simplexOptions.maxfcall = options_list{i,2};
case '''MaxFunEvals''' case 'MaxFunEvalFactor'
simplexOptions.maxfcall = str2num(options_list{2*(o-1)+2}); simplexOptions.maxfcallfactor = options_list{i,2};
case '''MaxFunEvalFactor''' case 'InitialSimplexSize'
simplexOptions.maxfcallfactor = str2num(options_list{2*(o-1)+2}); simplexOptions.delta_factor = options_list{i,2};
case '''InitialSimplexSize'''
simplexOptions.delta_factor = str2double(options_list{2*(o-1)+2});
otherwise otherwise
warning(['simplex: Unknown option (' options_list{2*(o-1)+1} ')!']) warning(['simplex: Unknown option (' options_list{i,1} ')!'])
end end
o = o + 1;
end end
end end
[xparam1,fval,exitflag] = simplex_optimization_routine(objective_function,xparam1,simplexOptions,dataset_,options_,M_,estim_params_,bayestopt_,oo_); [xparam1,fval,exitflag] = simplex_optimization_routine(objective_function,xparam1,simplexOptions,dataset_,options_,M_,estim_params_,bayestopt_,oo_);
...@@ -515,23 +506,20 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -515,23 +506,20 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
cmaesOptions = options_.cmaes; cmaesOptions = options_.cmaes;
% Modify defaults % Modify defaults
if isfield(options_,'optim_opt') if isfield(options_,'optim_opt')
options_list = strsplit(options_.optim_opt,','); options_list = read_key_value_string(options_.optim_opt);
number_of_options = length(options_list)/2; for i=1:rows(options_list)
o = 1; switch options_list{i,1}
while o<=number_of_options case 'MaxIter'
switch strtrim(options_list{2*(o-1)+1}) cmaesOptions.MaxIter = options_list{i,2};
case '''MaxIter''' case 'TolFun'
cmaesOptions.MaxIter = str2num(options_list{2*(o-1)+2}); cmaesOptions.TolFun = options_list{i,2};
case '''TolFun''' case 'TolX'
cmaesOptions.TolFun = str2double(options_list{2*(o-1)+2}); cmaesOptions.TolX = options_list{i,2};
case '''TolX''' case 'MaxFunEvals'
cmaesOptions.TolX = str2double(options_list{2*(o-1)+2}); cmaesOptions.MaxFunEvals = options_list{i,2};
case '''MaxFunEvals'''
cmaesOptions.MaxFunEvals = str2num(options_list{2*(o-1)+2});
otherwise otherwise
warning(['cmaes: Unknown option (' options_list{2*(o-1)+1} ')!']) warning(['cmaes: Unknown option (' options_list{i,1} ')!'])
end end
o = o + 1;
end end
end end
warning('off','CMAES:NonfinitenessRange'); warning('off','CMAES:NonfinitenessRange');
...@@ -542,30 +530,27 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -542,30 +530,27 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
case 10 case 10
simpsaOptions = options_.simpsa; simpsaOptions = options_.simpsa;
if isfield(options_,'optim_opt') if isfield(options_,'optim_opt')
options_list = strsplit(options_.optim_opt,','); options_list = read_key_value_string(options_.optim_opt);
number_of_options = length(options_list)/2; for i=1:rows(options_list)
o = 1; switch options_list{i,1}
while o<=number_of_options case 'MaxIter'
switch strtrim(options_list{2*(o-1)+1}) simpsaOptions.MAX_ITER_TOTAL = options_list{i,2};
case '''MaxIter''' case 'TolFun'
simpsaOptions.MAX_ITER_TOTAL = str2num(options_list{2*(o-1)+2}); simpsaOptions.TOLFUN = options_list{i,2};
case '''TolFun''' case 'TolX'
simpsaOptions.TOLFUN = str2double(options_list{2*(o-1)+2}); tolx = options_list{i,2};
case '''TolX'''
tolx = str2double(options_list{2*(o-1)+2});
if tolx<0 if tolx<0
simpsaOptions = rmfield(simpsaOptions,'TOLX'); % Let cmaes choose the default. simpsaOptions = rmfield(simpsaOptions,'TOLX'); % Let simpsa choose the default.
else else
simpsaOptions.TOLX = tolx; simpsaOptions.TOLX = tolx;
end end
case '''EndTemparature''' case 'EndTemparature'
simpsaOptions.TEMP_END = str2double(options_list{2*(o-1)+2}); simpsaOptions.TEMP_END = options_list{i,2};
case '''MaxFunEvals''' case 'MaxFunEvals'
simpsaOptions.MAX_FUN_EVALS = str2num(options_list{2*(o-1)+2}); simpsaOptions.MAX_FUN_EVALS = options_list{i,2};
otherwise otherwise
warning(['simpsa: Unknown option (' options_list{2*(o-1)+1} ')!']) warning(['simpsa: Unknown option (' options_list{i,1} ')!'])
end end
o = o + 1;
end end
end end
simpsaOptionsList = options2cell(simpsaOptions); simpsaOptionsList = options2cell(simpsaOptions);
...@@ -632,7 +617,6 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation ...@@ -632,7 +617,6 @@ if ~isequal(options_.mode_compute,0) && ~options_.mh_posterior_mode_estimation
[junk1, junk2, hh] = feval(objective_function,xparam1, ... [junk1, junk2, hh] = feval(objective_function,xparam1, ...
dataset_,options_,M_,estim_params_,bayestopt_,oo_); dataset_,options_,M_,estim_params_,bayestopt_,oo_);
options_.analytic_derivation = ana_deriv; options_.analytic_derivation = ana_deriv;
else else
hh = reshape(hessian(objective_function,xparam1, ... hh = reshape(hessian(objective_function,xparam1, ...
options_.gstep,dataset_,options_,M_,estim_params_,bayestopt_,oo_),nx,nx); options_.gstep,dataset_,options_,M_,estim_params_,bayestopt_,oo_),nx,nx);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment