From e3e6f4c9b4fc1431ccc16063dc4a89ffb93fecb8 Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx.de>
Date: Thu, 21 Dec 2023 12:33:53 +0100
Subject: [PATCH] :bug: get_mean.m: fix internal logic

---
 matlab/accessors/get_mean.m | 53 +++++++++++++++++++++++++------------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/matlab/accessors/get_mean.m b/matlab/accessors/get_mean.m
index 3c54cb98a8..377ee5e16e 100644
--- a/matlab/accessors/get_mean.m
+++ b/matlab/accessors/get_mean.m
@@ -1,14 +1,15 @@
 function y0 = get_mean(varargin)
-% function x = get_mean(vname1, vname2, <order>)
-% returns the steady-state of a variable identified by its name
+% function y0 = get_mean(varargin)
+% returns the mean of a variable identified by its name
 %
 % INPUTS:
-%   vname1, vname2, ... :  list of variable names
-%   order: if integer 1 or 2, optionally last input can trigger the order
-%   at which steady state is computed
+%   vargargin           inputs containing
+%                       - vname1, vname2, ... :  list of variable names
+%                       - order: if integer 1 or 2, optionally last input can trigger the order
+%                           at which steady state is computed
 %
 % OUTPUTS
-%   x:      steady state values
+%   y0:      mean values
 %
 % SPECIAL REQUIREMENTS
 %   none
@@ -30,27 +31,45 @@ function y0 = get_mean(varargin)
 % You should have received a copy of the GNU General Public License
 % along with Dynare.  If not, see <https://www.gnu.org/licenses/>.
 
-global M_ oo_ options_
+global M_ options_ oo_
 
 if ~isempty(regexp(varargin{end},'\d','ONCE')) && isempty(regexp(varargin{end},'\D','ONCE'))
     order=eval(varargin{end});
+    nvars=length(varargin)-1;
 else
     order=1;
+    nvars=length(varargin);
 end
 if order==1
-    ys_ = oo_.steady_state;
-    ys_ = evaluate_steady_state(ys_,[oo_.exo_steady_state; oo_.exo_det_steady_state],M_,options_,true);
+    if isfield(oo_,'dr') && isfield(oo_.dr,'ys')
+        ys_=oo_.dr.ys;
+    else
+        ys_ = oo_.steady_state;
+        ys_ = evaluate_steady_state(ys_,[oo_.exo_steady_state; oo_.exo_det_steady_state],M_,options_,true);
+    end
 elseif order==2
-    ys_ = oo_.dr.ys;
-    ys_(oo_.dr.order_var)=ys_(oo_.dr.order_var)+oo_.dr.ghs2./2;
+    if isfield(oo_,'dr') && isfield(oo_.dr,'ys')
+        ys_=oo_.dr.ys;
+        if ~isfield(oo_.dr,'ghs2')
+            error('get_mean: ghs2 needs to be present in oo_ to compute mean at order=2')
+        else
+            ys_(oo_.dr.order_var)=ys_(oo_.dr.order_var)+oo_.dr.ghs2./2;
+        end
+    else
+        error('get_mean: decision rules need to be present in oo_ to compute mean') 
+    end
 else
-    return
+    error('get_mean: order>2 not implemented')
 end
-lgy_ = M_.endo_names;
 
-mfys=nan(length(varargin),1);
-for j=1:length(varargin)
-    mfys(j) = find(strcmp(varargin{j},lgy_));
+mfys=NaN(nvars,1);
+for j=1:nvars
+    endo_index=find(strcmp(varargin{j},M_.endo_names));
+    if isempty(endo_index)
+        error('get_mean: unknown variables %s requested',varargin{j})
+    else
+    mfys(j) = find(strcmp(varargin{j},M_.endo_names));
+    end
 end
 
-y0 = ys_(mfys);
+y0 = ys_(mfys);
\ No newline at end of file
-- 
GitLab