From 265337ec765300902790a31c506ce93a27d33639 Mon Sep 17 00:00:00 2001 From: Rik Huijzer Date: Tue, 8 Mar 2022 16:28:52 +0100 Subject: [PATCH 1/8] Change to _copy_oftype With this, tests still pass on Julia 1.7.2. It doesn't fix 1.8-beta1 yet because there is some other problem too. --- .github/workflows/ci.yml | 10 ++++++---- Project.toml | 2 +- src/ArrayLayouts.jl | 8 ++++---- src/diagonal.jl | 22 +++++++++++----------- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d592f14..0123b9c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,9 @@ name: CI on: - - push - - pull_request + push: + branches: + - master + pull_request: jobs: test: name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} @@ -12,7 +14,7 @@ jobs: version: - '1.5' - '1' - - '^1.7.0-0' + - '^1.8.0-0' os: - ubuntu-latest - macOS-latest @@ -62,4 +64,4 @@ jobs: - run: julia --project=docs docs/make.jl env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} \ No newline at end of file + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} diff --git a/Project.toml b/Project.toml index 4aaac10..75315bf 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ArrayLayouts" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" authors = ["Sheehan Olver "] -version = "0.7.10" +version = "0.7.11" [deps] FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" diff --git a/src/ArrayLayouts.jl b/src/ArrayLayouts.jl index 4729748..0a5d32c 100644 --- a/src/ArrayLayouts.jl +++ b/src/ArrayLayouts.jl @@ -35,12 +35,12 @@ import Base.Broadcast: BroadcastStyle, AbstractArrayStyle, Broadcasted, broadcas materialize!, eltypes import LinearAlgebra: AbstractTriangular, AbstractQ, checksquare, pinv, fill!, tilebufsize, factorize, qr, lu, cholesky, - norm2, norm1, normInf, normMinusInf, qr, lu, qr!, lu!, AdjOrTrans, HermOrSym, copy_oftype, - AdjointAbsVec, TransposeAbsVec, cholcopy, checknonsingular, _apply_ipiv_rows!, ipiv2perm, RealHermSymComplexHerm, chkfullrank + norm2, norm1, normInf, normMinusInf, qr, lu, qr!, lu!, AdjOrTrans, HermOrSym, AdjointAbsVec, + TransposeAbsVec, cholcopy, checknonsingular, _apply_ipiv_rows!, ipiv2perm, RealHermSymComplexHerm, chkfullrank import LinearAlgebra.BLAS: BlasFloat, BlasReal, BlasComplex -import FillArrays: AbstractFill, getindex_value, axes_print_matrix_row +import FillArrays: AbstractFill, getindex_value, axes_print_matrix_row, _copy_oftype import Base: require_one_based_indexing @@ -367,4 +367,4 @@ Base.typed_vcat(::Type{T}, A::LayoutVecOrMats, B::LayoutVecOrMats, C::AbstractVe Base.typed_hcat(::Type{T}, A::LayoutVecOrMats, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_hcat(T, A, B, C...) Base.typed_vcat(::Type{T}, A::AbstractVecOrMat, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_vcat(T, A, B, C...) Base.typed_hcat(::Type{T}, A::AbstractVecOrMat, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_hcat(T, A, B, C...) -end # module \ No newline at end of file +end # module diff --git a/src/diagonal.jl b/src/diagonal.jl index c0b8c44..9f9d151 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -56,11 +56,11 @@ copy(M::Lmul{<:DiagonalLayout,<:TridiagonalLayout}) = M.A * convert(Tridiagonal, copy(M::Rmul{<:SymTridiagonalLayout,<:DiagonalLayout}) = convert(SymTridiagonal, M.A) * M.B copy(M::Lmul{<:DiagonalLayout,<:SymTridiagonalLayout}) = M.A * convert(SymTridiagonal, M.B) -copy(M::Lmul{DiagonalLayout{OnesLayout}}) = copy_oftype(M.B, eltype(M)) -copy(M::Lmul{DiagonalLayout{OnesLayout},<:DiagonalLayout}) = Diagonal(copy_oftype(diagonaldata(M.B), eltype(M))) -copy(M::Lmul{<:DiagonalLayout,DiagonalLayout{OnesLayout}}) = Diagonal(copy_oftype(diagonaldata(M.A), eltype(M))) -copy(M::Lmul{DiagonalLayout{OnesLayout},DiagonalLayout{OnesLayout}}) = copy_oftype(M.B, eltype(M)) -copy(M::Rmul{<:Any,DiagonalLayout{OnesLayout}}) = copy_oftype(M.A, eltype(M)) +copy(M::Lmul{DiagonalLayout{OnesLayout}}) = _copy_oftype(M.B, eltype(M)) +copy(M::Lmul{DiagonalLayout{OnesLayout},<:DiagonalLayout}) = Diagonal(_copy_oftype(diagonaldata(M.B), eltype(M))) +copy(M::Lmul{<:DiagonalLayout,DiagonalLayout{OnesLayout}}) = Diagonal(_copy_oftype(diagonaldata(M.A), eltype(M))) +copy(M::Lmul{DiagonalLayout{OnesLayout},DiagonalLayout{OnesLayout}}) = _copy_oftype(M.B, eltype(M)) +copy(M::Rmul{<:Any,DiagonalLayout{OnesLayout}}) = _copy_oftype(M.A, eltype(M)) copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout}}) = getindex_value(diagonaldata(M.A)) * M.B copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout},<:DiagonalLayout}) = getindex_value(diagonaldata(M.A)) * M.B @@ -74,9 +74,9 @@ copy(M::Rmul{<:SymTridiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = M copy(M::Lmul{<:DiagonalLayout{<:AbstractFillLayout},<:SymTridiagonalLayout}) = getindex_value(diagonaldata(M.A)) * M.B -copy(M::Rmul{<:BidiagonalLayout,DiagonalLayout{OnesLayout}}) = copy_oftype(M.A, eltype(M)) -copy(M::Lmul{DiagonalLayout{OnesLayout},<:BidiagonalLayout}) = copy_oftype(M.B, eltype(M)) -copy(M::Rmul{<:TridiagonalLayout,DiagonalLayout{OnesLayout}}) = copy_oftype(M.A, eltype(M)) -copy(M::Lmul{DiagonalLayout{OnesLayout},<:TridiagonalLayout}) = copy_oftype(M.B, eltype(M)) -copy(M::Rmul{<:SymTridiagonalLayout,DiagonalLayout{OnesLayout}}) = copy_oftype(M.A, eltype(M)) -copy(M::Lmul{DiagonalLayout{OnesLayout},<:SymTridiagonalLayout}) = copy_oftype(M.B, eltype(M)) +copy(M::Rmul{<:BidiagonalLayout,DiagonalLayout{OnesLayout}}) = _copy_oftype(M.A, eltype(M)) +copy(M::Lmul{DiagonalLayout{OnesLayout},<:BidiagonalLayout}) = _copy_oftype(M.B, eltype(M)) +copy(M::Rmul{<:TridiagonalLayout,DiagonalLayout{OnesLayout}}) = _copy_oftype(M.A, eltype(M)) +copy(M::Lmul{DiagonalLayout{OnesLayout},<:TridiagonalLayout}) = _copy_oftype(M.B, eltype(M)) +copy(M::Rmul{<:SymTridiagonalLayout,DiagonalLayout{OnesLayout}}) = _copy_oftype(M.A, eltype(M)) +copy(M::Lmul{DiagonalLayout{OnesLayout},<:SymTridiagonalLayout}) = _copy_oftype(M.B, eltype(M)) From a8830280befc77246273bbcbbbc8a6eb1063afa8 Mon Sep 17 00:00:00 2001 From: Rik Huijzer Date: Wed, 9 Mar 2022 09:38:49 +0100 Subject: [PATCH 2/8] Add StableRNGs --- Project.toml | 3 ++- src/mul.jl | 2 +- src/muladd.jl | 4 ++-- test/test_muladd.jl | 9 +++++---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Project.toml b/Project.toml index 75315bf..72db912 100644 --- a/Project.toml +++ b/Project.toml @@ -16,7 +16,8 @@ julia = "1.5" Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" Compat = "34da2185-b29b-5c13-b0c7-acf172513d20" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Random", "Base64", "Compat"] +test = ["Base64", "Compat", "Random", "StableRNGs", "Test"] diff --git a/src/mul.jl b/src/mul.jl index cdfff36..046ca59 100644 --- a/src/mul.jl +++ b/src/mul.jl @@ -309,4 +309,4 @@ for Typ in (:LayoutMatrix, :(Symmetric{<:Any,<:LayoutMatrix}), :(Hermitian{<:Any @inline -(A::$Typ, Λ::UniformScaling) = _apply(MemoryLayout(A), size(A), -, A, Λ) @inline -(Λ::UniformScaling, A::$Typ) = _apply(MemoryLayout(A), size(A), -, Λ, A) end -end \ No newline at end of file +end diff --git a/src/muladd.jl b/src/muladd.jl index 8212e20..5a0bb1c 100644 --- a/src/muladd.jl +++ b/src/muladd.jl @@ -74,7 +74,7 @@ copy(M::MulAdd) = copyto!(similar(M), M) _fill_copyto!(dest, C) = copyto!(dest, C) _fill_copyto!(dest, C::Zeros) = zero!(dest) # exploit special fill! overload -@inline copyto!(dest::AbstractArray{T}, M::MulAdd) where T = +@inline copyto!(dest::AbstractArray{T}, M::MulAdd) where T = muladd!(M.α, unalias(dest,M.A), unalias(dest,M.B), M.β, _fill_copyto!(dest, M.C)) # Modified from LinearAlgebra._generic_matmatmul! @@ -420,4 +420,4 @@ end const ZerosLayouts = Union{ZerosLayout,DualLayout{ZerosLayout}} copy(M::MulAdd{<:ZerosLayouts, <:ZerosLayouts, <:ZerosLayouts}) = M.C copy(M::MulAdd{<:ZerosLayouts, <:Any, <:ZerosLayouts}) = M.C -copy(M::MulAdd{<:Any, <:ZerosLayouts, <:ZerosLayouts}) = M.C \ No newline at end of file +copy(M::MulAdd{<:Any, <:ZerosLayouts, <:ZerosLayouts}) = M.C diff --git a/test/test_muladd.jl b/test/test_muladd.jl index 419f931..5ae6445 100644 --- a/test/test_muladd.jl +++ b/test/test_muladd.jl @@ -1,4 +1,4 @@ -using ArrayLayouts, FillArrays, Random, LinearAlgebra, Test +using ArrayLayouts, FillArrays, Random, StableRNGs, LinearAlgebra, Test import ArrayLayouts: DenseColumnMajor, AbstractStridedLayout, AbstractColumnMajor, DiagonalLayout, mul, Mul, zero! Random.seed!(0) @@ -688,8 +688,9 @@ Random.seed!(0) end @testset "tiled_blasmul!" begin - X = randn(ComplexF64, 8, 4) - Y = randn(8, 2) + rng = StableRNG(1) + X = randn(rng, ComplexF64, 8, 4) + Y = randn(rng, 8, 2) @test all(mul(Y',X) .=== Y'X) end -end \ No newline at end of file +end From a6231b1b3508aa321d6feef6e12fe89c9156775b Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Wed, 16 Mar 2022 16:32:20 +0000 Subject: [PATCH 3/8] 1.5 -> 1.6 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0123b9c..6bdd1b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: fail-fast: false matrix: version: - - '1.5' + - '1.6' - '1' - '^1.8.0-0' os: From 00f213d321b3ef3bca17d2d84a68b7f0f1d92a81 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Wed, 16 Mar 2022 16:32:48 +0000 Subject: [PATCH 4/8] Require Julia v1.6 --- Project.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 72db912..1a95246 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ArrayLayouts" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" authors = ["Sheehan Olver "] -version = "0.7.11" +version = "0.8" [deps] FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" @@ -9,8 +9,8 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [compat] -FillArrays = "0.12.6, 0.13" -julia = "1.5" +FillArrays = "0.13.1" +julia = "1.6" [extras] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From 48660861579865083a8b479e310f64e22342af43 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Fri, 18 Mar 2022 21:07:37 +0000 Subject: [PATCH 5/8] Update test_muladd.jl --- test/test_muladd.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_muladd.jl b/test/test_muladd.jl index 5ae6445..fad8fa9 100644 --- a/test/test_muladd.jl +++ b/test/test_muladd.jl @@ -657,7 +657,8 @@ Random.seed!(0) @testset "Dot" begin a = randn(5) b = randn(5) - @test ArrayLayouts.dot(a,b) == mul(a',b) == dot(a,b) + @test ArrayLayouts.dot(a,b) == mul(a',b) + @test ArrayLayout.dot(a,b) ≈ dot(a,b) @test eltype(Dot(a,1:5)) == Float64 end From ed1a0b8afeec94fed05968d5ce3bb243bbafcab4 Mon Sep 17 00:00:00 2001 From: Rik Huijzer Date: Sat, 19 Mar 2022 08:55:36 +0100 Subject: [PATCH 6/8] Fix typo (fix broken test) --- test/test_muladd.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_muladd.jl b/test/test_muladd.jl index fad8fa9..d822779 100644 --- a/test/test_muladd.jl +++ b/test/test_muladd.jl @@ -658,7 +658,7 @@ Random.seed!(0) a = randn(5) b = randn(5) @test ArrayLayouts.dot(a,b) == mul(a',b) - @test ArrayLayout.dot(a,b) ≈ dot(a,b) + @test ArrayLayouts.dot(a,b) ≈ dot(a,b) @test eltype(Dot(a,1:5)) == Float64 end From 47611bc6a64fe10a4f973e30b8d816f419b49eaa Mon Sep 17 00:00:00 2001 From: Rik Huijzer Date: Sat, 19 Mar 2022 09:18:57 +0100 Subject: [PATCH 7/8] Fix another test by allowing minor differences --- test/test_muladd.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_muladd.jl b/test/test_muladd.jl index d822779..fbc7396 100644 --- a/test/test_muladd.jl +++ b/test/test_muladd.jl @@ -692,6 +692,6 @@ Random.seed!(0) rng = StableRNG(1) X = randn(rng, ComplexF64, 8, 4) Y = randn(rng, 8, 2) - @test all(mul(Y',X) .=== Y'X) + @test all(isapprox.(mul(Y', X), Y'X; atol=0.000001)) end end From 1539f50b9007f2cd0f73c051bf3c13e82a50ebe6 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Sat, 19 Mar 2022 10:09:31 +0000 Subject: [PATCH 8/8] tests pass --- src/ArrayLayouts.jl | 22 ++++++++++++++++++-- src/factorizations.jl | 44 ++++++++++++++++++++++++---------------- test/test_layoutarray.jl | 11 +++++----- test/test_muladd.jl | 4 ++-- 4 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/ArrayLayouts.jl b/src/ArrayLayouts.jl index 0a5d32c..7e251fe 100644 --- a/src/ArrayLayouts.jl +++ b/src/ArrayLayouts.jl @@ -22,7 +22,7 @@ import Base: AbstractArray, AbstractMatrix, AbstractVector, AbstractMatrix, AbstractArray, checkindex, unsafe_length, OneTo, one, zero, to_shape, _sub2ind, print_matrix, print_matrix_row, print_matrix_vdots, checkindex, Slice, @propagate_inbounds, @_propagate_inbounds_meta, - _in_range, _range, _rangestyle, Ordered, + _in_range, _range, Ordered, ArithmeticWraps, floatrange, reverse, unitrange_last, AbstractArray, AbstractVector, axes, (:), _sub2ind_recurse, broadcast, promote_eltypeof, similar, @_gc_preserve_end, @_gc_preserve_begin, @@ -58,6 +58,14 @@ if VERSION < v"1.7-" const RowMaximum = Val{true} const NoPivot = Val{false} end + +if VERSION < v"1.8-" + const CRowMaximum = Val{true} + const CNoPivot = Val{false} +else + const CRowMaximum = RowMaximum + const CNoPivot = NoPivot +end struct ApplyBroadcastStyle <: BroadcastStyle end @@ -81,7 +89,9 @@ strides(A::Transpose) = _transpose_strides(strides(parent(A))...) """ ConjPtr{T} -represents that the entry is the complex-conjugate of the pointed to entry. +A memory address referring to complex conjugated data of type T. However, there is no guarantee +that the memory is actually valid, or that it actually represents the complex conjugate of data of +the specified type. """ struct ConjPtr{T} ptr::Ptr{T} @@ -96,6 +106,14 @@ function unsafe_convert(::Type{ConjPtr{T}}, V::SubArray{T,2}) where {T,N,P} unsafe_convert(Ptr{T}, view(parent(V)', jr, kr)) end +Base.elsize(::Type{<:Adjoint{<:Complex,P}}) where P<:AbstractVecOrMat = conjelsize(P) +conjelsize(::Type{<:Adjoint{<:Complex,P}}) where P<:AbstractVecOrMat = Base.elsize(P) +conjelsize(::Type{<:Transpose{<:Any, P}}) where {P<:AbstractVecOrMat} = conjelsize(P) +conjelsize(::Type{<:PermutedDimsArray{<:Any, <:Any, <:Any, <:Any, P}}) where {P} = conjelsize(P) +conjelsize(::Type{<:ReshapedArray{<:Any,<:Any,P}}) where {P} = conjelsize(P) +conjelsize(::Type{<:SubArray{<:Any,<:Any,P}}) where {P} = conjelsize(P) +conjelsize(A::AbstractArray) = conjelsize(typeof(A)) + include("memorylayout.jl") include("mul.jl") include("muladd.jl") diff --git a/src/factorizations.jl b/src/factorizations.jl index 83ede11..e86ed88 100644 --- a/src/factorizations.jl +++ b/src/factorizations.jl @@ -305,20 +305,32 @@ _qr!(layout, axes, A, args...; kwds...) = error("Overload _qr!(::$(typeof(layout _lu(layout, axes, A; kwds...) = Base.invoke(lu, Tuple{AbstractMatrix{eltype(A)}}, A; kwds...) _lu(layout, axes, A, pivot::P; kwds...) where P = Base.invoke(lu, Tuple{AbstractMatrix{eltype(A)},P}, A, pivot; kwds...) _lu!(layout, axes, A, args...; kwds...) = error("Overload _lu!(::$(typeof(layout)), axes, A)") -_cholesky(layout, axes, A, ::Val{false}=Val(false); check::Bool = true) = cholesky!(cholcopy(A); check = check) -_cholesky(layout, axes, A, ::Val{true}; tol = 0.0, check::Bool = true) = cholesky!(cholcopy(A), Val(true); tol = tol, check = check) +_cholesky(layout, axes, A, ::CNoPivot=CNoPivot(); check::Bool = true) = cholesky!(cholcopy(A); check = check) +_cholesky(layout, axes, A, ::CRowMaximum; tol = 0.0, check::Bool = true) = cholesky!(cholcopy(A), CRowMaximum(); tol = tol, check = check) _factorize(layout, axes, A) = qr(A) # Default to QR _factorize(::AbstractStridedLayout, axes, A) = lu(A) -function _lu!(::AbstractColumnMajor, axes, A::AbstractMatrix{T}, pivot::Union{NoPivot, RowMaximum} = RowMaximum(); - check::Bool = true) where T<:BlasFloat - if pivot === NoPivot() - return generic_lufact!(A, pivot; check = check) +if VERSION < v"1.8-" + function _lu!(::AbstractColumnMajor, axes, A::AbstractMatrix{T}, pivot::Union{NoPivot, RowMaximum} = RowMaximum(); + check::Bool = true) where T<:BlasFloat + if pivot === NoPivot() + return generic_lufact!(A, pivot; check = check) + end + lpt = LAPACK.getrf!(A) + check && checknonsingular(lpt[3]) + return LU{T,typeof(A)}(lpt[1], lpt[2], lpt[3]) + end +else + function _lu!(::AbstractColumnMajor, axes, A::AbstractMatrix{T}, pivot::Union{NoPivot, RowMaximum} = RowMaximum(); + check::Bool = true) where T<:BlasFloat + if pivot === NoPivot() + return generic_lufact!(A, pivot; check = check) + end + lpt = LAPACK.getrf!(A) + check && checknonsingular(lpt[3]) + return LU{T,typeof(A),typeof(lpt[2])}(lpt[1], lpt[2], lpt[3]) end - lpt = LAPACK.getrf!(A) - check && checknonsingular(lpt[3]) - return LU{T,typeof(A)}(lpt[1], lpt[2], lpt[3]) end # for some reason only defined for StridedMatrix in LinearAlgebra @@ -355,14 +367,14 @@ end _chol!(_, A, UL) = LinearAlgebra._chol!(A, UL) -function _cholesky!(layout, axes, A::RealHermSymComplexHerm, ::Val{false}; check::Bool = true) +function _cholesky!(layout, axes, A::RealHermSymComplexHerm, ::CNoPivot; check::Bool = true) C, info = _chol!(layout, A.data, A.uplo == 'U' ? UpperTriangular : LowerTriangular) check && LinearAlgebra.checkpositivedefinite(info) return Cholesky(C.data, A.uplo, info) end function _cholesky!(::SymmetricLayout{<:AbstractColumnMajor}, axes, A::AbstractMatrix{<:BlasReal}, - ::Val{true}; tol = 0.0, check::Bool = true) + ::CRowMaximum; tol = 0.0, check::Bool = true) AA, piv, rank, info = LAPACK.pstrf!(A.uplo, A.data, tol) C = CholeskyPivoted{eltype(AA),typeof(AA)}(AA, A.uplo, piv, rank, tol, info) check && chkfullrank(C) @@ -390,9 +402,10 @@ end macro _layoutfactorizations(Typ) esc(quote - LinearAlgebra.cholesky(A::$Typ, args...; kwds...) = ArrayLayouts._cholesky(ArrayLayouts.MemoryLayout(A), axes(A), A, args...; kwds...) - LinearAlgebra.cholesky!(A::LinearAlgebra.RealHermSymComplexHerm{<:Real,<:$Typ}, v::Val{false}=Val(false); check::Bool = true) = ArrayLayouts._cholesky!(ArrayLayouts.MemoryLayout(A), axes(A), A, v; check=check) - LinearAlgebra.cholesky!(A::LinearAlgebra.RealHermSymComplexHerm{<:Real,<:$Typ}, v::Val{true}; check::Bool = true, tol = 0.0) = ArrayLayouts._cholesky!(ArrayLayouts.MemoryLayout(A), axes(A), A, v; check=check, tol=tol) + LinearAlgebra.cholesky(A::$Typ, v::CNoPivot = CNoPivot(); kwds...) = ArrayLayouts._cholesky(ArrayLayouts.MemoryLayout(A), axes(A), A, v; kwds...) + LinearAlgebra.cholesky(A::$Typ, v::CRowMaximum; kwds...) = ArrayLayouts._cholesky(ArrayLayouts.MemoryLayout(A), axes(A), A, v; kwds...) + LinearAlgebra.cholesky!(A::LinearAlgebra.RealHermSymComplexHerm{<:Real,<:$Typ}, v::CNoPivot = CNoPivot(); check::Bool = true) = ArrayLayouts._cholesky!(ArrayLayouts.MemoryLayout(A), axes(A), A, v; check=check) + LinearAlgebra.cholesky!(A::LinearAlgebra.RealHermSymComplexHerm{<:Real,<:$Typ}, v::CRowMaximum; check::Bool = true, tol = 0.0) = ArrayLayouts._cholesky!(ArrayLayouts.MemoryLayout(A), axes(A), A, v; check=check, tol=tol) LinearAlgebra.qr(A::$Typ, args...; kwds...) = ArrayLayouts._qr(ArrayLayouts.MemoryLayout(A), axes(A), A, args...; kwds...) LinearAlgebra.qr!(A::$Typ, args...; kwds...) = ArrayLayouts._qr!(ArrayLayouts.MemoryLayout(A), axes(A), A, args...; kwds...) LinearAlgebra.lu(A::$Typ, pivot::Union{ArrayLayouts.NoPivot,ArrayLayouts.RowMaximum}; kwds...) = ArrayLayouts._lu(ArrayLayouts.MemoryLayout(A), axes(A), A, pivot; kwds...) @@ -424,6 +437,3 @@ end LinearAlgebra.ldiv!(L::LU{<:Any,<:LayoutMatrix}, B::LayoutVector) = ArrayLayouts.ldiv!(L, B) -if VERSION ≥ v"1.7-" - @deprecate qr(A::LayoutMatrix, ::Val{true}) qr(A, ColumnNorm()) -end diff --git a/test/test_layoutarray.jl b/test/test_layoutarray.jl index 17bfd7a..711d2b9 100644 --- a/test/test_layoutarray.jl +++ b/test/test_layoutarray.jl @@ -1,5 +1,5 @@ using ArrayLayouts, LinearAlgebra, FillArrays, Base64, Test -import ArrayLayouts: sub_materialize, MemoryLayout, ColumnNorm, RowMaximum +import ArrayLayouts: sub_materialize, MemoryLayout, ColumnNorm, RowMaximum, CRowMaximum struct MyMatrix <: LayoutMatrix{Float64} @@ -10,6 +10,7 @@ Base.getindex(A::MyMatrix, k::Int, j::Int) = A.A[k,j] Base.setindex!(A::MyMatrix, v, k::Int, j::Int) = setindex!(A.A, v, k, j) Base.size(A::MyMatrix) = size(A.A) Base.strides(A::MyMatrix) = strides(A.A) +Base.elsize(::Type{MyMatrix}) = sizeof(Float64) Base.unsafe_convert(::Type{Ptr{T}}, A::MyMatrix) where T = Base.unsafe_convert(Ptr{T}, A.A) MemoryLayout(::Type{MyMatrix}) = DenseColumnMajor() Base.copy(A::MyMatrix) = MyMatrix(copy(A.A)) @@ -22,6 +23,7 @@ Base.getindex(A::MyVector, k::Int) = A.A[k] Base.setindex!(A::MyVector, v, k::Int) = setindex!(A.A, v, k) Base.size(A::MyVector) = size(A.A) Base.strides(A::MyVector) = strides(A.A) +Base.elsize(::Type{MyVector}) = sizeof(Float64) Base.unsafe_convert(::Type{Ptr{T}}, A::MyVector) where T = Base.unsafe_convert(Ptr{T}, A.A) MemoryLayout(::Type{MyVector}) = DenseColumnMajor() @@ -100,17 +102,14 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor() @test qr(A) isa LinearAlgebra.QRCompactWY @test inv(A) ≈ inv(A.A) - if VERSION ≥ v"1.7-" - @test qr(A, Val(true)) == qr(A, ColumnNorm()) - end S = Symmetric(MyMatrix(reshape(inv.(1:25),5,5) + 10I)) @test cholesky(S).U ≈ @inferred(cholesky!(deepcopy(S))).U - @test cholesky(S,Val(true)).U ≈ cholesky(Matrix(S),Val(true)).U + @test cholesky(S,CRowMaximum()).U ≈ cholesky(Matrix(S),CRowMaximum()).U S = Symmetric(MyMatrix(reshape(inv.(1:25),5,5) + 10I),:L) @test cholesky(S).U ≈ @inferred(cholesky!(deepcopy(S))).U - @test cholesky(S,Val(true)).U ≈ cholesky(Matrix(S),Val(true)).U + @test cholesky(S,CRowMaximum()).U ≈ cholesky(Matrix(S),CRowMaximum()).U end Bin = randn(5,5) B = MyMatrix(copy(Bin)) diff --git a/test/test_muladd.jl b/test/test_muladd.jl index fad8fa9..d645156 100644 --- a/test/test_muladd.jl +++ b/test/test_muladd.jl @@ -658,7 +658,7 @@ Random.seed!(0) a = randn(5) b = randn(5) @test ArrayLayouts.dot(a,b) == mul(a',b) - @test ArrayLayout.dot(a,b) ≈ dot(a,b) + @test ArrayLayouts.dot(a,b) ≈ dot(a,b) @test eltype(Dot(a,1:5)) == Float64 end @@ -692,6 +692,6 @@ Random.seed!(0) rng = StableRNG(1) X = randn(rng, ComplexF64, 8, 4) Y = randn(rng, 8, 2) - @test all(mul(Y',X) .=== Y'X) + @test mul(Y',X) ≈ Y'X end end