@@ -133,7 +133,16 @@ function VectorOfArray(vec::AbstractVector{T}, ::NTuple{N}) where {T, N}
133133 VectorOfArray {eltype(T), N, typeof(vec)} (vec)
134134end
135135# Assume that the first element is representative of all other elements
136- VectorOfArray (vec:: AbstractVector ) = VectorOfArray (vec, (size (vec[1 ])... , length (vec)))
136+ function VectorOfArray (vec:: AbstractVector )
137+ T = eltype (vec[1 ])
138+ N = ndims (vec[1 ])
139+ if all (x isa Union{<: AbstractArray , <: AbstractVectorOfArray } for x in vec)
140+ A = Vector{Union{typeof .(vec)... }}
141+ else
142+ A = typeof (vec)
143+ end
144+ VectorOfArray {T, N + 1, A} (vec)
145+ end
137146function VectorOfArray (vec:: AbstractVector{VT} ) where {T, N, VT <: AbstractArray{T, N} }
138147 VectorOfArray {T, N + 1, typeof(vec)} (vec)
139148end
@@ -482,21 +491,30 @@ function Base.append!(VA::AbstractVectorOfArray{T, N},
482491 return VA
483492end
484493
494+ function Base. stack (VA:: AbstractVectorOfArray ; dims = :)
495+ stack (VA. u; dims)
496+ end
497+
485498# AbstractArray methods
486499function Base. view (A:: AbstractVectorOfArray , I:: Vararg{Any,M} ) where {M}
487500 @inline
488501 J = map (i-> Base. unalias (A,i), to_indices (A, I))
489502 @boundscheck checkbounds (A, J... )
490503 SubArray (IndexStyle (A), A, J, Base. index_dimsum (J... ))
491504end
505+ function Base. SubArray (parent:: AbstractVectorOfArray , indices:: Tuple )
506+ @inline
507+ SubArray (IndexStyle (Base. viewindexing (indices), IndexStyle (parent)), parent, Base. ensure_indexable (indices), Base. index_dimsum (indices... ))
508+ end
509+ Base. isassigned (VA:: AbstractVectorOfArray , idxs... ) = checkbounds (Bool, VA, idxs... )
492510Base. check_parent_index_match (:: RecursiveArrayTools.AbstractVectorOfArray{T,N} , :: NTuple{N,Bool} ) where {T,N} = nothing
493511Base. ndims (:: AbstractVectorOfArray{T, N} ) where {T, N} = N
494512function Base. checkbounds (:: Type{Bool} , VA:: AbstractVectorOfArray , idx... )
495513 if checkbounds (Bool, VA. u, last (idx))
496514 if last (idx) isa Integer
497- return all (checkbounds .(Bool, (VA. u[last (idx)],), Base. front (idx)))
515+ return all (checkbounds .(Bool, (VA. u[last (idx)],), Base. front (idx)... ))
498516 else
499- return all (checkbounds .(Bool, VA. u[last (idx)], Base. front (idx)))
517+ return all (checkbounds .(Bool, VA. u[last (idx)], tuple .( Base. front (idx)) ... ))
500518 end
501519 end
502520 return false
@@ -595,10 +613,14 @@ function Base.convert(::Type{Array}, VA::AbstractVectorOfArray)
595613end
596614
597615# statistics
598- @inline Base. sum (f, VA:: AbstractVectorOfArray ) = sum (f, Array (VA))
599- @inline Base. sum (VA:: AbstractVectorOfArray ; kwargs... ) = sum (Array (VA); kwargs... )
600- @inline Base. prod (f, VA:: AbstractVectorOfArray ) = prod (f, Array (VA))
601- @inline Base. prod (VA:: AbstractVectorOfArray ; kwargs... ) = prod (Array (VA); kwargs... )
616+ @inline Base. sum (VA:: AbstractVectorOfArray ; kwargs... ) = sum (identity, VA; kwargs... )
617+ @inline function Base. sum (f, VA:: AbstractVectorOfArray ; kwargs... )
618+ mapreduce (f, Base. add_sum, VA; kwargs... )
619+ end
620+ @inline Base. prod (VA:: AbstractVectorOfArray ; kwargs... ) = prod (identity, VA; kwargs... )
621+ @inline function Base. prod (f, VA:: AbstractVectorOfArray ; kwargs... )
622+ mapreduce (f, Base. mul_prod, VA; kwargs... )
623+ end
602624
603625@inline Statistics. mean (VA:: AbstractVectorOfArray ; kwargs... ) = mean (Array (VA); kwargs... )
604626@inline function Statistics. median (VA:: AbstractVectorOfArray ; kwargs... )
638660end
639661
640662Base. map (f, A:: RecursiveArrayTools.AbstractVectorOfArray ) = map (f, A. u)
641- function Base. mapreduce (f, op, A:: AbstractVectorOfArray )
642- mapreduce (f, op, (mapreduce (f, op, x) for x in A. u))
663+
664+ function Base. mapreduce (f, op, A:: AbstractVectorOfArray ; kwargs... )
665+ mapreduce (f, op, view (A, ntuple (_ -> :, ndims (A))... ); kwargs... )
666+ end
667+ function Base. mapreduce (f, op, A:: AbstractVectorOfArray{T,1,<:AbstractVector{T}} ; kwargs... ) where {T}
668+ mapreduce (f, op, A. u; kwargs... )
643669end
644670
645671# # broadcasting
0 commit comments