* Added new option stack_solve_algo to simul

* Added solve_algo=5 for steady
* Remove obsolete method option of simul
* Added various checks to avoid unimplemented combinations of bytecode/block/solve_algo/stack_solve_algo


git-svn-id: https://www.dynare.org/svn/dynare/trunk@2882 ac1d8469-bf42-47a9-8791-bf33cf982152
time-shift
sebastien 2009-09-02 16:34:48 +00:00
parent 9f45200924
commit 74232e9ee5
10 changed files with 63 additions and 221 deletions

View File

@ -106,6 +106,9 @@ function global_initialization()
% Model
options_.linear = 0;
% Deterministic simulation
options_.stack_solve_algo = 0;
% Solution
options_.order = 2;
options_.solve_algo = 2;
@ -173,7 +176,6 @@ function global_initialization()
options_.prefilter = 0;
options_.presample = 0;
options_.prior_trunc = 1e-10;
options_.simulation_method = 0;
options_.smoother = 0;
options_.student_degrees_of_freedom = 3;
options_.subdraws = [];

View File

@ -71,6 +71,16 @@ if options_.simul_algo == 0
options_.scalv= 1 ;
if ~options_.block && ~options_.bytecode && options_.stack_solve_algo ~= 0
error('SIMUL: for the moment, you must use stack_solve_algo=0 when not using block nor bytecode option')
end
if options_.block && ~options_.bytecode && (options_.stack_solve_algo == 0 || options_.stack_solve_algo == 5)
error('SIMUL: for the moment, you must use stack_solve_algo={1,2,3,4} when using block without bytecode option')
end
if options_.block && options_.bytecode && options_.stack_solve_algo ~= 5
error('SIMUL: for the moment, you must use stack_solve_algo=5 with block and bytecode option')
end
if(options_.block)
if(options_.bytecode)
oo_.endo_simul=bytecode('dynamic');

View File

@ -1,4 +1,4 @@
function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, periods, is_linear, Block_Num, y_kmin, maxit_, solve_tolf, lambda, cutoff, simulation_method, forward_backward, is_dynamic, verbose)
function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, periods, is_linear, Block_Num, y_kmin, maxit_, solve_tolf, lambda, cutoff, stack_solve_algo, forward_backward, is_dynamic, verbose)
% Computes the deterministic simulation of a block of equation containing
% lead or lag variables
%
@ -23,11 +23,12 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
% Newton
% cutoff [double] cutoff to correct the direction in Newton in case
% of singular jacobian matrix
% simulation_method [integer] linear solver method used in the
% stack_solve_algo [integer] linear solver method used in the
% Newton algorithm :
% - 0 sprse LU
% - 1 sparse LU
% - 2 GMRES
% - 3 BicGStab
% - 4 Optimal path length
% forward_backward [integer] The block has to be solve forward
% (1) or backward (0)
% is_dynamic [integer] (1) The block belong to the dynamic
@ -35,7 +36,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
% (0) The block belong to the static
% file and th oo_.deteerminstic
% field remains unchanged
% verobse [integer] (0) iterations are not printed
% verbose [integer] (0) iterations are not printed
% (1) iterations are printed
%
% OUTPUTS
@ -48,7 +49,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
% none.
%
% Copyright (C) 1996-2008 Dynare Team
% Copyright (C) 1996-2009 Dynare Team
%
% This file is part of Dynare.
%
@ -232,7 +233,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
else
info = -Block_Num*10;
end
elseif((~is_dynamic & options_.solve_algo==2) || (is_dynamic & simulation_method==4))
elseif((~is_dynamic & options_.solve_algo==2) || (is_dynamic & stack_solve_algo==4))
lambda=1;
stpmx = 100 ;
if (is_dynamic)
@ -254,7 +255,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
[yn,info] = csolve(@local_fname, y(y_index_eq),@local_fname,1e-6,500, x, params, y, y_index_eq, fname, 1);
dx = ya - yn;
y(y_index_eq) = yn;
elseif((simulation_method==0 & is_dynamic) | (~is_dynamic & options_.solve_algo==1)),
elseif((stack_solve_algo==1 & is_dynamic) | (~is_dynamic & options_.solve_algo==1)),
dx = g1\r;
ya = ya - lambda*dx;
if(is_dynamic)
@ -262,7 +263,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
else
y(y_index_eq) = ya;
end;
elseif(simulation_method==2 & is_dynamic),
elseif(stack_solve_algo==2 & is_dynamic),
flag1=1;
while(flag1>0)
[L1, U1]=luinc(g1,luinc_tol);
@ -288,7 +289,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
end;
end;
end;
elseif(simulation_method==3 & is_dynamic),
elseif(stack_solve_algo==3 & is_dynamic),
flag1=1;
while(flag1>0)
[L1, U1]=luinc(g1,luinc_tol);
@ -317,7 +318,7 @@ function [y, info] = solve_one_boundary(fname, y, x, params, y_index_eq, nze, pe
else
disp('unknown option : ');
if(is_dynamic)
disp(['options_.simulation_method = ' num2str(simulation_method) ' not implemented']);
disp(['options_.stack_solve_algo = ' num2str(stack_solve_algo) ' not implemented']);
else
disp(['options_.solve_algo = ' num2str(options_.solve_algo) ' not implemented']);
end;

View File

@ -1,4 +1,4 @@
function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_kmin_l, y_kmax_l, is_linear, Block_Num, y_kmin, maxit_, solve_tolf, lambda, cutoff, simulation_method)
function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_kmin_l, y_kmax_l, is_linear, Block_Num, y_kmin, maxit_, solve_tolf, lambda, cutoff, stack_solve_algo)
% Computes the deterministic simulation of a block of equation containing
% both lead and lag variables using relaxation methods
%
@ -25,11 +25,12 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
% Newton
% cutoff [double] cutoff to correct the direction in Newton in case
% of singular jacobian matrix
% simulation_method [integer] linear solver method used in the
% stack_solve_algo [integer] linear solver method used in the
% Newton algorithm :
% - 0 sprse LU
% - 1 sprse LU
% - 2 GMRES
% - 3 BicGStab
% - 4 Optimal path length
%
% OUTPUTS
% y [matrix] All endogenous variables of the model
@ -41,7 +42,7 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
% none.
%
% Copyright (C) 1996-2008 Dynare Team
% Copyright (C) 1996-2009 Dynare Team
%
% This file is part of Dynare.
%
@ -58,7 +59,7 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
global options_ oo_ M_ T9025 T1149 T11905;
global oo_ M_;
cvg=0;
iter=0;
Per_u_=0;
@ -208,7 +209,7 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
g1aa=g1a;
ba=b;
max_resa=max_res;
if(simulation_method==0),
if(stack_solve_algo==1),
dx = g1a\b- ya;
ya = ya + lambda*dx;
y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';
@ -220,7 +221,7 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
% v
% sprintf(v,y(:,y_index)')
% return;
elseif(simulation_method==2),
elseif(stack_solve_algo==2),
flag1=1;
while(flag1>0)
[L1, U1]=luinc(g1a,luinc_tol);
@ -241,7 +242,7 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';
end;
end;
elseif(simulation_method==3),
elseif(stack_solve_algo==3),
flag1=1;
while(flag1>0)
[L1, U1]=luinc(g1a,luinc_tol);
@ -262,6 +263,8 @@ function y = solve_two_boundaries(fname, y, x, params, y_index, nze, periods, y_
y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';
end;
end;
elseif(stack_solve_algo==4),
error('SOLVE_TWO_BOUNDARIES: stack_solve_algo=4 not implemented')
end;
end
iter=iter+1;

View File

@ -28,6 +28,13 @@ function steady_()
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
global M_ oo_ it_ options_
if options_.bytecode && options_.solve_algo ~= 5
error('STEADY: for the moment, you must use solve_algo=5 with bytecode option')
end
if ~options_.bytecode && options_.solve_algo == 5
error('STEADY: you can''t yet use solve_algo=5 without bytecode option')
end
if options_.steadystate_flag
[oo_.steady_state,check] = feval([M_.fname '_steadystate'],...

View File

@ -1483,12 +1483,14 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri
mDynamicModelFile << " return;\n";
mDynamicModelFile << " end;\n";
mDynamicModelFile << " %it is the deterministic simulation of the block decomposed dynamic model\n";
mDynamicModelFile << " if(options_.simulation_method==0)\n";
mDynamicModelFile << " if(options_.stack_solve_algo==1)\n";
mDynamicModelFile << " mthd='Sparse LU';\n";
mDynamicModelFile << " elseif(options_.simulation_method==2)\n";
mDynamicModelFile << " elseif(options_.stack_solve_algo==2)\n";
mDynamicModelFile << " mthd='GMRES';\n";
mDynamicModelFile << " elseif(options_.simulation_method==3)\n";
mDynamicModelFile << " elseif(options_.stack_solve_algo==3)\n";
mDynamicModelFile << " mthd='BICGSTAB';\n";
mDynamicModelFile << " elseif(options_.stack_solve_algo==4)\n";
mDynamicModelFile << " mthd='OPTIMPATH';\n";
mDynamicModelFile << " else\n";
mDynamicModelFile << " mthd='UNKNOWN';\n";
mDynamicModelFile << " end;\n";
@ -1594,7 +1596,7 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri
mDynamicModelFile << " y = solve_one_boundary('" << dynamic_basename << "_" << i + 1 << "'" <<
", y, x, params, y_index, " << nze <<
", options_.periods, " << block_triangular.ModelBlock->Block_List[i].is_linear <<
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.simulation_method, 1, 1, 0);\n";
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.stack_solve_algo, 1, 1, 0);\n";
mDynamicModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mDynamicModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mDynamicModelFile << " disp(['Inf or Nan value during the resolution of block " << i <<"']);\n";
@ -1625,7 +1627,7 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri
mDynamicModelFile << " y = solve_one_boundary('" << dynamic_basename << "_" << i + 1 << "'" <<
", y, x, params, y_index, " << nze <<
", options_.periods, " << block_triangular.ModelBlock->Block_List[i].is_linear <<
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.simulation_method, 1, 1, 0);\n";
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.stack_solve_algo, 1, 1, 0);\n";
mDynamicModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mDynamicModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mDynamicModelFile << " disp(['Inf or Nan value during the resolution of block " << i <<"']);\n";
@ -1657,7 +1659,7 @@ DynamicModel::writeSparseDynamicMFile(const string &dynamic_basename, const stri
", options_.periods, " << block_triangular.ModelBlock->Block_List[i].Max_Lag <<
", " << block_triangular.ModelBlock->Block_List[i].Max_Lead <<
", " << block_triangular.ModelBlock->Block_List[i].is_linear <<
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.simulation_method);\n";
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.stack_solve_algo);\n";
mDynamicModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mDynamicModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mDynamicModelFile << " disp(['Inf or Nan value during the resolution of block " << i <<"']);\n";

View File

@ -87,7 +87,7 @@ class ParsingDriver;
%}
%token AR AUTOCORR
%token BAYESIAN_IRF BETA_PDF BICGSTAB BLOCK
%token BAYESIAN_IRF BETA_PDF BLOCK
%token BVAR_DENSITY BVAR_FORECAST
%token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA
%token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN
@ -98,15 +98,15 @@ class ParsingDriver;
%token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
%token <string_val> FLOAT_NUMBER
%token FORECAST
%token GAMMA_PDF GAUSSIAN_ELIMINATION GMRES GRAPH
%token GAMMA_PDF GRAPH
%token HISTVAL HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS HP_FILTER HP_NGRID
%token IDENTIFICATION INF_CONSTANT INITVAL INITVAL_FILE
%token <string_val> INT_NUMBER
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF
%token KALMAN_ALGO KALMAN_TOL
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LU
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR
%token MARKOWITZ MARGINAL_DENSITY MAX
%token METHOD MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN
%token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN
%token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS
%token MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER
%token <string_val> NAME
@ -118,7 +118,7 @@ class ParsingDriver;
%token <string_val> QUOTED_STRING
%token QZ_CRITERIUM
%token RELATIVE_IRF REPLIC RPLOT SAVE_PARAMS_AND_STEADY_STATE
%token SHOCKS SIGMA_E SIMUL SIMUL_ALGO SIMUL_SEED SMOOTHER SOLVE_ALGO
%token SHOCKS SIGMA_E SIMUL SIMUL_ALGO SIMUL_SEED SMOOTHER STACK_SOLVE_ALGO SOLVE_ALGO
%token STDERR STEADY STOCH_SIMUL
%token TEX RAMSEY_POLICY PLANNER_DISCOUNT
%token <string_val> TEX_NAME
@ -678,7 +678,7 @@ simul_options_list : simul_options_list COMMA simul_options
simul_options : o_periods
| o_datafile
| o_method
| o_stack_solve_algo
| o_markowitz
;
@ -1497,6 +1497,7 @@ o_dr_algo : DR_ALGO EQUAL INT_NUMBER {
}
o_solve_algo : SOLVE_ALGO EQUAL INT_NUMBER { driver.option_num("solve_algo", $3); };
o_simul_algo : SIMUL_ALGO EQUAL INT_NUMBER { driver.option_num("simul_algo", $3); };
o_stack_solve_algo : STACK_SOLVE_ALGO EQUAL INT_NUMBER { driver.option_num("stack_solve_algo", $3); };
o_linear : LINEAR { driver.linear(); };
o_order : ORDER EQUAL INT_NUMBER { driver.option_num("order", $3); };
o_replic : REPLIC EQUAL INT_NUMBER { driver.option_num("replic", $3); };
@ -1511,11 +1512,6 @@ o_hp_ngrid : HP_NGRID EQUAL INT_NUMBER { driver.option_num("hp_ngrid", $3); };
o_periods : PERIODS EQUAL INT_NUMBER
{ driver.option_num("periods", $3); driver.option_num("simul", "1"); };
o_cutoff : CUTOFF EQUAL number { driver.option_num("cutoff", $3); }
o_method : METHOD EQUAL INT_NUMBER { driver.option_num("simulation_method",$3);}
| METHOD EQUAL LU { driver.option_num("simulation_method", "0"); }
| METHOD EQUAL GAUSSIAN_ELIMINATION { driver.option_num("simulation_method", "1"); }
| METHOD EQUAL GMRES { driver.option_num("simulation_method", "2"); }
| METHOD EQUAL BICGSTAB { driver.option_num("simulation_method", "3"); };
o_markowitz : MARKOWITZ EQUAL number { driver.option_num("markowitz", $3); };
o_mfs : MFS EQUAL number { driver.option_num("mfs", $3); };
o_simul : SIMUL { driver.option_num("simul", "1"); };

View File

@ -168,7 +168,6 @@ int sigma_e = 0;
/* Inside of a Dynare statement */
<DYNARE_STATEMENT>datafile {return token::DATAFILE;}
<DYNARE_STATEMENT>method {return token::METHOD;}
<DYNARE_STATEMENT>nobs {return token::NOBS;}
<DYNARE_STATEMENT>first_obs {return token::FIRST_OBS;}
<DYNARE_STATEMENT>prefilter {return token::PREFILTER;}
@ -332,6 +331,7 @@ int sigma_e = 0;
<DYNARE_STATEMENT>solve_algo {return token::SOLVE_ALGO;}
<DYNARE_STATEMENT>dr_algo {return token::DR_ALGO;}
<DYNARE_STATEMENT>simul_algo {return token::SIMUL_ALGO;}
<DYNARE_STATEMENT>stack_solve_algo {return token::STACK_SOLVE_ALGO;}
<DYNARE_STATEMENT>drop {return token::DROP;}
<DYNARE_STATEMENT>order {return token::ORDER;}
<DYNARE_STATEMENT>replic {return token::REPLIC;}
@ -353,14 +353,12 @@ int sigma_e = 0;
<DYNARE_STATEMENT>[\\] {return Dynare::parser::token_type (yytext[0]);}
<DYNARE_STATEMENT>[\'] {return Dynare::parser::token_type (yytext[0]);}
<DYNARE_STATEMENT,DYNARE_BLOCK>use_dll {return token::USE_DLL;}
<DYNARE_STATEMENT,DYNARE_BLOCK>lu {return token::LU;}
<DYNARE_STATEMENT,DYNARE_BLOCK>gaussian_elimination {return token::GAUSSIAN_ELIMINATION;}
<DYNARE_STATEMENT,DYNARE_BLOCK>gmres {return token::GMRES;}
<DYNARE_STATEMENT,DYNARE_BLOCK>bicgstab {return token::BICGSTAB;}
<DYNARE_STATEMENT,DYNARE_BLOCK>block {return token::BLOCK;}
<DYNARE_STATEMENT,DYNARE_BLOCK>bytecode {return token::BYTECODE;}
<DYNARE_BLOCK>use_dll {return token::USE_DLL;}
<DYNARE_BLOCK>block {return token::BLOCK;}
<DYNARE_BLOCK>bytecode {return token::BYTECODE;}
<DYNARE_STATEMENT,DYNARE_BLOCK>linear {return token::LINEAR;}
<DYNARE_STATEMENT,DYNARE_BLOCK>[,] {return token::COMMA;}
<DYNARE_STATEMENT,DYNARE_BLOCK>[:] {return Dynare::parser::token_type (yytext[0]);}
<DYNARE_STATEMENT,DYNARE_BLOCK>[\(\)] {return Dynare::parser::token_type (yytext[0]);}

View File

@ -645,181 +645,6 @@ StaticDllModel::Write_Inf_To_Bin_File(const string &static_basename, const strin
SaveCode.close();
}
void
StaticDllModel::writeSparseStaticMFile(const string &static_basename, const string &basename, const int mode) const
{
string sp;
ofstream mStaticModelFile;
ostringstream tmp, tmp1, tmp_eq;
int prev_Simulation_Type;
//SymbolicGaussElimination SGE;
bool OK;
chdir(basename.c_str());
string filename = static_basename + ".m";
mStaticModelFile.open(filename.c_str(), ios::out | ios::binary);
if (!mStaticModelFile.is_open())
{
cerr << "Error: Can't open file " << filename << " for writing" << endl;
exit(EXIT_FAILURE);
}
mStaticModelFile << "%\n";
mStaticModelFile << "% " << filename << " : Computes static model for Dynare\n";
mStaticModelFile << "%\n";
mStaticModelFile << "% Warning : this file is generated automatically by Dynare\n";
mStaticModelFile << "% from model file (.mod)\n\n";
mStaticModelFile << "%/\n";
int i, k;
mStaticModelFile << "function [varargout] = " << static_basename << "(varargin)\n";
mStaticModelFile << " global oo_ options_ M_ ;\n";
//Temporary variables declaration
OK=true;
ostringstream tmp_output;
for (temporary_terms_type::const_iterator it = temporary_terms.begin();
it != temporary_terms.end(); it++)
{
if (OK)
OK=false;
else
tmp_output << " ";
(*it)->writeOutput(tmp_output, oMatlabStaticModelSparse, temporary_terms);
}
if (tmp_output.str().length()>0)
mStaticModelFile << " global " << tmp_output.str() << " M_ ;\n";
mStaticModelFile << " T_init=0;\n";
tmp_output.str("");
for (temporary_terms_type::const_iterator it = temporary_terms.begin();
it != temporary_terms.end(); it++)
{
tmp_output << " ";
(*it)->writeOutput(tmp_output, oMatlabStaticModel, temporary_terms);
tmp_output << "=T_init;\n";
}
if (tmp_output.str().length()>0)
mStaticModelFile << tmp_output.str();
mStaticModelFile << " y_size=M_.endo_nbr;\n";
mStaticModelFile << " %it is the deterministic simulation of the block decomposed static model\n";
mStaticModelFile << " maxit_=options_.maxit_;\n";
mStaticModelFile << " solve_tolf=options_.solve_tolf;\n";
mStaticModelFile << " y=oo_.steady_state';\n";
mStaticModelFile << " x=[oo_.exo_steady_state oo_.exo_det_steady_state];\n";
prev_Simulation_Type=-1;
mStaticModelFile << " params=M_.params;\n";
mStaticModelFile << " oo_.deterministic_simulation.status = 0;\n";
for (i = 0;i < block_triangular.ModelBlock->Size;i++)
{
k = block_triangular.ModelBlock->Block_List[i].Simulation_Type;
if ((k == EVALUATE_FORWARD) && (block_triangular.ModelBlock->Block_List[i].Size))
{
mStaticModelFile << " oo_.deterministic_simulation.status = 1;\n";
mStaticModelFile << " oo_.deterministic_simulation.error = 0;\n";
mStaticModelFile << " oo_.deterministic_simulation.iterations = 0;\n";
mStaticModelFile << " if(isfield(oo_.deterministic_simulation,'block'))\n";
mStaticModelFile << " blck_num = length(oo_.deterministic_simulation.block)+1;\n";
mStaticModelFile << " else\n";
mStaticModelFile << " blck_num = 1;\n";
mStaticModelFile << " end;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).status = 1;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).error = 0;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).iterations = 0;\n";
//mStaticModelFile << " for it_ = y_kmin+1:(periods+y_kmin)\n";
mStaticModelFile << " y=" << static_basename << "_" << i + 1 << "(y, x, params);\n";
mStaticModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mStaticModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mStaticModelFile << " disp(['Inf or Nan value during the evaluation of block " << i <<"']);\n";
mStaticModelFile << " return;\n";
mStaticModelFile << " end;\n";
}
else if ((k == EVALUATE_BACKWARD) && (block_triangular.ModelBlock->Block_List[i].Size))
{
mStaticModelFile << " oo_.deterministic_simulation.status = 1;\n";
mStaticModelFile << " oo_.deterministic_simulation.error = 0;\n";
mStaticModelFile << " oo_.deterministic_simulation.iterations = 0;\n";
mStaticModelFile << " if(isfield(oo_.deterministic_simulation,'block'))\n";
mStaticModelFile << " blck_num = length(oo_.deterministic_simulation.block)+1;\n";
mStaticModelFile << " else\n";
mStaticModelFile << " blck_num = 1;\n";
mStaticModelFile << " end;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).status = 1;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).error = 0;\n";
mStaticModelFile << " oo_.deterministic_simulation.block(blck_num).iterations = 0;\n";
mStaticModelFile << " " << static_basename << "_" << i + 1 << "(y, x, params);\n";
mStaticModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mStaticModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mStaticModelFile << " disp(['Inf or Nan value during the evaluation of block " << i <<"']);\n";
mStaticModelFile << " return;\n";
mStaticModelFile << " end;\n";
}
else if ((k == SOLVE_FORWARD_COMPLETE || k == SOLVE_FORWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
{
/*mStaticModelFile << " g1=0;\n";
mStaticModelFile << " r=0;\n";*/
tmp.str("");
for (int ik=block_triangular.ModelBlock->Block_List[i].Nb_Recursives ;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
{
tmp << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
}
mStaticModelFile << " y_index = [" << tmp.str() << "];\n";
/*int nze, m;
for (nze=0,m=0;m<=block_triangular.ModelBlock->Block_List[i].Max_Lead+block_triangular.ModelBlock->Block_List[i].Max_Lag;m++)*/
int nze=block_triangular.ModelBlock->Block_List[i].IM_lead_lag[0].size;
mStaticModelFile << " if(isfield(oo_.deterministic_simulation,'block'))\n";
mStaticModelFile << " blck_num = length(oo_.deterministic_simulation.block)+1;\n";
mStaticModelFile << " else\n";
mStaticModelFile << " blck_num = 1;\n";
mStaticModelFile << " end;\n";
mStaticModelFile << " y = solve_one_boundary('" << static_basename << "_" << i + 1 << "'" <<
", y, x, params, y_index, " << nze <<
", 1, " << block_triangular.ModelBlock->Block_List[i].is_linear <<
", blck_num, 0, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.simulation_method, 1, 0, 0);\n";
mStaticModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mStaticModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mStaticModelFile << " disp(['Inf or Nan value during the resolution of block " << i <<"']);\n";
mStaticModelFile << " return;\n";
mStaticModelFile << " end;\n";
}
else if ((k == SOLVE_BACKWARD_COMPLETE || k == SOLVE_BACKWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
{
/*mStaticModelFile << " g1=0;\n";
mStaticModelFile << " r=0;\n";*/
tmp.str("");
for (int ik=block_triangular.ModelBlock->Block_List[i].Nb_Recursives ;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
{
tmp << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
}
mStaticModelFile << " y_index = [" << tmp.str() << "];\n";
/*int nze, m;
for (nze=0,m=0;m<=block_triangular.ModelBlock->Block_List[i].Max_Lead+block_triangular.ModelBlock->Block_List[i].Max_Lag;m++)*/
int nze=block_triangular.ModelBlock->Block_List[i].IM_lead_lag[0].size;
mStaticModelFile << " if(isfield(oo_.deterministic_simulation,'block'))\n";
mStaticModelFile << " blck_num = length(oo_.deterministic_simulation.block)+1;\n";
mStaticModelFile << " else\n";
mStaticModelFile << " blck_num = 1;\n";
mStaticModelFile << " end;\n";
mStaticModelFile << " y = solve_one_boundary('" << static_basename << "_" << i + 1 << "'" <<
", y, x, params, y_index, " << nze <<
", 0, " << block_triangular.ModelBlock->Block_List[i].is_linear <<
", blck_num, y_kmin, options_.maxit_, options_.solve_tolf, options_.slowc, options_.cutoff, options_.simulation_method, 1, 0, 0);\n";
mStaticModelFile << " tmp = y(:,M_.block_structure.block(" << i + 1 << ").variable);\n";
mStaticModelFile << " if(isnan(tmp) | isinf(tmp))\n";
mStaticModelFile << " disp(['Inf or Nan value during the resolution of block " << i <<"']);\n";
mStaticModelFile << " return;\n";
mStaticModelFile << " end;\n";
}
}
mStaticModelFile << " oo_.steady_state = y';\n";
mStaticModelFile << "return;\n";
mStaticModelFile.close();
writeModelEquationsOrdered_M( block_triangular.ModelBlock, static_basename);
chdir("..");
}
void
StaticDllModel::evaluateJacobian(const eval_context_type &eval_context, jacob_map *j_m, bool dynamic)

View File

@ -77,8 +77,6 @@ private:
//! Writes static model file (C version)
/*! \todo add third derivatives handling */
void writeStaticCFile(const string &static_basename) const;
//! Writes static model file when SparseDLL option is on
void writeSparseStaticMFile(const string &static_basename, const string &basename, const int mode) const;
//! Writes the Block reordred structure of the model in M output
void writeModelEquationsOrdered_M(Model_Block *ModelBlock, const string &static_basename) const;
//! Writes the code of the Block reordred structure of the model in virtual machine bytecode