-
Notifications
You must be signed in to change notification settings - Fork 421
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
Decouple rand
and eltype
#1905
base: master
Are you sure you want to change the base?
Decouple rand
and eltype
#1905
Conversation
747a191
to
0ea5502
Compare
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1905 +/- ##
==========================================
- Coverage 85.99% 85.10% -0.90%
==========================================
Files 144 144
Lines 8685 8774 +89
==========================================
- Hits 7469 7467 -2
- Misses 1216 1307 +91 ☔ View full report in Codecov by Sentry. |
Given that, according to the docstring Distributions.jl/src/common.jl Lines 96 to 102 in a1010e4
the sole purpose of eltype is to return the type of rand , which I agree isn't really feasible, should we also deprecate the methods here as part of this PR?
|
#1907 is related. |
5644af6
to
3e66d3e
Compare
My personal opinion: This is orthogonal to the fact that Distributions should probably support In an ideal situation, I think we would define |
I became convinced that in general this is not possible. It basically means trying to manually figure out type inference, a task that even the Julia compiler can fail at. Of course, for some number types and distributions it can be done (as also the compiler will succeed in many instances). But in general it's far from trivial. As in the initial stages of Distributions, one could be restrictive and limit samples to |
4db3858
to
d824cf8
Compare
d824cf8
to
2e7752e
Compare
A few distributions still give me julia> dist = Semicircle(50.0f0)
Semicircle{Float32}(r=50.0f0)
julia> rand(dist, 5)
5-element Array{Float64, 1}:
36.80671953487414
-18.355635129900335
-11.701855436648922
-21.444118928985656
-5.80120463505302
julia> dist = JohnsonSU(0.0f0, 1.0f0, 0.0f0, 1.0f0)
JohnsonSU{Float32}(ξ=0.0f0, λ=1.0f0, γ=0.0f0, δ=1.0f0)
julia> rand(dist, 5)
5-element Array{Float64, 1}:
0.5311696707298299
1.632313034117999
0.04951771555318912
0.4721610259428258
-3.052321854866766
julia> dist = Chisq(5.0f0)
Chisq{Float32}(ν=5.0f0)
julia> rand(dist, 5)
5-element Array{Float32, 1}:
15.465032
1.888659
7.013455
4.258529
3.9611576 Can this be fixed? |
The reason is that for quite a few of the older, probably less used and definitely less frequently updated distributions the |
This is not the first time I have went on a rant about how Distributions in this package are effectively unordered containers with infinite size, but I have stumbled upon new ammunition: This section of the Julia stdlib documentation claims:
This led me to JuliaLang/julia#31787 and JuliaLang/julia#27756 I believe that it is actually deeper Random.jl precedent that Additional ramblingOn a similar note, I do not think that it is controversial that I also believe that it is reasonable that julia> d = Normal(0f0, 1f0)
Normal{Float32}(μ=0.0f0, σ=1.0f0)
julia> typeof(quantile(d, .5)) == typeof(rand(d))
false For many distribution types, perhaps the real conversation we should be having is if we should force For distributions parameterized by mean/std, similar logic definitely holds. It is not a stretch to extend this for other location/spread parameters. Shape parameters are ambiguous, but if someone types For distributions like Binomial, I would argue that the type of Yet further rambling
|
One of my take-aways from issues such as #1252, #1902, #894, #1783, #1041, and #1071 is that
eltype
is not only quite inconsistently implemented and unclearly documented currently but more generally it might be a bad design decision to use it for pre-allocating containers of samples: Setting it to a fixed type (historicallyFloat64
for continuous andInt
for discrete distributions) is too limiting, but trying to infer it from parameters is challenging and doomed to fail for more challenging scenarios that are not as clear as e.g.Normal
.This PR tries to decouple
rand
andeltype
, to make it easier to possibly eventually deprecate and removeeltype
.Fixes #1041.
Fixes #1071.
Fixes #1082.
Fixes #1252.
Fixes #1783.
Fixes #1884.
Fixes #1902.
Fixes #1907.