Skip to content

Commit d824cf8

Browse files
committed
Fix deprecations
1 parent 67740a9 commit d824cf8

33 files changed

+177
-121
lines changed

src/genericrand.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ rand(rng::AbstractRNG, s::Sampleable, dim1::Int, moredims::Int...) =
2626

2727
# default fallback (redefined for univariate distributions)
2828
function rand(rng::AbstractRNG, s::Sampleable{<:ArrayLikeVariate})
29+
Base.depwarn("Please implement `rand(rng::AbstractRNG, s::$(typeof(s)))`. The default fallback will be removed", :rand)
2930
return @inbounds rand!(rng, s, Array{eltype(s)}(undef, size(s)))
3031
end
3132

@@ -45,7 +46,8 @@ end
4546

4647
# this is a workaround for sampleables that incorrectly base `eltype` on the parameters
4748
function rand(rng::AbstractRNG, s::Sampleable{<:ArrayLikeVariate,Continuous})
48-
return @inbounds rand!(rng, sampler(s), Array{float(eltype(s))}(undef, size(s)))
49+
Base.depwarn("Please implement `rand(rng::AbstractRNG, s::$(typeof(s))`. The default fallback will be removed", :rand)
50+
return @inbounds rand!(rng, s, Array{float(eltype(s))}(undef, size(s)))
4951
end
5052

5153
"""
@@ -63,16 +65,14 @@ form as specified above. The rules are summarized as below:
6365
"""
6466
function rand! end
6567
Base.@propagate_inbounds rand!(s::Sampleable, X::AbstractArray) = rand!(default_rng(), s, X)
66-
Base.@propagate_inbounds function rand!(rng::AbstractRNG, s::Sampleable, X::AbstractArray)
67-
return _rand!(rng, s, X)
68-
end
6968

7069
# default definitions for arraylike variates
7170
@inline function rand!(
7271
rng::AbstractRNG,
7372
s::Sampleable{ArrayLikeVariate{N}},
7473
x::AbstractArray{<:Real,N},
7574
) where {N}
75+
Base.depwarn("Please implement `Random.rand!(rng::Random.AbstractRNG, s::$(typeof(s)), x::AbstractArray{<:Real,$N})`, the default fallback will be removed.", :rand!)
7676
@boundscheck begin
7777
size(x) == size(s) || throw(DimensionMismatch("inconsistent array dimensions"))
7878
end
@@ -93,7 +93,8 @@ end
9393
throw(DimensionMismatch("inconsistent array dimensions"))
9494
end
9595
# the function barrier fixes performance issues if `sampler(s)` is type unstable
96-
return _rand!(rng, sampler(s), x)
96+
_rand!(rng, sampler(s), x)
97+
return x
9798
end
9899

99100
function _rand!(

src/mixtures/mixturemodel.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -470,16 +470,14 @@ end
470470

471471
Base.length(s::MixtureSampler) = length(first(s.csamplers))
472472

473-
rand(rng::AbstractRNG, s::MixtureSampler{Univariate}) =
473+
# mixture sampler
474+
rand(rng::AbstractRNG, s::MixtureSampler) =
474475
rand(rng, s.csamplers[rand(rng, s.psampler)])
475-
rand(rng::AbstractRNG, d::MixtureModel{Univariate}) =
476-
rand(rng, component(d, rand(rng, d.prior)))
477476

478-
# multivariate mixture sampler for a vector
479-
_rand!(rng::AbstractRNG, s::MixtureSampler{Multivariate}, x::AbstractVector{<:Real}) =
480-
@inbounds rand!(rng, s.csamplers[rand(rng, s.psampler)], x)
481477
# if only a single sample is requested, no alias table is created
482-
_rand!(rng::AbstractRNG, d::MixtureModel{Multivariate}, x::AbstractVector{<:Real}) =
483-
@inbounds rand!(rng, component(d, rand(rng, d.prior)), x)
478+
rand(rng::AbstractRNG, s::MixtureModel) = rand(rng, s.csamplers[rand(rng, s.psampler)])
479+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::MixtureModel{ArrayLikeVariate{N}}, x::AbstractArray{<:Real,N}) where {N}
480+
return rand!(rng, component(d, rand(rng, d.prior)), x)
481+
end
484482

485483
sampler(d::MixtureModel) = MixtureSampler(d)

src/mixtures/unigmm.jl

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ probs(d::UnivariateGMM) = probs(d.prior)
2525

2626
mean(d::UnivariateGMM) = dot(d.means, probs(d))
2727

28-
rand(d::UnivariateGMM) = (k = rand(d.prior); d.means[k] + randn() * d.stds[k])
29-
30-
rand(rng::AbstractRNG, d::UnivariateGMM) =
31-
(k = rand(rng, d.prior); d.means[k] + randn(rng) * d.stds[k])
28+
function rand(rng::AbstractRNG, d::UnivariateGMM)
29+
k = rand(rng, d.prior)
30+
μ = d.means[k]
31+
σ = d.std[k]
32+
return muladd(randn(rng, float(Base.promote_typeof(μ, σ))), σ, μ)
33+
end
3234

3335
params(d::UnivariateGMM) = (d.means, d.stds, d.prior)
3436

@@ -38,6 +40,22 @@ struct UnivariateGMMSampler{VT1<:AbstractVector{<:Real},VT2<:AbstractVector{<:Re
3840
psampler::AliasTable
3941
end
4042

41-
rand(rng::AbstractRNG, s::UnivariateGMMSampler) =
42-
(k = rand(rng, s.psampler); s.means[k] + randn(rng) * s.stds[k])
43+
function rand(rng::AbstractRNG, s::UnivariateGMMSampler)
44+
k = rand(rng, s.psampler)
45+
μ = d.means[k]
46+
σ = d.stds[k]
47+
return muladd(randn(rng, float(Base.promote_typeof(μ, σ))), σ, μ)
48+
end
49+
function rand(rng::AbstractRNG, s::UnivariateGMMSampler, x::AbstractArray{<:Real})
50+
psampler = s.psampler
51+
means = s.means
52+
stds = s.stds
53+
randn!(rng, x)
54+
for i in eachindex(x)
55+
k = rand(rng, psampler)
56+
x[i] = muladd(x[i], stds[k], means[k])
57+
end
58+
return x
59+
end
60+
4361
sampler(d::UnivariateGMM) = UnivariateGMMSampler(d.means, d.stds, sampler(d.prior))

src/multivariate/dirichletmultinomial.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ end
9999
# Sampling
100100
rand(rng::AbstractRNG, d::DirichletMultinomial) =
101101
multinom_rand(rng, ntrials(d), rand(rng, Dirichlet(d.α)))
102-
_rand!(rng::AbstractRNG, d::DirichletMultinomial, x::AbstractVector{<:Real}) =
102+
@inline function rand!(rng::AbstractRNG, d::DirichletMultinomial, x::AbstractVector{<:Real})
103+
@boundscheck length(d) == length(x)
103104
multinom_rand!(rng, ntrials(d), rand(rng, Dirichlet(d.α)), x)
105+
end
104106

105107
# Fit Model
106108
# Using https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2945396/pdf/nihms205488.pdf

src/multivariate/multinomial.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ end
166166

167167
# if only a single sample is requested, no alias table is created
168168
rand(rng::AbstractRNG, d::Multinomial) = multinom_rand(rng, ntrials(d), probs(d))
169-
_rand!(rng::AbstractRNG, d::Multinomial, x::AbstractVector{<:Real}) =
169+
rand!(rng::AbstractRNG, d::Multinomial, x::AbstractVector{<:Real}) =
170170
multinom_rand!(rng, ntrials(d), probs(d), x)
171171

172172
sampler(d::Multinomial) = MultinomialSampler(ntrials(d), probs(d))

src/multivariate/mvlogitnormal.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,15 @@ function rand(rng::AbstractRNG, d::MvLogitNormal, n::Int)
9999
return x
100100
end
101101

102-
function _rand!(rng::AbstractRNG, d::MvLogitNormal, x::AbstractVecOrMat{<:Real})
103-
y = @views _drop1(x)
104-
rand!(rng, d.normal, y)
105-
_softmax1!(x, y)
106-
return x
102+
for N in (1, 2)
103+
@eval begin
104+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::MvLogitNormal, x::AbstractArray{<:Real, $N})
105+
y = @views _drop1(x)
106+
rand!(rng, d.normal, y)
107+
_softmax1!(x, y)
108+
return x
109+
end
110+
end
107111
end
108112

109113
# Fitting

src/multivariate/mvlognormal.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,10 +241,14 @@ function rand(rng::AbstractRNG, d::MvLogNormal, n::Int)
241241
return xs
242242
end
243243

244-
function _rand!(rng::AbstractRNG, d::MvLogNormal, x::AbstractVecOrMat{<:Real})
245-
_rand!(rng, d.normal, x)
246-
map!(exp, x, x)
247-
return x
244+
for N in (1, 2)
245+
@eval begin
246+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::MvLogNormal, x::AbstractArray{<:Real,$N})
247+
rand!(rng, d.normal, x)
248+
map!(exp, x, x)
249+
return x
250+
end
251+
end
248252
end
249253

250254
_logpdf(d::MvLogNormal, x::AbstractVecOrMat{T}) where {T<:Real} = insupport(d, x) ? (_logpdf(d.normal, log.(x)) - sum(log.(x))) : -Inf

src/multivariate/mvnormal.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,16 +282,16 @@ function rand(rng::AbstractRNG, d::MvNormal, n::Int)
282282
return x
283283
end
284284

285-
function _rand!(rng::AbstractRNG, d::MvNormal, x::VecOrMat)
285+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::MvNormal, x::VecOrMat{<:Real})
286286
unwhiten!(d.Σ, randn!(rng, x))
287287
x .+= d.μ
288288
return x
289289
end
290290

291291
# Workaround: randn! only works for Array, but not generally for AbstractArray
292-
function _rand!(rng::AbstractRNG, d::MvNormal, x::AbstractVector)
292+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::MvNormal, x::AbstractVector{<:Real})
293293
for i in eachindex(x)
294-
@inbounds x[i] = randn(rng, eltype(x))
294+
x[i] = randn(rng, eltype(x))
295295
end
296296
unwhiten!(d.Σ, x)
297297
x .+= d.μ

src/multivariate/product.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ end
3232

3333
length(d::Product) = length(d.v)
3434

35-
_rand!(rng::AbstractRNG, d::Product, x::AbstractVector{<:Real}) =
36-
map!(Base.Fix1(rand, rng), x, d.v)
35+
rand(rng::AbstractRNG, d::Product) = map(Base.Fix1(rand, rng), d.v)
36+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::Product, x::AbstractVector{<:Real})
37+
return map!(Base.Fix1(rand, rng), x, d.v)
38+
end
39+
3740
function _logpdf(d::Product, x::AbstractVector{<:Real})
3841
dists = d.v
3942
if isempty(dists)

src/multivariate/vonmisesfisher.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,10 @@ _logpdf(d::VonMisesFisher, x::AbstractVector{T}) where {T<:Real} = d.logCκ + d.
7777

7878
sampler(d::VonMisesFisher) = VonMisesFisherSampler(d.μ, d.κ)
7979

80-
_rand!(rng::AbstractRNG, d::VonMisesFisher, x::AbstractVector) =
81-
_rand!(rng, sampler(d), x)
82-
_rand!(rng::AbstractRNG, d::VonMisesFisher, x::AbstractMatrix) =
83-
_rand!(rng, sampler(d), x)
84-
80+
rand(rng::AbstractRNG, d::VonMisesFisher) = rand(rng, sampler(d))
81+
Base.@propagate_inbounds function rand!(rng::AbstractRNG, d::VonMisesFisher, x::AbstractVector)
82+
return rand!(rng, sampler(d), x)
83+
end
8584

8685
### Estimation
8786

0 commit comments

Comments
 (0)