11using ArrayLayouts, Test
2+ import ArrayLayouts: MemoryLayout, @_layoutlmul , triangulardata
23
34include (" test_layouts.jl" )
45include (" test_muladd.jl" )
5- include (" test_ldiv.jl" )
6+ include (" test_ldiv.jl" )
7+
8+ struct MyMatrix <: LayoutMatrix{Float64}
9+ A:: Matrix{Float64}
10+ end
11+
12+ Base. getindex (A:: MyMatrix , k:: Int , j:: Int ) = A. A[k,j]
13+ Base. size (A:: MyMatrix ) = size (A. A)
14+ Base. strides (A:: MyMatrix ) = strides (A. A)
15+ Base. unsafe_convert (:: Type{Ptr{T}} , A:: MyMatrix ) where T = Base. unsafe_convert (Ptr{T}, A. A)
16+ MemoryLayout (:: Type{MyMatrix} ) = DenseColumnMajor ()
17+
18+ @testset " LayoutMatrix" begin
19+ A = MyMatrix (randn (5 ,5 ))
20+ for (kr,jr) in ((1 : 2 ,2 : 3 ), (:,:), (:,1 : 2 ), (2 : 3 ,:), ([1 ,2 ],3 : 4 ), (:,[1 ,2 ]), ([2 ,3 ],:))
21+ @test A[kr,jr] == A. A[kr,jr]
22+ end
23+ b = randn (5 )
24+ for Tri in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
25+ @test ldiv! (Tri (A), copy (b)) ≈ ldiv! (Tri (A. A), copy (b))
26+ @test lmul! (Tri (A), copy (b)) ≈ lmul! (Tri (A. A), copy (b))
27+ end
28+ end
29+
30+ struct MyUpperTriangular{T} <: AbstractMatrix{T}
31+ A:: UpperTriangular{T,Matrix{T}}
32+ end
33+
34+ MyUpperTriangular {T} (:: UndefInitializer , n:: Int , m:: Int ) where T = MyUpperTriangular {T} (UpperTriangular (Array {T} (undef, n, m)))
35+ MyUpperTriangular (A:: AbstractMatrix{T} ) where T = MyUpperTriangular {T} (UpperTriangular (Matrix {T} (A)))
36+ Base. convert (:: Type{MyUpperTriangular{T}} , A:: MyUpperTriangular{T} ) where T = A
37+ Base. convert (:: Type{MyUpperTriangular{T}} , A:: MyUpperTriangular ) where T = MyUpperTriangular (convert (AbstractArray{T}, A. A))
38+ Base. convert (:: Type{MyUpperTriangular} , A:: MyUpperTriangular )= A
39+ Base. convert (:: Type{AbstractArray{T}} , A:: MyUpperTriangular ) where T = MyUpperTriangular (convert (AbstractArray{T}, A. A))
40+ Base. convert (:: Type{AbstractMatrix{T}} , A:: MyUpperTriangular ) where T = MyUpperTriangular (convert (AbstractArray{T}, A. A))
41+ Base. convert (:: Type{MyUpperTriangular{T}} , A:: AbstractArray{T} ) where T = MyUpperTriangular {T} (A)
42+ Base. convert (:: Type{MyUpperTriangular{T}} , A:: AbstractArray ) where T = MyUpperTriangular {T} (convert (AbstractArray{T}, A))
43+ Base. convert (:: Type{MyUpperTriangular} , A:: AbstractArray{T} ) where T = MyUpperTriangular {T} (A)
44+ Base. getindex (A:: MyUpperTriangular , kj... ) = A. A[kj... ]
45+ Base. getindex (A:: MyUpperTriangular , :: Colon , j:: AbstractVector ) = MyUpperTriangular (A. A[:,j])
46+ Base. setindex! (A:: MyUpperTriangular , v, kj... ) = setindex! (A. A, v, kj... )
47+ Base. size (A:: MyUpperTriangular ) = size (A. A)
48+ Base. similar (:: Type{MyUpperTriangular{T}} , m:: Int , n:: Int ) where T = MyUpperTriangular {T} (undef, m, n)
49+ Base. similar (:: MyUpperTriangular{T} , m:: Int , n:: Int ) where T = MyUpperTriangular {T} (undef, m, n)
50+ Base. similar (:: MyUpperTriangular , :: Type{T} , m:: Int , n:: Int ) where T = MyUpperTriangular {T} (undef, m, n)
51+ LinearAlgebra. factorize (A:: MyUpperTriangular ) = factorize (A. A)
52+
53+ MemoryLayout (:: Type{MyUpperTriangular{T}} ) where T = MemoryLayout (UpperTriangular{T,Matrix{T}})
54+ triangulardata (A:: MyUpperTriangular ) = triangulardata (A. A)
55+
56+ @_layoutlmul MyUpperTriangular
57+
58+
59+ @testset " MyUpperTriangular" begin
60+ A = randn (5 ,5 )
61+ B = randn (5 ,5 )
62+ x = randn (5 )
63+
64+ @test lmul! (MyUpperTriangular (A), copy (x)) ≈ MyUpperTriangular (A) * x
65+ @test lmul! (MyUpperTriangular (A), copy (B)) ≈ MyUpperTriangular (A) * B
66+
67+ @test_skip lmul! (MyUpperTriangular (A),view (copy (B),collect (1 : 5 ),1 : 5 )) ≈ MyUpperTriangular (A) * B
68+ end
0 commit comments