Skip to content

Commit a9c2da4

Browse files
committed
Add random and sized initializers
1 parent 8d8eda5 commit a9c2da4

3 files changed

Lines changed: 171 additions & 2 deletions

File tree

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ authors = ["Mark Kittisopikul <kittisopikulm@janelia.hhmi.org> and contributors"
44
version = "0.1.0"
55

66
[deps]
7+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
78

89
[compat]
910
julia = "1"
1011

1112
[extras]
12-
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1313
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
14+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1415

1516
[targets]
1617
test = ["Test", "OffsetArrays"]

src/ArrayInitializers.jl

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module ArrayInitializers
22

3-
export init, undeftype, zeroinit, oneinit
3+
using Random
4+
5+
export init, undeftype, zeroinit, oneinit, randinit
46

57
const NArray{N} = Array{T,N} where T
68
const NAbstractArray{N} = AbstractArray{T,N} where T
@@ -214,4 +216,124 @@ undeftype(::Type{T}) where T = UndefTypeArrayInitializer{T}()
214216
@inline (::Type{A})(::UndefTypeArrayInitializer{T}, dims...) where {T, T2, A <: AbstractArray{T2}} = throw(ArgumentError("Tried to initialize $A with a $(UndefTypeArrayInitializer{T})"))
215217
@inline (::Type{A})(::UndefTypeArrayInitializer{T}, dims...) where {T, N, A <: NAbstractArray{N} where T2} = A{T}(undef, dims...)
216218

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+
217339
end

test/runtests.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using ArrayInitializers
22
using ArrayInitializers: fill!
33
using OffsetArrays
4+
using Random
45
using Test
56

67
@testset "ArrayInitializers.jl" begin
@@ -73,4 +74,49 @@ using Test
7374
D = OffsetMatrix(undeftype(Int), 1:3, 2:5)
7475
@test size(D) == (3,4)
7576
@test typeof(D) == OffsetMatrix{Int, Matrix{Int}}
77+
78+
# RandomTypeInitializer
79+
E = Array{Int}(randinit, 3, 5)
80+
@test size(E) == (3,5)
81+
@test typeof(E) == Matrix{Int}
82+
83+
F = Array(randinit(Float64), 7, 9)
84+
@test size(F) == (7,9)
85+
@test typeof(F) == Matrix{Float64}
86+
87+
# RandomCollectionInitializer
88+
G = Array(randinit(1:10), 8, 2)
89+
@test size(G) == (8,2)
90+
@test typeof(G) == Matrix{Int}
91+
92+
# SizedArrayInitializer
93+
szinit = reshape(fives, 3, 8)
94+
H = Array(szinit)
95+
@test size(H) == (3,8)
96+
@test typeof(H) == Matrix{Int}
97+
@test all(==(5), H)
98+
99+
I = OffsetArray(szinit)
100+
@test size(I) == (3,8)
101+
@test typeof(I) == OffsetMatrix{Int, Matrix{Int}}
102+
@test all(==(5), I)
103+
104+
offset_sz_init = reshape(randinit(1:10), 2:5, 8:9)
105+
J = OffsetArray(offset_sz_init)
106+
@test size(J) == (4, 2)
107+
@test typeof(I) == OffsetMatrix{Int, Matrix{Int}}
108+
@test all(in(1:10), J)
109+
110+
# RNGArrayInitializer
111+
ri = randinit(MersenneTwister(1234), 3:5)
112+
K = Array(ri, 2, 3)
113+
@test size(K) == (2,3)
114+
@test typeof(K) == Matrix{Int}
115+
@test all(in(3:5), K)
116+
117+
ri = randinit(MersenneTwister(1234), Float64)
118+
L = Array(ri, 2, 3)
119+
@test size(L) == (2,3)
120+
@test typeof(L) == Matrix{Float64}
121+
76122
end

0 commit comments

Comments
 (0)