diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index dbe07c4d8ec520946544cd5a4ffbdcf91397d7cb..728030f48787bde5be0f77880f872484ea039f6e 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -121,6 +121,7 @@ DynamicModel::DynamicModel(const DynamicModel &m) : max_exo_det_lead {m.max_exo_det_lead}, max_lag_orig {m.max_lag_orig}, max_lead_orig {m.max_lead_orig}, + max_lag_with_diffs_expanded_orig {m.max_lag_with_diffs_expanded_orig}, max_endo_lag_orig {m.max_endo_lag_orig}, max_endo_lead_orig {m.max_endo_lead_orig}, max_exo_lag_orig {m.max_exo_lag_orig}, @@ -181,6 +182,7 @@ DynamicModel::operator=(const DynamicModel &m) max_exo_det_lead = m.max_exo_det_lead; max_lag_orig = m.max_lag_orig; max_lead_orig = m.max_lead_orig; + max_lag_with_diffs_expanded_orig = m.max_lag_with_diffs_expanded_orig; max_endo_lag_orig = m.max_endo_lag_orig; max_endo_lead_orig = m.max_endo_lead_orig; max_exo_lag_orig = m.max_exo_lag_orig; @@ -3036,6 +3038,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de << modstruct << "orig_maximum_exo_det_lead = " << max_exo_det_lead_orig << ";" << endl << modstruct << "orig_maximum_lag = " << max_lag_orig << ";" << endl << modstruct << "orig_maximum_lead = " << max_lead_orig << ";" << endl + << modstruct << "orig_maximum_lag_with_diffs_expanded = " << max_lag_with_diffs_expanded_orig << ";" << endl << modstruct << "lead_lag_incidence = ["; // Loop on endogenous variables int nstatic = 0, @@ -5086,6 +5089,9 @@ DynamicModel::setLeadsLagsOrig() equation->collectDynamicVariables(SymbolType::endogenous, dynvars); equation->collectDynamicVariables(SymbolType::exogenous, dynvars); equation->collectDynamicVariables(SymbolType::exogenousDet, dynvars); + + max_lag_with_diffs_expanded_orig = max(equation->maxLagWithDiffsExpanded(), + max_lag_with_diffs_expanded_orig); } for (const auto & dynvar : dynvars) diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 2fd4231863e2d65ab32df0c7e77619403d6e49b1..02229a662f9afc7a3a4be03097b86d71a6be674b 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -73,7 +73,7 @@ private: /*! Set by computeDerivIDs() */ int max_exo_det_lag{0}, max_exo_det_lead{0}; //! Maximum lag and lead over all types of variables (positive values) of original model - int max_lag_orig{0}, max_lead_orig{0}; + int max_lag_orig{0}, max_lead_orig{0}, max_lag_with_diffs_expanded_orig{0}; //! Maximum lag and lead over endogenous variables (positive values) of original model int max_endo_lag_orig{0}, max_endo_lead_orig{0}; //! Maximum lag and lead over exogenous variables (positive values) of original model diff --git a/src/ModFile.cc b/src/ModFile.cc index 43d895957a2dbb5aca010c2dd10e383aeeb8a887..2247f5577632ffd12656212ad4693b96d94129ac 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -498,23 +498,6 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const mod_file_struct.ramsey_eq_nbr = dynamic_model.equation_number() - mod_file_struct.orig_eq_nbr; } - // Workaround for #1193 - if (!mod_file_struct.hist_vals_wrong_lag.empty()) - { - bool err = false; - for (map<int, int>::const_iterator it = mod_file_struct.hist_vals_wrong_lag.begin(); - it != mod_file_struct.hist_vals_wrong_lag.end(); it++) - if (dynamic_model.minLagForSymbol(it->first) > it->second - 1) - { - cerr << "ERROR: histval: variable " << symbol_table.getName(it->first) - << " does not appear in the model with the lag " << it->second - 1 - << " (see the reference manual for the timing convention in 'histval')" << endl; - err = true; - } - if (err) - exit(EXIT_FAILURE); - } - /* Handle var_expectation_model statements: collect information about them, create the new corresponding parameters, and the expressions to replace the var_expectation statements. diff --git a/src/NumericalInitialization.cc b/src/NumericalInitialization.cc index e6878e093831fb1efbda46c651ead2cabc3b5027..88a0a9cb8c65b26f25ac7b6354a58a79635d866d 100644 --- a/src/NumericalInitialization.cc +++ b/src/NumericalInitialization.cc @@ -304,11 +304,9 @@ EndValStatement::writeJsonOutput(ostream &output) const } HistValStatement::HistValStatement(hist_values_t hist_values_arg, - const hist_vals_wrong_lag_t hist_vals_wrong_lag_arg, const SymbolTable &symbol_table_arg, const bool &all_values_required_arg) : hist_values{move(hist_values_arg)}, - hist_vals_wrong_lag{hist_vals_wrong_lag_arg}, symbol_table{symbol_table_arg}, all_values_required{all_values_required_arg} { @@ -322,10 +320,9 @@ HistValStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidat set<int> unused_endo = symbol_table.getEndogenous(); set<int> unused_exo = symbol_table.getExogenous(); - set<int>::iterator sit; for (const auto & hist_value : hist_values) { - sit = unused_endo.find(hist_value.first.first); + auto sit = unused_endo.find(hist_value.first.first); if (sit != unused_endo.end()) unused_endo.erase(sit); @@ -353,7 +350,6 @@ HistValStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidat if (unused_endo.size() > 0 || unused_exo.size() > 0) exit(EXIT_FAILURE); } - mod_file_struct.hist_vals_wrong_lag = hist_vals_wrong_lag; } void @@ -362,9 +358,13 @@ HistValStatement::writeOutput(ostream &output, const string &basename, bool mini output << "%" << endl << "% HISTVAL instructions" << endl << "%" << endl - << "M_.endo_histval = zeros(M_.endo_nbr,M_.maximum_lag);" << endl - << "M_.exo_histval = zeros(M_.exo_nbr,M_.maximum_lag);" << endl - << "M_.exo_det_histval = zeros(M_.exo_det_nbr,M_.maximum_lag);" << endl; + << "M_.histval_dseries = dseries(zeros(M_.orig_maximum_lag_with_diffs_expanded, M_.orig_endo_nbr" + << (symbol_table.exo_nbr() > 0 ? "+M_.exo_nbr" : "") + << (symbol_table.exo_det_nbr() > 0 ? "+M_.exo_det_nbr" : "") + << "), dates(sprintf('%dY', -M_.orig_maximum_lag_with_diffs_expanded+1)), [ M_.endo_names(1:M_.orig_endo_nbr); " + << (symbol_table.exo_nbr() > 0 ? "M_.exo_names; " : "") + << (symbol_table.exo_det_nbr() > 0 ? "M_.exo_det_names; " : "") + << "]);" << endl; for (const auto & hist_value : hist_values) { @@ -372,42 +372,20 @@ HistValStatement::writeOutput(ostream &output, const string &basename, bool mini int lag = hist_value.first.second; const expr_t expression = hist_value.second; - SymbolType type = symbol_table.getType(symb_id); - - // For a lag greater than 1 on endo, or for any exo, lookup for auxiliary variable - if ((type == SymbolType::endogenous && lag < 0) || type == SymbolType::exogenous) - { - try - { - // This function call must remain the 1st statement in this block - symb_id = symbol_table.searchAuxiliaryVars(symb_id, lag); - lag = 0; - type = SymbolType::endogenous; - } - catch (SymbolTable::SearchFailedException &e) - { - if (type == SymbolType::endogenous) - { - cerr << "HISTVAL: internal error of Dynare, please contact the developers"; - exit(EXIT_FAILURE); - } - // We don't fail for exogenous, because they are not replaced by - // auxiliary variables in deterministic mode. - } - } - - int tsid = symbol_table.getTypeSpecificID(symb_id) + 1; - - if (type == SymbolType::endogenous) - output << "M_.endo_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = "; - else if (type == SymbolType::exogenous) - output << "M_.exo_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = "; - else if (type == SymbolType::exogenousDet) - output << "M_.exo_det_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = "; - + output << "M_.histval_dseries{'" << symbol_table.getName(symb_id) << "'}(dates('" << lag << "Y'))="; expression->writeOutput(output); output << ";" << endl; } + + output << "if exist(['+' M_.fname '/dynamic_set_auxiliary_series'])" << endl + << " eval(['M_.histval_dseries = ' M_.fname '.dynamic_set_auxiliary_series(M_.histval_dseries, []);']);" << endl + << "end" << endl + << "M_.endo_histval = M_.histval_dseries{M_.endo_names{:}}(dates(sprintf('%dY', 1-M_.maximum_lag)):dates('0Y')).data';" << endl; + + if (symbol_table.exo_nbr() > 0) + output << "M_.exo_histval = M_.histval_dseries{M_.exo_names{:}}(dates(sprintf('%dY', 1-M_.maximum_lag)):dates('0Y')).data';" << endl; + if (symbol_table.exo_det_nbr() > 0) + output << "M_.exo_det_histval = M_.histval_dseries{M_.exo_det_names{:}}(dates(sprintf('%dY', 1-M_.maximum_lag)):dates('0Y')).data';" << endl; } void diff --git a/src/NumericalInitialization.hh b/src/NumericalInitialization.hh index b0c589bad6f1d9dd59e5c2609365542f4e030bc1..d341ec828543a871a5046ba9dde922c79273c000 100644 --- a/src/NumericalInitialization.hh +++ b/src/NumericalInitialization.hh @@ -107,15 +107,12 @@ public: Maps pairs (symbol_id, lag) to expr_t */ using hist_values_t = map<pair<int, int>, expr_t>; - using hist_vals_wrong_lag_t = map<int, int>; private: const hist_values_t hist_values; - const hist_vals_wrong_lag_t hist_vals_wrong_lag; const SymbolTable &symbol_table; const bool all_values_required; public: HistValStatement(hist_values_t hist_values_arg, - const hist_vals_wrong_lag_t hist_vals_wrong_lag_arg, const SymbolTable &symbol_table_arg, const bool &all_values_required_arg); //! Workaround for trac ticket #157 diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index 5714c81bc7e481e6e4084baece14be38bd2b962b..deeb52ee481ba459d3a0a7929ec431f8ce1c254e 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -661,9 +661,6 @@ ParsingDriver::hist_val(const string &name, const string &lag, expr_t rhs) pair<int, int> key(symb_id, ilag); - if (mod_file->dynamic_model.minLagForSymbol(symb_id) > ilag - 1) - hist_vals_wrong_lag[symb_id] = ilag; - if (hist_values.find(key) != hist_values.end()) error("hist_val: (" + name + ", " + lag + ") declared twice"); @@ -807,7 +804,7 @@ ParsingDriver::end_endval(bool all_values_required) void ParsingDriver::end_histval(bool all_values_required) { - mod_file->addStatement(make_unique<HistValStatement>(hist_values, hist_vals_wrong_lag, mod_file->symbol_table, all_values_required)); + mod_file->addStatement(make_unique<HistValStatement>(hist_values, mod_file->symbol_table, all_values_required)); hist_values.clear(); } diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index c6895454d2583cf02d281bddd313f6c5f93e5ec1..b172b4138b2032fca488a6af9c3fc45d0bd313ca 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -173,8 +173,6 @@ private: InitOrEndValStatement::init_values_t init_values; //! Temporary storage for histval blocks HistValStatement::hist_values_t hist_values; - //! Temporary storage for histval blocks - HistValStatement::hist_vals_wrong_lag_t hist_vals_wrong_lag; //! Temporary storage for homotopy_setup blocks HomotopyStatement::homotopy_values_t homotopy_values; //! Temporary storage for moment_calibration diff --git a/src/Statement.hh b/src/Statement.hh index 40adb8a390cd0e660bb3feb1bf22ccf6130408b1..fb672604491523dabea6755d1ae28e6ff2dc9ec8 100644 --- a/src/Statement.hh +++ b/src/Statement.hh @@ -123,8 +123,6 @@ public: bool steady_state_model_present{false}; //! Whether there is a write_latex_steady_state_model statement present bool write_latex_steady_state_model_present{false}; - //! Histval values that do not have the appropriate lag - map<int, int> hist_vals_wrong_lag; //! Pac growth and discount set<int> pac_params; };