Skip to content

Commit 75f3594

Browse files
authored
special case of permutedims for Diagonal (#53)
* special case of permutedims for Diagonal * add permutedims test * v0.5.3
1 parent 72553a9 commit 75f3594

File tree

5 files changed

+241
-233
lines changed

5 files changed

+241
-233
lines changed

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.5.2"
4+
version = "0.5.3"
55

66
[deps]
77
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"

src/ArrayLayouts.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ end
191191

192192
# avoid bad copy in Base
193193
Base.map(::typeof(copy), D::Diagonal{<:LayoutArray}) = Diagonal(map(copy, D.diag))
194+
Base.permutedims(D::Diagonal{<:Any,<:LayoutVector}) = D
195+
194196

195197
zero!(A::AbstractArray{T}) where T = fill!(A,zero(T))
196198
function zero!(A::AbstractArray{<:AbstractArray})

src/diagonal.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ copy(M::Ldiv{<:DiagonalLayout{<:AbstractFillLayout},<:DiagonalLayout}) = Diagona
4545
copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout}) = Diagonal(M.A.diag .* inv.(M.B.diag))
4646
copy(M::Rdiv{<:Any,<:DiagonalLayout}) = M.A .* inv.(permutedims(M.B.diag))
4747
copy(M::Rdiv{<:Any,<:DiagonalLayout{<:AbstractFillLayout}}) = M.A .* inv(getindex_value(M.B.diag))
48-
copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = Diagonal(M.A.diag .* inv(getindex_value(M.B.diag)))
48+
copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = Diagonal(M.A.diag .* inv(getindex_value(M.B.diag)))

test/runtests.jl

Lines changed: 1 addition & 231 deletions
Original file line numberDiff line numberDiff line change
@@ -6,235 +6,5 @@ Random.seed!(0)
66
include("test_layouts.jl")
77
include("test_muladd.jl")
88
include("test_ldiv.jl")
9-
10-
struct MyMatrix <: LayoutMatrix{Float64}
11-
A::Matrix{Float64}
12-
end
13-
14-
Base.getindex(A::MyMatrix, k::Int, j::Int) = A.A[k,j]
15-
Base.setindex!(A::MyMatrix, v, k::Int, j::Int) = setindex!(A.A, v, k, j)
16-
Base.size(A::MyMatrix) = size(A.A)
17-
Base.strides(A::MyMatrix) = strides(A.A)
18-
Base.unsafe_convert(::Type{Ptr{T}}, A::MyMatrix) where T = Base.unsafe_convert(Ptr{T}, A.A)
19-
MemoryLayout(::Type{MyMatrix}) = DenseColumnMajor()
20-
21-
struct MyVector <: LayoutVector{Float64}
22-
A::Vector{Float64}
23-
end
24-
25-
Base.getindex(A::MyVector, k::Int) = A.A[k]
26-
Base.setindex!(A::MyVector, v, k::Int) = setindex!(A.A, v, k)
27-
Base.size(A::MyVector) = size(A.A)
28-
Base.strides(A::MyVector) = strides(A.A)
29-
Base.unsafe_convert(::Type{Ptr{T}}, A::MyVector) where T = Base.unsafe_convert(Ptr{T}, A.A)
30-
MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
31-
32-
# These need to test dispatch reduces to ArrayLayouts.mul, etc.
33-
@testset "LayoutArray" begin
34-
@testset "LayoutVector" begin
35-
a = MyVector([1.,2,3])
36-
B = randn(3,3)
37-
b = randn(3)
38-
39-
@test a == a.A == Vector(a)
40-
@test a[1:3] == a.A[1:3]
41-
@test a[:] == a
42-
@test (a')[1,:] == (a')[1,1:3] == a
43-
@test stringmime("text/plain", a) == "3-element MyVector:\n 1.0\n 2.0\n 3.0"
44-
@test B*a B*a.A
45-
@test B'*a B'*a.A
46-
@test transpose(B)*a transpose(B)*a.A
47-
@test b'a transpose(b)a a'b transpose(a)b b'a.A
48-
@test qr(B).Q*a qr(B).Q*a.A
49-
50-
@test a'a == transpose(a)a == dot(a,a) == dot(a,a.A) == dot(a.A,a) == 14
51-
v = view(a,1:3)
52-
@test dot(v,a) == dot(v,a.A) == dot(a,v) == dot(a.A,v) == dot(v,v) == 14
53-
54-
s = SparseVector(3, [1], [2])
55-
@test a's == s'a == dot(a,s) == dot(s,a) == dot(s,a.A)
56-
end
57-
58-
@testset "LayoutMatrix" begin
59-
A = MyMatrix(randn(5,5))
60-
for (kr,jr) in ((1:2,2:3), (:,:), (:,1:2), (2:3,:), ([1,2],3:4), (:,[1,2]), ([2,3],:),
61-
(2,:), (:,2), (2,1:3), (1:3,2))
62-
@test A[kr,jr] == A.A[kr,jr]
63-
end
64-
b = randn(5)
65-
for Tri in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
66-
@test ldiv!(Tri(A), copy(b)) ldiv!(Tri(A.A), copy(b))
67-
@test lmul!(Tri(A), copy(b)) lmul!(Tri(A.A), copy(b))
68-
end
69-
70-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A) == A
71-
@test copyto!(Array{Float64}(undef,5,5), A) == A
72-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A.A) == A
73-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),1:3,1:3), view(A,1:3,1:3)) == A[1:3,1:3]
74-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A) == A
75-
@test copyto!(MyMatrix(Array{Float64}(undef,3,3)), view(A,1:3,1:3)) == A[1:3,1:3]
76-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A.A) == A
77-
@test copyto!(Array{Float64}(undef,3,3), view(A,1:3,1:3)) == A[1:3,1:3]
78-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A') == A'
79-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), view(A',:,:)) == A'
80-
@test copyto!(Array{Float64}(undef,5,5), A') == A'
81-
@test copyto!(Array{Float64}(undef,5,5), view(A',:,:)) == A'
82-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A') == A'
83-
84-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), view(A',:,:)) == A'
85-
86-
@test qr(A).factors qr(A.A).factors
87-
@test qr(A,Val(true)).factors qr(A.A,Val(true)).factors
88-
@test lu(A).factors lu(A.A).factors
89-
@test lu(A,Val(true)).factors lu(A.A,Val(true)).factors
90-
@test_throws ErrorException qr!(A)
91-
@test_throws ErrorException lu!(A)
92-
93-
@test qr(A) isa LinearAlgebra.QRCompactWY
94-
@test inv(A) inv(A.A)
95-
96-
Bin = randn(5,5)
97-
B = MyMatrix(copy(Bin))
98-
muladd!(1.0, A, A, 2.0, B)
99-
@test all(B .=== A.A^2 + 2Bin)
100-
101-
@testset "tiled_blasmul!" begin
102-
B = MyMatrix(copy(Bin))
103-
muladd!(1.0, Ones(5,5), A, 2.0, B)
104-
end
105-
106-
@testset "generic_blasmul!" begin
107-
A = BigFloat.(randn(5,5))
108-
Bin = BigFloat.(randn(5,5))
109-
B = copy(Bin)
110-
muladd!(1.0, Ones(5,5), A, 2.0, B)
111-
@test B == Ones(5,5)*A + 2.0Bin
112-
end
113-
114-
C = MyMatrix([1 2; 3 4])
115-
@test stringmime("text/plain", C) == "2×2 MyMatrix:\n 1.0 2.0\n 3.0 4.0"
116-
117-
@testset "layoutldiv" begin
118-
A = MyMatrix(randn(5,5))
119-
x = randn(5)
120-
X = randn(5,5)
121-
t = view(randn(10),[1,3,4,6,7])
122-
T = view(randn(10,5),[1,3,4,6,7],:)
123-
= copy(t)
124-
= copy(T)
125-
B = Bidiagonal(randn(5),randn(4),:U)
126-
@test ldiv!(A, copy(x)) A\x
127-
@test A\t A\
128-
# QR is not general enough
129-
@test_broken ldiv!(A, t) A\t
130-
@test ldiv!(A, copy(X)) A\X
131-
@test A\T A\
132-
@test_broken A/T A/
133-
@test_broken ldiv!(A, T) A\T
134-
@test B\A B\Matrix(A)
135-
@test transpose(B)\A transpose(B)\Matrix(A) Transpose(B)\A Adjoint(B)\A
136-
@test B'\A B'\Matrix(A)
137-
@test A\A I
138-
@test_broken A/A I
139-
@test A\MyVector(x) A\x
140-
@test A\MyMatrix(X) A\X
141-
end
142-
143-
@testset "dot" begin
144-
A = MyMatrix(randn(5,5))
145-
b = randn(5)
146-
@test dot(b, A, b) b'*(A*b) b'A*b
147-
end
148-
149-
@testset "dual vector * symmetric (#40)" begin
150-
A = randn(3,3)
151-
x = rand(3)
152-
@test x' * Symmetric(MyMatrix(A)) x'Symmetric(A)
153-
@test transpose(x) * Symmetric(MyMatrix(A)) transpose(x)Symmetric(A)
154-
end
155-
156-
@testset "map(copy, ::Diagonal)" begin
157-
# this is needed in BlockArrays
158-
D = Diagonal([MyMatrix(randn(2,2)), MyMatrix(randn(2,2))])
159-
@test map(copy, D) == D
160-
end
161-
end
162-
163-
@testset "l/rmul!" begin
164-
b = MyVector(randn(5))
165-
A = MyMatrix(randn(5,5))
166-
@test lmul!(2, deepcopy(b)) == rmul!(deepcopy(b), 2) == 2b
167-
@test lmul!(2, deepcopy(A)) == rmul!(deepcopy(A), 2) == 2A
168-
@test lmul!(2, deepcopy(A)') == rmul!(deepcopy(A)', 2) == 2A'
169-
@test lmul!(2, transpose(deepcopy(A))) == rmul!(transpose(deepcopy(A)), 2) == 2transpose(A)
170-
@test lmul!(2, Symmetric(deepcopy(A))) == rmul!(Symmetric(deepcopy(A)), 2) == 2Symmetric(A)
171-
@test lmul!(2, Hermitian(deepcopy(A))) == rmul!(Hermitian(deepcopy(A)), 2) == 2Hermitian(A)
172-
173-
C = randn(ComplexF64,5,5)
174-
@test ArrayLayouts.lmul!(2, Hermitian(copy(C))) == ArrayLayouts.rmul!(Hermitian(copy(C)), 2) == 2Hermitian(C)
175-
176-
if VERSION v"1.5"
177-
@test ldiv!(2, deepcopy(b)) == rdiv!(deepcopy(b), 2) == 2\b
178-
@test ldiv!(2, deepcopy(A)) == rdiv!(deepcopy(A), 2) == 2\A
179-
@test ldiv!(2, deepcopy(A)') == rdiv!(deepcopy(A)', 2) == 2\A'
180-
@test ldiv!(2, transpose(deepcopy(A))) == rdiv!(transpose(deepcopy(A)), 2) == 2\transpose(A)
181-
@test ldiv!(2, Symmetric(deepcopy(A))) == rdiv!(Symmetric(deepcopy(A)), 2) == 2\Symmetric(A)
182-
@test ldiv!(2, Hermitian(deepcopy(A))) == rdiv!(Hermitian(deepcopy(A)), 2) == 2\Hermitian(A)
183-
@test ArrayLayouts.ldiv!(2, Hermitian(copy(C))) == ArrayLayouts.rdiv!(Hermitian(copy(C)), 2) == 2\Hermitian(C)
184-
end
185-
end
186-
187-
@testset "pow/I" begin
188-
A = randn(2,2)
189-
B = MyMatrix(A)
190-
@test B^2 A^2
191-
@test B^2.3 A^2.3
192-
@test B^(-1) inv(A)
193-
@test B + I I + B A + I
194-
@test B - I A - I
195-
@test I - B I - B
196-
end
197-
end
198-
199-
struct MyUpperTriangular{T} <: AbstractMatrix{T}
200-
A::UpperTriangular{T,Matrix{T}}
201-
end
202-
203-
MyUpperTriangular{T}(::UndefInitializer, n::Int, m::Int) where T = MyUpperTriangular{T}(UpperTriangular(Array{T}(undef, n, m)))
204-
MyUpperTriangular(A::AbstractMatrix{T}) where T = MyUpperTriangular{T}(UpperTriangular(Matrix{T}(A)))
205-
Base.convert(::Type{MyUpperTriangular{T}}, A::MyUpperTriangular{T}) where T = A
206-
Base.convert(::Type{MyUpperTriangular{T}}, A::MyUpperTriangular) where T = MyUpperTriangular(convert(AbstractArray{T}, A.A))
207-
Base.convert(::Type{MyUpperTriangular}, A::MyUpperTriangular)= A
208-
Base.convert(::Type{AbstractArray{T}}, A::MyUpperTriangular) where T = MyUpperTriangular(convert(AbstractArray{T}, A.A))
209-
Base.convert(::Type{AbstractMatrix{T}}, A::MyUpperTriangular) where T = MyUpperTriangular(convert(AbstractArray{T}, A.A))
210-
Base.convert(::Type{MyUpperTriangular{T}}, A::AbstractArray{T}) where T = MyUpperTriangular{T}(A)
211-
Base.convert(::Type{MyUpperTriangular{T}}, A::AbstractArray) where T = MyUpperTriangular{T}(convert(AbstractArray{T}, A))
212-
Base.convert(::Type{MyUpperTriangular}, A::AbstractArray{T}) where T = MyUpperTriangular{T}(A)
213-
Base.getindex(A::MyUpperTriangular, kj...) = A.A[kj...]
214-
Base.getindex(A::MyUpperTriangular, ::Colon, j::AbstractVector) = MyUpperTriangular(A.A[:,j])
215-
Base.setindex!(A::MyUpperTriangular, v, kj...) = setindex!(A.A, v, kj...)
216-
Base.size(A::MyUpperTriangular) = size(A.A)
217-
Base.similar(::Type{MyUpperTriangular{T}}, m::Int, n::Int) where T = MyUpperTriangular{T}(undef, m, n)
218-
Base.similar(::MyUpperTriangular{T}, m::Int, n::Int) where T = MyUpperTriangular{T}(undef, m, n)
219-
Base.similar(::MyUpperTriangular, ::Type{T}, m::Int, n::Int) where T = MyUpperTriangular{T}(undef, m, n)
220-
LinearAlgebra.factorize(A::MyUpperTriangular) = factorize(A.A)
221-
222-
MemoryLayout(::Type{MyUpperTriangular{T}}) where T = MemoryLayout(UpperTriangular{T,Matrix{T}})
223-
triangulardata(A::MyUpperTriangular) = triangulardata(A.A)
224-
225-
@_layoutlmul MyUpperTriangular
226-
227-
228-
@testset "MyUpperTriangular" begin
229-
A = randn(5,5)
230-
B = randn(5,5)
231-
x = randn(5)
232-
U = MyUpperTriangular(A)
233-
234-
@test lmul!(U, copy(x)) U * x
235-
@test lmul!(U, copy(B)) U * B
236-
237-
@test_skip lmul!(U,view(copy(B),collect(1:5),1:5)) U * B
238-
end
239-
9+
include("test_layoutarray.jl")
24010
include("test_cumsum.jl")

0 commit comments

Comments
 (0)