147 lines
3.7 KiB
Matlab
147 lines
3.7 KiB
Matlab
function b = admissible(o, d)
|
||
|
||
% Return true iff d is an admissible draw in a distribution characterized by o.
|
||
%
|
||
% INPUTS
|
||
% - o [dprior] Distribution specification for a n×1 vector of independent continuous random variables
|
||
% - d [double] n×1 vector.
|
||
%
|
||
% OUTPUTS
|
||
% - b [logical] scalar.
|
||
%
|
||
% REMARKS
|
||
% None.
|
||
%
|
||
% EXAMPLE
|
||
%
|
||
% >> Prior = dprior(bayestopt_, options_.prior_trunc);
|
||
% >> d = Prior.draw()
|
||
% >> Prior.admissible(d)
|
||
% ans =
|
||
%
|
||
% logical
|
||
%
|
||
% 1
|
||
|
||
% Copyright © 2023 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 <https://www.gnu.org/licenses/>.
|
||
|
||
b = false;
|
||
|
||
if ~isequal(length(d), length(o.lb))
|
||
return
|
||
end
|
||
|
||
if all(d>=o.lb & d<=o.ub)
|
||
b = true;
|
||
end
|
||
|
||
return % --*-- Unit tests --*--
|
||
|
||
%@test:1
|
||
% Fill global structures with required fields...
|
||
prior_trunc = 1e-10;
|
||
p0 = repmat([1; 2; 3; 4; 5; 6; 8], 2, 1); % Prior shape
|
||
p1 = .4*ones(14,1); % Prior mean
|
||
p2 = .2*ones(14,1); % Prior std.
|
||
p3 = NaN(14,1);
|
||
p4 = NaN(14,1);
|
||
p5 = NaN(14,1);
|
||
p6 = NaN(14,1);
|
||
p7 = NaN(14,1);
|
||
|
||
for i=1:14
|
||
switch p0(i)
|
||
case 1
|
||
% Beta distribution
|
||
p3(i) = 0;
|
||
p4(i) = 1;
|
||
[p6(i), p7(i)] = beta_specification(p1(i), p2(i)^2, p3(i), p4(i));
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 1);
|
||
case 2
|
||
% Gamma distribution
|
||
p3(i) = 0;
|
||
p4(i) = Inf;
|
||
[p6(i), p7(i)] = gamma_specification(p1(i), p2(i)^2, p3(i), p4(i));
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 2);
|
||
case 3
|
||
% Normal distribution
|
||
p3(i) = -Inf;
|
||
p4(i) = Inf;
|
||
p6(i) = p1(i);
|
||
p7(i) = p2(i);
|
||
p5(i) = p1(i);
|
||
case 4
|
||
% Inverse Gamma (type I) distribution
|
||
p3(i) = 0;
|
||
p4(i) = Inf;
|
||
[p6(i), p7(i)] = inverse_gamma_specification(p1(i), p2(i)^2, p3(i), 1, false);
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 4);
|
||
case 5
|
||
% Uniform distribution
|
||
[p1(i), p2(i), p6(i), p7(i)] = uniform_specification(p1(i), p2(i), p3(i), p4(i));
|
||
p3(i) = p6(i);
|
||
p4(i) = p7(i);
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 5);
|
||
case 6
|
||
% Inverse Gamma (type II) distribution
|
||
p3(i) = 0;
|
||
p4(i) = Inf;
|
||
[p6(i), p7(i)] = inverse_gamma_specification(p1(i), p2(i)^2, p3(i), 2, false);
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 6);
|
||
case 8
|
||
% Weibull distribution
|
||
p3(i) = 0;
|
||
p4(i) = Inf;
|
||
[p6(i), p7(i)] = weibull_specification(p1(i), p2(i)^2, p3(i));
|
||
p5(i) = compute_prior_mode([p6(i) p7(i)], 8);
|
||
otherwise
|
||
error('This density is not implemented!')
|
||
end
|
||
end
|
||
|
||
BayesInfo.pshape = p0;
|
||
BayesInfo.p1 = p1;
|
||
BayesInfo.p2 = p2;
|
||
BayesInfo.p3 = p3;
|
||
BayesInfo.p4 = p4;
|
||
BayesInfo.p5 = p5;
|
||
BayesInfo.p6 = p6;
|
||
BayesInfo.p7 = p7;
|
||
|
||
ndraws = 10;
|
||
|
||
% Call the tested routine
|
||
try
|
||
% Instantiate dprior object
|
||
o = dprior(BayesInfo, prior_trunc, false);
|
||
% Do simulations in a loop and estimate recursively the mean and the variance.
|
||
for i = 1:ndraws
|
||
draw = o.draw();
|
||
if ~o.admissible(draw)
|
||
error()
|
||
end
|
||
end
|
||
t(1) = true;
|
||
catch
|
||
t(1) = false;
|
||
end
|
||
|
||
T = all(t);
|
||
|
||
%@eof:1
|