diff --git a/matlab/get_lhs_and_rhs.m b/matlab/get_lhs_and_rhs.m new file mode 100644 index 0000000000000000000000000000000000000000..84df0bbfa393eb7ddd0126a2d875f2f48d5f54a7 --- /dev/null +++ b/matlab/get_lhs_and_rhs.m @@ -0,0 +1,54 @@ +function [lhs, rhs] = get_lhs_and_rhs(eqname, DynareModel, original) + +% Returns the left and right handsides of an equation. +% +% INPUTS +% - lhs [string] Left hand side of the equation. +% - rhs [string] Right hand side of the equation. +% - DynareModel [struct] Structure describing the current model (M_). +% +% OUTPUTS +% - eqname [string] Name of the equation. +% +% SPECIAL REQUIREMENTS +% The user must have attached names to the equations using equation +% tags. Each equation in the model block must be preceeded with a +% tag (see the reference manual). For instance, we should have +% something as: +% +% [name='Phillips curve'] +% pi = beta*pi(1) + slope*y + lam; + +% 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 <http://www.gnu.org/licenses/>. + +if nargin<3 + original = false; +end + +% Get the equation from the JSON output. +if original + jsonfil = loadjson([DynareModel.fname '_original.json']); +else + jsonfil = loadjson([DynareModel.fname '.json']); +end +jsonmod = jsonfil.model; +jsoneqn = getEquationsByTags(jsonmod, 'name', eqname); + +% Get the lhs and rhs members of the selected equation. +lhs = jsoneqn{1}.lhs; +rhs = jsoneqn{1}.rhs; \ No newline at end of file diff --git a/matlab/get_variables_and_parameters_in_equation.m b/matlab/get_variables_and_parameters_in_equation.m new file mode 100644 index 0000000000000000000000000000000000000000..fcca32cf02153c1e4f1e5b4c1ed8ac2d0bbbc866 --- /dev/null +++ b/matlab/get_variables_and_parameters_in_equation.m @@ -0,0 +1,87 @@ +function [pnames, enames, xnames, pid, eid, xid] = get_variables_and_parameters_in_equation(lhs, rhs, DynareModel) + +% Returns the lists of parameters, endogenous variables and exogenous variables in an equation. +% +% INPUTS +% - lhs [string] Left hand side of an equation. +% - rhs [string] Right hand side of an equation. +% - DynareModel [struct] Structure describing the current model (M_). +% +% OUTPUTS +% - pnames [cell] Cell of row char arrays (p elements), names of the parameters. +% - enames [cell] Cell of row char arrays (n elements), names of the endogenous variables. +% - xnames [cell] Cell of row char arrays (m elements), names of the exogenous variables. +% - pid [Integer] p*1 vector of indices in M_.param_names for the listed parameters in params. +% - eid [Integer] n*1 vector of indices in M_.endo_names for the listed parameters in endogenous. +% - xid [Integer] m*1 vector of indices in M_.exo_names for the listed parameters in exogenous. + +% 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 <http://www.gnu.org/licenses/>. + +% Get the tokens in the rhs member of the equation. +rhs_ = strsplit(rhs,{'+','-','*','/','^', ... + 'log(', 'log10(', 'ln(', 'exp(', ... + 'sqrt(', 'abs(', 'sign(', ... + 'sin(', 'cos(', 'tan(', 'asin(', 'acos(', 'atan(', ... + 'min(', 'max(', ... + 'normcdf(', 'normpdf(', 'erf(', ... + 'diff(', 'adl(', '(', ')'}); + +% Filter out the numbers and punctuation. +rhs_(cellfun(@(x) all(isstrprop(x, 'digit')+isstrprop(x, 'punct')), rhs_)) = []; + +% Get list of parameters. +pnames = DynareModel.param_names; +pnames = intersect(rhs_, pnames); + +% Get list of endogenous variables. +enames = DynareModel.endo_names; +enames = intersect(rhs_, enames); + +% Get list of exogenous variables +xnames = DynareModel.exo_names; +xnames = intersect(rhs_, xnames); + +% Decide if we are dealing with a dynamic model. If so, the lhs variable +% already belongs to enames, we remove this variable from enames. +id = strmatch(lhs, enames, 'exact'); +if ~isempty(id) + enames(id) = []; +end + +% Add lhs variable in first position of enames. +enames = [lhs; enames]; + +% Returns vector of indices for parameters endogenous and exogenous +% variables if required. +if nargout>3 + p = length(pnames); + pid = zeros(p, 1); + for i = 1:p + pid(i) = strmatch(pnames{i}, DynareModel.param_names, 'exact'); + end + p = length(enames); + eid = zeros(p, 1); + for i = 1:p + eid(i) = strmatch(enames{i}, DynareModel.endo_names, 'exact'); + end + p = length(xnames); + xid = zeros(p, 1); + for i = 1:p + xid(i) = strmatch(xnames{i}, DynareModel.exo_names, 'exact'); + end +end \ No newline at end of file