From 89dc280161dc87bd479e17c682bad02a6a6b243b Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Tue, 2 Jan 2024 13:12:52 +0530 Subject: [PATCH 1/3] Reinstate similar for AbstractQ for backward compatibility --- stdlib/LinearAlgebra/src/LinearAlgebra.jl | 2 ++ stdlib/LinearAlgebra/src/abstractq.jl | 8 ++++++++ stdlib/LinearAlgebra/test/abstractq.jl | 24 +++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/stdlib/LinearAlgebra/src/LinearAlgebra.jl b/stdlib/LinearAlgebra/src/LinearAlgebra.jl index 10cc9a2f3459a..26a996b803e91 100644 --- a/stdlib/LinearAlgebra/src/LinearAlgebra.jl +++ b/stdlib/LinearAlgebra/src/LinearAlgebra.jl @@ -196,6 +196,8 @@ struct RowNonZero <: PivotingStrategy end struct RowMaximum <: PivotingStrategy end struct ColumnNorm <: PivotingStrategy end +const DimOrInd = Union{Integer, AbstractUnitRange} + # Check that stride of matrix/vector is 1 # Writing like this to avoid splatting penalty when called with multiple arguments, # see PR 16416 diff --git a/stdlib/LinearAlgebra/src/abstractq.jl b/stdlib/LinearAlgebra/src/abstractq.jl index b0d53320f4aa3..48e3feed396a4 100644 --- a/stdlib/LinearAlgebra/src/abstractq.jl +++ b/stdlib/LinearAlgebra/src/abstractq.jl @@ -74,6 +74,14 @@ axes(Q::AbstractQ, d::Integer) = d in (1, 2) ? axes(Q)[d] : Base.OneTo(1) copymutable(Q::AbstractQ{T}) where {T} = lmul!(Q, Matrix{T}(I, size(Q))) copy(Q::AbstractQ) = copymutable(Q) +# legacy compatibility +similar(Q::AbstractQ) = similar(Q, eltype(Q), size(Q)) +similar(Q::AbstractQ, ::Type{T}) where {T} = similar(Q, T, size(Q)) +similar(Q::AbstractQ, size::DimOrInd...) = similar(Q, eltype(Q), size...) +similar(Q::AbstractQ, ::Type{T}, size::DimOrInd...) where {T} = similar(Q, T, Base.to_shape(size)) +similar(Q::AbstractQ, size::Tuple{Vararg{DimOrInd}}) = similar(Q, eltype(Q), Base.to_shape(size)) +similar(Q::AbstractQ, ::Type{T}, size::NTuple{N,Integer}) where {T,N} = Array{T,N}(undef, size) + # getindex @inline function getindex(Q::AbstractQ, inds...) @boundscheck Base.checkbounds_indices(Bool, axes(Q), inds) || Base.throw_boundserror(Q, inds) diff --git a/stdlib/LinearAlgebra/test/abstractq.jl b/stdlib/LinearAlgebra/test/abstractq.jl index 19b872d685668..2467d0ca4c7c3 100644 --- a/stdlib/LinearAlgebra/test/abstractq.jl +++ b/stdlib/LinearAlgebra/test/abstractq.jl @@ -96,6 +96,30 @@ n = 5 @test Q ≈ Prect @test Q ≈ Psquare @test Q ≈ F.Q*I + + @testset "similar" begin + QS = similar(Q) + @test QS isa Matrix{eltype(Q)} + @test size(QS) == size(Q) + + QS = similar(Q, Int8) + @test QS isa Matrix{Int8} + @test size(QS) == size(Q) + + QS = similar(Q, 1) + @test QS isa Vector{eltype(Q)} + @test size(QS) == (1,) + + QS = similar(Q, Int8, 2) + @test QS isa Vector{Int8} + @test size(QS) == (2,) + + QS = similar(Q, Int8, ()) + @test QS isa Array{Int8,0} + + QS = similar(Q, ()) + @test QS isa Array{eltype(Q),0} + end end end # module From c5edb4f1af25166752b2b4d028bc7d8da44d4ecc Mon Sep 17 00:00:00 2001 From: Daniel Karrasch Date: Mon, 20 May 2024 17:25:07 +0200 Subject: [PATCH 2/3] Update stdlib/LinearAlgebra/src/LinearAlgebra.jl Co-authored-by: Steven G. Johnson --- stdlib/LinearAlgebra/src/LinearAlgebra.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/LinearAlgebra.jl b/stdlib/LinearAlgebra/src/LinearAlgebra.jl index 26a996b803e91..08c18f670e991 100644 --- a/stdlib/LinearAlgebra/src/LinearAlgebra.jl +++ b/stdlib/LinearAlgebra/src/LinearAlgebra.jl @@ -196,7 +196,7 @@ struct RowNonZero <: PivotingStrategy end struct RowMaximum <: PivotingStrategy end struct ColumnNorm <: PivotingStrategy end -const DimOrInd = Union{Integer, AbstractUnitRange} +using Base: DimOrInd # Check that stride of matrix/vector is 1 # Writing like this to avoid splatting penalty when called with multiple arguments, From dd75d9d445b118f59b397b181e83ed89907a4818 Mon Sep 17 00:00:00 2001 From: Daniel Karrasch Date: Wed, 22 May 2024 12:25:07 +0200 Subject: [PATCH 3/3] less invasive changes --- stdlib/LinearAlgebra/test/abstractq.jl | 49 +++++++++++++------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/stdlib/LinearAlgebra/test/abstractq.jl b/stdlib/LinearAlgebra/test/abstractq.jl index 453d942621f06..5bfd62b467718 100644 --- a/stdlib/LinearAlgebra/test/abstractq.jl +++ b/stdlib/LinearAlgebra/test/abstractq.jl @@ -127,31 +127,30 @@ n = 5 @test QS isa Array{eltype(Q),0} end - @testset "matrix division" begin - q, r = F - R = randn(Float64, 5, 5) - @test q / r ≈ Matrix(q) / r - @test_throws DimensionMismatch MyQ(q) / r # doesn't have size flexibility - @test q / R ≈ collect(q) / R - @test copy(r') \ q' ≈ (q / r)' - @test_throws DimensionMismatch copy(r') \ MyQ(q') - @test r \ q' ≈ r \ Matrix(q)' - @test R \ q' ≈ R \ MyQ(q') ≈ R \ collect(q') - @test R \ q ≈ R \ MyQ(q) ≈ R \ collect(q) - B = copy(A') - G = lq(B) - l, q = G - L = R - @test l \ q ≈ l \ Matrix(q) - @test_throws DimensionMismatch l \ MyQ(q) - @test L \ q ≈ L \ collect(q) - @test q' / copy(l') ≈ (l \ q)' - @test_throws DimensionMismatch MyQ(q') / copy(l') - @test q' / l ≈ Matrix(q)' / l - @test q' / L ≈ MyQ(q') / L ≈ collect(q)' / L - @test q / L ≈ Matrix(q) / L - @test MyQ(q) / L ≈ collect(q) / L - end + # matrix division + q, r = F + R = randn(Float64, 5, 5) + @test q / r ≈ Matrix(q) / r + @test_throws DimensionMismatch MyQ(q) / r # doesn't have size flexibility + @test q / R ≈ collect(q) / R + @test copy(r') \ q' ≈ (q / r)' + @test_throws DimensionMismatch copy(r') \ MyQ(q') + @test r \ q' ≈ r \ Matrix(q)' + @test R \ q' ≈ R \ MyQ(q') ≈ R \ collect(q') + @test R \ q ≈ R \ MyQ(q) ≈ R \ collect(q) + B = copy(A') + G = lq(B) + l, q = G + L = R + @test l \ q ≈ l \ Matrix(q) + @test_throws DimensionMismatch l \ MyQ(q) + @test L \ q ≈ L \ collect(q) + @test q' / copy(l') ≈ (l \ q)' + @test_throws DimensionMismatch MyQ(q') / copy(l') + @test q' / l ≈ Matrix(q)' / l + @test q' / L ≈ MyQ(q') / L ≈ collect(q)' / L + @test q / L ≈ Matrix(q) / L + @test MyQ(q) / L ≈ collect(q) / L end end # module