From f7cf75a228b635b49f8bfaf2e3cd27e0107c56ad Mon Sep 17 00:00:00 2001
From: Michel Juillard <michel.juillard@mjui.fr>
Date: Mon, 23 Apr 2012 16:57:30 +0200
Subject: [PATCH] fixed problems with trying to make homotopy robust to
 problems in one run.

---
 matlab/evaluate_steady_state.m |  3 ++-
 matlab/homotopy1.m             |  9 ++++++++-
 matlab/steady.m                | 12 ++++++++----
 preprocessor/DynareBison.yy    |  2 +-
 4 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/matlab/evaluate_steady_state.m b/matlab/evaluate_steady_state.m
index 3e73c3c57..c979e0d9c 100644
--- a/matlab/evaluate_steady_state.m
+++ b/matlab/evaluate_steady_state.m
@@ -81,7 +81,8 @@ function [ys,params,info] = evaluate_steady_state(ys_init,M,options,oo,steadysta
         end
     else
         % block or bytecode
-        [ys,check] = dynare_solve_block_or_bytecode(ys_init,exo_ss, params, options, M);
+        [ys,check] = dynare_solve_block_or_bytecode(ys_init,exo_ss, params, ...
+                                                    options, M);
     end
 
     if check
diff --git a/matlab/homotopy1.m b/matlab/homotopy1.m
index f0913b86b..30e8ef137 100644
--- a/matlab/homotopy1.m
+++ b/matlab/homotopy1.m
@@ -77,5 +77,12 @@ for i=1:step_nbr+1
     oo_.exo_steady_state(values(ix,2)) = points(ix,i);
     oo_.exo_det_steady_state(values(ixd,2)) = points(ixd,i);
 
-    oo_.steady_state = steady_(M_,options_,oo_);
+    [steady_state,M_.params,info] = steady_(M_,options_,oo_);
+    if info(1) == 0
+        % if homotopy step is not successful, current values of steady
+        % state are not modified
+        oo_.steady_state = steady_state;
+    else 
+        break
+    end
 end
diff --git a/matlab/steady.m b/matlab/steady.m
index 8f3a72fa7..67c49b53c 100644
--- a/matlab/steady.m
+++ b/matlab/steady.m
@@ -53,12 +53,16 @@ switch options_.homotopy_mode
     homotopy3(options_.homotopy_values, options_.homotopy_steps);
 end
 
-[oo_.steady_state,M_.params,info] = steady_(M_,options_,oo_);
+[steady_state,M_.params,info] = steady_(M_,options_,oo_);
 
-if info(1) && options_.steady.stop_on_error
+if info(1) == 0
+    oo_.steady_state = steady_state;
+    disp_steady_state(M_,oo_);
+elseif options_.steady.stop_on_error
     print_info(info,options_.noprint);
+else
+    disp(['Warning: steady state could not be computed but steady.stop_on_error ' ...
+          '== 0, so I continue'])
 end
 
-disp_steady_state(M_,oo_);
-
 M_.Sigma_e = Sigma_e;
diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy
index 39878f99e..a246d5c39 100644
--- a/preprocessor/DynareBison.yy
+++ b/preprocessor/DynareBison.yy
@@ -2502,7 +2502,7 @@ o_median : MEDIAN { driver.option_num("ms.median","1"); }
 o_regimes : REGIMES { driver.option_num("ms.regimes","1"); };
 o_regime : REGIME EQUAL INT_NUMBER { driver.option_num("ms.regime",$3); };
 o_data_obs_nbr : DATA_OBS_NBR EQUAL INT_NUMBER { driver.option_num("ms.forecast_data_obs",$3); };
-o_stop_on_error: STOP_ON_ERROR EQUAL INT_NUMBER { driver.option_num("steady.stop_on_eror",$3); };
+o_stop_on_error: STOP_ON_ERROR EQUAL INT_NUMBER { driver.option_num("steady.stop_on_error",$3); };
 o_discretionary_tol: DISCRETIONARY_TOL EQUAL non_negative_number { driver.option_num("discretionary_tol",$3); };
 
 range : symbol ':' symbol
-- 
GitLab