2023-09-11 17:17:23 +02:00
function [loss,info,exit_flag,df,vx]= objective ( x,M_, oo_, options_,i_params,i_var,weights)
% [loss,info,exit_flag,df,vx]=objective(x,M_, oo_, options_,i_params,i_var,weights)
% Objective function for optimal simple rules (OSR)
2013-07-28 12:38:15 +02:00
% INPUTS
% x vector values of the parameters
% over which to optimize
2023-09-08 11:55:15 +02:00
% M_ [structure] Dynare's model structure
% oo_ [structure] Dynare's results structure
% options_ [structure] Dynare's options structure
2013-07-28 12:38:15 +02:00
% i_params vector index of optimizing parameters in M_.params
% i_var vector variables indices
% weights vector weights in the OSRs
%
% OUTPUTS
% loss scalar loss function returned to solver
% info vector info vector returned by resol
% exit_flag scalar exit flag returned to solver
2023-09-11 17:17:23 +02:00
% df vectcor Analytic Jacobian
2016-06-01 15:51:13 +02:00
% vx vector variances of the endogenous variables
2013-07-28 12:38:15 +02:00
%
% SPECIAL REQUIREMENTS
% none
2023-09-08 11:55:15 +02:00
% Copyright © 2005-2023 Dynare Team
2008-08-01 20:53:30 +02:00
%
% 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
2021-06-09 17:33:48 +02:00
% along with Dynare. If not, see <https://www.gnu.org/licenses/>.
2008-08-01 20:53:30 +02:00
2015-10-09 14:20:11 +02:00
exit_flag = 1 ;
vx = [ ] ;
2023-09-11 17:17:23 +02:00
df = NaN ( length ( i_params ) , 1 ) ;
% set parameters of the policy rule
2015-10-09 14:20:11 +02:00
M_ . params ( i_params ) = x ;
2023-09-15 13:40:10 +02:00
[ oo_ . dr , info , M_ . params ] = resol ( 0 , M_ , options_ , oo_ . dr , oo_ . steady_state , oo_ . exo_steady_state , oo_ . exo_det_steady_state ) ;
2015-10-09 14:20:11 +02:00
2016-06-01 18:22:51 +02:00
if info ( 1 )
2016-12-09 12:56:36 +01:00
if info ( 1 ) == 3 || info ( 1 ) == 4 || info ( 1 ) == 5 || info ( 1 ) == 6 || info ( 1 ) == 19 || ...
2023-09-11 17:17:23 +02:00
info ( 1 ) == 20 || info ( 1 ) == 21 || info ( 1 ) == 23 || info ( 1 ) == 26 || ...
info ( 1 ) == 81 || info ( 1 ) == 84 || info ( 1 ) == 85
2016-06-01 18:22:51 +02:00
loss = 1e8 ;
info ( 4 ) = info ( 2 ) ;
return
else
loss = 1e8 ;
2017-05-16 15:10:20 +02:00
info ( 4 ) = 0.1 ;
2016-06-01 18:22:51 +02:00
return
end
2015-10-09 14:20:11 +02:00
end
2023-09-11 17:17:23 +02:00
if ~ options_ . analytic_derivation
vx = osr . get_variance_of_endogenous_variables ( M_ , options_ , oo_ . dr , i_var ) ;
loss = full ( weights ( : ) ' * vx ( : ) ) ;
else
totparam_nbr = length ( i_params ) ;
2023-09-25 22:11:21 +02:00
oo_ . dr . derivs = get_perturbation_params_derivs ( M_ , options_ , [ ] , oo_ . dr , oo_ . steady_state , oo_ . exo_steady_state , oo_ . exo_det_steady_state , i_params , [ ] , [ ] , 0 ) ; %analytic derivatives of perturbation matrices
2023-09-11 17:17:23 +02:00
pruned_state_space = pruned_state_space_system ( M_ , options_ , oo_ . dr , i_var , 0 , 0 , 1 ) ;
vx = pruned_state_space . Var_y + pruned_state_space . E_y * pruned_state_space . E_y ' ;
dE_yy = pruned_state_space . dVar_y ;
for jp = 1 : length ( i_params )
dE_yy ( : , : , jp ) = dE_yy ( : , : , jp ) + pruned_state_space . dE_y ( : , jp ) * pruned_state_space . E_y ' + pruned_state_space . E_y * pruned_state_space . dE_y ( : , jp ) ' ;
end
model_moments_params_derivs = reshape ( dE_yy , length ( i_var ) ^2 , totparam_nbr ) ;
df = NaN ( totparam_nbr , 1 ) ;
loss = full ( weights ( : ) ' * vx ( : ) ) ;
for jp = 1 : length ( i_params )
df ( jp , 1 ) = sum ( weights ( : ) .* model_moments_params_derivs ( : , jp ) ) ;
end
end