Skip to content

Commit

Permalink
Reland "add more methods and tests for reductions over empty arrays"
Browse files Browse the repository at this point in the history
Refs #29919
Refs #52003

This reverts commit 2a84214.
  • Loading branch information
vtjnash committed Apr 16, 2024
1 parent 13d4f0e commit 6ca85cd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
9 changes: 6 additions & 3 deletions base/reduce.jl
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,8 @@ reduce_empty(::typeof(*), ::Type{T}) where {T} = one(T)
reduce_empty(::typeof(*), ::Type{<:AbstractChar}) = ""
reduce_empty(::typeof(&), ::Type{Bool}) = true
reduce_empty(::typeof(|), ::Type{Bool}) = false

reduce_empty(::typeof(max), T) = typemin(T)
reduce_empty(::typeof(min), T) = typemax(T)
reduce_empty(::typeof(add_sum), ::Type{T}) where {T} = reduce_empty(+, T)
reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:BitSignedSmall} = zero(Int)
reduce_empty(::typeof(add_sum), ::Type{T}) where {T<:BitUnsignedSmall} = zero(UInt)
Expand All @@ -362,8 +363,10 @@ mapreduce_empty(::typeof(identity), op, T) = reduce_empty(op, T)
mapreduce_empty(::typeof(abs), op, T) = abs(reduce_empty(op, T))
mapreduce_empty(::typeof(abs2), op, T) = abs2(reduce_empty(op, T))

mapreduce_empty(f::typeof(abs), ::typeof(max), T) = abs(zero(T))
mapreduce_empty(f::typeof(abs2), ::typeof(max), T) = abs2(zero(T))
mapreduce_empty(::typeof(abs), ::typeof(max), T) = abs(zero(T))
mapreduce_empty(::typeof(abs), ::typeof(min), T) = typemax(abs(zero(T)))
mapreduce_empty(::typeof(abs2), ::typeof(max), T) = abs2(zero(T))
mapreduce_empty(::typeof(abs2), ::typeof(min), T) = typemax(abs2(zero(T)))

# For backward compatibility:
mapreduce_empty_iter(f, op, itr, ItrEltype) =
Expand Down
23 changes: 21 additions & 2 deletions test/reduce.jl
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ end
@test mapreduce(abs2, *, Float64[]) === 1.0
@test mapreduce(abs2, max, Float64[]) === 0.0
@test mapreduce(abs, max, Float64[]) === 0.0
@test mapreduce(abs2, min, Float64[]) === Inf
@test mapreduce(abs, min, Float64[]) === Inf
@test_throws ArgumentError mapreduce(abs2, &, Float64[])
@test_throws ArgumentError mapreduce(abs2, |, Float64[])
@test_throws "reducing over an empty collection is not allowed" mapreduce(abs2, &, Float64[])
@test_throws str -> !occursin("Closest candidates are", str) mapreduce(abs2, &, Float64[])
@test_throws "reducing over an empty collection is not allowed" mapreduce(abs2, |, Float64[])
Expand Down Expand Up @@ -246,8 +250,8 @@ prod2(itr) = invoke(prod, Tuple{Any}, itr)

# maximum & minimum & extrema

@test_throws "reducing over an empty" maximum(Int[])
@test_throws "reducing over an empty" minimum(Int[])
@test maximum(Int[]) === typemin(Int)
@test minimum(Int[]) === typemax(Int)
@test_throws "reducing over an empty" extrema(Int[])

@test maximum(Int[]; init=-1) == -1
Expand All @@ -258,6 +262,21 @@ prod2(itr) = invoke(prod, Tuple{Any}, itr)
@test minimum(sin, []; init=1) == 1
@test extrema(sin, []; init=(1, -1)) == (1, -1)

@test maximum(Float64[]) === -Inf
@test minimum(Float64[]) === +Inf

@test maximum(Float32[]) === -Inf32
@test minimum(Float32[]) === +Inf32

@test maximum(abs, Int[]) === 0
@test minimum(abs, Int[]) === typemax(Int)

@test maximum(abs, Float64[]) === 0.0
@test minimum(abs, Float64[]) === +Inf

@test maximum(abs, Float32[]) === 0.0f0
@test minimum(abs, Float32[]) === +Inf32

@test maximum(5) == 5
@test minimum(5) == 5
@test extrema(5) == (5, 5)
Expand Down

0 comments on commit 6ca85cd

Please sign in to comment.