From a7d747aedac558d2d70067a284439e0130e40fa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 15 Apr 2025 17:10:05 +0200
Subject: [PATCH] Perfect foresight solver: new options for preconditioners
 with iterative solvers

---
 src/DynareBison.yy | 23 +++++++++++++++++++++++
 src/DynareFlex.ll  | 11 +++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index deabedfa..385b0377 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -221,6 +221,7 @@ str_tolower(string s)
 %token HOMOTOPY_LINEARIZATION_FALLBACK HOMOTOPY_MARGINAL_LINEARIZATION_FALLBACK HOMOTOPY_EXCLUDE_VAREXO FROM_INITVAL_TO_ENDVAL
 %token STATIC_MFS RELATIVE_TO_INITVAL MATCHED_IRFS MATCHED_IRFS_WEIGHTS WEIGHTS PERPENDICULAR
 %token HETEROGENEITY HETEROGENEITY_DIMENSION SUM PERFECT_FORESIGHT_CONTROLLED_PATHS EXOGENIZE ENDOGENIZE
+%token PRECONDITIONER UMFITER ITERSTACK ILU ITER_TOL ITER_MAXIT GMRES_RESTART ITERSTACK_MAXLU ITERSTACK_NPERIODS ITERSTACK_NLU ITERSTACK_RELU
 
 %token <vector<string>> SYMBOL_VEC
 
@@ -1586,6 +1587,14 @@ perfect_foresight_solver_options : o_stack_solve_algo
                                  | o_homotopy_linearization_fallback
                                  | o_homotopy_marginal_linearization_fallback
                                  | o_homotopy_exclude_varexo
+                                 | o_preconditioner
+                                 | o_iter_tol
+                                 | o_iter_maxit
+                                 | o_gmres_restart
+                                 | o_iterstack_maxlu
+                                 | o_iterstack_nperiods
+                                 | o_iterstack_nlu
+                                 | o_iterstack_relu
                                  ;
 
 perfect_foresight_with_expectation_errors_setup : PERFECT_FORESIGHT_WITH_EXPECTATION_ERRORS_SETUP ';'
@@ -4141,6 +4150,20 @@ o_max_dim_cova_group : MAX_DIM_COVA_GROUP EQUAL INT_NUMBER { driver.option_num("
 o_homotopy_mode : HOMOTOPY_MODE EQUAL INT_NUMBER { driver.option_num("homotopy_mode", $3); };
 o_homotopy_steps : HOMOTOPY_STEPS EQUAL INT_NUMBER { driver.option_num("homotopy_steps", $3); };
 o_homotopy_force_continue: HOMOTOPY_FORCE_CONTINUE EQUAL INT_NUMBER { driver.option_num("homotopy_force_continue", $3); };
+o_preconditioner : PRECONDITIONER EQUAL UMFITER
+                   { driver.option_str("simul.preconditioner", "umfiter"); }
+                 | PRECONDITIONER EQUAL ITERSTACK
+                   { driver.option_str("simul.preconditioner", "iterstack"); }
+                 | PRECONDITIONER EQUAL ILU
+                   { driver.option_str("simul.preconditioner", "ilu"); };
+                 ;
+o_iter_tol : ITER_TOL EQUAL non_negative_number  { driver.option_num("simul.iter_tol", $3); };
+o_iter_maxit : ITER_MAXIT EQUAL INT_NUMBER  { driver.option_num("simul.iter_maxit", $3); };
+o_gmres_restart : GMRES_RESTART EQUAL INT_NUMBER  { driver.option_num("simul.gmres_restart", $3); };
+o_iterstack_maxlu : ITERSTACK_MAXLU EQUAL INT_NUMBER  { driver.option_num("simul.iterstack_maxlu", $3); };
+o_iterstack_nperiods : ITERSTACK_NPERIODS EQUAL INT_NUMBER  { driver.option_num("simul.iterstack_nperiods", $3); };
+o_iterstack_nlu : ITERSTACK_NLU EQUAL INT_NUMBER  { driver.option_num("simul.iterstack_nlu", $3); };
+o_iterstack_relu : ITERSTACK_RELU EQUAL non_negative_number  { driver.option_num("simul.iterstack_relu", $3); };
 o_nocheck : NOCHECK { driver.option_num("steadystate.nocheck", "true"); };
 
 o_controlled_varexo : CONTROLLED_VAREXO EQUAL '(' symbol_list ')' { driver.option_symbol_list("controlled_varexo", $4); };
diff --git a/src/DynareFlex.ll b/src/DynareFlex.ll
index 8574a94c..68369507 100644
--- a/src/DynareFlex.ll
+++ b/src/DynareFlex.ll
@@ -749,6 +749,17 @@ DATE -?[0-9]+([ya]|m([1-9]|1[0-2])|q[1-4]|[sh][12])
 <DYNARE_STATEMENT>with_epilogue {return token::WITH_EPILOGUE;}
 <DYNARE_STATEMENT>heteroskedastic_filter {return token::HETEROSKEDASTIC_FILTER;}
 <DYNARE_STATEMENT>non_zero {return token::NON_ZERO;}
+<DYNARE_STATEMENT>preconditioner {return token::PRECONDITIONER;}
+<DYNARE_STATEMENT>umfiter {return token::UMFITER;}
+<DYNARE_STATEMENT>iterstack {return token::ITERSTACK;}
+<DYNARE_STATEMENT>ilu {return token::ILU;}
+<DYNARE_STATEMENT>iter_tol {return token::ITER_TOL;}
+<DYNARE_STATEMENT>iter_maxit {return token::ITER_MAXIT;}
+<DYNARE_STATEMENT>gmres_restart {return token::GMRES_RESTART;}
+<DYNARE_STATEMENT>iterstack_maxlu {return token::ITERSTACK_MAXLU;}
+<DYNARE_STATEMENT>iterstack_nperiods {return token::ITERSTACK_NPERIODS;}
+<DYNARE_STATEMENT>iterstack_nlu {return token::ITERSTACK_NLU;}
+<DYNARE_STATEMENT>iterstack_relu {return token::ITERSTACK_RELU;}
 
 <DYNARE_STATEMENT>\$[^$]*\$ {
   yylval->emplace<string>(yytext + 1).pop_back();
-- 
GitLab