diff --git a/matlab/print_expectations.m b/matlab/print_expectations.m index 89be53633074e74b5b660725daa98919422be7f9..d53a3238d8c0c23aaa8f9a708055591148b7f0f5 100644 --- a/matlab/print_expectations.m +++ b/matlab/print_expectations.m @@ -361,32 +361,35 @@ if isequal(expectationmodelkind, 'pac') && growth_correction pgrowth = M_.params(expectationmodel.growth_neutrality_param_index); for iter = 1:numel(expectationmodel.growth_linear_comb) vgrowth=''; + variable = []; if expectationmodel.growth_linear_comb(iter).exo_id > 0 variable = M_.exo_names{expectationmodel.growth_linear_comb(iter).exo_id}; elseif expectationmodel.growth_linear_comb(iter).endo_id > 0 variable = M_.endo_names{expectationmodel.growth_linear_comb(iter).endo_id}; end - [variable, transformations] = rewrite_aux_variable(variable, M_); - if isempty(transformations) - if expectationmodel.growth_linear_comb(iter).lag ~= 0 - variable = sprintf('%s(%d)', variable, expectationmodel.growth_linear_comb(iter).lag); - end - else - for k=rows(transformations):-1:1 - if isequal(transformations{k,1}, 'lag') - variable = sprintf('%s.lag(%u)', variable, -transformations{k,2}); - elseif isequal(transformations{k,1}, 'diff') - if isempty(transformations{k,2}) - variable = sprintf('%s.%s()', variable, transformations{k,1}); + if ~isempty(variable) + [variable, transformations] = rewrite_aux_variable(variable, M_); + if isempty(transformations) + if expectationmodel.growth_linear_comb(iter).lag ~= 0 + variable = sprintf('%s(%d)', variable, expectationmodel.growth_linear_comb(iter).lag); + end + else + for k=rows(transformations):-1:1 + if isequal(transformations{k,1}, 'lag') + variable = sprintf('%s.lag(%u)', variable, -transformations{k,2}); + elseif isequal(transformations{k,1}, 'diff') + if isempty(transformations{k,2}) + variable = sprintf('%s.%s()', variable, transformations{k,1}); + else + variable = sprintf('%s(-%u).%s()', variable, transformations{k,2}, transformations{k,1}); + end else - variable = sprintf('%s(-%u).%s()', variable, transformations{k,2}, transformations{k,1}); + variable = sprintf('%s.%s()', variable, transformations{k}); end - else - variable = sprintf('%s.%s()', variable, transformations{k}); end end + vgrowth = strcat('dbase.', variable); end - vgrowth = strcat('dbase.', variable); if expectationmodel.growth_linear_comb(iter).param_id > 0 if ~isempty(vgrowth) vgrowth = sprintf('%1.16f*%s',M_.params(expectationmodel.growth_linear_comb(iter).param_id), vgrowth); @@ -408,8 +411,8 @@ if isequal(expectationmodelkind, 'pac') && growth_correction linearCombination = sprintf('%s-%s', linearCombination, vgrowth); end else - linearCombination = vgrowth; - end + linearCombination = vgrowth; + end end % loop over growth linear combination elements growthcorrection = sprintf('%1.16f*(%s)', pgrowth, linearCombination); else @@ -419,32 +422,35 @@ if isequal(expectationmodelkind, 'pac') && growth_correction pgrowth = targetcoefficients(i)*M_.params(expectationmodel.components(i).growth_neutrality_param_index); for iter = 1:numel(expectationmodel.components(i).growth_linear_comb) vgrowth=''; + variable=[]; if expectationmodel.components(i).growth_linear_comb(iter).exo_id > 0 variable = M_.exo_names{expectationmodel.components(i).growth_linear_comb(iter).exo_id}; elseif expectationmodel.components(i).growth_linear_comb(iter).endo_id > 0 variable = M_.endo_names{expectationmodel.components(i).growth_linear_comb(iter).endo_id}; end - [variable, transformations] = rewrite_aux_variable(variable, M_); - if isempty(transformations) - if expectationmodel.components(i).growth_linear_comb(iter).lag ~= 0 - variable = sprintf('%s(%d)', variable, expectationmodel.components(i).growth_linear_comb(iter).lag); - end - else - for k=rows(transformations):-1:1 - if isequal(transformations{k,1}, 'lag') - variable = sprintf('%s.lag(%u)', variable, -transformations{k,2}); - elseif isequal(transformations{k,1}, 'diff') - if isempty(transformations{k,2}) - variable = sprintf('%s.%s()', variable, transformations{k,1}); + if ~isempty(variable) + [variable, transformations] = rewrite_aux_variable(variable, M_); + if isempty(transformations) + if expectationmodel.components(i).growth_linear_comb(iter).lag ~= 0 + variable = sprintf('%s(%d)', variable, expectationmodel.components(i).growth_linear_comb(iter).lag); + end + else + for k=rows(transformations):-1:1 + if isequal(transformations{k,1}, 'lag') + variable = sprintf('%s.lag(%u)', variable, -transformations{k,2}); + elseif isequal(transformations{k,1}, 'diff') + if isempty(transformations{k,2}) + variable = sprintf('%s.%s()', variable, transformations{k,1}); + else + variable = sprintf('%s(-%u).%s()', variable, transformations{k,2}, transformations{k,1}); + end else - variable = sprintf('%s(-%u).%s()', variable, transformations{k,2}, transformations{k,1}); + variable = sprintf('%s.%s()', variable, transformations{k}); end - else - variable = sprintf('%s.%s()', variable, transformations{k}); end end + vgrowth = strcat('dbase.', variable); end - vgrowth = strcat('dbase.', variable); if expectationmodel.components(i).growth_linear_comb(iter).param_id > 0 if ~isempty(vgrowth) vgrowth = sprintf('%1.16f*%s',M_.params(expectationmodel.components(i).growth_linear_comb(iter).param_id), vgrowth); diff --git a/tests/Makefile.am b/tests/Makefile.am index 8d007ff13754f973f53ddc1b708030703894d5fb..62da3ef47a0ebd1f177991b7f52d914194573bca 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -531,6 +531,7 @@ ECB_MODFILES = \ pac/var-11e/example1.mod \ pac/var-12/example1.mod \ pac/var-12/example2.mod \ + pac/var-12/example4.mod \ pac/var-12/example11.mod \ pac/var-12/example12.mod \ pac/trend-component-1/example1.mod \ diff --git a/tests/pac/var-12/example4.mod b/tests/pac/var-12/example4.mod new file mode 100644 index 0000000000000000000000000000000000000000..ef709aa25cbaf72d9cb48d629440f80d6b682b14 --- /dev/null +++ b/tests/pac/var-12/example4.mod @@ -0,0 +1,69 @@ +// --+ options: json=compute, stochastic +-- + +var y x z v; + +varexo ex ey ez ; + +parameters a_y_1 a_y_2 b_y_1 b_y_2 b_x_1 b_x_2 d_y; // VAR parameters + +parameters beta e_c_m c_z_1 c_z_2; // PAC equation parameters + +a_y_1 = .2; +a_y_2 = .3; +b_y_1 = .1; +b_y_2 = .4; +b_x_1 = -.1; +b_x_2 = -.2; +d_y = .5; + + +beta = .9; +e_c_m = .1; +c_z_1 = .7; +c_z_2 = -.3; + +var_model(model_name=toto, structural, eqtags=['eq:x', 'eq:y']); + +pac_model(auxiliary_model_name=toto, discount=beta, model_name=pacman); + +pac_target_info(pacman); + target v; + auxname_target_nonstationary vns; + + component y; + growth 0; + auxname pv_y_; + kind dl; + + component x; + growth diff(x(-2)); + auxname pv_dx_; + kind dd; + +end; + +model; + + [name='eq:y'] + y = a_y_1*y(-1) + a_y_2*diff(x(-1)) + b_y_1*y(-2) + b_y_2*diff(x(-2)) + ey ; + + + [name='eq:x'] + diff(x) = b_x_1*y(-2) + b_x_2*diff(x(-1)) + ex ; + + [name='eq:v'] + v = x + d_y*y ; + + [name='eq:pac'] + diff(z) = e_c_m*(pac_target_nonstationary(pacman)-z(-1)) + c_z_1*diff(z(-1)) + c_z_2*diff(z(-2)) + pac_expectation(pacman) + ez; + +end; + +// Initialize the PAC model (build the Companion VAR representation for the auxiliary model). +pac.initialize('pacman'); + +// Update the parameters of the PAC expectation model (h0 and h1 vectors). +pac.update.expectation('pacman'); + +// Print expanded PAC_EXPECTATION term. +pac.print('pacman', 'eq:pac');