Skip to content

Commit 96bfa9d

Browse files
authored
first/isempty for RangeCumsum (#76)
* first/isempty for RangeCumsum * avoid ambiguities with Zeros multiplication * Revert "Revert "fill special cases"" This reverts commit 4482296. * increase cov * increase cov * tests pass * Update test_layoutarray.jl
1 parent 4482296 commit 96bfa9d

File tree

7 files changed

+62
-7
lines changed

7 files changed

+62
-7
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.7.5"
4+
version = "0.7.6"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
88
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
99
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1010

1111
[compat]
12-
FillArrays = "0.11, 0.12"
12+
FillArrays = "0.12.6"
1313
julia = "1.5"
1414

1515
[extras]

src/ArrayLayouts.jl

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ getindex(A::LayoutVector, kr::Colon) = layout_getindex(A, kr)
162162
getindex(A::AdjOrTrans{<:Any,<:LayoutVector}, kr::Integer, jr::Colon) = layout_getindex(A, kr, jr)
163163
getindex(A::AdjOrTrans{<:Any,<:LayoutVector}, kr::Integer, jr::AbstractVector) = layout_getindex(A, kr, jr)
164164

165+
*(a::Zeros{<:Any,2}, b::LayoutMatrix) = FillArrays.mult_zeros(a, b)
166+
*(a::LayoutMatrix, b::Zeros{<:Any,2}) = FillArrays.mult_zeros(a, b)
167+
*(a::Transpose{T, <:LayoutMatrix{T}} where T, b::Zeros{<:Any, 2}) = FillArrays.mult_zeros(a, b)
168+
*(a::Adjoint{T, <:LayoutMatrix{T}} where T, b::Zeros{<:Any, 2}) = FillArrays.mult_zeros(a, b)
169+
165170
*(A::Diagonal{<:Any,<:LayoutVector}, B::Diagonal{<:Any,<:LayoutVector}) = mul(A, B)
166171
*(A::Diagonal{<:Any,<:LayoutVector}, B::AbstractMatrix) = mul(A, B)
167172
*(A::AbstractMatrix, B::Diagonal{<:Any,<:LayoutVector}) = mul(A, B)
@@ -306,6 +311,9 @@ end
306311
# printing
307312
###
308313

314+
const LayoutVecOrMat{T} = Union{LayoutVector{T},LayoutMatrix{T}}
315+
const LayoutVecOrMats{T} = Union{LayoutVecOrMat{T},SubArray{T,1,<:LayoutVecOrMat},SubArray{T,2,<:LayoutVecOrMat}}
316+
309317
layout_replace_in_print_matrix(_, A, i, j, s) =
310318
i in colsupport(A,j) ? s : Base.replace_with_centered_mark(s)
311319

@@ -315,7 +323,7 @@ Base.replace_in_print_matrix(A::Union{LayoutVector,
315323
UnitUpperTriangular{<:Any,<:LayoutMatrix},
316324
LowerTriangular{<:Any,<:LayoutMatrix},
317325
UnitLowerTriangular{<:Any,<:LayoutMatrix},
318-
AdjOrTrans{<:Any,<:LayoutMatrix},
326+
AdjOrTrans{<:Any,<:LayoutVecOrMat},
319327
HermOrSym{<:Any,<:LayoutMatrix},
320328
SubArray{<:Any,2,<:LayoutMatrix}}, i::Integer, j::Integer, s::AbstractString) =
321329
layout_replace_in_print_matrix(MemoryLayout(A), A, i, j, s)
@@ -339,8 +347,7 @@ include("cumsum.jl")
339347
# support overloading hcat/vcat for ∞-arrays
340348
###
341349

342-
const LayoutVecOrMat{T} = Union{LayoutVector{T},LayoutMatrix{T}}
343-
const LayoutVecOrMats{T} = Union{LayoutVecOrMat{T},SubArray{T,1,<:LayoutVecOrMat},SubArray{T,2,<:LayoutVecOrMat}}
350+
344351

345352
typed_hcat(::Type{T}, ::Tuple, A...) where T = Base._typed_hcat(T, A)
346353
typed_vcat(::Type{T}, ::Tuple, A...) where T = Base._typed_vcat(T, A)

src/cumsum.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ end
2626

2727
Base.@propagate_inbounds getindex(c::RangeCumsum, kr::OneTo) = RangeCumsum(c.range[kr])
2828

29+
first(r::RangeCumsum) = first(r.range)
2930
last(r::RangeCumsum) = sum(r.range)
3031
diff(r::RangeCumsum) = r.range[2:end]
32+
isempty(r::RangeCumsum) = isempty(r.range)
3133

3234
union(a::RangeCumsum{<:Any,<:Base.OneTo}, b::RangeCumsum{<:Any,<:Base.OneTo}) =
3335
RangeCumsum(Base.OneTo(max(last(a.range),last(b.range))))

src/mul.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ macro layoutmul(Typ)
182182
Base.:*(A::AbstractMatrix, B::$Typ) = ArrayLayouts.mul(A,B)
183183
Base.:*(A::LinearAlgebra.AdjointAbsVec, B::$Typ) = ArrayLayouts.mul(A,B)
184184
Base.:*(A::LinearAlgebra.TransposeAbsVec, B::$Typ) = ArrayLayouts.mul(A,B)
185+
Base.:*(A::LinearAlgebra.AdjointAbsVec{<:Any,<:Zeros{<:Any,1}}, B::$Typ) = ArrayLayouts.mul(A,B)
186+
Base.:*(A::LinearAlgebra.TransposeAbsVec{<:Any,<:Zeros{<:Any,1}}, B::$Typ) = ArrayLayouts.mul(A,B)
187+
Base.:*(A::LinearAlgebra.Transpose{T,<:$Typ}, B::Zeros{T,1}) where T<:Real = ArrayLayouts.mul(A,B)
185188

186189
Base.:*(A::LinearAlgebra.AbstractQ, B::$Typ) = ArrayLayouts.mul(A,B)
187190
Base.:*(A::$Typ, B::LinearAlgebra.AbstractQ) = ArrayLayouts.mul(A,B)
@@ -224,6 +227,7 @@ macro layoutmul(Typ)
224227
Base.:*(A::LinearAlgebra.TransposeAbsVec, B::$Mod{<:Any,<:$Typ}) = ArrayLayouts.mul(A,B)
225228
Base.:*(A::$Mod{<:Any,<:$Typ}, B::AbstractVector) = ArrayLayouts.mul(A,B)
226229
Base.:*(A::$Mod{<:Any,<:$Typ}, B::ArrayLayouts.LayoutVector) = ArrayLayouts.mul(A,B)
230+
Base.:*(A::$Mod{<:Any,<:$Typ}, B::Zeros{<:Any,1}) = ArrayLayouts.mul(A,B)
227231

228232
Base.:*(A::$Mod{<:Any,<:$Typ}, B::$Typ) = ArrayLayouts.mul(A,B)
229233
Base.:*(A::$Typ, B::$Mod{<:Any,<:$Typ}) = ArrayLayouts.mul(A,B)
@@ -267,6 +271,8 @@ dot(a, b) = materialize(Dot(a, b))
267271
@inline LinearAlgebra.dot(a::LayoutArray, b::LayoutArray) = dot(a,b)
268272
@inline LinearAlgebra.dot(a::LayoutArray, b::AbstractArray) = dot(a,b)
269273
@inline LinearAlgebra.dot(a::AbstractArray, b::LayoutArray) = dot(a,b)
274+
@inline LinearAlgebra.dot(a::LayoutVector, b::AbstractFill{<:Any,1}) = FillArrays._fill_dot(a,b)
275+
@inline LinearAlgebra.dot(a::AbstractFill{<:Any,1}, b::LayoutVector) = FillArrays._fill_dot(a,b)
270276
@inline LinearAlgebra.dot(a::LayoutArray{<:Number}, b::SparseArrays.SparseVectorUnion{<:Number}) = dot(a,b)
271277
@inline LinearAlgebra.dot(a::SparseArrays.SparseVectorUnion{<:Number}, b::LayoutArray{<:Number}) = dot(a,b)
272278

src/muladd.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ size(M::MulAdd) = map(length,axes(M))
3939
axes(M::MulAdd) = axes(M.C)
4040

4141
similar(M::MulAdd, ::Type{T}, axes) where {T,N} = similar(Array{T}, axes)
42+
similar(M::MulAdd{<:DualLayout,<:Any,<:Any,<:Any,<:Adjoint}, ::Type{T}, axes) where {T,N} = similar(Array{T}, axes[2])'
43+
similar(M::MulAdd{<:DualLayout,<:Any,<:Any,<:Any,<:Transpose}, ::Type{T}, axes) where {T,N} = transpose(similar(Array{T}, axes[2]))
4244
similar(M::MulAdd, ::Type{T}) where T = similar(M, T, axes(M))
4345
similar(M::MulAdd) = similar(M, eltype(M))
4446

@@ -371,6 +373,8 @@ scalarzero(::Type{<:AbstractArray{T}}) where T = scalarzero(T)
371373

372374
fillzeros(::Type{T}, ax) where T<:Number = Zeros{T}(ax)
373375
mulzeros(::Type{T}, M) where T<:Number = fillzeros(T, axes(M))
376+
mulzeros(::Type{T}, M::Mul{<:DualLayout,<:Any,<:Adjoint}) where T<:Number = fillzeros(T, axes(M,2))'
377+
mulzeros(::Type{T}, M::Mul{<:DualLayout,<:Any,<:Transpose}) where T<:Number = transpose(fillzeros(T, axes(M,2)))
374378

375379
# initiate array-valued MulAdd
376380
function _mulzeros!(dest::AbstractVector{T}, A, B) where T
@@ -412,4 +416,9 @@ function similar(M::MulAdd{<:Any,<:DualLayout,ZerosLayout}, ::Type{T}, (x,y)) wh
412416
@assert length(x) == 1
413417
trans = transtype(M.B)
414418
trans(similar(trans(M.B), T, y))
415-
end
419+
end
420+
421+
const ZerosLayouts = Union{ZerosLayout,DualLayout{ZerosLayout}}
422+
copy(M::MulAdd{<:ZerosLayouts, <:ZerosLayouts, <:ZerosLayouts}) = M.C
423+
copy(M::MulAdd{<:ZerosLayouts, <:Any, <:ZerosLayouts}) = M.C
424+
copy(M::MulAdd{<:Any, <:ZerosLayouts, <:ZerosLayouts}) = M.C

test/test_cumsum.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ using ArrayLayouts, Test
88
@test r[Base.OneTo(3)] == r[1:3]
99
@test last(r) == r[end]
1010
@test diff(r) == diff(Vector(r))
11+
@test first(r) == r[1]
1112
end
1213

1314
a,b = RangeCumsum(Base.OneTo(5)), RangeCumsum(Base.OneTo(6))

test/test_layoutarray.jl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using ArrayLayouts, LinearAlgebra, Test
1+
using ArrayLayouts, LinearAlgebra, FillArrays, Base64, Test
22
import ArrayLayouts: sub_materialize
33

44
if VERSION < v"1.7-"
@@ -173,6 +173,7 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
173173
A = MyMatrix(randn(5,5))
174174
b = randn(5)
175175
@test dot(b, A, b) b'*(A*b) b'A*b
176+
@test dot(b, A, b) transpose(b)*(A*b) transpose(b)A*b
176177
end
177178

178179
@testset "dual vector * symmetric (#40)" begin
@@ -265,8 +266,32 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
265266
@test Transpose(T) * A Transpose(T) * A.A
266267
@test Transpose(T)A' Adjoint(T)A' Adjoint(T)Transpose(A) Transpose(T)Transpose(A)
267268
@test Transpose(A)Adjoint(T) A'Adjoint(T) A'Transpose(T) Transpose(A)Transpose(T)
269+
270+
@test Zeros(5)' * A Zeros(5)'
271+
@test transpose(Zeros(5)) * A transpose(Zeros(5))
272+
273+
@test A' * Zeros(5) Zeros(5)
274+
@test Zeros(3,5) * A Zeros(3,5)
275+
@test A * Zeros(5,3) Zeros(5,3)
276+
@test A' * Zeros(5,3) Zeros(5,3)
277+
@test transpose(A) * Zeros(5,3) Zeros(5,3)
278+
@test A' * Zeros(5) Zeros(5)
279+
@test transpose(A) * Zeros(5) Zeros(5)
280+
281+
b = MyVector(randn(5))
282+
@test A' * b A' * b.A
268283
end
269284

285+
@testset "AbstractQ" begin
286+
A = MyMatrix(randn(5,5))
287+
Q = qr(randn(5,5)).Q
288+
@test Q'*A Q'*A.A
289+
@test Q*A Q*A.A
290+
@test A*Q A.A*Q
291+
@test A*Q' A.A*Q'
292+
end
293+
294+
270295
@testset "concat" begin
271296
a = MyVector(randn(5))
272297
A = MyMatrix(randn(5,6))
@@ -278,6 +303,11 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
278303
@test [a A A] == [Array(a) Array(A) Array(A)]
279304
@test [a Array(A) A] == [Array(a) Array(A) Array(A)]
280305
end
306+
307+
@testset "dot" begin
308+
a = MyVector(randn(5))
309+
@test dot(a, Zeros(5)) dot(Zeros(5), a) 0.0
310+
end
281311
end
282312

283313
struct MyUpperTriangular{T} <: AbstractMatrix{T}

0 commit comments

Comments
 (0)