@@ -12,7 +12,7 @@ No method is implemented for reducing index range of type $(typeof(i)). Please i
12
12
reduced_index for this index type or report this as an issue.
13
13
"""
14
14
))
15
- reduced_indices (a:: AbstractArray , region) = reduced_indices (axes (a), region)
15
+ reduced_indices (a:: AbstractArrayOrBroadcasted , region) = reduced_indices (axes (a), region)
16
16
17
17
# for reductions that keep 0 dims as 0
18
18
reduced_indices0 (a:: AbstractArray , region) = reduced_indices0 (axes (a), region)
@@ -89,8 +89,8 @@ for (Op, initval) in ((:(typeof(&)), true), (:(typeof(|)), false))
89
89
end
90
90
91
91
# reducedim_initarray is called by
92
- reducedim_initarray (A:: AbstractArray , region, init, :: Type{R} ) where {R} = fill! (similar (A,R,reduced_indices (A,region)), init)
93
- reducedim_initarray (A:: AbstractArray , region, init:: T ) where {T} = reducedim_initarray (A, region, init, T)
92
+ reducedim_initarray (A:: AbstractArrayOrBroadcasted , region, init, :: Type{R} ) where {R} = fill! (similar (A,R,reduced_indices (A,region)), init)
93
+ reducedim_initarray (A:: AbstractArrayOrBroadcasted , region, init:: T ) where {T} = reducedim_initarray (A, region, init, T)
94
94
95
95
# TODO : better way to handle reducedim initialization
96
96
#
156
156
reducedim_init (f:: Union{typeof(abs),typeof(abs2)} , op:: typeof (max), A:: AbstractArray{T} , region) where {T} =
157
157
reducedim_initarray (A, region, zero (f (zero (T))), _realtype (f, T))
158
158
159
- reducedim_init (f, op:: typeof (& ), A:: AbstractArray , region) = reducedim_initarray (A, region, true )
160
- reducedim_init (f, op:: typeof (| ), A:: AbstractArray , region) = reducedim_initarray (A, region, false )
159
+ reducedim_init (f, op:: typeof (& ), A:: AbstractArrayOrBroadcasted , region) = reducedim_initarray (A, region, true )
160
+ reducedim_init (f, op:: typeof (| ), A:: AbstractArrayOrBroadcasted , region) = reducedim_initarray (A, region, false )
161
161
162
162
# specialize to make initialization more efficient for common cases
163
163
179
179
180
180
# # generic (map)reduction
181
181
182
- has_fast_linear_indexing (a:: AbstractArray ) = false
182
+ has_fast_linear_indexing (a:: AbstractArrayOrBroadcasted ) = false
183
183
has_fast_linear_indexing (a:: Array ) = true
184
+ has_fast_linear_indexing (:: Number ) = true # for Broadcasted
185
+ has_fast_linear_indexing (bc:: Broadcast.Broadcasted ) =
186
+ all (has_fast_linear_indexing, bc. args)
184
187
185
188
function check_reducedims (R, A)
186
189
# Check whether R has compatible dimensions w.r.t. A for reduction
@@ -233,7 +236,7 @@ _firstslice(i::OneTo) = OneTo(1)
233
236
_firstslice (i:: Slice ) = Slice (_firstslice (i. indices))
234
237
_firstslice (i) = i[firstindex (i): firstindex (i)]
235
238
236
- function _mapreducedim! (f, op, R:: AbstractArray , A:: AbstractArray )
239
+ function _mapreducedim! (f, op, R:: AbstractArray , A:: AbstractArrayOrBroadcasted )
237
240
lsiz = check_reducedims (R,A)
238
241
isempty (A) && return R
239
242
@@ -271,10 +274,10 @@ function _mapreducedim!(f, op, R::AbstractArray, A::AbstractArray)
271
274
return R
272
275
end
273
276
274
- mapreducedim! (f, op, R:: AbstractArray , A:: AbstractArray ) =
277
+ mapreducedim! (f, op, R:: AbstractArray , A:: AbstractArrayOrBroadcasted ) =
275
278
(_mapreducedim! (f, op, R, A); R)
276
279
277
- reducedim! (op, R:: AbstractArray{RT} , A:: AbstractArray ) where {RT} =
280
+ reducedim! (op, R:: AbstractArray{RT} , A:: AbstractArrayOrBroadcasted ) where {RT} =
278
281
mapreducedim! (identity, op, R, A)
279
282
280
283
"""
@@ -304,17 +307,21 @@ julia> mapreduce(isodd, |, a, dims=1)
304
307
1 1 1 1
305
308
```
306
309
"""
307
- mapreduce (f, op, A:: AbstractArray ; dims= :, kw... ) = _mapreduce_dim (f, op, kw. data, A, dims)
308
- mapreduce (f, op, A:: AbstractArray... ; kw... ) = reduce (op, map (f, A... ); kw... )
310
+ mapreduce (f, op, A:: AbstractArrayOrBroadcasted ; dims= :, kw... ) =
311
+ _mapreduce_dim (f, op, kw. data, A, dims)
312
+ mapreduce (f, op, A:: AbstractArrayOrBroadcasted... ; kw... ) =
313
+ reduce (op, map (f, A... ); kw... )
309
314
310
- _mapreduce_dim (f, op, nt:: NamedTuple{(:init,)} , A:: AbstractArray , :: Colon ) = mapfoldl (f, op, A; nt... )
315
+ _mapreduce_dim (f, op, nt:: NamedTuple{(:init,)} , A:: AbstractArrayOrBroadcasted , :: Colon ) =
316
+ mapfoldl (f, op, A; nt... )
311
317
312
- _mapreduce_dim (f, op, :: NamedTuple{()} , A:: AbstractArray , :: Colon ) = _mapreduce (f, op, IndexStyle (A), A)
318
+ _mapreduce_dim (f, op, :: NamedTuple{()} , A:: AbstractArrayOrBroadcasted , :: Colon ) =
319
+ _mapreduce (f, op, IndexStyle (A), A)
313
320
314
- _mapreduce_dim (f, op, nt:: NamedTuple{(:init,)} , A:: AbstractArray , dims) =
321
+ _mapreduce_dim (f, op, nt:: NamedTuple{(:init,)} , A:: AbstractArrayOrBroadcasted , dims) =
315
322
mapreducedim! (f, op, reducedim_initarray (A, dims, nt. init), A)
316
323
317
- _mapreduce_dim (f, op, :: NamedTuple{()} , A:: AbstractArray , dims) =
324
+ _mapreduce_dim (f, op, :: NamedTuple{()} , A:: AbstractArrayOrBroadcasted , dims) =
318
325
mapreducedim! (f, op, reducedim_init (f, op, A, dims), A)
319
326
320
327
"""
0 commit comments