var_forecast: clean up writing of forecast function

time-shift
Houtan Bastani 2016-11-22 13:08:37 +01:00 committed by Stéphane Adjemian (Charybdis)
parent 7c28e217e5
commit 20ba99cf94
1 changed files with 30 additions and 21 deletions

View File

@ -19,10 +19,10 @@ end
%%
fprintf(fid, 'function ret = %s(y)\n', basename);
fprintf(fid, '%%function ret = %s(y, h)\n', basename);
fprintf(fid, '%%function ret = %s(y)\n', basename);
fprintf(fid, '%% Calculates the %d-step-ahead forecast from the VAR model %s\n', max(horizon), var_model_name);
fprintf(fid, '%%\n%% Created automatically by Dynare\n%%\n\n');
fprintf(fid, '%%%% Construct ret\n');
fprintf(fid, '%%\n%% Created automatically by Dynare on %s\n%%\n\n', datetime);
fprintf(fid, '%%%% Construct y\n');
fprintf(fid, 'assert(length(y) == %d);\n', sum(sum(M_.lead_lag_incidence ~= 0)));
endo_names = cellstr(M_.endo_names);
@ -55,26 +55,27 @@ end
if M_.var.(var_model_name).order > 1
mu = [mu; zeros(lm*M_.var.(var_model_name).order-lm, 1)];
end
fprintf(fid, '%%%% Calculate h-step-ahead forecast\n');
fprintf(fid, 'retidx = 1;\n');
fprintf(fid, 'ret = zeros(%d, %d);\n', length(horizon), lm);
fprintf(fid, 'for i=1:%d\n', max(horizon));
fprintf(fid, ' y = [');
fprintf(fid, [repmat(' %f ', 1, size(mu, 2)) ';'], mu');
fprintf(fid, '] + [');
fprintf(fid, [repmat(' %f ', 1, size(A, 2)) ';'], A');
fprintf(fid, ']*y(:);\n');
if length(horizon) == 1
fprintf(fid, ' if %d == i\n', horizon);
fprintf(fid, '\n%%%% Calculate %d-step-ahead forecast\n', max(horizon));
if max(horizon) == 1
printInsideOfLoop(fid, mu, A, '');
fprintf(fid, 'ret(1, :) = y(1:%d);\n', lm);
else
fprintf(fid, ' if any([');
fprintf(fid, '%d ', horizon);
fprintf(fid, '] == i)\n');
fprintf(fid, 'retidx = 1;\n');
fprintf(fid, 'ret = zeros(%d, %d);\n', length(horizon), lm);
fprintf(fid, 'for i=1:%d\n', max(horizon));
printInsideOfLoop(fid, mu, A, ' ');
if length(horizon) == 1
fprintf(fid, ' if %d == i\n', horizon);
else
fprintf(fid, ' if any([');
fprintf(fid, '%d ', horizon);
fprintf(fid, '] == i)\n');
end
fprintf(fid, ' ret(retidx, :) = y(1:%d);\n', lm);
fprintf(fid, ' retidx = retidx + 1;\n');
fprintf(fid, ' end\n');
fprintf(fid, 'end\n');
end
fprintf(fid, ' ret(retidx, :) = y(1:%d);\n', lm);
fprintf(fid, ' retidx = retidx + 1;\n');
fprintf(fid, ' end\n');
fprintf(fid, 'end\n');
% retidx = find(strcmp(dwrt, endo_names) & yidx == 1);
% assert(~isempty(retidx))
@ -87,4 +88,12 @@ fprintf(fid, 'end\n');
%% close file
fprintf(fid, 'end\n');
fclose(fid);
end
function printInsideOfLoop(fid, mu, A, spaces)
fprintf(fid, '%sy = [',spaces);
fprintf(fid, [repmat(' %f ', 1, size(mu, 2)) ';'], mu');
fprintf(fid, '] + [');
fprintf(fid, [repmat(' %f ', 1, size(A, 2)) ';'], A');
fprintf(fid, ']*y(:);\n');
end