From f70e46d9dce293faf3b27ca269899ba6aaa4fdcb Mon Sep 17 00:00:00 2001 From: Joshua Lampert Date: Tue, 16 Dec 2025 23:33:07 +0100 Subject: [PATCH 1/2] specialize recursivecopy for ArrayPartition of VectorOfArray --- src/array_partition.jl | 11 +++++++++++ test/partitions_test.jl | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/array_partition.jl b/src/array_partition.jl index 55e117aa..b01be653 100644 --- a/src/array_partition.jl +++ b/src/array_partition.jl @@ -329,6 +329,17 @@ function recursivecopy!(A::ArrayPartition, B::ArrayPartition) end recursivecopy(A::ArrayPartition) = ArrayPartition(copy.(A.x)) +function recursivecopy(A::ArrayPartition{T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} + return ArrayPartition(map(recursivecopy, A.x)) +end + +function recursivecopy!(A::ArrayPartition{T, S}, B::ArrayPartition{T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} + for i in eachindex(A.x, B.x) + recursivecopy!(A.x[i], B.x[i]) + end + return A +end + recursive_mean(A::ArrayPartition) = mean((recursive_mean(x) for x in A.x)) # note: consider only first partition for recursive one and eltype diff --git a/test/partitions_test.jl b/test/partitions_test.jl index 2487dbdb..749f4b57 100644 --- a/test/partitions_test.jl +++ b/test/partitions_test.jl @@ -132,6 +132,23 @@ y = ArrayPartition(ArrayPartition([1], [2.0]), ArrayPartition([3], [4.0])) @inferred recursive_one(x) @inferred recursive_bottom_eltype(x) +src_voa = VectorOfArray([[1.0, 2.0], [3.0, 4.0]]) +src_ap = ArrayPartition(src_voa) + +copied_ap = recursivecopy(src_ap) +@test copied_ap.x[1].u[1] == src_ap.x[1].u[1] +@test copied_ap.x[1].u[2] == src_ap.x[1].u[2] +@test copied_ap.x[1].u[1] !== src_ap.x[1].u[1] +@test copied_ap.x[1].u[2] !== src_ap.x[1].u[2] + +dest_voa = VectorOfArray([zeros(2), zeros(2)]) +dest_ap = ArrayPartition(dest_voa) +recursivecopy!(dest_ap, src_ap) +@test dest_ap.x[1].u[1] == src_ap.x[1].u[1] +@test dest_ap.x[1].u[2] == src_ap.x[1].u[2] +@test dest_ap.x[1].u[1] !== src_ap.x[1].u[1] +@test dest_ap.x[1].u[2] !== src_ap.x[1].u[2] + # mapreduce @inferred Union{Int, Float64} sum(x) @inferred sum(ArrayPartition(ArrayPartition(zeros(4, 4)))) @@ -149,7 +166,7 @@ y = ArrayPartition(ArrayPartition([1], [2.0]), ArrayPartition([3], [4.0])) @test any(isnan, ArrayPartition([2], [NaN])) @test any(isnan, ArrayPartition([2], ArrayPartition([NaN]))) -# all +# all @test !all(isnan, ArrayPartition([1, 2], [3.0, 4.0])) @test !all(isnan, ArrayPartition([3.0, 4.0])) @test !all(isnan, ArrayPartition([NaN], [3.0, 4.0])) From 3056492a1f4b254569ba4608db8286e52457ae48 Mon Sep 17 00:00:00 2001 From: Joshua Lampert Date: Tue, 16 Dec 2025 23:41:30 +0100 Subject: [PATCH 2/2] format --- src/array_partition.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/array_partition.jl b/src/array_partition.jl index b01be653..08ff25b0 100644 --- a/src/array_partition.jl +++ b/src/array_partition.jl @@ -329,11 +329,13 @@ function recursivecopy!(A::ArrayPartition, B::ArrayPartition) end recursivecopy(A::ArrayPartition) = ArrayPartition(copy.(A.x)) -function recursivecopy(A::ArrayPartition{T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} +function recursivecopy(A::ArrayPartition{ + T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} return ArrayPartition(map(recursivecopy, A.x)) end -function recursivecopy!(A::ArrayPartition{T, S}, B::ArrayPartition{T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} +function recursivecopy!(A::ArrayPartition{T, S}, + B::ArrayPartition{T, S}) where {T, S <: Tuple{Vararg{AbstractVectorOfArray}}} for i in eachindex(A.x, B.x) recursivecopy!(A.x[i], B.x[i]) end @@ -486,7 +488,7 @@ end ## Linear Algebra function ArrayInterface.zeromatrix(A::ArrayPartition) - x = reduce(vcat,vec.(A.x)) + x = reduce(vcat, vec.(A.x)) x .* x' .* false end