From cffff796f154710754e7223175dca1300885888f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= Date: Mon, 23 Jul 2018 10:41:34 +0200 Subject: [PATCH] Added routine to test if an auxiliary variable is a lag of a variable. --- matlab/islagof.m | 129 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 matlab/islagof.m diff --git a/matlab/islagof.m b/matlab/islagof.m new file mode 100644 index 000000000..271cbe186 --- /dev/null +++ b/matlab/islagof.m @@ -0,0 +1,129 @@ +function b = islagof(v1, v2) + +% Returns true if and only if variable v1 is a lag of variable v2. +% +% INPUTS +% - v1 [string] Variable name. +% - v2 [string] Variable name. +% +% OUTPUTS +% - b [logical] + +% Copyright (C) 2018 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . + +global M_ + +if ~ischar(v1) && isscalar(v1) && isnumeric(v1) && isint(v1) + id1 = v1; + if id1>M_.endo_nbr + error('First input must be an integer between 1 and %u', M_.endo_nbr) + end +end + +if ~ischar(v2) && isscalar(v2) && isnumeric(v2) && isint(v2) + id2 = v2; + if id2>M_.endo_nbr + error('First input must be an integer between 1 and %u', M_.endo_nbr) + end +end + +% Set output default value +b = false; + +% Get index of v1 +if ischar(v1) + id1 = find(strcmp(v1, M_.endo_names)); +end + +if isempty(id1) + error('First input must be a variable name.') +end + +% Get index of v2 +if ischar(v2) + id2 = find(strcmp(v2, M_.endo_names)); +end + +if isempty(id2) + error('Second input must be a variable name.') +end + +% A variable cannot be a lag of itself. +if isequal(id1, id2) + return +end + +% Are v1 and v2 auxiliary variables? +v1_is_an_auxiliary_variable = id1>M_.orig_endo_nbr; +v2_is_an_auxiliary_variable = id2>M_.orig_endo_nbr; + +% At least one of the variables must be an auxiliary variable +if ~v1_is_an_auxiliary_variable && ~v2_is_an_auxiliary_variable + return +end + +% If v1 and v2 are auxiliary variables +if v1_is_an_auxiliary_variable && v2_is_an_auxiliary_variable + auxinfo1 = M_.aux_vars(get_aux_variable_id(id1)); + auxinfo2 = M_.aux_vars(get_aux_variable_id(id2)); + isleadlag1 = ismember(auxinfo1.type, [1,0]); + isleadlag2 = ismember(auxinfo2.type, [1,0]); + % If v1 and v2 are lead/lag auxiliary variables + if isleadlag1 && isleadlag2 + % If v1 and v2 are lead/lag of a common endogenous variable. + if auxinfo1.orig_index && auxinfo2.orig_index + if auxinfo1.orig_lead_lag