dynare/matlab/+bgp/+transform/in.m

102 lines
3.7 KiB
Matlab

function Variables = in(DynareModel, constraints, variables, id, lb, ub)
if ~iscell(constraints)
error('Second argument must be a one-dimensional cell array.')
end
if iskeyvalue(constraints)
if nargin<4
id = zeros(length(constraints)/2,1);
j = 1;
for i=1:2:length(constraints)
if isempty(regexp(constraints{i}, 'G\(\w+\)')) i
tmp = find(strcmp(constraints{i}, DynareModel.endo_names));
else
tmp = find(strcmp(constraints{i}(3:end-1), DynareModel.endo_names));
if ~isempty(tmp)
tmp = tmp+DynareModel.endo_nbr;
end
end
if isempty(tmp)
error('Unknown variable (%s).', constraints{i})
else
id(j) = tmp;
end
j = j+1;
end
end
Variables = NaN(2*DynareModel.endo_nbr, 1);
jj = 1:length(Variables);
ll = setdiff(jj, id);
Variables(ll) = variables;
values = NaN(length(constraints)/2, 1);
j = 1;
for i=2:2:length(constraints)
values(j) = constraints{i};
j = j+1;
end
Variables(id) = values;
return
end
if iskeyvalues(constraints)
halfline.right = @(x, a) a+exp(x);
halfline.left = @(x, a) a-exp(x);
interval = @(x, a, b) a+(b-a)/(1+exp(x));
if nargin<4
id = zeros(length(constraints)/3,1);
lb = [-Inf(DynareModel.endo_nbr, 1); zeros(DynareModel.endo_nbr, 1)];
ub = Inf(2*DynareModel.endo_nbr, 1);
j = 1;
for i=1:3:length(constraints)
if isempty(regexp(constraints{i}, 'G\(\w+\)'))
tmp = find(strcmp(constraints{i}, DynareModel.endo_names));
else
tmp = find(strcmp(constraints{i}(3:end-1), DynareModel.endo_names));
if ~isempty(tmp)
tmp = tmp + DynareModel.endo_nbr;
end
end
assert(~isempty(tmp), 'Unknown variable (%s).', constraints{i})
lb(tmp) = constraints{i+1};
ub(tmp) = constraints{i+2};
if abs(lb(tmp)-ub(tmp))<1e-6
id(j) = tmp;
end
j = j+1;
end
id = id(id>0);
end
Variables = NaN(2*DynareModel.endo_nbr, 1);
jj = 1:length(Variables);
ll = setdiff(jj, id);
Variables(ll) = variables;
values = NaN(length(id), 1);
j = 1;
for i=1:length(id)
if id(i)>DynareModel.endo_nbr
j = find(strcmp(sprintf('G(%s)', DynareModel.endo_names{id(i)-DynareModel.endo_nbr}), constraints));
else
j = find(strcmp(sprintf('%s', DynareModel.endo_names{id(i)}), constraints));
end
assert(~isempty(j), 'Unknown variable (indexing issue).')
values(i) = constraints{j+1};
end
Variables(id) = values;
for i=1:length(Variables)
if isfinite(lb(i)) && isinf(ub(i))
Variables(i) = halfline.right(Variables(i), lb(i));
elseif isinf(lb(i)) && isfinite(ub(i))
Variables(i) = halfline.left(Variables(i), ub(i));
elseif isfinite(lb(i)) && isfinite(ub(i)) && ub(i)-lb(i)>1e-6
Variables(i) = interval(Variables(i), lb(i), ub(i));
end
end
return
end
error('Second argument must be a cell array of key/value pairs or key/values triplets.')
end