diff --git a/matlab/@dprior/dprior.m b/matlab/@dprior/dprior.m index f9e1d0b97a839680754f2028595bf2dcd3dcd7e2..d17a54db4eefc6ff926a8c0fb50e0fba065faca9 100644 --- a/matlab/@dprior/dprior.m +++ b/matlab/@dprior/dprior.m @@ -7,20 +7,20 @@ classdef dprior p4 = []; % Upper bound of the prior support. lb = []; % Truncated prior lower bound. ub = []; % Truncated prior upper bound. - uniform_index = []; % Index for the uniform priors. - gaussian_index = []; % Index for the gaussian priors. - gamma_index = []; % Index for the gamma priors. - beta_index = []; % Index for the beta priors. - inverse_gamma_1_index = []; % Index for the inverse gamma type 1 priors. - inverse_gamma_2_index = []; % Index for the inverse gamma type 2 priors. - weibull_index = []; % Index for the weibull priors. - uniform_draws = false; - gaussian_draws = false; - gamma_draws = false; - beta_draws = false; - inverse_gamma_1_draws = false; - inverse_gamma_2_draws = false; - weibull_draws = false; + iduniform = []; % Index for the uniform priors. + idgaussian = []; % Index for the gaussian priors. + idgamma = []; % Index for the gamma priors. + idbeta = []; % Index for the beta priors. + idinvgamma1 = []; % Index for the inverse gamma type 1 priors. + idinvgamma2 = []; % Index for the inverse gamma type 2 priors. + idweibull = []; % Index for the weibull priors. + isuniform = false; + isgaussian = false; + isgamma = false; + isbeta = false; + isinvgamma1 = false; + isinvgamma2 = false; + isweibull = false; end methods @@ -50,33 +50,33 @@ classdef dprior else prior_shape = bayestopt_.pshape; end - o.beta_index = find(prior_shape==1); - if ~isempty(o.beta_index) - o.beta_draws = true; + o.idbeta = find(prior_shape==1); + if ~isempty(o.idbeta) + o.isbeta = true; end - o.gamma_index = find(prior_shape==2); - if ~isempty(o.gamma_index) - o.gamma_draws = true; + o.idgamma = find(prior_shape==2); + if ~isempty(o.idgamma) + o.isgamma = true; end - o.gaussian_index = find(prior_shape==3); - if ~isempty(o.gaussian_index) - o.gaussian_draws = true; + o.idgaussian = find(prior_shape==3); + if ~isempty(o.idgaussian) + o.isgaussian = true; end - o.inverse_gamma_1_index = find(prior_shape==4); - if ~isempty(o.inverse_gamma_1_index) - o.inverse_gamma_1_draws = true; + o.idinvgamma1 = find(prior_shape==4); + if ~isempty(o.idinvgamma1) + o.isinvgamma1 = true; end - o.uniform_index = find(prior_shape==5); - if ~isempty(o.uniform_index) - o.uniform_draws = true; + o.iduniform = find(prior_shape==5); + if ~isempty(o.iduniform) + o.isuniform = true; end - o.inverse_gamma_2_index = find(prior_shape==6); - if ~isempty(o.inverse_gamma_2_index) - o.inverse_gamma_2_draws = true; + o.idinvgamma2 = find(prior_shape==6); + if ~isempty(o.idinvgamma2) + o.isinvgamma2 = true; end - o.weibull_index = find(prior_shape==8); - if ~isempty(o.weibull_index) - o.weibull_draws = true; + o.idweibull = find(prior_shape==8); + if ~isempty(o.idweibull) + o.isweibull = true; end end @@ -97,64 +97,64 @@ classdef dprior % >> Prior = dprior(bayestopt_, options_.prior_trunc); % >> d = Prior.draw() p = NaN(rows(o.lb), 1); - if o.uniform_draws - p(o.uniform_index) = rand(length(o.uniform_index),1).*(o.p4(o.uniform_index)-o.p3(o.uniform_index)) + o.p3(o.uniform_index); - out_of_bound = find( (p(o.uniform_index)>o.ub(o.uniform_index)) | (p(o.uniform_index)<o.lb(o.uniform_index))); - while ~isempty(out_of_bound) - p(o.uniform_index) = rand(length(o.uniform_index), 1).*(o.p4(o.uniform_index)-o.p3(o.uniform_index)) + o.p3(o.uniform_index); - out_of_bound = find( (p(o.uniform_index)>o.ub(o.uniform_index)) | (p(o.uniform_index)<o.lb(o.uniform_index))); + if o.isuniform + p(o.iduniform) = rand(length(o.iduniform),1).*(o.p4(o.iduniform)-o.p3(o.iduniform)) + o.p3(o.iduniform); + oob = find( (p(o.iduniform)>o.ub(o.iduniform)) | (p(o.iduniform)<o.lb(o.iduniform))); + while ~isempty(oob) + p(o.iduniform) = rand(length(o.iduniform), 1).*(o.p4(o.iduniform)-o.p3(o.iduniform)) + o.p3(o.iduniform); + oob = find( (p(o.iduniform)>o.ub(o.iduniform)) | (p(o.iduniform)<o.lb(o.iduniform))); end end - if o.gaussian_draws - p(o.gaussian_index) = randn(length(o.gaussian_index), 1).*o.p7(o.gaussian_index) + o.p6(o.gaussian_index); - out_of_bound = find( (p(o.gaussian_index)>o.ub(o.gaussian_index)) | (p(o.gaussian_index)<o.lb(o.gaussian_index))); - while ~isempty(out_of_bound) - p(o.gaussian_index(out_of_bound)) = randn(length(o.gaussian_index(out_of_bound)), 1).*o.p7(o.gaussian_index(out_of_bound)) + o.p6(o.gaussian_index(out_of_bound)); - out_of_bound = find( (p(o.gaussian_index)>o.ub(o.gaussian_index)) | (p(o.gaussian_index)<o.lb(o.gaussian_index))); + if o.isgaussian + p(o.idgaussian) = randn(length(o.idgaussian), 1).*o.p7(o.idgaussian) + o.p6(o.idgaussian); + oob = find( (p(o.idgaussian)>o.ub(o.idgaussian)) | (p(o.idgaussian)<o.lb(o.idgaussian))); + while ~isempty(oob) + p(o.idgaussian(oob)) = randn(length(o.idgaussian(oob)), 1).*o.p7(o.idgaussian(oob)) + o.p6(o.idgaussian(oob)); + oob = find( (p(o.idgaussian)>o.ub(o.idgaussian)) | (p(o.idgaussian)<o.lb(o.idgaussian))); end end - if o.gamma_draws - p(o.gamma_index) = gamrnd(o.p6(o.gamma_index), o.p7(o.gamma_index))+o.p3(o.gamma_index); - out_of_bound = find( (p(o.gamma_index)>o.ub(o.gamma_index)) | (p(o.gamma_index)<o.lb(o.gamma_index))); - while ~isempty(out_of_bound) - p(o.gamma_index(out_of_bound)) = gamrnd(o.p6(o.gamma_index(out_of_bound)), o.p7(o.gamma_index(out_of_bound)))+o.p3(o.gamma_index(out_of_bound)); - out_of_bound = find( (p(o.gamma_index)>o.ub(o.gamma_index)) | (p(o.gamma_index)<o.lb(o.gamma_index))); + if o.isgamma + p(o.idgamma) = gamrnd(o.p6(o.idgamma), o.p7(o.idgamma))+o.p3(o.idgamma); + oob = find( (p(o.idgamma)>o.ub(o.idgamma)) | (p(o.idgamma)<o.lb(o.idgamma))); + while ~isempty(oob) + p(o.idgamma(oob)) = gamrnd(o.p6(o.idgamma(oob)), o.p7(o.idgamma(oob)))+o.p3(o.idgamma(oob)); + oob = find( (p(o.idgamma)>o.ub(o.idgamma)) | (p(o.idgamma)<o.lb(o.idgamma))); end end - if o.beta_draws - p(o.beta_index) = (o.p4(o.beta_index)-o.p3(o.beta_index)).*betarnd(o.p6(o.beta_index), o.p7(o.beta_index))+o.p3(o.beta_index); - out_of_bound = find( (p(o.beta_index)>o.ub(o.beta_index)) | (p(o.beta_index)<o.lb(o.beta_index))); - while ~isempty(out_of_bound) - p(o.beta_index(out_of_bound)) = (o.p4(o.beta_index(out_of_bound))-o.p3(o.beta_index(out_of_bound))).*betarnd(o.p6(o.beta_index(out_of_bound)), o.p7(o.beta_index(out_of_bound)))+o.p3(o.beta_index(out_of_bound)); - out_of_bound = find( (p(o.beta_index)>o.ub(o.beta_index)) | (p(o.beta_index)<o.lb(o.beta_index))); + if o.isbeta + p(o.idbeta) = (o.p4(o.idbeta)-o.p3(o.idbeta)).*betarnd(o.p6(o.idbeta), o.p7(o.idbeta))+o.p3(o.idbeta); + oob = find( (p(o.idbeta)>o.ub(o.idbeta)) | (p(o.idbeta)<o.lb(o.idbeta))); + while ~isempty(oob) + p(o.idbeta(oob)) = (o.p4(o.idbeta(oob))-o.p3(o.idbeta(oob))).*betarnd(o.p6(o.idbeta(oob)), o.p7(o.idbeta(oob)))+o.p3(o.idbeta(oob)); + oob = find( (p(o.idbeta)>o.ub(o.idbeta)) | (p(o.idbeta)<o.lb(o.idbeta))); end end - if o.inverse_gamma_1_draws - p(o.inverse_gamma_1_index) = ... - sqrt(1./gamrnd(o.p7(o.inverse_gamma_1_index)/2, 2./o.p6(o.inverse_gamma_1_index)))+o.p3(o.inverse_gamma_1_index); - out_of_bound = find( (p(o.inverse_gamma_1_index)>o.ub(o.inverse_gamma_1_index)) | (p(o.inverse_gamma_1_index)<o.lb(o.inverse_gamma_1_index))); - while ~isempty(out_of_bound) - p(o.inverse_gamma_1_index(out_of_bound)) = ... - sqrt(1./gamrnd(o.p7(o.inverse_gamma_1_index(out_of_bound))/2, 2./o.p6(o.inverse_gamma_1_index(out_of_bound))))+o.p3(o.inverse_gamma_1_index(out_of_bound)); - out_of_bound = find( (p(o.inverse_gamma_1_index)>o.ub(o.inverse_gamma_1_index)) | (p(o.inverse_gamma_1_index)<o.lb(o.inverse_gamma_1_index))); + if o.isinvgamma1 + p(o.idinvgamma1) = ... + sqrt(1./gamrnd(o.p7(o.idinvgamma1)/2, 2./o.p6(o.idinvgamma1)))+o.p3(o.idinvgamma1); + oob = find( (p(o.idinvgamma1)>o.ub(o.idinvgamma1)) | (p(o.idinvgamma1)<o.lb(o.idinvgamma1))); + while ~isempty(oob) + p(o.idinvgamma1(oob)) = ... + sqrt(1./gamrnd(o.p7(o.idinvgamma1(oob))/2, 2./o.p6(o.idinvgamma1(oob))))+o.p3(o.idinvgamma1(oob)); + oob = find( (p(o.idinvgamma1)>o.ub(idinvgamma1)) | (p(o.idinvgamma1)<o.lb(o.idinvgamma1))); end end - if o.inverse_gamma_2_draws - p(o.inverse_gamma_2_index) = ... - 1./gamrnd(o.p7(o.inverse_gamma_2_index)/2, 2./o.p6(o.inverse_gamma_2_index))+o.p3(o.inverse_gamma_2_index); - out_of_bound = find( (p(o.inverse_gamma_2_index)>o.ub(o.inverse_gamma_2_index)) | (p(o.inverse_gamma_2_index)<o.lb(o.inverse_gamma_2_index))); - while ~isempty(out_of_bound) - p(o.inverse_gamma_2_index(out_of_bound)) = ... - 1./gamrnd(o.p7(o.inverse_gamma_2_index(out_of_bound))/2, 2./o.p6(o.inverse_gamma_2_index(out_of_bound)))+o.p3(o.inverse_gamma_2_index(out_of_bound)); - out_of_bound = find( (p(o.inverse_gamma_2_index)>o.ub(o.inverse_gamma_2_index)) | (p(o.inverse_gamma_2_index)<o.lb(o.inverse_gamma_2_index))); + if o.isinvgamma2 + p(o.idinvgamma2) = ... + 1./gamrnd(o.p7(o.idinvgamma2)/2, 2./o.p6(o.idinvgamma2))+o.p3(o.idinvgamma2); + oob = find( (p(o.idinvgamma2)>o.ub(o.idinvgamma2)) | (p(o.idinvgamma2)<o.lb(o.idinvgamma2))); + while ~isempty(oob) + p(o.idinvgamma2(oob)) = ... + 1./gamrnd(o.p7(o.idinvgamma2(oob))/2, 2./o.p6(o.idinvgamma2(oob)))+o.p3(o.idinvgamma2(oob)); + oob = find( (p(o.idinvgamma2)>o.ub(o.idinvgamma2)) | (p(o.idinvgamma2)<o.lb(o.idinvgamma2))); end end - if o.weibull_draws - p(o.weibull_index) = wblrnd(o.p7(o.weibull_index), o.p6(o.weibull_index)) + o.p3(o.weibull_index); - out_of_bound = find( (p(o.weibull_index)>o.ub(o.weibull_index)) | (p(o.weibull_index)<o.lb(o.weibull_index))); - while ~isempty(out_of_bound) - p(o.weibull_index(out_of_bound)) = wblrnd(o.p7(o.weibull_index(out_of_bound)), o.p6(o.weibull_index(out_of_bound)))+o.p3(o.weibull_index(out_of_bound)); - out_of_bound = find( (p(o.weibull_index)>o.ub(o.weibull_index)) | (p(o.weibull_index)<o.lb(o.weibull_index))); + if o.isweibull + p(o.idweibull) = wblrnd(o.p7(o.idweibull), o.p6(o.idweibull)) + o.p3(o.idweibull); + oob = find( (p(o.idweibull)>o.ub(o.idweibull)) | (p(o.idweibull)<o.lb(o.idweibull))); + while ~isempty(oob) + p(o.idweibull(oob)) = wblrnd(o.p7(o.idweibull(oob)), o.p6(o.idweibull(oob)))+o.p3(o.idweibull(oob)); + oob = find( (p(o.idweibull)>o.ub(o.idweibull)) | (p(o.idweibull)<o.lb(o.idweibull))); end end end