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

Merge branch 'pfm-unexpected'

Adds interface for unexpected shocks in perfect foresight models.
parents c684a18b 4eb5633f
Branches
No related tags found
No related merge requests found
......@@ -22,13 +22,13 @@ Main functionalities:
How to run it:
--------------
- Temporarly add the dynare/matlab folder to the matlab's path.
- Temporarily add the dynare/matlab folder to the matlab's path.
```matlab
>> addpath c:\dynare\4.x.y\matlab
```
- Temporarly add folder containing the fonction Dynare_GUI to the matlab's path
- Temporarily add the folder containing the function Dynare_GUI to the Matlab's path
```matlab
>> addpath c:\dynare\dynare-gui\src
......@@ -41,7 +41,6 @@ How to run it:
>> Dynare_GUI
```
- Important note:
Following folder is not on GitHub, but it is necessary for running the application: \src\resources
- Important notes:
The following folder is not on GitHub, but it is necessary for running the application: \src\resources
function pf_unanticipated(data)
% Allows deterministic simulation with unanticipated shocks
%
% INPUTS
% none
%
% OUTPUTS
% none
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 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 oo_;
global M_;
num = rows(data);
ant = {} ; unant = {};
shock_matrix_array = {};
% Create two matrices for anticipated and unexpected shocks
for i = 1:num
aux = data(i,1:5);
if aux{1,2} == 1
aux{1,5} = true;
end
if ~aux{1,5}
ant = sortrows([ant;aux],2);
else
unant = sortrows([unant;aux],2);
end
end
for i = 1:rows(unant)
% Sort both matrices by increasing number of periods
det_aux = unant(i,:);
for j = 1:rows(ant)
if ant{j,2} > unant{i,2}
det_aux = [det_aux; ant(j,:)];
end
end
% Re-index periods
idx = det_aux{1,2} - 1;
for k = 1:rows(det_aux)
det_aux{k,2} = det_aux{k,2} - idx;
end
% Create "provisional" M_.det_shocks for each unanticipated shock
det_shocks_prov = struct([]);
for n = 1:size(det_aux,1)
exo_id = find(ismember(M_.exo_names, det_aux{n,1}, 'rows'));
if(~isempty(exo_id))
det_shocks_prov = [det_shocks_prov; struct('exo_det',0,'exo_id',exo_id,'multiplicative',0,...
'periods',det_aux{n,2},'value',det_aux{n,3})];
else
gui_tools.show_error('Error while saving deterministic shocks!');
end
end
% Store each "provisional" M_.det_shocks in cell
shock_matrix_array{i,1} = det_shocks_prov;
end
M_.det_shocks = shock_matrix_array{1,1};
yy = oo_.steady_state;
perfect_foresight_setup;
perfect_foresight_solver;
yy = [yy, oo_.endo_simul(:,shock_matrix_array{1,1}(end).periods - 1)];
for i = 2:rows(shock_matrix_array)
M_.det_shocks = shock_matrix_array{i,1};
oo_.endo_simul(:,1) = yy(:,end);
perfect_foresight_solver;
yy = [yy, oo_.endo_simul(:,shock_matrix_array{i,1}(end).periods - 1)];
end
end
\ No newline at end of file
......@@ -176,25 +176,23 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
'Enable', 'Off',...
'Callback', @pussbuttonAddValue_Callback);
column_names = {'Shock ','Period ','Value ', 'Remove '};
column_format = {'char','numeric','numeric', 'logical'};
column_names = {'Shock ','Period ','Value ', 'Remove ','Unanticipated?'}; %%%
column_format = {'char','numeric','numeric', 'logical','logical'};%%%
data = get_det_shocks();
handles.shocks_table = uitable(handles.shocks_panel,'Data',data, ...
'Units','normalized','Position',[0.02 0.10 0.96 0.6],...
'ColumnName', column_names,...
'ColumnFormat', column_format,...
'ColumnEditable', [false true true true],...
'ColumnWidth', {150, 90, 90, 60}, ...
'ColumnEditable', [false true true true true],... %%%
'ColumnWidth', {200, 50, 90, 60, 100}, ... %%%
'RowName',[],...
'CellEditCallback',@savedata);
handles.pussbuttonRemoveValue = uicontrol('Parent',handles.shocks_panel,'Style','pushbutton','Units','normalized','Position',[0.73 0.03 0.25 0.06],...
'String', 'Remove all selected', ...
'Enable', 'Off',...
'Callback', @pussbuttonRemoveValues_Callback);
%initval and endval
column_names = {'Shock ','Initval ','Endval '};
column_format = {'char','numeric','numeric'};
......@@ -225,6 +223,7 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
shocks_data_items = shocks_data_items +1;
shocks_data{shocks_data_items,1} = selected_shock;
shocks_data{shocks_data_items,4} = false;
shocks_data{shocks_data_items,5} = false; %%%
set(handles.shocks_table, 'Data', shocks_data);
end
end
......@@ -233,7 +232,7 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
shocks_data = get(handles.shocks_table, 'Data');
shocks_data_items = size(shocks_data,1);
num=0;
new_data = cell(0,4);
new_data = cell(0,5); %%%
for(i=1:shocks_data_items)
if(~shocks_data{i,4})
num = num+1;
......@@ -257,18 +256,17 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
end
end
function data = get_det_shocks()
data = cell(0,4);
data = cell(0,5); %%%
if(isfield(M_,'det_shocks') && ~isempty(M_.det_shocks))
num = size(M_.det_shocks);
for i=1:num
data{i,1} = M_.exo_names(M_.det_shocks(i).exo_id);
data{i,1} = M_.exo_names(M_.det_shocks(i).exo_id,:);
data{i,2} = M_.det_shocks(i).periods;
data{i,3} = M_.det_shocks(i).value;
data{i,4} = false;
data{i,5} = false; %%%
end
end
end
......@@ -283,12 +281,11 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
struct('exo_det',0,'exo_id',exo_id,'multiplicative',0,'periods',data{i,2},'value',data{i,3}) ];
else
gui_tools.show_error('Error while saving deterministic shocks!');
end
end
end
end
function data = get_exo_steady_states()
data = cell(M_.exo_nbr,3);
for i=1:M_.exo_nbr
......@@ -329,7 +326,6 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
end
end
function pussbuttonSimulation_Callback(hObject,evendata)
comm_str = get(handles.simul, 'String');
......@@ -377,12 +373,32 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
end
model_settings.varlist_.simul = var_list_;
data = get(handles.shocks_table, 'Data');
aux = data(:,5);
is_unant = 0;
for i = 1:rows(aux)
if aux{i}
is_unant = is_unant + 1;
end
end
try
if is_unant == 0
set_det_shocks();
set_exo_steady_states();
perfect_foresight_setup;
perfect_foresight_solver;
else
set_exo_steady_states();
unanticipated_shocks();
% Uncomment the following if you want to keep the
% original M_.det_shocks after simulation
%
% set_det_shocks();
end
vars = getVariablesSelected;
for ii=1: size(vars,2)
rplot(vars{ii});
......@@ -406,7 +422,6 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
end
end
function pussbuttonReset_Callback(hObject,evendata)
for ii = 1:handles.numVars
set(handles.vars(ii),'Value',0);
......@@ -479,10 +494,8 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
num=num+1;
varName = get(handles.vars(ii),'TooltipString');
vars(num) = cellstr(varName);
end
end
end
function pussbuttonCloseAll_Callback(hObject,evendata)
......@@ -493,4 +506,10 @@ handles.pushbuttonCommandDefinition = uicontrol( ...
gui_tabs.delete_tab(hTab);
end
function unanticipated_shocks()
data = get(handles.shocks_table, 'Data');
gui_auxiliary.pf_unanticipated(data);
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment