Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explicitly ignore derivatives of argument checks #1492

Merged
merged 15 commits into from
Jan 31, 2022
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "Distributions"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
authors = ["JuliaStats"]
version = "0.25.41"
version = "0.25.42"

[deps]
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
Expand Down
9 changes: 5 additions & 4 deletions src/cholesky/lkjcholesky.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,11 @@ end
# -----------------------------------------------------------------------------

function LKJCholesky(d::Int, η::Real, _uplo::Union{Char,Symbol} = 'L'; check_args::Bool=true)
if check_args
d > 0 || throw(ArgumentError("matrix dimension must be positive"))
η > 0 || throw(ArgumentError("shape parameter must be positive"))
end
@check_args(
LKJCholesky,
(d > 0, "matrix dimension must be positive"),
(η > 0, "shape parameter must be positive"),
)
logc0 = lkj_logc0(d, η)
uplo = _char_uplo(_uplo)
T = Base.promote_eltype(η, logc0)
Expand Down
4 changes: 2 additions & 2 deletions src/edgeworth.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ struct EdgeworthZ{D<:UnivariateDistribution} <: EdgeworthAbstract
n::Float64

function EdgeworthZ{D}(d::UnivariateDistribution, n::Real; check_args::Bool=true) where {D<:UnivariateDistribution}
check_args && @check_args(EdgeworthZ, n > zero(n))
@check_args(EdgeworthZ, n > zero(n))
new{D}(d, n)
end
end
Expand Down Expand Up @@ -80,7 +80,7 @@ struct EdgeworthSum{D<:UnivariateDistribution} <: EdgeworthAbstract
dist::D
n::Float64
function EdgeworthSum{D}(d::UnivariateDistribution, n::Real; check_args::Bool=true) where {D<:UnivariateDistribution}
check_args && @check_args(EdgeworthSum, n > zero(n))
@check_args(EdgeworthSum, n > zero(n))
new{D}(d, n)
end
end
Expand Down
18 changes: 10 additions & 8 deletions src/matrix/lkj.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ end
# -----------------------------------------------------------------------------

function LKJ(d::Integer, η::Real; check_args::Bool=true)
if check_args
d > 0 || throw(ArgumentError("Matrix dimension must be positive."))
η > 0 || throw(ArgumentError("Shape parameter must be positive."))
end
@check_args(
LKJ,
(d > 0, "matrix dimension must be positive."),
(η > 0, "shape parameter must be positive."),
)
logc0 = lkj_logc0(d, η)
T = Base.promote_eltype(η, logc0)
LKJ{T, typeof(d)}(d, T(η), T(logc0))
Expand Down Expand Up @@ -75,10 +76,11 @@ insupport(d::LKJ, R::AbstractMatrix) = isreal(R) && size(R) == size(d) && isone(
mean(d::LKJ) = Matrix{partype(d)}(I, dim(d), dim(d))

function mode(d::LKJ; check_args::Bool=true)
p, η = params(d)
if check_args
η > 1 || throw(ArgumentError("mode is defined only when η > 1."))
end
@check_args(
LKJ,
@setup(_, η = params(d)),
(η > 1, "mode is defined only when η > 1."),
)
return mean(d)
end

Expand Down
9 changes: 5 additions & 4 deletions src/multivariate/dirichlet.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ struct Dirichlet{T<:Real,Ts<:AbstractVector{T},S<:Real} <: ContinuousMultivariat
lmnB::S

function Dirichlet{T}(alpha::AbstractVector{T}; check_args::Bool=true) where T
if check_args && !all(x -> x > zero(x), alpha)
throw(ArgumentError("Dirichlet: alpha must be a positive vector."))
end
@check_args(
Dirichlet,
(!all(x -> x > zero(x), alpha), "alpha must be a positive vector."),
devmotion marked this conversation as resolved.
Show resolved Hide resolved
)
alpha0 = sum(alpha)
lmnB = sum(loggamma, alpha) - loggamma(alpha0)
new{T,typeof(alpha),typeof(lmnB)}(alpha, alpha0, lmnB)
Expand All @@ -39,7 +40,7 @@ function Dirichlet(alpha::AbstractVector{T}; check_args::Bool=true) where {T<:Re
Dirichlet{T}(alpha; check_args=check_args)
end
function Dirichlet(d::Integer, alpha::Real; check_args::Bool=true)
check_args && @check_args(Dirichlet, d > zero(d) && alpha > zero(alpha))
@check_args(Dirichlet, d > zero(d), alpha > zero(alpha))
return Dirichlet{typeof(alpha)}(Fill(alpha, d); check_args=false)
end

Expand Down
18 changes: 6 additions & 12 deletions src/multivariate/multinomial.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,16 @@ struct Multinomial{T<:Real, TV<:AbstractVector{T}} <: DiscreteMultivariateDistri
end

function Multinomial(n::Integer, p::AbstractVector{T}; check_args::Bool=true) where {T<:Real}
if check_args
if n < 0
throw(ArgumentError("n must be a nonnegative integer."))
end
if !isprobvec(p)
throw(ArgumentError("p = $p is not a probability vector."))
end
end
@check_args(
Multinomial,
n >= 0,
(isprobvec(p), "p is not a probability vector."),
)
return Multinomial{T,typeof(p)}(n, p)
end

function Multinomial(n::Integer, k::Integer; check_args::Bool=true)
if check_args
@check_args(Multinomial, n >= 0)
@check_args(Multinomial, k >= 1)
end
@check_args(Multinomial, n >= 0, k >= 1)
return Multinomial{Float64, Vector{Float64}}(round(Int, n), fill(1.0 / k, k))
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/arcsine.jl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct Arcsine{T<:Real} <: ContinuousUnivariateDistribution
end

function Arcsine(a::T, b::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Arcsine, a < b)
@check_args(Arcsine, a < b)
return Arcsine{T}(a, b)
end

Expand Down
13 changes: 7 additions & 6 deletions src/univariate/continuous/beta.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ struct Beta{T<:Real} <: ContinuousUnivariateDistribution
end

function Beta(α::T, β::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(Beta, α > zero(α) && β > zero(β))
@check_args(Beta, α > zero(α), β > zero(β))
return Beta{T}(α, β)
end

Beta(α::Real, β::Real; check_args::Bool=true) = Beta(promote(α, β)...; check_args=check_args)
Beta(α::Integer, β::Integer; check_args::Bool=true) = Beta(float(α), float(β); check_args=check_args)
function Beta(α::Real; check_args::Bool=true)
check_args && @check_args(Beta, α > zero(α))
@check_args(Beta, α > zero(α))
Beta(α, α; check_args=false)
end
Beta() = Beta{Float64}(1.0, 1.0)
Expand All @@ -66,10 +66,11 @@ params(d::Beta) = (d.α, d.β)
mean(d::Beta) = ((α, β) = params(d); α / (α + β))

function mode(d::Beta; check_args::Bool=true)
(α, β) = params(d)
if check_args
(α > 1 && β > 1) || error("mode is defined only when α > 1 and β > 1.")
end
α, β = params(d)
@check_args(
Beta,
(α > 1 && β > 1, "mode is defined only when α > 1 and β > 1."),
)
return (α - 1) / (α + β - 2)
end

Expand Down
4 changes: 2 additions & 2 deletions src/univariate/continuous/betaprime.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ struct BetaPrime{T<:Real} <: ContinuousUnivariateDistribution
end

function BetaPrime(α::T, β::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(BetaPrime, α > zero(α) && β > zero(β))
@check_args(BetaPrime, α > zero(α), β > zero(β))
return BetaPrime{T}(α, β)
end

BetaPrime(α::Real, β::Real; check_args::Bool=true) = BetaPrime(promote(α, β)...; check_args=check_args)
BetaPrime(α::Integer, β::Integer; check_args::Bool=true) = BetaPrime(float(α), float(β); check_args=check_args)
function BetaPrime(α::Real; check_args::Bool=true)
check_args && @check_args(BetaPrime, α > zero(α))
@check_args(BetaPrime, α > zero(α))
BetaPrime(α, α; check_args=false)
end
BetaPrime() = BetaPrime{Float64}(1.0, 1.0)
Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/biweight.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ struct Biweight{T<:Real} <: ContinuousUnivariateDistribution
end

function Biweight(μ::T, σ::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(Biweight, σ > zero(σ))
@check_args(Biweight, σ > zero(σ))
return Biweight{T}(μ, σ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/cauchy.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct Cauchy{T<:Real} <: ContinuousUnivariateDistribution
end

function Cauchy(μ::T, σ::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(Cauchy, σ > zero(σ))
@check_args(Cauchy, σ > zero(σ))
return Cauchy{T}(μ, σ)
end

Expand Down
9 changes: 5 additions & 4 deletions src/univariate/continuous/chi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct Chi{T<:Real} <: ContinuousUnivariateDistribution
end

function Chi(ν::Real; check_args::Bool=true)
check_args && @check_args(Chi, ν > zero(ν))
@check_args(Chi, ν > zero(ν))
return Chi{typeof(ν)}(ν)
end

Expand Down Expand Up @@ -71,9 +71,10 @@ entropy(d::Chi{T}) where {T<:Real} = (ν = d.ν;

function mode(d::Chi; check_args::Bool=true)
ν = d.ν
if check_args
ν >= 1 || error("Chi distribution has no mode when ν < 1")
end
@check_args(
Chi,
(ν >= 1, "Chi distribution has no mode when ν < 1"),
)
sqrt(ν - 1)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/chisq.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct Chisq{T<:Real} <: ContinuousUnivariateDistribution
end

function Chisq(ν::Real; check_args::Bool=true)
check_args && @check_args(Chisq, ν > zero(ν))
@check_args(Chisq, ν > zero(ν))
return Chisq{typeof(ν)}(ν)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/cosine.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ struct Cosine{T<:Real} <: ContinuousUnivariateDistribution
end

function Cosine(μ::T, σ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Cosine, σ > zero(σ))
@check_args(Cosine, σ > zero(σ))
return Cosine{T}(μ, σ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/epanechnikov.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ struct Epanechnikov{T<:Real} <: ContinuousUnivariateDistribution
end

function Epanechnikov(μ::T, σ::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(Epanechnikov, σ > zero(σ))
@check_args(Epanechnikov, σ > zero(σ))
return Epanechnikov{T}(μ, σ)
end

Expand Down
11 changes: 6 additions & 5 deletions src/univariate/continuous/erlang.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ struct Erlang{T<:Real} <: ContinuousUnivariateDistribution
end

function Erlang(α::Real, θ::Real; check_args::Bool=true)
check_args && @check_args(Erlang, isinteger(α) && α >= zero(α))
@check_args(Erlang, isinteger(α), α >= zero(α))
return Erlang{typeof(θ)}(α, θ)
end

function Erlang(α::Integer, θ::Real; check_args::Bool=true)
check_args && @check_args(Erlang, α >= zero(α))
@check_args(Erlang, α >= zero(α))
return Erlang{typeof(θ)}(α, θ)
end

Expand Down Expand Up @@ -63,9 +63,10 @@ kurtosis(d::Erlang) = 6 / d.α

function mode(d::Erlang; check_args::Bool=true)
α, θ = params(d)
if check_args
α >= 1 || error("Erlang has no mode when α < 1")
end
@check_args(
Erlang,
(α >= 1, "Erlang has no mode when α < 1"),
)
θ * (α - 1)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/exponential.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct Exponential{T<:Real} <: ContinuousUnivariateDistribution
end

function Exponential(θ::Real; check_args::Bool=true)
check_args && @check_args(Exponential, θ > zero(θ))
@check_args(Exponential, θ > zero(θ))
return Exponential{typeof(θ)}(θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/fdist.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct FDist{T<:Real} <: ContinuousUnivariateDistribution
ν2::T

function FDist{T}(ν1::T, ν2::T; check_args::Bool=true) where T
check_args && @check_args(FDist, ν1 > zero(ν1) && ν2 > zero(ν2))
@check_args(FDist, ν1 > zero(ν1), ν2 > zero(ν2))
new{T}(ν1, ν2)
end
end
Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/frechet.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct Frechet{T<:Real} <: ContinuousUnivariateDistribution
end

function Frechet(α::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Frechet, α > zero(α) && θ > zero(θ))
@check_args(Frechet, α > zero(α), θ > zero(θ))
return Frechet{T}(α, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/gamma.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct Gamma{T<:Real} <: ContinuousUnivariateDistribution
end

function Gamma(α::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Gamma, α > zero(α) && θ > zero(θ))
@check_args(Gamma, α > zero(α), θ > zero(θ))
return Gamma{T}(α, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/generalizedpareto.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ struct GeneralizedPareto{T<:Real} <: ContinuousUnivariateDistribution
end

function GeneralizedPareto(μ::T, σ::T, ξ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(GeneralizedPareto, σ > zero(σ))
@check_args(GeneralizedPareto, σ > zero(σ))
return GeneralizedPareto{T}(μ, σ, ξ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/gumbel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct Gumbel{T<:Real} <: ContinuousUnivariateDistribution
end

function Gumbel(μ::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Gumbel, θ > zero(θ))
@check_args(Gumbel, θ > zero(θ))
return Gumbel{T}(μ, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/inversegamma.jl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct InverseGamma{T<:Real} <: ContinuousUnivariateDistribution
end

function InverseGamma(α::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(InverseGamma, α > zero(α) && θ > zero(θ))
@check_args(InverseGamma, α > zero(α), θ > zero(θ))
return InverseGamma{T}(α, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/inversegaussian.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct InverseGaussian{T<:Real} <: ContinuousUnivariateDistribution
end

function InverseGaussian(μ::T, λ::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(InverseGaussian, μ > zero(μ) && λ > zero(λ))
@check_args(InverseGaussian, μ > zero(μ), λ > zero(λ))
return InverseGaussian{T}(μ, λ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/laplace.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct Laplace{T<:Real} <: ContinuousUnivariateDistribution
end

function Laplace(μ::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Laplace, θ > zero(θ))
@check_args(Laplace, θ > zero(θ))
return Laplace{T}(μ, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/levy.jl
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct Levy{T<:Real} <: ContinuousUnivariateDistribution
end

function Levy(μ::T, σ::T; check_args::Bool=true) where {T<:Real}
check_args && @check_args(Levy, σ > zero(σ))
@check_args(Levy, σ > zero(σ))
return Levy{T}(μ, σ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/logistic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ end


function Logistic(μ::T, θ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(Logistic, θ > zero(θ))
@check_args(Logistic, θ > zero(θ))
return Logistic{T}(μ, θ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/logitnormal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ struct LogitNormal{T<:Real} <: ContinuousUnivariateDistribution
end

function LogitNormal(μ::T, σ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(LogitNormal, σ > zero(σ))
@check_args(LogitNormal, σ > zero(σ))
return LogitNormal{T}(μ, σ)
end

Expand Down
2 changes: 1 addition & 1 deletion src/univariate/continuous/lognormal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ struct LogNormal{T<:Real} <: ContinuousUnivariateDistribution
end

function LogNormal(μ::T, σ::T; check_args::Bool=true) where {T <: Real}
check_args && @check_args(LogNormal, σ ≥ zero(σ))
@check_args(LogNormal, σ ≥ zero(σ))
return LogNormal{T}(μ, σ)
end

Expand Down
Loading