File: osr1.m

package info (click to toggle)
dynare 4.5.7-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 49,408 kB
  • sloc: cpp: 84,998; ansic: 29,058; pascal: 13,843; sh: 4,833; objc: 4,236; yacc: 3,622; makefile: 2,278; lex: 1,541; python: 236; lisp: 69; xml: 8
file content (155 lines) | stat: -rw-r--r-- 5,478 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
function osr_res = osr1(i_params,i_var,weights)
% Compute the Optimal Simple Rules
% INPUTS
%   i_params                  vector           index of optimizing parameters in M_.params
%   i_var                     vector           variables indices in declaration order
%   weights                   vector           weights in the OSRs
%
% OUTPUTS
%   osr_res:    [structure] results structure containing:
%    - objective_function [scalar double]   value of the objective
%                                               function at the optimum
%    - optim_params       [structure]       parameter values at the optimum
%
% Algorithm:
%
%   Uses Newton-type optimizer csminwel to directly solve quadratic
%   osr-problem
%
% Copyright (C) 2005-2017 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/>.

global M_ oo_ options_ it_

klen = M_.maximum_lag + M_.maximum_lead + 1;
iyv = M_.lead_lag_incidence';
iyv = iyv(:);
iyr0 = find(iyv) ;
it_ = M_.maximum_lag + 1 ;

osr_res.error_indicator = 1; %initialize indicator

if M_.exo_nbr == 0
    oo_.exo_steady_state = [] ;
end

if ~ M_.lead_lag_incidence(M_.maximum_lag+1,:) > 0
    error ('OSR: Error in model specification: some variables don''t appear as current') ;
end

if M_.maximum_lead == 0
    error ('OSR: Backward or static model: no point in using OSR') ;
end

if any(any(isinf(weights)))
    error ('OSR: At least one of the optim_weights is infinite.') ;
end

if any(isnan(M_.params(i_params)))
    error ('OSR: At least one of the initial parameter values for osr_params is NaN') ;
end

%restore backward compatibility with maxit and tolf
if isfield(options_.osr,'maxit') || isfield(options_.osr,'tolf')
    warning('OSR: The use of maxit and tolf is now deprecated. Please use the optim-option instead.')
    if options_.osr.opt_algo~=4
        error ('OSR: The maxit and tolf options are not supported when not using the default opt_algo=4. Use the optim-option instead.') ;
    else
        if isfield(options_.osr,'maxit')
            if ~isempty(options_.optim_opt)
                options_.optim_opt=[options_.optim_opt,','];
            end
            options_.optim_opt=[options_.optim_opt,'''MaxIter'',',num2str(options_.osr.maxit),''];
        end
        if isfield(options_.osr,'tolf')
            if ~isempty(options_.optim_opt)
                options_.optim_opt=[options_.optim_opt,','];
            end
            options_.optim_opt=[options_.optim_opt,'''TolFun'',',num2str(options_.osr.tolf),''];
        end
    end
end

exe =zeros(M_.exo_nbr,1);

oo_.dr = set_state_space(oo_.dr,M_,options_);


np = size(i_params,1);
t0 = M_.params(i_params);


inv_order_var = oo_.dr.inv_order_var;


%extract unique entries of covariance
i_var=unique(i_var);
%% do initial checks
[loss,info,exit_flag,vx]=osr_obj(t0,i_params,inv_order_var(i_var),weights(i_var,i_var));
if info~=0
    print_info(info, options_.noprint, options_);
else
    if ~options_.noprint
        fprintf('\nOSR: Initial value of the objective function: %g \n\n',loss);
    end
end
if ~options_.noprint && isinf(loss)
    fprintf('\nOSR: The initial value of the objective function is infinite.\n');
    fprintf('\nOSR: Check whether the unconditional variance of a target variable is infinite\n');
    fprintf('\nOSR: due to the presence of a unit root.\n');
    error('OSR: Initial likelihood is infinite')
end


if isequal(options_.osr.opt_algo,5)
    error('OSR: OSR does not support opt_algo=5.')
elseif isequal(options_.osr.opt_algo,6)
    error('OSR: OSR does not support opt_algo=6.')
elseif isequal(options_.osr.opt_algo,10)
    error('OSR: OSR does not support opt_algo=10.')
elseif isequal(options_.osr.opt_algo,11)
    error('OSR: OSR does not support opt_algo=11.')
else

    if ~isempty(M_.osr.param_bounds) && ~(ismember(options_.osr.opt_algo,[1,2,5,9]) || ischar(options_.osr.opt_algo))
        error('OSR: OSR with bounds on parameters requires a constrained optimizer, i.e. 1,2,5, or 9.')
    end
    %%do actual optimization
    [p, f, exitflag] = dynare_minimize_objective(str2func('osr_obj'),t0,options_.osr.opt_algo,options_,M_.osr.param_bounds,cellstr(M_.param_names(i_params,:)),[],[], i_params,...
                                                 inv_order_var(i_var),weights(i_var,i_var));
end

osr_res.objective_function = f;
M_.params(i_params)=p; %make sure optimal parameters are set (and not the last draw used in csminwel)
for i=1:length(i_params)
    osr_res.optim_params.(deblank(M_.param_names(i_params(i),:))) = p(i);
end

if ~options_.noprint
    skipline()
    disp('OPTIMAL VALUE OF THE PARAMETERS:')
    skipline()
    for i=1:np
        disp(sprintf('%16s %16.6g\n',M_.param_names(i_params(i),:),p(i)))
    end
    disp(sprintf('Objective function : %16.6g\n',f));
    skipline()
end
[oo_.dr,info,M_,options_,oo_] = resol(0,M_,options_,oo_);
if ~info
    osr_res.error_indicator=0;
end