Skip to content

Commit 28ef321

Browse files
authored
getindex for LayoutVector (#19)
* getindex for LayoutVector * v0.3.2 * Better print * move print_matrix_row to FillArrays.jl * Diagonal overload improvements * Update muladd.jl * Tridiagonal tests * Update Project.toml
1 parent ba76345 commit 28ef321

File tree

7 files changed

+179
-79
lines changed

7 files changed

+179
-79
lines changed

Project.toml

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

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
88
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
99

1010
[compat]
11-
FillArrays = "0.8"
11+
FillArrays = "0.8.10"
1212
julia = "1"
1313

1414
[extras]
15+
Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
1516
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1617
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1718

1819
[targets]
19-
test = ["Test", "Random"]
20+
test = ["Test", "Random", "Base64"]

src/ArrayLayouts.jl

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module ArrayLayouts
22
using Base, Base.Broadcast, LinearAlgebra, FillArrays
33
import LinearAlgebra.BLAS
44

5-
import Base: AbstractArray, AbstractMatrix, AbstractVector,
5+
import Base: AbstractArray, AbstractMatrix, AbstractVector,
66
ReinterpretArray, ReshapedArray, AbstractCartesianIndex, Slice,
77
RangeIndex, BroadcastStyle, copyto!, length, broadcastable, axes,
88
getindex, eltype, tail, IndexStyle, IndexLinear, getproperty,
@@ -33,33 +33,33 @@ import Base.Broadcast: BroadcastStyle, AbstractArrayStyle, Broadcasted, broadcas
3333
combine_eltypes, DefaultArrayStyle, instantiate, materialize,
3434
materialize!, eltypes
3535

36-
import LinearAlgebra: AbstractTriangular, AbstractQ, checksquare, pinv, fill!, tilebufsize, Abuf, Bbuf, Cbuf, dot, factorize, qr, lu, cholesky,
37-
norm2, norm1, normInf, normMinusInf, qr, lu, qr!, lu!
36+
import LinearAlgebra: AbstractTriangular, AbstractQ, checksquare, pinv, fill!, tilebufsize, Abuf, Bbuf, Cbuf, dot, factorize, qr, lu, cholesky,
37+
norm2, norm1, normInf, normMinusInf, qr, lu, qr!, lu!, AdjOrTrans, HermOrSym
3838

3939
import LinearAlgebra.BLAS: BlasFloat, BlasReal, BlasComplex
4040

41-
import FillArrays: AbstractFill, getindex_value
41+
import FillArrays: AbstractFill, getindex_value, axes_print_matrix_row
4242

4343
if VERSION < v"1.2-"
4444
import Base: has_offset_axes
4545
require_one_based_indexing(A...) = !has_offset_axes(A...) || throw(ArgumentError("offset arrays are not supported but got an array with index other than 1"))
4646
else
47-
import Base: require_one_based_indexing
48-
end
47+
import Base: require_one_based_indexing
48+
end
4949

5050
export materialize, materialize!, MulAdd, muladd!, Ldiv, Rdiv, Lmul, Rmul, lmul, rmul, ldiv, rdiv, mul, MemoryLayout, AbstractStridedLayout,
5151
DenseColumnMajor, ColumnMajor, ZerosLayout, FillLayout, AbstractColumnMajor, RowMajor, AbstractRowMajor, UnitStride,
52-
DiagonalLayout, ScalarLayout, SymTridiagonalLayout, HermitianLayout, SymmetricLayout, TriangularLayout,
52+
DiagonalLayout, ScalarLayout, SymTridiagonalLayout, HermitianLayout, SymmetricLayout, TriangularLayout,
5353
UnknownLayout, AbstractBandedLayout, ApplyBroadcastStyle, ConjLayout, AbstractFillLayout,
5454
colsupport, rowsupport, layout_getindex, QLayout, LayoutArray, LayoutMatrix, LayoutVector
5555

5656
struct ApplyBroadcastStyle <: BroadcastStyle end
57-
@inline function copyto!(dest::AbstractArray, bc::Broadcasted{ApplyBroadcastStyle})
57+
@inline function copyto!(dest::AbstractArray, bc::Broadcasted{ApplyBroadcastStyle})
5858
@assert length(bc.args) == 1
5959
copyto!(dest, first(bc.args))
6060
end
6161

62-
# Subtypes of LayoutArray default to
62+
# Subtypes of LayoutArray default to
6363
# ArrayLayouts routines
6464
abstract type LayoutArray{T,N} <: AbstractArray{T,N} end
6565
const LayoutMatrix{T} = LayoutArray{T,2}
@@ -76,15 +76,15 @@ strides(A::Transpose) = _transpose_strides(strides(parent(A))...)
7676
7777
represents that the entry is the complex-conjugate of the pointed to entry.
7878
"""
79-
struct ConjPtr{T}
79+
struct ConjPtr{T}
8080
ptr::Ptr{T}
8181
end
8282

8383
unsafe_convert(::Type{Ptr{T}}, A::Adjoint{<:Real}) where T<:Real = unsafe_convert(Ptr{T}, parent(A))
8484
unsafe_convert(::Type{Ptr{T}}, A::Transpose) where T = unsafe_convert(Ptr{T}, parent(A))
8585
# work-around issue with complex conjugation of pointer
8686
unsafe_convert(::Type{Ptr{T}}, Ac::Adjoint{<:Complex}) where T<:Complex = unsafe_convert(ConjPtr{T}, parent(Ac))
87-
unsafe_convert(::Type{ConjPtr{T}}, Ac::Adjoint{<:Complex}) where T<:Complex = unsafe_convert(Ptr{T}, parent(Ac))
87+
unsafe_convert(::Type{ConjPtr{T}}, Ac::Adjoint{<:Complex}) where T<:Complex = unsafe_convert(Ptr{T}, parent(Ac))
8888
function unsafe_convert(::Type{ConjPtr{T}}, V::SubArray{T,2}) where {T,N,P}
8989
kr, jr = parentindices(V)
9090
unsafe_convert(Ptr{T}, view(parent(V)', jr, kr))
@@ -125,32 +125,34 @@ end
125125

126126
@layoutmatrix LayoutMatrix
127127

128-
_copyto!(_, _, dest::AbstractArray{T,N}, src::AbstractArray{V,N}) where {T,V,N} =
128+
getindex(A::LayoutVector, kr::AbstractVector) = layout_getindex(A, kr)
129+
130+
_copyto!(_, _, dest::AbstractArray{T,N}, src::AbstractArray{V,N}) where {T,V,N} =
129131
Base.invoke(copyto!, Tuple{AbstractArray{T,N},AbstractArray{V,N}}, dest, src)
130132

131-
132-
copyto!(dest::LayoutArray{<:Any,N}, src::LayoutArray{<:Any,N}) where N =
133+
134+
copyto!(dest::LayoutArray{<:Any,N}, src::LayoutArray{<:Any,N}) where N =
133135
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
134-
copyto!(dest::AbstractArray{<:Any,N}, src::LayoutArray{<:Any,N}) where N =
136+
copyto!(dest::AbstractArray{<:Any,N}, src::LayoutArray{<:Any,N}) where N =
135137
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
136-
copyto!(dest::LayoutArray{<:Any,N}, src::AbstractArray{<:Any,N}) where N =
138+
copyto!(dest::LayoutArray{<:Any,N}, src::AbstractArray{<:Any,N}) where N =
137139
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
138140

139-
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
141+
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
140142
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
141-
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::LayoutArray{<:Any,N}) where N =
143+
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::LayoutArray{<:Any,N}) where N =
142144
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
143-
copyto!(dest::LayoutArray{<:Any,N}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
145+
copyto!(dest::LayoutArray{<:Any,N}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
144146
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
145-
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::AbstractArray{<:Any,N}) where N =
147+
copyto!(dest::SubArray{<:Any,N,<:LayoutArray}, src::AbstractArray{<:Any,N}) where N =
148+
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
149+
copyto!(dest::AbstractArray{<:Any,N}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
146150
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
147-
copyto!(dest::AbstractArray{<:Any,N}, src::SubArray{<:Any,N,<:LayoutArray}) where N =
148-
_copyto!(MemoryLayout(dest), MemoryLayout(src), dest, src)
149151

150152

151153

152154
zero!(A::AbstractArray{T}) where T = fill!(A,zero(T))
153-
function zero!(A::AbstractArray{<:AbstractArray})
155+
function zero!(A::AbstractArray{<:AbstractArray})
154156
for a in A
155157
zero!(a)
156158
end
@@ -213,4 +215,35 @@ end
213215
return A
214216
end
215217

218+
###
219+
# printing
220+
###
221+
222+
layout_replace_in_print_matrix(_, A, i, j, s) =
223+
i in colsupport(A,j) ? s : Base.replace_with_centered_mark(s)
224+
225+
Base.replace_in_print_matrix(A::Union{LayoutMatrix,
226+
UpperTriangular{<:Any,<:LayoutMatrix},
227+
UnitUpperTriangular{<:Any,<:LayoutMatrix},
228+
LowerTriangular{<:Any,<:LayoutMatrix},
229+
UnitLowerTriangular{<:Any,<:LayoutMatrix},
230+
AdjOrTrans{<:Any,<:LayoutMatrix},
231+
HermOrSym{<:Any,<:LayoutMatrix},
232+
SubArray{<:Any,2,<:LayoutMatrix}}, i::Integer, j::Integer, s::AbstractString) =
233+
layout_replace_in_print_matrix(MemoryLayout(A), A, i, j, s)
234+
235+
Base.print_matrix_row(io::IO,
236+
X::Union{LayoutMatrix,
237+
LayoutVector,
238+
AbstractTriangular{<:Any,<:LayoutMatrix},
239+
AdjOrTrans{<:Any,<:LayoutMatrix},
240+
HermOrSym{<:Any,<:LayoutMatrix},
241+
SubArray{<:Any,2,<:LayoutMatrix},
242+
Diagonal{<:Any,<:LayoutVector}}, A::Vector,
243+
i::Integer, cols::AbstractVector, sep::AbstractString) =
244+
axes_print_matrix_row(axes(X), io, X, A, i, cols, sep)
245+
246+
247+
248+
216249
end

src/diagonal.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ end
1616

1717
copy(M::Lmul{<:DiagonalLayout,<:DiagonalLayout}) = Diagonal(M.A.diag .* M.B.diag)
1818
copy(M::Lmul{<:DiagonalLayout}) = M.A.diag .* M.B
19-
copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout}}) = getindex_value(M.A.diag) .* M.B
20-
copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout},<:DiagonalLayout}) = Diagonal(getindex_value(M.A.diag) .* M.B.diag)
19+
copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout}}) = getindex_value(M.A.diag) * M.B
20+
copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout},<:DiagonalLayout}) = Diagonal(getindex_value(M.A.diag) * M.B.diag)
2121

2222
# Diagonal multiplication never changes structure
2323
similar(M::Rmul{<:Any,<:DiagonalLayout}, ::Type{T}, axes) where T = similar(M.A, T, axes)

src/memorylayout.jl

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,11 @@ triangulardata(A::SubArray{<:Any,2,<:Any,<:Tuple{<:Union{Slice,Base.OneTo},<:Uni
497497

498498

499499
abstract type AbstractBandedLayout <: MemoryLayout end
500+
abstract type AbstractTridiagonalLayout <: MemoryLayout end
500501

501502
struct DiagonalLayout{ML} <: AbstractBandedLayout end
502-
struct SymTridiagonalLayout{ML} <: AbstractBandedLayout end
503+
struct SymTridiagonalLayout{ML} <: AbstractTridiagonalLayout end
504+
struct TridiagonalLayout{ML} <: AbstractTridiagonalLayout end
503505

504506
diagonallayout(_) = DiagonalLayout{UnknownLayout}()
505507
diagonallayout(::ML) where ML<:AbstractStridedLayout = DiagonalLayout{ML}()
@@ -508,13 +510,30 @@ diagonaldata(D::Diagonal) = parent(D)
508510

509511
MemoryLayout(::Type{SymTridiagonal{T,P}}) where {T,P} = SymTridiagonalLayout{typeof(MemoryLayout(P))}()
510512
diagonaldata(D::SymTridiagonal) = D.dv
511-
offdiagonaldata(D::SymTridiagonal) = D.ev
513+
supdiagonaldata(D::SymTridiagonal) = D.ev
514+
subdiagonaldata(D::SymTridiagonal) = D.ev
515+
516+
MemoryLayout(::Type{Tridiagonal{T,P}}) where {T,P} = TridiagonalLayout{typeof(MemoryLayout(P))}()
517+
diagonaldata(D::Tridiagonal) = D.d
518+
subdiagonaldata(D::Tridiagonal) = D.dl
519+
supdiagonaldata(D::Tridiagonal) = D.du
520+
512521

513522
transposelayout(ml::DiagonalLayout) = ml
514523
transposelayout(ml::SymTridiagonalLayout) = ml
524+
transposelayout(ml::TridiagonalLayout) = ml
515525
transposelayout(ml::ConjLayout{DiagonalLayout}) = ml
516526

517527
adjointlayout(::Type{<:Real}, ml::SymTridiagonalLayout) = ml
528+
adjointlayout(::Type{<:Real}, ml::TridiagonalLayout) = ml
529+
530+
subdiagonaldata(D::Transpose) = supdiagonaldata(parent(D))
531+
supdiagonaldata(D::Transpose) = subdiagonaldata(parent(D))
532+
diagonaldata(D::Transpose) = diagonaldata(parent(D))
533+
534+
subdiagonaldata(D::Adjoint{<:Real}) = supdiagonaldata(parent(D))
535+
supdiagonaldata(D::Adjoint{<:Real}) = subdiagonaldata(parent(D))
536+
diagonaldata(D::Adjoint{<:Real}) = diagonaldata(parent(D))
518537

519538
###
520539
# Fill

src/muladd.jl

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ function default_blasmul!(α, A::AbstractMatrix, B::AbstractVector, β, C::Abstr
216216
end
217217

218218
function materialize!(M::MatMulMatAdd)
219+
α, A, B, β, C = M.α, M.A, M.B, M.β, M.C
220+
if C B
221+
B = copy(B)
222+
end
223+
default_blasmul!(α, A, B, iszero(β) ? false : β, C)
224+
end
225+
226+
function materialize!(M::MatMulMatAdd{<:AbstractStridedLayout,<:AbstractStridedLayout,<:AbstractStridedLayout})
219227
α, A, B, β, C = M.α, M.A, M.B, M.β, M.C
220228
if C B
221229
B = copy(B)
@@ -379,11 +387,12 @@ function materialize!(M::MulAdd{<:Any,<:DiagonalLayout{<:AbstractFillLayout}})
379387
M.C
380388
end
381389

382-
copy(M::MulAdd{<:DiagonalLayout{<:AbstractFillLayout}}) = (M.α * getindex_value(M.A.diag)) .* M.B .+ M.β .* M.C
383-
copy(M::MulAdd{<:DiagonalLayout{<:AbstractFillLayout},<:Any,ZerosLayout}) = (M.α * getindex_value(M.A.diag)) .* M.B
390+
copy(M::MulAdd{<:DiagonalLayout{<:AbstractFillLayout}}) = (M.α * getindex_value(M.A.diag)) * M.B .+ M.β * M.C
391+
copy(M::MulAdd{<:DiagonalLayout{<:AbstractFillLayout},<:Any,ZerosLayout}) = (M.α * getindex_value(M.A.diag)) * M.B
384392
copy(M::MulAdd{<:AbstractFillLayout,<:AbstractFillLayout,<:AbstractFillLayout}) = M.α*M.A*M.B + M.β*M.C
385-
copy(M::MulAdd{<:Any,<:DiagonalLayout{<:AbstractFillLayout}}) = (M.α * getindex_value(M.B.diag)) .* M.A .+ M.β .* M.C
386-
copy(M::MulAdd{<:Any,<:DiagonalLayout{<:AbstractFillLayout},ZerosLayout}) = (M.α * getindex_value(M.B.diag)) .* M.A
393+
copy(M::MulAdd{<:Any,<:DiagonalLayout{<:AbstractFillLayout}}) = (M.α * getindex_value(M.B.diag)) * M.A .+ M.β * M.C
394+
copy(M::MulAdd{<:Any,<:DiagonalLayout{<:AbstractFillLayout},ZerosLayout}) = (M.α * getindex_value(M.B.diag)) * M.A
395+
387396

388397
BroadcastStyle(::Type{<:MulAdd}) = ApplyBroadcastStyle()
389398

test/runtests.jl

Lines changed: 66 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using ArrayLayouts, Random, FillArrays, Test
1+
using ArrayLayouts, Random, FillArrays, Test, Base64
22
import ArrayLayouts: MemoryLayout, @_layoutlmul, triangulardata
33

44
Random.seed!(0)
@@ -18,51 +18,73 @@ Base.strides(A::MyMatrix) = strides(A.A)
1818
Base.unsafe_convert(::Type{Ptr{T}}, A::MyMatrix) where T = Base.unsafe_convert(Ptr{T}, A.A)
1919
MemoryLayout(::Type{MyMatrix}) = DenseColumnMajor()
2020

21-
@testset "LayoutMatrix" begin
22-
A = MyMatrix(randn(5,5))
23-
for (kr,jr) in ((1:2,2:3), (:,:), (:,1:2), (2:3,:), ([1,2],3:4), (:,[1,2]), ([2,3],:))
24-
@test A[kr,jr] == A.A[kr,jr]
25-
end
26-
b = randn(5)
27-
for Tri in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
28-
@test ldiv!(Tri(A), copy(b)) ldiv!(Tri(A.A), copy(b))
29-
@test lmul!(Tri(A), copy(b)) lmul!(Tri(A.A), copy(b))
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+
@testset "LayoutArray" begin
33+
@testset "LayoutVector" begin
34+
A = MyVector(randn(5))
35+
@test A == A.A == Vector(A)
36+
@test A[1:3] == A.A[1:3]
3037
end
3138

32-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A) == A
33-
@test copyto!(Array{Float64}(undef,5,5), A) == A
34-
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A.A) == A
35-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),1:3,1:3), view(A,1:3,1:3)) == A[1:3,1:3]
36-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A) == A
37-
@test copyto!(MyMatrix(Array{Float64}(undef,3,3)), view(A,1:3,1:3)) == A[1:3,1:3]
38-
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A.A) == A
39-
@test copyto!(Array{Float64}(undef,3,3), view(A,1:3,1:3)) == A[1:3,1:3]
40-
41-
@test qr(A).factors qr(A.A).factors
42-
@test qr(A,Val(true)).factors qr(A.A,Val(true)).factors
43-
@test lu(A).factors lu(A.A).factors
44-
@test lu(A,Val(true)).factors lu(A.A,Val(true)).factors
45-
@test_throws ErrorException qr!(A)
46-
@test_throws ErrorException lu!(A)
47-
48-
@test qr(A) isa LinearAlgebra.QRCompactWY
49-
@test inv(A) inv(A.A)
50-
51-
Bin = randn(5,5)
52-
B = MyMatrix(copy(Bin))
53-
muladd!(1.0, A, A, 2.0, B)
54-
@test all(B .=== A.A^2 + 2Bin)
55-
56-
# tiled_blasmul!
57-
B = MyMatrix(copy(Bin))
58-
muladd!(1.0, Ones(5,5), A, 2.0, B)
59-
60-
#generic_blasmul!
61-
A = BigFloat.(randn(5,5))
62-
Bin = BigFloat.(randn(5,5))
63-
B = copy(Bin)
64-
muladd!(1.0, Ones(5,5), A, 2.0, B)
65-
@test B == Ones(5,5)*A + 2.0Bin
39+
@testset "LayoutMatrix" begin
40+
A = MyMatrix(randn(5,5))
41+
for (kr,jr) in ((1:2,2:3), (:,:), (:,1:2), (2:3,:), ([1,2],3:4), (:,[1,2]), ([2,3],:))
42+
@test A[kr,jr] == A.A[kr,jr]
43+
end
44+
b = randn(5)
45+
for Tri in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
46+
@test ldiv!(Tri(A), copy(b)) ldiv!(Tri(A.A), copy(b))
47+
@test lmul!(Tri(A), copy(b)) lmul!(Tri(A.A), copy(b))
48+
end
49+
50+
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A) == A
51+
@test copyto!(Array{Float64}(undef,5,5), A) == A
52+
@test copyto!(MyMatrix(Array{Float64}(undef,5,5)), A.A) == A
53+
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),1:3,1:3), view(A,1:3,1:3)) == A[1:3,1:3]
54+
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A) == A
55+
@test copyto!(MyMatrix(Array{Float64}(undef,3,3)), view(A,1:3,1:3)) == A[1:3,1:3]
56+
@test copyto!(view(MyMatrix(Array{Float64}(undef,5,5)),:,:), A.A) == A
57+
@test copyto!(Array{Float64}(undef,3,3), view(A,1:3,1:3)) == A[1:3,1:3]
58+
59+
@test qr(A).factors qr(A.A).factors
60+
@test qr(A,Val(true)).factors qr(A.A,Val(true)).factors
61+
@test lu(A).factors lu(A.A).factors
62+
@test lu(A,Val(true)).factors lu(A.A,Val(true)).factors
63+
@test_throws ErrorException qr!(A)
64+
@test_throws ErrorException lu!(A)
65+
66+
@test qr(A) isa LinearAlgebra.QRCompactWY
67+
@test inv(A) inv(A.A)
68+
69+
Bin = randn(5,5)
70+
B = MyMatrix(copy(Bin))
71+
muladd!(1.0, A, A, 2.0, B)
72+
@test all(B .=== A.A^2 + 2Bin)
73+
74+
# tiled_blasmul!
75+
B = MyMatrix(copy(Bin))
76+
muladd!(1.0, Ones(5,5), A, 2.0, B)
77+
78+
#generic_blasmul!
79+
A = BigFloat.(randn(5,5))
80+
Bin = BigFloat.(randn(5,5))
81+
B = copy(Bin)
82+
muladd!(1.0, Ones(5,5), A, 2.0, B)
83+
@test B == Ones(5,5)*A + 2.0Bin
84+
85+
C = MyMatrix([1 2; 3 4])
86+
@test stringmime("text/plain", C) == "2×2 MyMatrix:\n 1.0 2.0\n 3.0 4.0"
87+
end
6688
end
6789

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

0 commit comments

Comments
 (0)