Skip to content

Commit 3c87082

Browse files
authored
Fix sub_materialize for Padded (#83)
* Fix sub_materialize for Padded * Update Project.toml
1 parent 803400b commit 3c87082

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "LazyArrays"
22
uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02"
3-
version = "0.14.8"
3+
version = "0.14.9"
44

55

66
[deps]

src/lazyconcat.jl

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,10 @@ arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2,<:Any,<:Tuple{<:Slice
576576
arguments(::ApplyLayout{typeof(hcat)}, V::SubArray{<:Any,2,<:Any,<:Tuple{<:Any,<:Slice}}) =
577577
view.(arguments(parent(V)), Ref(parentindices(V)[1]), Ref(:))
578578

579-
copyto!(dest::AbstractArray{T,N}, src::SubArray{T,N,<:Vcat{T,N}}) where {T,N} = vcat_copyto!(dest, arguments(src)...)
580-
copyto!(dest::AbstractMatrix{T}, src::SubArray{T,2,<:Hcat{T}}) where T = hcat_copyto!(dest, arguments(src)...)
579+
copyto!(dest::AbstractArray{T,N}, src::SubArray{T,N,<:Vcat{T,N}}) where {T,N} =
580+
vcat_copyto!(dest, arguments(ApplyLayout{typeof(vcat)}(), src)...)
581+
copyto!(dest::AbstractMatrix{T}, src::SubArray{T,2,<:Hcat{T}}) where T =
582+
hcat_copyto!(dest, arguments(ApplyLayout{typeof(hcat)}(), src)...)
581583

582584

583585
_vcat_lastinds(sz) = _vcat_cumsum(sz...)
@@ -597,32 +599,35 @@ function _vcat_sub_arguments(::ApplyLayout{typeof(vcat)}, A, V)
597599
_view_vcat.(arguments(A), skr2)
598600
end
599601
_vcat_sub_arguments(::ApplyLayout{typeof(hcat)}, A, V) = arguments(ApplyLayout{typeof(hcat)}(), V)
602+
_vcat_sub_arguments(::PaddedLayout, A, V) = _vcat_sub_arguments(ApplyLayout{typeof(vcat)}(), A, V)
600603

601604
_vcat_sub_arguments(A, V) = _vcat_sub_arguments(MemoryLayout(typeof(A)), A, V)
602605
arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,1}) = _vcat_sub_arguments(parent(V), V)
603606

604-
function arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2})
607+
function arguments(L::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2})
605608
A = parent(V)
609+
args = arguments(L, A)
606610
kr,jr = parentindices(V)
607-
sz = size.(arguments(A),1)
611+
sz = size.(args,1)
608612
skr = intersect.(_argsindices(sz), Ref(kr))
609613
skr2 = broadcast((a,b) -> a .- b .+ 1, skr, _vcat_firstinds(sz))
610-
_view_vcat.(arguments(A), skr2, Ref(jr))
614+
_view_vcat.(args, skr2, Ref(jr))
611615
end
612616

613617
_view_hcat(a::Number, kr, jr) = Fill(a,length(kr),length(jr))
614618
_view_hcat(a, kr, jr) = view(a, kr, jr)
615619

616-
function arguments(::ApplyLayout{typeof(hcat)}, V::SubArray)
620+
function arguments(L::ApplyLayout{typeof(hcat)}, V::SubArray)
617621
A = parent(V)
622+
args = arguments(L, A)
618623
kr,jr = parentindices(V)
619-
sz = size.(arguments(A),2)
624+
sz = size.(args,2)
620625
sjr = intersect.(_argsindices(sz), Ref(jr))
621626
sjr2 = broadcast((a,b) -> a .- b .+ 1, sjr, _vcat_firstinds(sz))
622-
_view_hcat.(arguments(A), Ref(kr), sjr2)
627+
_view_hcat.(args, Ref(kr), sjr2)
623628
end
624629

625-
function sub_materialize(::ApplyLayout{typeof(vcat)}, V)
630+
function sub_materialize(::ApplyLayout{typeof(vcat)}, V::AbstractMatrix)
626631
ret = similar(V)
627632
n = 0
628633
_,jr = parentindices(V)
@@ -652,6 +657,26 @@ materialize!(M::MatMulMatAdd{<:AbstractColumnMajor,<:ApplyLayout{typeof(vcat)}})
652657
materialize!(M::MatMulVecAdd{<:AbstractColumnMajor,<:ApplyLayout{typeof(vcat)}}) =
653658
materialize!(MulAdd(M.α,M.A,Array(M.B),M.β,M.C))
654659

660+
sublayout(::PaddedLayout{L}, ::Type{I}) where {L,I<:Tuple{AbstractUnitRange}} =
661+
PaddedLayout{typeof(sublayout(L(), I))}()
662+
sublayout(::PaddedLayout{L}, ::Type{I}) where {L,I<:Tuple{AbstractUnitRange,AbstractUnitRange}} =
663+
PaddedLayout{typeof(sublayout(L(), I))}()
664+
665+
function sub_materialize(::PaddedLayout, v::AbstractVector{T}) where T
666+
A = parent(v)
667+
dat = paddeddata(A)
668+
(kr,) = parentindices(v)
669+
kr2 = kr axes(dat,1)
670+
Vcat(lazy_getindex(dat, kr2), Zeros{T}(length(kr) - length(kr2)))
671+
end
672+
673+
function sub_materialize(::PaddedLayout, v::AbstractMatrix{T}) where T
674+
A = parent(v)
675+
dat = paddeddata(A)
676+
kr,jr = parentindices(v)
677+
kr2 = kr axes(dat,1)
678+
Vcat(lazy_getindex(dat, kr2, jr), Zeros{T}(length(kr) - length(kr2), length(jr)))
679+
end
655680

656681
## print
657682

test/concattests.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,4 +413,21 @@ import LazyArrays: MemoryLayout, DenseColumnMajor, PaddedLayout, materialize!,
413413
@test arguments(v) == ([2], zeros(4))
414414
@test A[2,1:5] == copy(v) == sub_materialize(v)
415415
end
416+
417+
@testset "Padded subarrays" begin
418+
a = Vcat([1,2,3],[4,5,6])
419+
@test sub_materialize(view(a,2:6)) == a[2:6]
420+
a = Vcat([1,2,3], Zeros(10))
421+
c = cache(Zeros(10)); c[1:3] = 1:3;
422+
v = view(a,2:4)
423+
w = view(c,2:4);
424+
@test MemoryLayout(typeof(a)) isa PaddedLayout{DenseColumnMajor}
425+
@test MemoryLayout(typeof(v)) isa PaddedLayout{DenseColumnMajor}
426+
@test sub_materialize(v) == a[2:4] == sub_materialize(w)
427+
@test sub_materialize(v) isa Vcat
428+
@test sub_materialize(w) isa Vcat
429+
A = Vcat(Eye(2), Zeros(10,2))
430+
V = view(A, 1:5, 1:2)
431+
@test sub_materialize(V) == A[1:5,1:2]
432+
end
416433
end

0 commit comments

Comments
 (0)