Skip to content

Commit d79c989

Browse files
authored
Only add inplace methods for UpperOrLowerTriangular (#196)
* Only add inplace methods for UpperOrLowerTriangular * Don't test against LazyArrays * Set fail fast to false * Disambiguate triangular multiplication * Add missing tests
1 parent cc0de6e commit d79c989

File tree

5 files changed

+67
-4
lines changed

5 files changed

+67
-4
lines changed

.github/workflows/downstream.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
name: ${{ matrix.package.group }}/${{ matrix.package.repo }}/${{ matrix.julia-version }}
2626
runs-on: ${{ matrix.os }}
2727
strategy:
28-
fail-fast: true
28+
fail-fast: false
2929
matrix:
3030
julia-version: ['1']
3131
os: [ubuntu-latest]

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "1.5.1"
4+
version = "1.5.2"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"

src/mul.jl

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ macro layoutmul(Typ)
252252
(*)(A::$Typ, B::LinearAlgebra.$Struc) = ArrayLayouts.mul(A,B)
253253
end
254254
end
255-
for Mod in (:Adjoint, :Transpose, :Symmetric, :Hermitian, :UpperOrLowerTriangular)
255+
for Mod in (:Adjoint, :Transpose, :Symmetric, :Hermitian)
256256
ret = quote
257257
$ret
258258

@@ -297,6 +297,37 @@ macro layoutmul(Typ)
297297
end
298298
end
299299

300+
ret = quote
301+
$ret
302+
303+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, b::UpperOrLowerTriangular) =
304+
ArrayLayouts.mul!(dest,A,b)
305+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular, b::$Typ) =
306+
ArrayLayouts.mul!(dest,A,b)
307+
LinearAlgebra.mul!(dest::AbstractVector, A::UpperOrLowerTriangular{<:Any,<:$Typ}, b::AbstractVector) =
308+
ArrayLayouts.mul!(dest,A,b)
309+
LinearAlgebra.mul!(dest::AbstractVector, A::UpperOrLowerTriangular{<:Any,<:$Typ}, b::AbstractVector, α::Number, β::Number) =
310+
ArrayLayouts.mul!(dest,A,b,α,β)
311+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular{<:Any,<:$Typ}, B::AbstractMatrix, α::Number, β::Number) =
312+
ArrayLayouts.mul!(dest,A,B,α,β)
313+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular{<:Any,<:$Typ}, B::UpperOrLowerTriangular, α::Number, β::Number) =
314+
ArrayLayouts.mul!(dest,A,B,α,β)
315+
LinearAlgebra.mul!(dest::AbstractMatrix, A::AbstractMatrix, B::UpperOrLowerTriangular{<:Any,<:$Typ}, α::Number, β::Number) =
316+
ArrayLayouts.mul!(dest,A,B,α,β)
317+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular, B::UpperOrLowerTriangular{<:Any,<:$Typ}, α::Number, β::Number) =
318+
ArrayLayouts.mul!(dest,A,B,α,β)
319+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular{<:Any,<:$Typ}, B::$Typ, α::Number, β::Number) =
320+
ArrayLayouts.mul!(dest,A,B,α,β)
321+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::UpperOrLowerTriangular{<:Any,<:$Typ}, α::Number, β::Number) =
322+
ArrayLayouts.mul!(dest,A,B,α,β)
323+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular, B::$Typ, α::Number, β::Number) =
324+
ArrayLayouts.mul!(dest,A,B,α,β)
325+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::UpperOrLowerTriangular, α::Number, β::Number) =
326+
ArrayLayouts.mul!(dest,A,B,α,β)
327+
LinearAlgebra.mul!(dest::AbstractMatrix, A::UpperOrLowerTriangular{<:Any,<:$Typ}, B::UpperOrLowerTriangular{<:Any,<:$Typ}, α::Number, β::Number) =
328+
ArrayLayouts.mul!(dest,A,B,α,β)
329+
330+
end
300331
esc(ret)
301332
end
302333

@@ -316,6 +347,7 @@ end
316347
*(x::TransposeAbsVec{<:Any,<:Zeros{<:Any,1}}, D::Diagonal, y::LayoutVector) = FillArrays._triple_zeromul(x, D, y)
317348

318349

350+
*(A::UpperOrLowerTriangular{<:Any,<:LayoutMatrix}, B::UpperOrLowerTriangular{<:Any,<:LayoutMatrix}) = mul(A, B)
319351
*(A::UpperOrLowerTriangular{<:Any,<:AdjOrTrans{<:Any,<:LayoutMatrix}}, B::UpperOrLowerTriangular{<:Any,<:LayoutMatrix}) = mul(A, B)
320352
*(A::UpperOrLowerTriangular{<:Any,<:LayoutMatrix}, B::UpperOrLowerTriangular{<:Any,<:AdjOrTrans{<:Any,<:LayoutMatrix}}) = mul(A, B)
321353
*(A::UpperOrLowerTriangular{<:Any,<:AdjOrTrans{<:Any,<:LayoutMatrix}}, B::UpperOrLowerTriangular{<:Any,<:AdjOrTrans{<:Any,<:LayoutMatrix}}) = mul(A, B)

test/test_layoutarray.jl

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,38 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
536536
end
537537
end
538538

539+
@testset "mul involving a triangular" begin
540+
A = MyMatrix(rand(4,4))
541+
UA = UpperTriangular(A)
542+
MA = Matrix(A)
543+
MUA = Matrix(UA)
544+
B = rand(4,4)
545+
UB = UpperTriangular(B)
546+
@test mul!(zeros(4,4), A, UB) MA * UB
547+
@test mul!(ones(4,4), A, UB, 2, 2) 2 * MA * UB .+ 2
548+
@test mul!(zeros(4,4), UA, B) MUA * B
549+
@test mul!(ones(4,4), UA, B, 2, 2) 2 * MUA * B .+ 2
550+
@test mul!(zeros(4,4), UA, UB) MUA * UB
551+
@test mul!(ones(4,4), UA, UB, 2, 2) 2 * MUA * UB .+ 2
552+
@test mul!(zeros(4,4), UB, A) UB * MA
553+
@test mul!(ones(4,4), UB, A, 2, 2) 2 * UB * MA .+ 2
554+
@test mul!(zeros(4,4), UB, UA) UB * MUA
555+
@test mul!(ones(4,4), UB, UA, 2, 2) 2 * UB * MUA .+ 2
556+
@test mul!(zeros(4,4), B, UA) B * MUA
557+
@test mul!(ones(4,4), B, UA, 2, 2) 2 * B * MUA .+ 2
558+
@test mul!(zeros(4,4), A, UA) MA * MUA
559+
@test mul!(ones(4,4), A, UA, 2, 2) 2 * MA * MUA .+ 2
560+
@test mul!(zeros(4,4), UA, A) MUA * MA
561+
@test mul!(ones(4,4), UA, A, 2, 2) 2 * MUA * MA .+ 2
562+
@test mul!(zeros(4,4), UA, UA) MUA * MUA
563+
@test mul!(ones(4,4), UA, UA, 2, 2) 2 * MUA * MUA .+ 2
564+
565+
566+
v = rand(4)
567+
@test mul!(zeros(4), UA, v) MUA * v
568+
@test mul!(ones(4), UA, v, 2, 2) 2 * MUA * v .+ 2
569+
end
570+
539571
struct MyUpperTriangular{T} <: AbstractMatrix{T}
540572
A::UpperTriangular{T,Matrix{T}}
541573
end

test/test_muladd.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,6 @@ Random.seed!(0)
785785
x :: T
786786
sz :: NTuple{2,Int}
787787
end
788-
MFillMat(x::T, sz::NTuple{2,Int}) where {T} = MFillMat{T}(x, sz)
789788
MFillMat(x::T, sz::Vararg{Int,2}) where {T} = MFillMat{T}(x, sz)
790789
Base.size(M::MFillMat) = M.sz
791790
FillArrays.getindex_value(M::MFillMat) = M.x

0 commit comments

Comments
 (0)