From 63651c5f1bf843546eb8165887b0cefb4339b8cb Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx.de>
Date: Mon, 6 Jul 2020 13:11:23 +0200
Subject: [PATCH] Correctly distinguish tolerance between steady and perfect
 foresight

steady uses options_.solve_tolf as a termination criterion, so subsequent checks should do the same. Similarly, solve_tolx was never used.

(cherry picked from commit 607a273bb0086ed36831b36327c1b3c456e539b2)
---
 matlab/dynare_solve.m                  | 10 ++++++----
 matlab/evaluate_steady_state_file.m    |  2 +-
 matlab/partial_information/PCL_resol.m |  2 +-
 matlab/resid.m                         |  2 +-
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/matlab/dynare_solve.m b/matlab/dynare_solve.m
index d4b7352217..37483e46f2 100644
--- a/matlab/dynare_solve.m
+++ b/matlab/dynare_solve.m
@@ -48,8 +48,10 @@ else
 end
 if strcmp(caller_file_name,'solve_stacked_problem.m')
     tolf = options.dynatol.f;
+    tolx = options.dynatol.x;
 else
     tolf = options.solve_tolf;
+    tolx = options.solve_tolx;
 end
 
 if strcmp(caller_file_name,'dyn_ramsey_static.m')
@@ -216,11 +218,11 @@ if options.solve_algo == 0
     end
 elseif options.solve_algo == 1
     [x,info]=solve1(func,x,1:nn,1:nn,jacobian_flag,options.gstep, ...
-                    tolf,options.solve_tolx, ...
+                    tolf,tolx, ...
                     maxit,options.debug,varargin{:});
 elseif options.solve_algo == 9
     [x,info]=trust_region(func,x,1:nn,1:nn,jacobian_flag,options.gstep, ...
-                          tolf,options.solve_tolx, ...
+                          tolf,tolx, ...
                           maxit,options.debug,varargin{:});
 elseif options.solve_algo == 2 || options.solve_algo == 4
 
@@ -252,7 +254,7 @@ elseif options.solve_algo == 2 || options.solve_algo == 4
         end
         [x,info]=solver(func,x,j1(r(i):r(i+1)-1),j2(r(i):r(i+1)-1),jacobian_flag, ...
                         options.gstep, ...
-                        tolf,options.solve_tolx, ...
+                        tolf,tolx, ...
                         maxit,options.debug,varargin{:});
         if info
             return
@@ -261,7 +263,7 @@ elseif options.solve_algo == 2 || options.solve_algo == 4
     fvec = feval(func,x,varargin{:});
     if max(abs(fvec)) > tolf
         [x,info]=solver(func,x,1:nn,1:nn,jacobian_flag, ...
-                        options.gstep, tolf,options.solve_tolx, ...
+                        options.gstep, tolf,tolx, ...
                         maxit,options.debug,varargin{:});
     end
 elseif options.solve_algo == 3
diff --git a/matlab/evaluate_steady_state_file.m b/matlab/evaluate_steady_state_file.m
index 7a299f0fad..c503f6db2d 100644
--- a/matlab/evaluate_steady_state_file.m
+++ b/matlab/evaluate_steady_state_file.m
@@ -111,7 +111,7 @@ if steady_state_checkflag
         info(2) = check; % to be improved
         return
     end
-    if max(abs(residuals)) > options.dynatol.f
+    if max(abs(residuals)) > options.solve_tolf
         info(1) = 19;
         info(2) = residuals'*residuals;
         return
diff --git a/matlab/partial_information/PCL_resol.m b/matlab/partial_information/PCL_resol.m
index 9ddda8c13c..52e418e2ed 100644
--- a/matlab/partial_information/PCL_resol.m
+++ b/matlab/partial_information/PCL_resol.m
@@ -88,7 +88,7 @@ else
         if options_.linear == 0
             % nonlinear models
             if max(abs(feval(fh,dr.ys,[oo_.exo_steady_state; ...
-                                    oo_.exo_det_steady_state], M_.params))) > options_.dynatol.f
+                                    oo_.exo_det_steady_state], M_.params))) > options_.solve_tolf
                 opt = options_;
                 opt.jacobian_flag = false;
                 [dr.ys,check1] = dynare_solve(fh,dr.ys,opt,...
diff --git a/matlab/resid.m b/matlab/resid.m
index 716c9c5b36..945708e327 100644
--- a/matlab/resid.m
+++ b/matlab/resid.m
@@ -98,7 +98,7 @@ if nargout == 0
     disp('Residuals of the static equations:')
     skipline()
     for i=1:M_.orig_endo_nbr
-        if abs(z(i)) < options_.dynatol.f/100
+        if abs(z(i)) < options_.solve_tolf/100
             tmp = 0;
         else
             tmp = z(i);
-- 
GitLab