Skip to content

Commit 97361a4

Browse files
authored
Only Vcats of AbstractRange can be guaranteed to be vcat (#357)
* Only Vcats of AbstractUnitRange can be guaranteed to be ranges. * Update lazyconcat.jl
1 parent 9c908d6 commit 97361a4

File tree

4 files changed

+26
-16
lines changed

4 files changed

+26
-16
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 = "2.3"
3+
version = "2.3.1"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

ext/LazyArraysBandedMatricesExt.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,8 @@ _broadcast_BandedMatrix(a) = a
311311
for op in (:+, :-, :*)
312312
@eval begin
313313
@inline _BandedMatrix(::BroadcastBandedLayout{typeof($op)}, V::AbstractMatrix)::BandedMatrix = broadcast($op, map(_broadcast_BandedMatrix,arguments(V))...)
314-
copyto!_layout(::AbstractBandedLayout, ::BroadcastBandedLayout{typeof($op)}, dest::AbstractMatrix, src::AbstractMatrix) =
315-
broadcast!($op, dest, map(_broadcast_BandedMatrix, arguments(src))...)
314+
copyto!_layout(::AbstractBandedLayout, srclay::BroadcastBandedLayout{typeof($op)}, dest::AbstractMatrix, src::AbstractMatrix) =
315+
broadcast!($op, dest, map(_broadcast_BandedMatrix, arguments(srclay, src))...)
316316
end
317317
end
318318

@@ -325,8 +325,8 @@ _mulbanded_BandedMatrix(A, _) = A
325325
_mulbanded_BandedMatrix(A, ::NTuple{2,OneTo{Int}}) = BandedMatrix(A)
326326
_mulbanded_BandedMatrix(A) = _mulbanded_BandedMatrix(A, axes(A))
327327

328-
copyto!_layout(::AbstractBandedLayout, ::ApplyBandedLayout{typeof(*)}, dest::AbstractMatrix, src::AbstractMatrix) =
329-
_mulbanded_copyto!(dest, map(_mulbanded_BandedMatrix,arguments(src))...)
328+
copyto!_layout(::AbstractBandedLayout, srclay::ApplyBandedLayout{typeof(*)}, dest::AbstractMatrix, src::AbstractMatrix) =
329+
_mulbanded_copyto!(dest, map(_mulbanded_BandedMatrix,arguments(srclay,src))...)
330330

331331
arguments(::BroadcastBandedLayout{F}, V::SubArray) where F = _broadcast_sub_arguments(V)
332332

src/lazyconcat.jl

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -786,10 +786,10 @@ end
786786
# subarrays
787787
###
788788

789-
sublayout(::ApplyLayout{typeof(vcat)}, ::Type{<:Tuple{Vararg{Union{AbstractVector{Int},Int}}}}) = ApplyLayout{typeof(vcat)}()
790-
sublayout(::ApplyLayout{typeof(hcat)}, ::Type{<:Tuple{Vararg{Union{AbstractVector{Int},Int}}}}) = ApplyLayout{typeof(hcat)}()
789+
sublayout(::ApplyLayout{typeof(vcat)}, ::Type{<:Tuple{Vararg{Union{AbstractRange{Int},Int}}}}) = ApplyLayout{typeof(vcat)}()
790+
sublayout(::ApplyLayout{typeof(hcat)}, ::Type{<:Tuple{Vararg{Union{AbstractRange{Int},Int}}}}) = ApplyLayout{typeof(hcat)}()
791791
# a row-slice of an Hcat is equivalent to a Vcat
792-
sublayout(::ApplyLayout{typeof(hcat)}, ::Type{<:Tuple{Int,AbstractVector{Int}}}) = ApplyLayout{typeof(vcat)}()
792+
sublayout(::ApplyLayout{typeof(hcat)}, ::Type{<:Tuple{Int,AbstractRange{Int}}}) = ApplyLayout{typeof(vcat)}()
793793

794794
_vcat_lastinds(sz) = _vcat_cumsum(sz...)
795795
_vcat_firstinds(sz) = (1, (1 .+ Base.front(_vcat_lastinds(sz)))...)
@@ -800,18 +800,21 @@ _view_vcat(a::Number, kr) = Fill(a,length(kr))
800800
_view_vcat(a::Number, kr, jr) = Fill(a,length(kr), length(jr))
801801
_view_vcat(a, kr...) = _viewifmutable(a, kr...)
802802

803-
function _vcat_sub_arguments(::ApplyLayout{typeof(vcat)}, A, V, kr)
804-
sz = size.(arguments(A),1)
803+
_reverse_if_neg_step(args, kr::AbstractUnitRange) = args
804+
_reverse_if_neg_step(args, kr::AbstractRange) = step(kr) 0 ? args : reverse(args)
805+
806+
function _vcat_sub_arguments(lay::ApplyLayout{typeof(vcat)}, A, V, kr)
807+
sz = size.(arguments(lay, A),1)
805808
skr = intersect.(_argsindices(sz), Ref(kr))
806809
skr2 = broadcast((a,b) -> a .- b .+ 1, skr, _vcat_firstinds(sz))
807-
map(_view_vcat, arguments(A), skr2)
810+
_reverse_if_neg_step(map(_view_vcat, arguments(lay, A), skr2), kr)
808811
end
809812

810813
function _vcat_sub_arguments(::ApplyLayout{typeof(vcat)}, A, V, kr, jr)
811814
sz = size.(arguments(A),1)
812815
skr = intersect.(_argsindices(sz), Ref(kr))
813816
skr2 = broadcast((a,b) -> a .- b .+ 1, skr, _vcat_firstinds(sz))
814-
_view_vcat.(arguments(A), skr2, Ref(jr))
817+
_reverse_if_neg_step(_view_vcat.(arguments(A), skr2, Ref(jr)), kr)
815818
end
816819

817820
_vcat_sub_arguments(LAY::ApplyLayout{typeof(vcat)}, A, V) = _vcat_sub_arguments(LAY, A, V, parentindices(V)...)
@@ -824,21 +827,23 @@ function _vcat_sub_arguments(L::ApplyLayout{typeof(hcat)}, A, V)
824827
sz = size.(args,2)
825828
sjr = intersect.(_argsindices(sz), Ref(jr))
826829
sjr2 = broadcast((a,b) -> a .- b .+ 1, sjr, _vcat_firstinds(sz))
827-
_view_hcat.(args, k, sjr2)
830+
_view_hcat.(_reverse_if_neg_step(args, jr), k, sjr2)
828831
end
829832

830833
_vcat_sub_arguments(::DualLayout{ML}, A, V) where ML = _vcat_sub_arguments(ML(), A, V)
831834
_vcat_sub_arguments(A, V) = _vcat_sub_arguments(MemoryLayout(typeof(A)), A, V)
832835
arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,1}) = _vcat_sub_arguments(parent(V), V)
833836

837+
838+
834839
function arguments(L::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2})
835840
A = parent(V)
836841
args = arguments(L, A)
837842
kr,jr = parentindices(V)
838843
sz = size.(args,1)
839844
skr = intersect.(_argsindices(sz), Ref(kr))
840845
skr2 = broadcast((a,b) -> a .- b .+ 1, skr, _vcat_firstinds(sz))
841-
_view_vcat.(args, skr2, Ref(jr))
846+
_view_vcat.(_reverse_if_neg_step(args, kr), skr2, Ref(jr))
842847
end
843848

844849
@inline _view_hcat(a::Number, kr, jr) = Fill(a,length(kr),length(jr))
@@ -867,11 +872,11 @@ arguments(::ApplyLayout{typeof(vcat)}, V::SubArray{<:Any,2,<:Any,<:Tuple{<:Slice
867872
arguments(::ApplyLayout{typeof(hcat)}, V::SubArray{<:Any,2,<:Any,<:Tuple{<:Any,<:Slice}}) =
868873
__view_hcat(arguments(parent(V)), parentindices(V)[1], :)
869874

870-
function sub_materialize(::ApplyLayout{typeof(vcat)}, V::AbstractMatrix, _)
875+
function sub_materialize(lay::ApplyLayout{typeof(vcat)}, V::AbstractMatrix, _)
871876
ret = similar(V)
872877
n = 0
873878
_,jr = parentindices(V)
874-
for a in arguments(V)
879+
for a in arguments(lay, V)
875880
m = size(a,1)
876881
copyto!(view(ret,n+1:n+m,:), a)
877882
n += m

test/concattests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,11 @@ import LazyArrays: MemoryLayout, DenseColumnMajor, materialize!, call, paddeddat
652652
@test Array(Hcat()) == Array{Any}(undef,0,0)
653653
@test rowsupport(Hcat(Vcat(Zeros(3,1))),1:2) == colsupport(Vcat(Hcat(Zeros(1,3))),1:2)
654654
end
655+
656+
@testset "reverse Vcat" begin
657+
A = Vcat([1 2 3], [4 5 6])
658+
@test A[2:-1:1,1:-1:1] == [4; 1 ;;]
659+
end
655660
end
656661

657662
end # module

0 commit comments

Comments
 (0)