From 084372a314a5f3081dc055ba83dd879947809576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Fri, 6 Oct 2023 17:44:42 -0400 Subject: [PATCH] =?UTF-8?q?Add=20new=20option=20=E2=80=9Cfrom=5Finitval=5F?= =?UTF-8?q?to=5Fendval=E2=80=9D=20to=20=E2=80=9Chomotopy=5Fsetup=E2=80=9D?= =?UTF-8?q?=20block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DynareBison.yy | 11 ++++++++--- src/DynareFlex.ll | 1 + src/NumericalInitialization.cc | 7 +++++-- src/NumericalInitialization.hh | 3 ++- src/ParsingDriver.cc | 4 ++-- src/ParsingDriver.hh | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/DynareBison.yy b/src/DynareBison.yy index ba6c3d73..95986662 100644 --- a/src/DynareBison.yy +++ b/src/DynareBison.yy @@ -195,7 +195,7 @@ class ParsingDriver; %token FSOLVE_OPTIONS %token ENDVAL_STEADY STEADY_SOLVE_ALGO STEADY_MAXIT STEADY_TOLF STEADY_TOLX STEADY_MARKOWITZ %token HOMOTOPY_MAX_COMPLETION_SHARE HOMOTOPY_MIN_STEP_SIZE HOMOTOPY_INITIAL_STEP_SIZE HOMOTOPY_STEP_SIZE_INCREASE_SUCCESS_COUNT -%token HOMOTOPY_LINEARIZATION_FALLBACK HOMOTOPY_MARGINAL_LINEARIZATION_FALLBACK +%token HOMOTOPY_LINEARIZATION_FALLBACK HOMOTOPY_MARGINAL_LINEARIZATION_FALLBACK FROM_INITVAL_TO_ENDVAL %token <vector<string>> SYMBOL_VEC @@ -3204,8 +3204,13 @@ initial_condition_decomposition_option : o_icd_type | o_icd_with_epilogue ; -homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END ';' - { driver.end_homotopy();}; +homotopy_setup : HOMOTOPY_SETUP ';' homotopy_list END ';' + { driver.end_homotopy(false); } + | HOMOTOPY_SETUP '(' FROM_INITVAL_TO_ENDVAL ')' ';' END ';' + { driver.end_homotopy(true); } + | HOMOTOPY_SETUP '(' FROM_INITVAL_TO_ENDVAL ')' ';' homotopy_list END ';' + { driver.end_homotopy(true); } + ; homotopy_list : homotopy_item | homotopy_list homotopy_item diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll index 921d716f..fe6d8dbc 100644 --- a/src/DynareFlex.ll +++ b/src/DynareFlex.ll @@ -362,6 +362,7 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]) <DYNARE_STATEMENT>nocorr {return token::NOCORR;} <DYNARE_STATEMENT>optim {return token::OPTIM;} <DYNARE_STATEMENT>periods {return token::PERIODS;} +<DYNARE_BLOCK>from_initval_to_endval {return token::FROM_INITVAL_TO_ENDVAL;} <DYNARE_STATEMENT>endval_steady {return token::ENDVAL_STEADY;} <DYNARE_STATEMENT,DYNARE_BLOCK>model_name {return token::MODEL_NAME;} <DYNARE_STATEMENT>auxiliary_model_name {return token::AUXILIARY_MODEL_NAME;} diff --git a/src/NumericalInitialization.cc b/src/NumericalInitialization.cc index 8c2e32e3..cc5253bb 100644 --- a/src/NumericalInitialization.cc +++ b/src/NumericalInitialization.cc @@ -534,8 +534,10 @@ HistvalFileStatement::writeJsonOutput(ostream &output) const output << "}"; } -HomotopySetupStatement::HomotopySetupStatement(homotopy_values_t homotopy_values_arg, +HomotopySetupStatement::HomotopySetupStatement(bool from_initval_to_endval_arg, + homotopy_values_t homotopy_values_arg, const SymbolTable &symbol_table_arg) : + from_initval_to_endval{from_initval_to_endval_arg}, homotopy_values{move(homotopy_values_arg)}, symbol_table{symbol_table_arg} { @@ -548,7 +550,8 @@ HomotopySetupStatement::writeOutput(ostream &output, [[maybe_unused]] const stri output << "%" << endl << "% HOMOTOPY_SETUP instructions" << endl << "%" << endl - << "options_.homotopy_values = [];" << endl; + << "options_.homotopy_from_initval_to_endval = " << boolalpha << from_initval_to_endval << ';' << endl + << "options_.homotopy_values = zeros(0, 4);" << endl; for (auto [symb_id, expression1, expression2] : homotopy_values) { diff --git a/src/NumericalInitialization.hh b/src/NumericalInitialization.hh index 3e7d910f..f368696e 100644 --- a/src/NumericalInitialization.hh +++ b/src/NumericalInitialization.hh @@ -172,10 +172,11 @@ public: /*! Order matter so we use a vector. First expr_t can be NULL if no initial value given. */ using homotopy_values_t = vector<tuple<int, expr_t, expr_t>>; private: + const bool from_initval_to_endval; // Whether the from_initval_to_endval option was passed const homotopy_values_t homotopy_values; const SymbolTable &symbol_table; public: - HomotopySetupStatement(homotopy_values_t homotopy_values_arg, + HomotopySetupStatement(bool from_initval_to_endval_arg, homotopy_values_t homotopy_values_arg, const SymbolTable &symbol_table_arg); void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override; void writeJsonOutput(ostream &output) const override; diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index c01162e5..8868f3cf 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -793,9 +793,9 @@ ParsingDriver::end_histval(bool all_values_required) } void -ParsingDriver::end_homotopy() +ParsingDriver::end_homotopy(bool from_initval_to_endval) { - mod_file->addStatement(make_unique<HomotopySetupStatement>(move(homotopy_values), mod_file->symbol_table)); + mod_file->addStatement(make_unique<HomotopySetupStatement>(from_initval_to_endval, move(homotopy_values), mod_file->symbol_table)); homotopy_values.clear(); } diff --git a/src/ParsingDriver.hh b/src/ParsingDriver.hh index 5edf4fca..90a10d3b 100644 --- a/src/ParsingDriver.hh +++ b/src/ParsingDriver.hh @@ -427,7 +427,7 @@ public: //! Writes end of an histval block void end_histval(bool all_values_required); //! Writes end of an homotopy_setup block - void end_homotopy(); + void end_homotopy(bool from_initval_to_endval); //! Begin epilogue block void begin_epilogue(); //! End epilogue block -- GitLab