diff --git a/parser.src/ModelParameters.cc b/parser.src/ModelParameters.cc index d6f4e58e5..4d971dede 100644 --- a/parser.src/ModelParameters.cc +++ b/parser.src/ModelParameters.cc @@ -21,15 +21,17 @@ int ModelParameters::static_nbr = 0; int ModelParameters::forward_nbr = 0; int ModelParameters::both_nbr = 0; int ModelParameters::recur_nbr = 0; -int ModelParameters::max_lag=INT_MIN; -int ModelParameters::max_lead=INT_MIN; +int ModelParameters::max_lag = 0; +int ModelParameters::max_lead = 0; +int ModelParameters::max_endo_lag = 0; +int ModelParameters::max_endo_lead = 0; +int ModelParameters::max_exo_lag = 0; +int ModelParameters::max_exo_lead = 0; +int ModelParameters::max_exo_det_lag = 0; +int ModelParameters::max_exo_det_lead = 0; +int ModelParameters::max_recur_lag = 0; +int ModelParameters::max_recur_lead = 0; using namespace std; -//int ModelParameters::endo_min_lag=INT_MAX; -//int ModelParameters::endo_max_lag=INT_MIN; -//int ModelParameters::exo_min_lag=INT_MAX; -//int ModelParameters::exo_max_lag=INT_MIN; -//int ModelParameters::recur_min_lag=INT_MAX; -//int ModelParameters::recur_max_lag=INT_MIN; //------------------------------------------------------------------------------ ModelParameters::ModelParameters() { diff --git a/parser.src/ModelTree.cc b/parser.src/ModelTree.cc index c8ab9d0d8..95069526f 100644 --- a/parser.src/ModelTree.cc +++ b/parser.src/ModelTree.cc @@ -1012,6 +1012,7 @@ inline string ModelTree::getExpression(NodeID StartID, EquationType iEquationTy stack_token.push(StartID); int precedence_last_op = operator_table.precedence(StartID->op_code); + int last_op_code = 0; while (stack_token.size() > 0) { @@ -1042,17 +1043,17 @@ inline string ModelTree::getExpression(NodeID StartID, EquationType iEquationTy { // if current operator is not a temporary variable and // of lesser precedence than previous one, insert '(' - if ( precedence_current_op < precedence_last_op ) - { - exp << "("; - } - if ( current_op_code == UMINUS) + if ( precedence_current_op < precedence_last_op || + (last_op_code == MINUS & + precedence_current_op == precedence_last_op) || + current_op_code == UMINUS) { exp << "("; } // set flag: left argument has been explored current_token_ID->left_done = 1; precedence_last_op = precedence_current_op; + last_op_code = current_op_code; if ( offset == 0 && current_op_code == POWER) { exp << "pow("; @@ -1093,12 +1094,15 @@ inline string ModelTree::getExpression(NodeID StartID, EquationType iEquationTy { if ( (offset == 0 && current_op_code == POWER) || ( precedence_current_op > precedence_last_op && - operator_table.isfunction(current_op_code) == false) || + operator_table.isfunction(current_op_code) == false) || + (current_op_code == MINUS && + precedence_current_op == precedence_last_op) || current_op_code == UMINUS) { exp << ")"; } precedence_last_op = precedence_current_op; + last_op_code = current_op_code; current_token_ID->left_done=0; current_token_ID->right_done=0; stack_token.pop(); @@ -1406,16 +1410,45 @@ void ModelTree::ModelInitialization(void) output << "M_.exo_names_orig_ord = [1:" << ModelParameters::exo_nbr << "];\n"; output << "M_.maximum_lag = " << ModelParameters::max_lag << ";\n"; output << "M_.maximum_lead = " << ModelParameters::max_lead<< ";\n"; + if (ModelParameters::exo_nbr > 0) + { + } + if (ModelParameters::exo_nbr > 0) + { + } + if (ModelParameters::exo_nbr > 0) + { + output << "M_.maximum_exo_lag = " << ModelParameters::max_exo_lag << ";\n"; + output << "M_.maximum_exo_lead = " << ModelParameters::max_exo_lead<< ";\n"; + } if (ModelParameters::endo_nbr) - output << "oo_.steady_state = zeros(" << ModelParameters::endo_nbr << ", 1);\n"; + { + output << "M_.maximum_endo_lag = " << ModelParameters::max_endo_lag << ";\n"; + output << "M_.maximum_endo_lead = " << ModelParameters::max_endo_lead<< ";\n"; + output << "oo_.steady_state = zeros(" << ModelParameters::endo_nbr << ", 1);\n"; + } if (ModelParameters::exo_nbr) - output << "oo_.exo_steady_state = zeros(" << ModelParameters::exo_nbr << ", 1);\n"; + { + output << "M_.maximum_exo_lag = " << ModelParameters::max_exo_lag << ";\n"; + output << "M_.maximum_exo_lead = " << ModelParameters::max_exo_lead<< ";\n"; + output << "oo_.exo_steady_state = zeros(" << ModelParameters::exo_nbr << ", 1);\n"; + } + if (ModelParameters::exo_det_nbr) + { + output << "M_.maximum_exo_det_lag = " << ModelParameters::max_exo_det_lag << ";\n"; + output << "M_.maximum_exo_det_lead = " << ModelParameters::max_exo_det_lead<< ";\n"; + output << "oo_.exo_det_steadystate = zeros(" << ModelParameters::exo_det_nbr << ", 1);\n"; + } + if (ModelParameters::recur_nbr) + { + output << "M_.maximum_recur_lag = " << ModelParameters::max_recur_lag << ";\n"; + output << "M_.maximum_recur_lead = " << ModelParameters::max_recur_lead<< ";\n"; + output << "oo_.recur_steadystate = zeros(" << ModelParameters::recur_nbr << ", 1);\n"; + } if (ModelParameters::parameter_nbr) - output << "M_.params = zeros(" << ModelParameters::parameter_nbr << ", 1);\n"; - if (ModelParameters::exo_det_nbr) - output << "oo_exdet_ = zeros(" << ModelParameters::exo_det_nbr << ", 1);\n"; - if (ModelParameters::exo_det_nbr) - output << "oo_exedet_ = zeros(" << ModelParameters::exo_det_nbr << ", 1);\n"; + { + output << "M_.params = zeros(" << ModelParameters::parameter_nbr << ", 1);\n"; + } } //------------------------------------------------------------------------------ string ModelTree::get() diff --git a/parser.src/VariableTable.cc b/parser.src/VariableTable.cc index f798dfdb4..903bea2be 100644 --- a/parser.src/VariableTable.cc +++ b/parser.src/VariableTable.cc @@ -62,10 +62,56 @@ int VariableTable::AddVariable(string iName, int iLag) if (type == eEndogenous) ModelParameters::var_endo_nbr++; if (type == eExogenous) ModelParameters::var_exo_nbr++; // Setting Maximum and minimum lags - if (ModelParameters::max_lead < iLag && iLag >= 0) - ModelParameters::max_lead = iLag; - if (ModelParameters::max_lag < -iLag && iLag <= 0) - ModelParameters::max_lag = -iLag; + if (ModelParameters::max_lead < iLag) + { + ModelParameters::max_lead = iLag; + } + else if (-ModelParameters::max_lag > iLag) + { + ModelParameters::max_lag = -iLag; + } + switch(type) + { + case eEndogenous: + if (ModelParameters::max_endo_lead < iLag) + { + ModelParameters::max_endo_lead = iLag; + } + else if (-ModelParameters::max_endo_lag > iLag) + { + ModelParameters::max_endo_lag = -iLag; + } + case eExogenous: + if (ModelParameters::max_exo_lead < iLag) + { + ModelParameters::max_exo_lead = iLag; + } + else if (-ModelParameters::max_exo_lag > iLag) + { + ModelParameters::max_exo_lag = -iLag; + } + case eExogenousDet: + if (ModelParameters::max_exo_det_lead < iLag) + { + ModelParameters::max_exo_det_lead = iLag; + } + else if (-ModelParameters::max_exo_det_lag > iLag) + { + ModelParameters::max_exo_det_lag = -iLag; + } + case eRecursiveVariable: + if (ModelParameters::max_recur_lead < iLag) + { + ModelParameters::max_recur_lead = iLag; + } + else if (-ModelParameters::max_recur_lag > iLag) + { + ModelParameters::max_recur_lag = -iLag; + } + default: + ; + } + return mVariableIndex.size()-1; } //------------------------------------------------------------------------------ diff --git a/parser.src/include/ModelParameters.h b/parser.src/include/ModelParameters.h index 315bf7ddf..6ea79c45b 100644 --- a/parser.src/include/ModelParameters.h +++ b/parser.src/include/ModelParameters.h @@ -49,6 +49,15 @@ class ModelParameters static int max_lag; static int max_lead; + static int max_endo_lag; + static int max_endo_lead; + static int max_exo_lag; + static int max_exo_lead; + static int max_exo_det_lag; + static int max_exo_det_lead; + static int max_recur_lag; + static int max_recur_lead; + /*! Minimum lag for endogenous variables */ //static int endo_min_lag; /*! Maximum lag for endogenous variables*/