|
1 | 1 | module ArrayInitializers |
2 | 2 |
|
3 | | -export init, undeftype, zeroinit, oneinit |
| 3 | +using Random |
| 4 | + |
| 5 | +export init, undeftype, zeroinit, oneinit, randinit |
4 | 6 |
|
5 | 7 | const NArray{N} = Array{T,N} where T |
6 | 8 | const NAbstractArray{N} = AbstractArray{T,N} where T |
@@ -214,4 +216,124 @@ undeftype(::Type{T}) where T = UndefTypeArrayInitializer{T}() |
214 | 216 | @inline (::Type{A})(::UndefTypeArrayInitializer{T}, dims...) where {T, T2, A <: AbstractArray{T2}} = throw(ArgumentError("Tried to initialize $A with a $(UndefTypeArrayInitializer{T})")) |
215 | 217 | @inline (::Type{A})(::UndefTypeArrayInitializer{T}, dims...) where {T, N, A <: NAbstractArray{N} where T2} = A{T}(undef, dims...) |
216 | 218 |
|
| 219 | +abstract type AbstractRandomArrayInitializer{T} <: AbstractArrayInitializer{T} end |
| 220 | + |
| 221 | +struct RandomTypeInitializer{T} <: AbstractArrayInitializer{T} end |
| 222 | +""" |
| 223 | + randinit |
| 224 | +
|
| 225 | +Initialize array with random values. |
| 226 | +
|
| 227 | +```julia |
| 228 | +julia> Array{UInt8}(randinit, 5) |
| 229 | +5-element Vector{UInt8}: |
| 230 | + 0x91 |
| 231 | + 0xcb |
| 232 | + 0xf0 |
| 233 | + 0xa5 |
| 234 | + 0x9e |
| 235 | +
|
| 236 | +julia> Array(randinit(1:3), 5) |
| 237 | +5-element Vector{Int64}: |
| 238 | + 3 |
| 239 | + 3 |
| 240 | + 2 |
| 241 | + 2 |
| 242 | + 3 |
| 243 | +
|
| 244 | +julia> ri = randinit(MersenneTwister(1234), Int8) |
| 245 | +ArrayInitializers.RNGArrayInitializer{Int8, Type{Int8}, MersenneTwister}(Int8, MersenneTwister(1234)) |
| 246 | +
|
| 247 | +julia> Matrix(ri, 2, 3) |
| 248 | +2×3 Matrix{Int8}: |
| 249 | + -20 75 126 |
| 250 | + -105 115 -42 |
| 251 | +``` |
| 252 | +""" |
| 253 | +const randinit = RandomTypeInitializer{Any}() |
| 254 | +(::RandomTypeInitializer{Any})(::Type{T}) where T = RandomTypeInitializer{T}() |
| 255 | + |
| 256 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims::Dims{N}) where {T, N, A <: Array} = rand(T, dims...) |
| 257 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims...) where {T, A <: Array} = rand(T, dims...) |
| 258 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims...) where {T, N, A <: NArray{N}} = rand(T, dims...) |
| 259 | + |
| 260 | +@inline (::Type{A})(ri::RandomTypeInitializer, dims...) where {T, A <: Array{T}} = rand(T, dims...) |
| 261 | +@inline (::Type{A})(ri::RandomTypeInitializer, dims...) where {T, N, A <: Array{T,N}} = rand(T, dims...) |
| 262 | + |
| 263 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims::Dims{N}) where {T, N, A <: AbstractArray} = rand!(A{T,N}(undef, dims)) |
| 264 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims...) where {T, A <: AbstractArray} = rand!(A{T,length(dims)}(undef, dims...)) |
| 265 | +@inline (::Type{A})(ri::RandomTypeInitializer{T}, dims...) where {T, N, A <: NAbstractArray{N}} = rand!(A{T}(undef, dims...)) |
| 266 | + |
| 267 | +@inline (::Type{A})(ri::RandomTypeInitializer, dims...) where {T, A <: AbstractArray{T}} = rand!(A{length(dims)}(undef, dims...)) |
| 268 | +@inline (::Type{A})(ri::RandomTypeInitializer, dims...) where {T, N, A <: AbstractArray{T,N}} = rand!(A(undef, dims...)) |
| 269 | + |
| 270 | +struct RandomCollectionInitializer{T,C} <: AbstractArrayInitializer{T} |
| 271 | + S::C |
| 272 | +end |
| 273 | +(::RandomTypeInitializer{Any})(S::C) where C = RandomCollectionInitializer{eltype(C), C}(S) |
| 274 | + |
| 275 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims::Dims{N}) where {T, N, A <: Array} = Base.rand(ri.S, dims...) |
| 276 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims...) where {T, A <: Array} = Base.rand(ri.S, dims...) |
| 277 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims...) where {T, N, A <: NArray{N}} = Base.rand(ri.S, dims...) |
| 278 | + |
| 279 | +@inline (::Type{A})(ri::RandomCollectionInitializer, dims...) where {T, A <: Array{T}} = Base.rand(ri.S, dims...) |
| 280 | +@inline (::Type{A})(ri::RandomCollectionInitializer, dims...) where {T, N, A <: Array{T,N}} = Base.rand(ri.S, dims...) |
| 281 | + |
| 282 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims::Dims{N}) where {T, N, A <: AbstractArray} = Random.rand!(A{T,N}(undef, dims), ri.S) |
| 283 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims...) where {T, A <: AbstractArray} = Random.rand!(A{T,length(dims)}(undef, dims...), ri.S) |
| 284 | +@inline (::Type{A})(ri::RandomCollectionInitializer{T}, dims...) where {T, N, A <: NAbstractArray{N}} = Random.rand!(A{T}(undef, dims...), ri.S) |
| 285 | + |
| 286 | +@inline (::Type{A})(ri::RandomCollectionInitializer, dims...) where {T, A <: AbstractArray{T}} = Random.rand!(A{length(dims)}(undef, dims...), ri.S) |
| 287 | +@inline (::Type{A})(ri::RandomCollectionInitializer, dims...) where {T, N, A <: AbstractArray{T,N}} = Random.rand!(A(undef, dims...), ri.S) |
| 288 | + |
| 289 | +struct RNGArrayInitializer{T, C, RNG} <: AbstractArrayInitializer{T} |
| 290 | + S::C |
| 291 | + rng::RNG |
| 292 | +end |
| 293 | +(::RandomTypeInitializer{Any})(rng::RNG, S::C) where {RNG, C} = RNGArrayInitializer{eltype(C), C, RNG}(S, rng) |
| 294 | +(::RandomTypeInitializer{Any})(rng::RNG, T::Type{TY}) where {RNG, TY} = RNGArrayInitializer{T, Type{TY}, RNG}(T, rng) |
| 295 | + |
| 296 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims::Dims{N}) where {T, N, A <: Array} = Base.rand(ri.rng, ri.S, dims...) |
| 297 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims...) where {T, A <: Array} = Base.rand(ri.rng, ri.S, dims...) |
| 298 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims...) where {T, N, A <: NArray{N}} = Base.rand(ri.rng, ri.S, dims...) |
| 299 | + |
| 300 | +@inline (::Type{A})(ri::RNGArrayInitializer, dims...) where {T, A <: Array{T}} = Base.rand(ri.rng, ri.S, dims...) |
| 301 | +@inline (::Type{A})(ri::RNGArrayInitializer, dims...) where {T, N, A <: Array{T,N}} = Base.rand(ri.rng, ri.S, dims...) |
| 302 | + |
| 303 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims::Dims{N}) where {T, N, A <: AbstractArray} = Random.rand!(ri.rng, A{T,N}(undef, dims), ri.S) |
| 304 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims...) where {T, A <: AbstractArray} = Random.rand!(ri.rng, A{T,length(dims)}(undef, dims...), ri.S) |
| 305 | +@inline (::Type{A})(ri::RNGArrayInitializer{T}, dims...) where {T, N, A <: NAbstractArray{N}} = Random.rand!(ri.rng, A{T}(undef, dims...), ri.S) |
| 306 | + |
| 307 | +@inline (::Type{A})(ri::RNGArrayInitializer, dims...) where {T, A <: AbstractArray{T}} = Random.rand!(ri.rng, A{length(dims)}(undef, dims...), ri.S) |
| 308 | +@inline (::Type{A})(ri::RNGArrayInitializer, dims...) where {T, N, A <: AbstractArray{T,N}} = Random.rand!(ri.rng, A(undef, dims...), ri.S) |
| 309 | + |
| 310 | + |
| 311 | +""" |
| 312 | + SizedArrayInitializer(initializer, dims) |
| 313 | +
|
| 314 | +`Array` initializer with dimensions. Construct using `Base.reshape` |
| 315 | +
|
| 316 | +```julia |
| 317 | +julia> twos = init(2) |
| 318 | +ArrayInitializers.FillArrayInitializer{Int64}(2) |
| 319 | +
|
| 320 | +julia> twos_3x5 = reshape(twos, 3, 5) |
| 321 | +ArrayInitializers.SizedArrayInitializer{Int64, ArrayInitializers.FillArrayInitializer{Int64}, Tuple{Int64, Int64}}(ArrayInitializers.FillArrayInitializer{Int64}(2), (3, 5)) |
| 322 | +
|
| 323 | +julia> Array(twos_3x5) |
| 324 | +3×5 Matrix{Int64}: |
| 325 | + 2 2 2 2 2 |
| 326 | + 2 2 2 2 2 |
| 327 | + 2 2 2 2 2 |
| 328 | +``` |
| 329 | +""" |
| 330 | +struct SizedArrayInitializer{T, I <: AbstractArrayInitializer{T}, D} <: AbstractArrayInitializer{T} |
| 331 | + initializer::I |
| 332 | + dims::D |
| 333 | +end |
| 334 | +Base.reshape(aai::AbstractArrayInitializer{T}, dims) where T = SizedArrayInitializer(aai, dims) |
| 335 | +Base.reshape(aai::AbstractArrayInitializer{T}, dims...) where T = SizedArrayInitializer(aai, dims) |
| 336 | + |
| 337 | +@inline (::Type{A})(si::SizedArrayInitializer) where {A <: AbstractArray} = A(si.initializer, si.dims...) |
| 338 | + |
217 | 339 | end |
0 commit comments