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, 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
13 changes: 7 additions & 6 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, 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, n > zero(n))
new{D}(d, n)
end
end
Expand All @@ -95,14 +95,15 @@ var(d::EdgeworthSum) = d.n*var(d.dist)
struct EdgeworthMean{D<:UnivariateDistribution} <: EdgeworthAbstract
dist::D
n::Float64
function EdgeworthMean{D}(d::T, n::Real) where {D<:UnivariateDistribution,T<:UnivariateDistribution}
function EdgeworthMean{D}(d::UnivariateDistribution, n::Real; check_args::Bool=true) where {D<:UnivariateDistribution}
# although n would usually be an integer, no methods are require this
n > zero(n) ||
error("n must be positive")
@check_args EdgeworthMean (n, n > zero(n), "n must be positive")
new{D}(d, Float64(n))
end
end
EdgeworthMean(d::UnivariateDistribution,n::Real) = EdgeworthMean{typeof(d)}(d,n)
function EdgeworthMean(d::UnivariateDistribution, n::Real; check_args::Bool=true)
return EdgeworthMean{typeof(d)}(d, n; check_args=check_args)
end

mean(d::EdgeworthMean) = mean(d.dist)
var(d::EdgeworthMean) = var(d.dist) / d.n
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, 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,
(alpha, all(x -> x > zero(x), alpha), "alpha must be a positive vector."),
)
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, d > zero(d)) (alpha, 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, n >= 0),
(p, 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, n >= 0) (k, 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
14 changes: 8 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,12 @@ 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, "mode is defined only when α > 1."),
(β, β > 1, "mode is defined only when β > 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, ν1 > zero(ν1)) (ν2, ν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
Loading