From 25b3c84b40d7da6bcc08f730c1b842b1f830919d Mon Sep 17 00:00:00 2001 From: Ferhat Mihoubi Date: Fri, 17 Sep 2010 16:53:27 +0200 Subject: [PATCH] RESID command is compatible now with block option and without bytecode option (closes ticket #45) --- matlab/resid.m | 15 ++++++++++++++- preprocessor/StaticModel.cc | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/matlab/resid.m b/matlab/resid.m index 37d2a8a01..e88b20a82 100644 --- a/matlab/resid.m +++ b/matlab/resid.m @@ -55,7 +55,20 @@ end % Compute the residuals if options_.block && ~options_.bytecode - error('RESID: incompatibility with "block" without "bytecode" option') + z = zeros(M_.endo_nbr,1); + for i = 1:length(M_.blocksMFS) + [r, g, yy, var_indx] = feval([M_.fname '_static'],... + i,... + oo_.steady_state,... + [oo_.exo_steady_state; ... + oo_.exo_det_steady_state], M_.params); + if isempty(M_.blocksMFS{i}) + idx = var_indx; + else + idx = M_.blocksMFS{i}; + end + z(idx) = r; + end elseif options_.block && options_.bytecode [z,check] = bytecode('evaluate','static'); else diff --git a/preprocessor/StaticModel.cc b/preprocessor/StaticModel.cc index d060556c5..64aa97b09 100644 --- a/preprocessor/StaticModel.cc +++ b/preprocessor/StaticModel.cc @@ -1069,9 +1069,10 @@ StaticModel::writeStaticBlockMFSFile(const string &basename) const string func_name = basename + "_static"; - output << "function [residual, g1, y] = " << func_name << "(nblock, y, x, params)" << endl + output << "function [residual, g1, y, var_index] = " << func_name << "(nblock, y, x, params)" << endl << " residual = [];" << endl << " g1 = [];" << endl + << " var_index = [];\n" << endl << " switch nblock" << endl; unsigned int nb_blocks = getNbBlocks(); @@ -1086,9 +1087,18 @@ StaticModel::writeStaticBlockMFSFile(const string &basename) const BlockSimulationType simulation_type = getBlockSimulationType(b); if (simulation_type == EVALUATE_BACKWARD || simulation_type == EVALUATE_FORWARD) - output << " y = " << func_name << "_" << b+1 << "(y, x, params);\n"; + { + output << " y_tmp = " << func_name << "_" << b+1 << "(y, x, params);\n"; + ostringstream tmp; + for (int i = 0; i < getBlockSize(b); i++) + tmp << " " << getBlockVariableID(b, i)+1; + output << " var_index = [" << tmp.str() << "];\n"; + output << " residual = y(var_index) - y_tmp(var_index);\n"; + output << " y = y_tmp;\n"; + } else output << " [residual, y, g1] = " << func_name << "_" << b+1 << "(y, x, params);\n"; + } output << " end" << endl << "end" << endl;