102 lines
3.7 KiB
Matlab
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
|
|
|