Skip to content

Commit 9a9d8f1

Browse files
authored
Support kwds in ldiv and rdiv (#115)
* Support kwds in ldiv and rdiv * increase coverage * fix tests * Don't test on nightly * Update test_layoutarray.jl * Update test_layoutarray.jl
1 parent 54d26a4 commit 9a9d8f1

File tree

5 files changed

+79
-56
lines changed

5 files changed

+79
-56
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ jobs:
1414
version:
1515
- '1.6'
1616
- '1'
17-
- 'nightly'
1817
os:
1918
- ubuntu-latest
2019
- macOS-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 = "0.8.15"
4+
version = "0.8.16"
55

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

src/factorizations.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,11 @@ end
378378
function _cholesky!(::SymmetricLayout{<:AbstractColumnMajor}, axes, A::AbstractMatrix{<:BlasReal},
379379
::CRowMaximum; tol = 0.0, check::Bool = true)
380380
AA, piv, rank, info = LAPACK.pstrf!(A.uplo, A.data, tol)
381-
C = CholeskyPivoted{eltype(AA),typeof(AA)}(AA, A.uplo, piv, rank, tol, info)
382-
# TODO: when lower bound on julia is above v1.8, replace the above line by the following
383-
# C = CholeskyPivoted{eltype(AA),typeof(AA),typeof(piv)}(AA, A.uplo, piv, rank, tol, info)
381+
if VERSION < v"1.8"
382+
C = CholeskyPivoted{eltype(AA),typeof(AA)}(AA, A.uplo, piv, rank, tol, info)
383+
else
384+
C = CholeskyPivoted{eltype(AA),typeof(AA),typeof(piv)}(AA, A.uplo, piv, rank, tol, info)
385+
end
384386
check && chkfullrank(C)
385387
return C
386388
end

src/ldiv.jl

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ for Typ in (:Ldiv, :Rdiv)
1818
similar(A::$Typ, ::Type{T}) where T = similar(A, T, axes(A))
1919
similar(A::$Typ) = similar(A, eltype(A))
2020

21-
@inline copy(M::$Typ) = copyto!(similar(M), M)
22-
@inline materialize(M::$Typ) = copy(instantiate(M))
21+
@inline copy(M::$Typ; kwds...) = copyto!(similar(M), M; kwds...)
22+
@inline materialize(M::$Typ; kwds...) = copy(instantiate(M); kwds...)
2323
end
2424
end
2525

@@ -78,24 +78,24 @@ __ldiv!(_, F, B) = LinearAlgebra.ldiv!(F, B)
7878
@inline _ldiv!(A::Factorization, B) = LinearAlgebra.ldiv!(A, B)
7979
@inline _ldiv!(A::Factorization, B::LayoutArray) = error("Overload materialize!(::Ldiv{$(typeof(MemoryLayout(A))),$(typeof(MemoryLayout(B)))})")
8080

81-
@inline _ldiv!(dest, A, B) = ldiv!(dest, factorize(A), B)
82-
@inline _ldiv!(dest, A::Factorization, B) = LinearAlgebra.ldiv!(dest, A, B)
83-
@inline _ldiv!(dest, A::Transpose{<:Any,<:Factorization}, B) = LinearAlgebra.ldiv!(dest, A, B)
84-
@inline _ldiv!(dest, A::Adjoint{<:Any,<:Factorization}, B) = LinearAlgebra.ldiv!(dest, A, B)
81+
@inline _ldiv!(dest, A, B; kwds...) = ldiv!(dest, factorize(A), B; kwds...)
82+
@inline _ldiv!(dest, A::Factorization, B; kwds...) = LinearAlgebra.ldiv!(dest, A, B; kwds...)
83+
@inline _ldiv!(dest, A::Transpose{<:Any,<:Factorization}, B; kwds...) = LinearAlgebra.ldiv!(dest, A, B; kwds...)
84+
@inline _ldiv!(dest, A::Adjoint{<:Any,<:Factorization}, B; kwds...) = LinearAlgebra.ldiv!(dest, A, B; kwds...)
8585

86-
@inline ldiv(A, B) = materialize(Ldiv(A,B))
87-
@inline rdiv(A, B) = materialize(Rdiv(A,B))
86+
@inline ldiv(A, B; kwds...) = materialize(Ldiv(A,B); kwds...)
87+
@inline rdiv(A, B; kwds...) = materialize(Rdiv(A,B); kwds...)
8888

89-
@inline ldiv!(A, B) = materialize!(Ldiv(A,B))
90-
@inline rdiv!(A, B) = materialize!(Rdiv(A,B))
89+
@inline ldiv!(A, B; kwds...) = materialize!(Ldiv(A,B); kwds...)
90+
@inline rdiv!(A, B; kwds...) = materialize!(Rdiv(A,B); kwds...)
9191

92-
@inline ldiv!(C, A, B) = copyto!(C, Ldiv(A,B))
93-
@inline rdiv!(C, A, B) = copyto!(C, Rdiv(A,B))
92+
@inline ldiv!(C, A, B; kwds...) = copyto!(C, Ldiv(A,B); kwds...)
93+
@inline rdiv!(C, A, B; kwds...) = copyto!(C, Rdiv(A,B); kwds...)
9494

9595
@inline materialize!(M::Ldiv) = _ldiv!(M.A, M.B)
9696
@inline materialize!(M::Rdiv) = ldiv!(M.B', M.A')'
97-
@inline copyto!(dest::AbstractArray, M::Rdiv) = copyto!(dest', Ldiv(M.B', M.A'))'
98-
@inline copyto!(dest::AbstractArray, M::Ldiv) = _ldiv!(dest, M.A, copy(M.B))
97+
@inline copyto!(dest::AbstractArray, M::Rdiv; kwds...) = copyto!(dest', Ldiv(M.B', M.A'); kwds...)'
98+
@inline copyto!(dest::AbstractArray, M::Ldiv; kwds...) = _ldiv!(dest, M.A, copy(M.B); kwds...)
9999

100100
const MatLdivVec{styleA, styleB, T, V} = Ldiv{styleA, styleB, <:AbstractMatrix{T}, <:AbstractVector{V}}
101101
const MatLdivMat{styleA, styleB, T, V} = Ldiv{styleA, styleB, <:AbstractMatrix{T}, <:AbstractMatrix{V}}
@@ -127,61 +127,61 @@ end
127127

128128
macro _layoutldiv(Typ)
129129
ret = quote
130-
LinearAlgebra.ldiv!(A::$Typ, x::AbstractVector) = ArrayLayouts.ldiv!(A,x)
131-
LinearAlgebra.ldiv!(A::$Typ, x::AbstractMatrix) = ArrayLayouts.ldiv!(A,x)
132-
LinearAlgebra.ldiv!(A::$Typ, x::StridedVector) = ArrayLayouts.ldiv!(A,x)
133-
LinearAlgebra.ldiv!(A::$Typ, x::StridedMatrix) = ArrayLayouts.ldiv!(A,x)
130+
LinearAlgebra.ldiv!(A::$Typ, x::AbstractVector; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
131+
LinearAlgebra.ldiv!(A::$Typ, x::AbstractMatrix; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
132+
LinearAlgebra.ldiv!(A::$Typ, x::StridedVector; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
133+
LinearAlgebra.ldiv!(A::$Typ, x::StridedMatrix; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
134134

135-
LinearAlgebra.ldiv!(A::Factorization, x::$Typ) = ArrayLayouts.ldiv!(A,x)
136-
LinearAlgebra.ldiv!(A::LU, x::$Typ) = ArrayLayouts.ldiv!(A,x)
137-
LinearAlgebra.ldiv!(A::Cholesky, x::$Typ) = ArrayLayouts.ldiv!(A,x)
135+
LinearAlgebra.ldiv!(A::Factorization, x::$Typ; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
136+
LinearAlgebra.ldiv!(A::LU, x::$Typ; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
137+
LinearAlgebra.ldiv!(A::Cholesky, x::$Typ; kwds...) = ArrayLayouts.ldiv!(A,x; kwds...)
138138

139-
LinearAlgebra.ldiv!(A::Bidiagonal, B::$Typ) = ArrayLayouts.ldiv!(A,B)
139+
LinearAlgebra.ldiv!(A::Bidiagonal, B::$Typ; kwds...) = ArrayLayouts.ldiv!(A,B; kwds...)
140140

141141

142-
(\)(A::$Typ, x::AbstractVector) = ArrayLayouts.ldiv(A,x)
143-
(\)(A::$Typ, x::AbstractMatrix) = ArrayLayouts.ldiv(A,x)
142+
(\)(A::$Typ, x::AbstractVector; kwds...) = ArrayLayouts.ldiv(A,x; kwds...)
143+
(\)(A::$Typ, x::AbstractMatrix; kwds...) = ArrayLayouts.ldiv(A,x; kwds...)
144144

145-
(\)(x::AbstractMatrix, A::$Typ) = ArrayLayouts.ldiv(x,A)
146-
(\)(x::LinearAlgebra.HermOrSym, A::$Typ) = ArrayLayouts.ldiv(x,A)
145+
(\)(x::AbstractMatrix, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
146+
(\)(x::LinearAlgebra.HermOrSym, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
147147
if VERSION < v"1.9-" # disambiguation
148-
\(x::LinearAlgebra.HermOrSym{<:Any,<:StridedMatrix}, A::$Typ) = ArrayLayouts.ldiv(x,A)
148+
\(x::LinearAlgebra.HermOrSym{<:Any,<:StridedMatrix}, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
149149
end
150-
(\)(x::UpperTriangular, A::$Typ) = ArrayLayouts.ldiv(x,A)
151-
(\)(x::UnitUpperTriangular, A::$Typ) = ArrayLayouts.ldiv(x,A)
152-
(\)(x::LowerTriangular, A::$Typ) = ArrayLayouts.ldiv(x,A)
153-
(\)(x::UnitLowerTriangular, A::$Typ) = ArrayLayouts.ldiv(x,A)
154-
(\)(x::Diagonal, A::$Typ) = ArrayLayouts.ldiv(x,A)
150+
(\)(x::UpperTriangular, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
151+
(\)(x::UnitUpperTriangular, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
152+
(\)(x::LowerTriangular, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
153+
(\)(x::UnitLowerTriangular, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
154+
(\)(x::Diagonal, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
155155

156-
(\)(A::Bidiagonal{<:Number}, B::$Typ{<:Number}) = ArrayLayouts.ldiv(A,B)
157-
(\)(A::Bidiagonal, B::$Typ) = ArrayLayouts.ldiv(A,B)
158-
(\)(transA::Transpose{<:Number,<:Bidiagonal{<:Number}}, B::$Typ{<:Number}) = ArrayLayouts.ldiv(transA,B)
159-
(\)(transA::Transpose{<:Any,<:Bidiagonal}, B::$Typ) = ArrayLayouts.ldiv(transA,B)
160-
(\)(adjA::Adjoint{<:Number,<:Bidiagonal{<:Number}}, B::$Typ{<:Number}) = ArrayLayouts.ldiv(adjA,B)
161-
(\)(adjA::Adjoint{<:Any,<:Bidiagonal}, B::$Typ) = ArrayLayouts.ldiv(adjA,B)
156+
(\)(A::Bidiagonal{<:Number}, B::$Typ{<:Number}; kwds...) = ArrayLayouts.ldiv(A,B; kwds...)
157+
(\)(A::Bidiagonal, B::$Typ; kwds...) = ArrayLayouts.ldiv(A,B; kwds...)
158+
(\)(transA::Transpose{<:Number,<:Bidiagonal{<:Number}}, B::$Typ{<:Number}; kwds...) = ArrayLayouts.ldiv(transA,B; kwds...)
159+
(\)(transA::Transpose{<:Any,<:Bidiagonal}, B::$Typ; kwds...) = ArrayLayouts.ldiv(transA,B; kwds...)
160+
(\)(adjA::Adjoint{<:Number,<:Bidiagonal{<:Number}}, B::$Typ{<:Number}; kwds...) = ArrayLayouts.ldiv(adjA,B; kwds...)
161+
(\)(adjA::Adjoint{<:Any,<:Bidiagonal}, B::$Typ; kwds...) = ArrayLayouts.ldiv(adjA,B; kwds...)
162162

163-
(\)(x::$Typ, A::$Typ) = ArrayLayouts.ldiv(x,A)
163+
(\)(x::$Typ, A::$Typ; kwds...) = ArrayLayouts.ldiv(x,A; kwds...)
164164

165-
(/)(A::$Typ, x::AbstractVector) = ArrayLayouts.rdiv(A,x)
166-
(/)(A::$Typ, x::AbstractMatrix) = ArrayLayouts.rdiv(A,x)
165+
(/)(A::$Typ, x::AbstractVector; kwds...) = ArrayLayouts.rdiv(A,x; kwds...)
166+
(/)(A::$Typ, x::AbstractMatrix; kwds...) = ArrayLayouts.rdiv(A,x; kwds...)
167167

168-
(/)(x::AbstractMatrix, A::$Typ) = ArrayLayouts.rdiv(x,A)
169-
(/)(D::Diagonal, A::$Typ) = ArrayLayouts.rdiv(D,A)
170-
(/)(A::$Typ, D::Diagonal) = ArrayLayouts.rdiv(A,D)
168+
(/)(x::AbstractMatrix, A::$Typ; kwds...) = ArrayLayouts.rdiv(x,A; kwds...)
169+
(/)(D::Diagonal, A::$Typ; kwds...) = ArrayLayouts.rdiv(D,A; kwds...)
170+
(/)(A::$Typ, D::Diagonal; kwds...) = ArrayLayouts.rdiv(A,D; kwds...)
171171

172-
(/)(x::$Typ, A::$Typ) = ArrayLayouts.rdiv(x,A)
172+
(/)(x::$Typ, A::$Typ; kwds...) = ArrayLayouts.rdiv(x,A; kwds...)
173173
end
174174
if Typ  :LayoutVector
175175
ret = quote
176176
$ret
177-
(\)(A::$Typ, x::LayoutVector) = ArrayLayouts.ldiv(A,x)
177+
(\)(A::$Typ, x::LayoutVector; kwds...) = ArrayLayouts.ldiv(A,x; kwds...)
178178
end
179179
end
180180
if Typ  :LayoutMatrix
181181
ret = quote
182182
$ret
183-
(\)(A::$Typ, x::LayoutMatrix) = ArrayLayouts.ldiv(A,x)
184-
(/)(x::LayoutMatrix, A::$Typ) = ArrayLayouts.rdiv(x,A)
183+
(\)(A::$Typ, x::LayoutMatrix; kwds...) = ArrayLayouts.ldiv(A,x; kwds...)
184+
(/)(x::LayoutMatrix, A::$Typ; kwds...) = ArrayLayouts.rdiv(x,A; kwds...)
185185
end
186186
end
187187
esc(ret)

test/test_layoutarray.jl

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Base.unsafe_convert(::Type{Ptr{T}}, A::MyMatrix) where T = Base.unsafe_convert(P
1414
MemoryLayout(::Type{MyMatrix}) = DenseColumnMajor()
1515
Base.copy(A::MyMatrix) = MyMatrix(copy(A.A))
1616

17-
struct MyVector <: LayoutVector{Float64}
18-
A::Vector{Float64}
17+
struct MyVector{T} <: LayoutVector{T}
18+
A::Vector{T}
1919
end
2020

2121
Base.getindex(A::MyVector, k::Int) = A.A[k]
@@ -37,7 +37,7 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
3737
@test a[1:3] == a.A[1:3]
3838
@test a[:] == a
3939
@test (a')[1,:] == (a')[1,1:3] == a
40-
@test stringmime("text/plain", a) == "3-element MyVector:\n 1.0\n 2.0\n 3.0"
40+
@test stringmime("text/plain", a) == "3-element MyVector{Float64}:\n 1.0\n 2.0\n 3.0"
4141
@test B*a B*a.A
4242
@test B'*a B'*a.A
4343
@test transpose(B)*a transpose(B)*a.A
@@ -126,6 +126,28 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
126126
@test S \ b Matrix(S) \ b Symmetric(Matrix(S), :L) \ b
127127
@test S \ b Symmetric(Matrix(S), :L) \ MyVector(b)
128128
end
129+
130+
@testset "ldiv!" begin
131+
c = MyVector(randn(5))
132+
@test_broken ldiv!(lu(A), MyVector(copy(c))) A \ c
133+
@test_throws ErrorException ldiv!(qr(A), MyVector(copy(c)))
134+
@test_throws ErrorException ldiv!(eigen(randn(5,5)), c)
135+
@test ArrayLayouts.ldiv!(svd(A.A), copy(c)) ArrayLayouts.ldiv!(similar(c), svd(A.A), c) A \ c
136+
if VERSION v"1.8"
137+
@test ArrayLayouts.ldiv!(similar(c), transpose(lu(A.A)), copy(c)) A'\c
138+
end
139+
140+
B = Bidiagonal(randn(5), randn(4), :U)
141+
@test ldiv!(B, MyVector(copy(c))) B \ c
142+
@test ldiv!(Transpose(B), MyVector(copy(c))) transpose(B) \ c
143+
@test ldiv!(B', MyVector(copy(c))) B' \ c
144+
145+
@test ldiv!(cholesky(S), MyVector(copy(c))) S \ c
146+
147+
@test B \ MyVector(fill([1.,2],5)) B \ fill([1.,2],5)
148+
@test Transpose(B) \ MyVector(fill([1.,2],5)) transpose(B) \ fill([1.,2],5)
149+
@test Adjoint(B) \ MyVector(fill([1.,2],5)) transpose(B) \ fill([1.,2],5)
150+
end
129151
end
130152
Bin = randn(5,5)
131153
B = MyMatrix(copy(Bin))

0 commit comments

Comments
 (0)