diff --git a/src/array_of_similar_arrays.jl b/src/array_of_similar_arrays.jl index 7d6a0b2..8246729 100644 --- a/src/array_of_similar_arrays.jl +++ b/src/array_of_similar_arrays.jl @@ -262,6 +262,9 @@ Base.@propagate_inbounds function _deepview_impl_aosa(A::ArrayOfSimilarArrays, i end +Base.mapreduce(::typeof(maximum), ::typeof(max), A::ArrayOfSimilarArrays; kw...) = maximum(flatview(A); kw...) +Base.mapreduce(::typeof(minimum), ::typeof(min), A::ArrayOfSimilarArrays; kw...) = minimum(flatview(A); kw...) + const VectorOfSimilarArrays{ T, M, L, diff --git a/src/vector_of_arrays.jl b/src/vector_of_arrays.jl index 645a9e2..d7c3724 100644 --- a/src/vector_of_arrays.jl +++ b/src/vector_of_arrays.jl @@ -337,6 +337,10 @@ function Base.append!(A::VectorOfArrays{T,N}, B::AbstractVector{<:AbstractArray{ end +Base.mapreduce(::typeof(maximum), ::typeof(max), V::VectorOfArrays) = maximum(flatview(V)) +Base.mapreduce(::typeof(minimum), ::typeof(min), V::VectorOfArrays) = minimum(flatview(V)) + + Base.vcat(V::VectorOfArrays) = V function Base.vcat(Vs::(VectorOfArrays{U,N} where U)...) where {N} diff --git a/test/array_of_similar_arrays.jl b/test/array_of_similar_arrays.jl index 4c2ca84..4483fac 100644 --- a/test/array_of_similar_arrays.jl +++ b/test/array_of_similar_arrays.jl @@ -365,6 +365,17 @@ using StatsBase: cov2cor @test @inferred(ArraysOfArrays._innerlength(VSV)) == N end + @testset "mapreduce maximum/minimum shortcut" begin + r1 = rand(1,4); r2 = rand(1,4); r3 = rand(1,4); r4 = rand(1,4) + ASA = ArrayOfSimilarArrays([r1,r2,r3,r4]) + + @test mapreduce(maximum, max, ASA) == maximum(flatview(ASA)) + @test (@allocated mapreduce(maximum, max, ASA)) == (@allocated maximum(flatview(ASA))) + + @test mapreduce(minimum, min, ASA) == minimum(flatview(ASA)) + @test (@allocated mapreduce(minimum, min, ASA)) == (@allocated minimum(flatview(ASA))) + end + @testset "map and broadcast" begin A_flat = rand(2,3,4,5,6) A = nestedview(A_flat, 2) diff --git a/test/runtests.jl b/test/runtests.jl index fa08bb9..33f956c 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -2,7 +2,7 @@ import Test -Test.@testset "Package ArraysOfArrays" begin +Test.@testset verbose=true "Package ArraysOfArrays" begin include("test_aqua.jl") include("functions.jl") include("array_of_similar_arrays.jl") diff --git a/test/vector_of_arrays.jl b/test/vector_of_arrays.jl index 8ea4d00..6e3ae58 100644 --- a/test/vector_of_arrays.jl +++ b/test/vector_of_arrays.jl @@ -76,6 +76,43 @@ using ArraysOfArrays: full_consistency_checks, append_elemptr!, element_ptr end + @testset "mapreduce maximum/minimum shortcut" begin + A1 = ref_AoA3(Float32, 3); # A2 = ref_AoA3(Float32, 0) + A3 = ref_AoA3(Float32, 4); A4 = ref_AoA3(Float64, 2) + + B1 = VectorOfArrays(A1); # B2 = VectorOfArrays(A2); + B3 = VectorOfArrays(A3); B4 = VectorOfArrays(A4); + + @testset "maximum - correctness" begin + @test mapreduce(maximum, max, B1) == mapreduce(maximum, max, Array(B1)) + # `init` kwarg is not supported for this specialization right now + # @test mapreduce(maximum, max, B2; init=Float32(0.)) == mapreduce(maximum, max, Array(B2); init=Float32(0.)) + @test mapreduce(maximum, max, B3) == mapreduce(maximum, max, Array(B3)) + @test mapreduce(maximum, max, B4) == mapreduce(maximum, max, Array(B4)) + end + + @testset "maximum - performance" begin + B1_naive = Array(B1) + mapreduce(maximum, max, B1_naive) + @test (@allocated mapreduce(maximum, max, B1)) <= (@allocated mapreduce(maximum, max, B1_naive)) + end + + @testset "minimum - correctness" begin + @test mapreduce(minimum, min, B1) == mapreduce(minimum, min, Array(B1)) + # `init` kwarg is not supported for this specialization right now + # @test mapreduce(minimum, min, B2; init=Float32(0.)) == mapreduce(minimum, min, Array(B2); init=Float32(0.)) + @test mapreduce(minimum, min, B3) == mapreduce(minimum, min, Array(B3)) + @test mapreduce(minimum, min, B4) == mapreduce(minimum, min, Array(B4)) + end + + @testset "minimum - performance" begin + B1_naive = Array(B1) + mapreduce(minimum, min, B1_naive) + @test (@allocated mapreduce(minimum, min, B1)) <= (@allocated mapreduce(minimum, min, B1_naive)) + end + end + + @testset "append! and vcat" begin A1 = ref_AoA3(Float32, 3); A2 = ref_AoA3(Float32, 0) A3 = ref_AoA3(Float32, 4); A4 = ref_AoA3(Float64, 2)