From 60c8ed1948a640cd9f449e9413cde8460ecd1dcf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Ry=C3=BBk=29?=
 <stepan@adjemian.eu>
Date: Wed, 15 Sep 2021 12:04:56 +0200
Subject: [PATCH] Fix bug, pac.bgp.set should also work with exogenous
 variables.

---
 matlab/+pac/+bgp/set.m | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/matlab/+pac/+bgp/set.m b/matlab/+pac/+bgp/set.m
index ccb92f85ac..d48f20ec24 100644
--- a/matlab/+pac/+bgp/set.m
+++ b/matlab/+pac/+bgp/set.m
@@ -33,7 +33,15 @@ global M_
 eqtag = M_.pac.(pacmodel).tag_map{strcmp(paceq, M_.pac.(pacmodel).tag_map(:,1)),2};
 
 dummy = [];
+
 ide = find(strcmp(variable, M_.endo_names));
+xflag = false;
+if isempty(ide)
+    % variable is not an endogenous variable
+    ide = find(strcmp(variable, M_.exo_names));
+    xflag = true;
+end
+
 if ~isempty(ide)
     if isfield(M_.pac.(pacmodel).equations.(eqtag), 'additive') && length(M_.pac.(pacmodel).equations.(eqtag).additive.vars)>1
         if ~isfield(M_.pac.(pacmodel).equations.(eqtag).additive, 'bgp')
@@ -41,6 +49,11 @@ if ~isempty(ide)
         end
         [isvar, ie] = ismember(ide, M_.pac.(pacmodel).equations.(eqtag).additive.vars);
         if isvar
+            if xflag
+                assert(~M_.pac.(pacmodel).equations.(eqtag).additive.isendo(ie), 'Variable type issue.')
+            else
+                assert(M_.pac.(pacmodel).equations.(eqtag).additive.isendo(ie), 'Variable type issue.')
+            end
             M_.pac.(pacmodel).equations.(eqtag).additive.bgp(ie) = nonzeromean;
             return
         end
@@ -51,6 +64,11 @@ if ~isempty(ide)
         end
         [isvar, ie] = ismember(ide, M_.pac.(pacmodel).equations.(eqtag).optim_additive.vars);
         if isvar
+            if xflag
+                assert(~M_.pac.(pacmodel).equations.(eqtag).optim_additive.isendo(ie), 'Variable type issue.')
+            else
+                assert(M_.pac.(pacmodel).equations.(eqtag).optim_additive.isendo(ie), 'Variable type issue.')
+            end
             M_.pac.(pacmodel).equations.(eqtag).optim_additive.bgp(ie) = nonzeromean;
             return
         end
@@ -61,11 +79,16 @@ if ~isempty(ide)
         end
         [isvar, ie] = ismember(ide, M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.vars);
         if isvar
+            if xflag
+                assert(~M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.isendo(ie), 'Variable type issue.')
+            else
+                assert(M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.isendo(ie), 'Variable type issue.')
+            end
             M_.pac.(pacmodel).equations.(eqtag).non_optimizing_behaviour.bgp(ie) = nonzeromean;
             return
         end
     end
     warning('%s is not an exogenous variable in equation %s.', variable, paceq)
 else
-    error('Endogenous variable %s is unknown.', variable)
+    error('Endogenous/Exogenous variable %s is unknown.', variable)
 end
\ No newline at end of file
-- 
GitLab