6
6
# ###########################################################################################
7
7
# interface
8
8
"""
9
- vextrema ([f=identity], A::AbstractArray; [dims=:], [init=(mn,mx)])
9
+ vvextrema ([f=identity], A::AbstractArray; [dims=:], [init=(mn,mx)])
10
10
11
11
Compute the minimum and maximum values by calling `f` on each element of of `A`
12
12
over the given `dims`, with the `mn` and `mx` initialized by the respective arguments
@@ -25,44 +25,44 @@ julia> A = reshape(Vector(1:2:16), (2,2,2))
25
25
9 13
26
26
11 15
27
27
28
- julia> vextrema (abs2, A, dims=(1,2), init=(typemax, 100))
28
+ julia> vvextrema (abs2, A, dims=(1,2), init=(typemax, 100))
29
29
1×1×2 Array{Tuple{Int64, Int64}, 3}:
30
30
[:, :, 1] =
31
31
(1, 100)
32
32
33
33
[:, :, 2] =
34
34
(81, 225)
35
35
36
- julia> vextrema (abs2, A, init=(typemax, 100))
36
+ julia> vvextrema (abs2, A, init=(typemax, 100))
37
37
(1, 225)
38
38
```
39
39
"""
40
- vextrema (f, A; dims= :, init= (typemax, typemin)) = vextrema (f, init[1 ], init[2 ], A, dims)
41
- vextrema (A; dims= :, init= (typemax, typemin)) = vextrema (identity, init[1 ], init[2 ], A, dims)
40
+ vvextrema (f, A; dims= :, init= (typemax, typemin)) = vvextrema (f, init[1 ], init[2 ], A, dims)
41
+ vvextrema (A; dims= :, init= (typemax, typemin)) = vvextrema (identity, init[1 ], init[2 ], A, dims)
42
42
43
43
# handle convenience cases
44
- vextrema (f, initmin, initmax, A, dims:: Int ) = vextrema (f, initmin, initmax, A, (dims,))
44
+ vvextrema (f, initmin, initmax, A, dims:: Int ) = vvextrema (f, initmin, initmax, A, (dims,))
45
45
46
46
"""
47
- vextrema ([f=identity], A::AbstractArray, dims=:)
47
+ vvextrema ([f=identity], A::AbstractArray, dims=:)
48
48
49
49
Compute the minimum and maximum values by calling `f` on each element of of `A`
50
50
over the given `dims`.
51
51
"""
52
- vextrema (f, A, dims) = vextrema (f, typemax, typemin, A, dims)
53
- vextrema (A:: AbstractArray , dims) = vextrema (identity, A, dims)
52
+ vvextrema (f, A, dims) = vvextrema (f, typemax, typemin, A, dims)
53
+ vvextrema (A:: AbstractArray , dims) = vvextrema (identity, A, dims)
54
54
55
55
# support any kind of init args -- this necessitates Iₘᵢₙ<:Function, Iₘₐₓ<:Function
56
56
# for the function-initialized version. It would be nice to support functors, but
57
57
# LoopVectorization would likely throw anyway.
58
- vextrema (f, initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A, dims) where {Iₘᵢₙ<: Function , Iₘₐₓ<: Number } =
59
- vextrema (f, initmin (Base. promote_op (f, eltype (A))), initmax, A, dims)
60
- vextrema (f, initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A, dims) where {Iₘᵢₙ<: Number , Iₘₐₓ<: Function } =
61
- vextrema (f, initmin, initmax (Base. promote_op (f, eltype (A))), A, dims)
58
+ vvextrema (f, initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A, dims) where {Iₘᵢₙ<: Function , Iₘₐₓ<: Number } =
59
+ vvextrema (f, initmin (Base. promote_op (f, eltype (A))), initmax, A, dims)
60
+ vvextrema (f, initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A, dims) where {Iₘᵢₙ<: Number , Iₘₐₓ<: Function } =
61
+ vvextrema (f, initmin, initmax (Base. promote_op (f, eltype (A))), A, dims)
62
62
63
63
# ###############
64
64
65
- function vextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , :: Colon ) where {F, Iₘᵢₙ<: Function , Iₘₐₓ<: Function , T, N}
65
+ function vvextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , :: Colon ) where {F, Iₘᵢₙ<: Function , Iₘₐₓ<: Function , T, N}
66
66
Tₒ = Base. promote_op (f, T)
67
67
mn = initmin (Tₒ)
68
68
mx = initmax (Tₒ)
@@ -73,13 +73,13 @@ function vextrema(f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, A::AbstractArr
73
73
mn, mx
74
74
end
75
75
76
- function vextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , dims:: NTuple{M, Int} ) where {F, Iₘᵢₙ<: Function , Iₘₐₓ<: Function , T, N, M}
76
+ function vvextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , dims:: NTuple{M, Int} ) where {F, Iₘᵢₙ<: Function , Iₘₐₓ<: Function , T, N, M}
77
77
Dᴬ = size (A)
78
78
Dᴮ = ntuple (d -> d ∈ dims ? 1 : Dᴬ[d], Val (N))
79
79
Tₒ = Base. promote_op (f, T)
80
80
B = similar (A, Tₒ, Dᴮ)
81
81
C = similar (A, Tₒ, Dᴮ)
82
- _vextrema ! (f, initmin, initmax, B, C, A, dims)
82
+ _vvextrema ! (f, initmin, initmax, B, C, A, dims)
83
83
return collect (zip (B, C))
84
84
end
85
85
@@ -188,7 +188,7 @@ function branches_extrema_quote(Iₘᵢₙ, Iₘₐₓ, N::Int, M::Int, D)
188
188
n ∈ static_dims && continue
189
189
tc = copy (t)
190
190
push! (tc. args, :(StaticInt {$n} ()))
191
- qnew = Expr (ifsym, :(dimm == $ n), :(return _vextrema ! (f, initmin, initmax, B, C, A, $ tc)))
191
+ qnew = Expr (ifsym, :(dimm == $ n), :(return _vvextrema ! (f, initmin, initmax, B, C, A, $ tc)))
192
192
for r ∈ m+ 1 : M
193
193
push! (tc. args, :(dims[$ r]))
194
194
end
@@ -201,14 +201,14 @@ function branches_extrema_quote(Iₘᵢₙ, Iₘₐₓ, N::Int, M::Int, D)
201
201
for r ∈ m+ 1 : M
202
202
push! (tc. args, :(dims[$ r]))
203
203
end
204
- push! (qold. args, Expr (:block , :(return _vextrema ! (f, initmin, initmax, B, C, A, $ tc))))
204
+ push! (qold. args, Expr (:block , :(return _vvextrema ! (f, initmin, initmax, B, C, A, $ tc))))
205
205
return q
206
206
end
207
207
end
208
208
return staticdim_extrema_quote (Iₘᵢₙ, Iₘₐₓ, static_dims, N)
209
209
end
210
210
211
- @generated function _vextrema ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: D ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<: Tuple{Vararg{Integer, M}} }
211
+ @generated function _vvextrema ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: D ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<: Tuple{Vararg{Integer, M}} }
212
212
branches_extrema_quote (Iₘᵢₙ, Iₘₐₓ, N, M, D)
213
213
end
214
214
@@ -230,17 +230,17 @@ function extrema_map_quote(Iₘᵢₙ, Iₘₐₓ)
230
230
end
231
231
end
232
232
233
- @generated function _vextrema ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: Tuple{} ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M}
233
+ @generated function _vvextrema ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: Tuple{} ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M}
234
234
extrema_map_quote (Iₘᵢₙ, Iₘₐₓ)
235
235
end
236
236
237
237
# ###############
238
- # function vextrema_nonzip (f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, A::AbstractArray{T, N}, dims::NTuple{M, Int}) where {F, Iₘᵢₙ, Iₘₐₓ, T, N, M}
238
+ # function vvextrema_nonzip (f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, A::AbstractArray{T, N}, dims::NTuple{M, Int}) where {F, Iₘᵢₙ, Iₘₐₓ, T, N, M}
239
239
# Dᴬ = size(A)
240
240
# Dᴮ = ntuple(d -> d ∈ dims ? 1 : Dᴬ[d], Val(N))
241
241
# Tₒ = Base.promote_op(f, T)
242
242
# B = similar(A, Tuple{Tₒ, Tₒ}, Dᴮ)
243
- # _vextrema_nonzip !(f, initmin, initmax, B, A, dims)
243
+ # _vvextrema_nonzip !(f, initmin, initmax, B, A, dims)
244
244
# return B
245
245
# end
246
246
346
346
# n ∈ static_dims && continue
347
347
# tc = copy(t)
348
348
# push!(tc.args, :(StaticInt{$n}()))
349
- # qnew = Expr(ifsym, :(dimm == $n), :(return _vextrema_nonzip !(f, initmin, initmax, B, A, $tc)))
349
+ # qnew = Expr(ifsym, :(dimm == $n), :(return _vvextrema_nonzip !(f, initmin, initmax, B, A, $tc)))
350
350
# for r ∈ m+1:M
351
351
# push!(tc.args, :(dims[$r]))
352
352
# end
@@ -359,21 +359,21 @@ end
359
359
# for r ∈ m+1:M
360
360
# push!(tc.args, :(dims[$r]))
361
361
# end
362
- # push!(qold.args, Expr(:block, :(return _vextrema_nonzip !(f, initmin, initmax, B, A, $tc))))
362
+ # push!(qold.args, Expr(:block, :(return _vvextrema_nonzip !(f, initmin, initmax, B, A, $tc))))
363
363
# return q
364
364
# end
365
365
# end
366
366
# return staticdim_extrema_nonzip_quote(Iₘᵢₙ, Iₘₐₓ, static_dims, N)
367
367
# end
368
368
369
369
370
- # @generated function _vextrema_nonzip !(f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, B::AbstractArray{Tuple{Tₒ, Tₒ}, N}, A::AbstractArray{T, N}, dims::D) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<:Tuple{Vararg{Integer, M}}}
370
+ # @generated function _vvextrema_nonzip !(f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, B::AbstractArray{Tuple{Tₒ, Tₒ}, N}, A::AbstractArray{T, N}, dims::D) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<:Tuple{Vararg{Integer, M}}}
371
371
# branches_extrema_nonzip_quote(Iₘᵢₙ, Iₘₐₓ, N, M, D)
372
372
# end
373
373
374
374
# ###########################################################################################
375
375
# Version wherein an initial value is supplied
376
- function vextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , :: Colon ) where {F, Iₘᵢₙ<: Number , Iₘₐₓ<: Number , T, N}
376
+ function vvextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , :: Colon ) where {F, Iₘᵢₙ<: Number , Iₘₐₓ<: Number , T, N}
377
377
Tₒ = Base. promote_op (f, T)
378
378
mn = convert (Tₒ, initmin)
379
379
mx = convert (Tₒ, initmax)
@@ -384,13 +384,13 @@ function vextrema(f::F, initmin::Iₘᵢₙ, initmax::Iₘₐₓ, A::AbstractArr
384
384
mn, mx
385
385
end
386
386
387
- function vextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , dims:: NTuple{M, Int} ) where {F, Iₘᵢₙ<: Number , Iₘₐₓ<: Number , T, N, M}
387
+ function vvextrema (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , A:: AbstractArray{T, N} , dims:: NTuple{M, Int} ) where {F, Iₘᵢₙ<: Number , Iₘₐₓ<: Number , T, N, M}
388
388
Dᴬ = size (A)
389
389
Dᴮ = ntuple (d -> d ∈ dims ? 1 : Dᴬ[d], Val (N))
390
390
Tₒ = Base. promote_op (f, T)
391
391
B = similar (A, Tₒ, Dᴮ)
392
392
C = similar (A, Tₒ, Dᴮ)
393
- _vextrema_init ! (f, initmin, initmax, B, C, A, dims)
393
+ _vvextrema_init ! (f, initmin, initmax, B, C, A, dims)
394
394
return collect (zip (B, C))
395
395
end
396
396
@@ -503,7 +503,7 @@ function branches_extrema_init_quote(N::Int, M::Int, D)
503
503
n ∈ static_dims && continue
504
504
tc = copy (t)
505
505
push! (tc. args, :(StaticInt {$n} ()))
506
- qnew = Expr (ifsym, :(dimm == $ n), :(return _vextrema_init ! (f, initmin, initmax, B, C, A, $ tc)))
506
+ qnew = Expr (ifsym, :(dimm == $ n), :(return _vvextrema_init ! (f, initmin, initmax, B, C, A, $ tc)))
507
507
for r ∈ m+ 1 : M
508
508
push! (tc. args, :(dims[$ r]))
509
509
end
@@ -516,15 +516,15 @@ function branches_extrema_init_quote(N::Int, M::Int, D)
516
516
for r ∈ m+ 1 : M
517
517
push! (tc. args, :(dims[$ r]))
518
518
end
519
- push! (qold. args, Expr (:block , :(return _vextrema_init ! (f, initmin, initmax, B, C, A, $ tc))))
519
+ push! (qold. args, Expr (:block , :(return _vvextrema_init ! (f, initmin, initmax, B, C, A, $ tc))))
520
520
return q
521
521
end
522
522
end
523
523
return staticdim_extrema_init_quote (static_dims, N)
524
524
end
525
525
526
526
527
- @generated function _vextrema_init ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: D ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<: Tuple{Vararg{Integer, M}} }
527
+ @generated function _vvextrema_init ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: D ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M, D<: Tuple{Vararg{Integer, M}} }
528
528
branches_extrema_init_quote (N, M, D)
529
529
end
530
530
@@ -546,7 +546,7 @@ function extrema_init_map_quote()
546
546
end
547
547
end
548
548
549
- @generated function _vextrema_init ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: Tuple{} ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M}
549
+ @generated function _vvextrema_init ! (f:: F , initmin:: Iₘ ᵢₙ, initmax:: Iₘₐₓ , B:: AbstractArray{Tₒ, N} , C:: AbstractArray{Tₒ, N} , A:: AbstractArray{T, N} , dims:: Tuple{} ) where {F, Iₘᵢₙ, Iₘₐₓ, Tₒ, T, N, M}
550
550
extrema_init_map_quote ()
551
551
end
552
552
0 commit comments