From bfd53e0a25ef3cb26b40a63b2c7e479f971f8f2f Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 25 Jun 2021 00:28:40 +0530 Subject: [PATCH 01/23] Float 16 factors --- stdlib/LinearAlgebra/src/cholesky.jl | 6 ++++++ stdlib/LinearAlgebra/src/eigen.jl | 7 +++++++ stdlib/LinearAlgebra/src/svd.jl | 6 ++++++ stdlib/LinearAlgebra/test/cholesky.jl | 9 +++++++++ stdlib/LinearAlgebra/test/eigen.jl | 8 ++++++++ stdlib/LinearAlgebra/test/svd.jl | 9 +++++++++ 6 files changed, 45 insertions(+) diff --git a/stdlib/LinearAlgebra/src/cholesky.jl b/stdlib/LinearAlgebra/src/cholesky.jl index 6e381243faf43..76a6f50a124ce 100644 --- a/stdlib/LinearAlgebra/src/cholesky.jl +++ b/stdlib/LinearAlgebra/src/cholesky.jl @@ -388,6 +388,12 @@ true cholesky(A::Union{StridedMatrix,RealHermSymComplexHerm{<:Real,<:StridedMatrix}}, ::Val{false}=Val(false); check::Bool = true) = cholesky!(cholcopy(A); check = check) +function cholesky(A::Union{StridedMatrix{T},RealHermSymComplexHerm{<:T,<:StridedMatrix}}, ::Val{false}=Val(false); check::Bool = true) where T<:Float16 + X = cholesky!(cholcopy(A); check = check) + Xnew = convert(AbstractMatrix{T}, X.factors) + Cholesky{T, typeof(Xnew)}(Xnew, X.uplo, X.info) +end + ## With pivoting """ diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 3341a2a9bc744..c54b5597540b1 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -275,6 +275,13 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) return eigen!(AA; permute=permute, scale=scale, sortby=sortby, jvl=jvl, jvr=jvr, jce=jce, jcv=jcv) end +function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where T<:Float16 + AA = copy_oftype(A, eigtype(T)) + isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) + A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) + Eigen(convert(Vector{Float16}, A.values), + convert(AbstractArray{Float16}, A.vectors)) +end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) """ diff --git a/stdlib/LinearAlgebra/src/svd.jl b/stdlib/LinearAlgebra/src/svd.jl index dca1cfaaf1e73..cf8c272a894ea 100644 --- a/stdlib/LinearAlgebra/src/svd.jl +++ b/stdlib/LinearAlgebra/src/svd.jl @@ -175,6 +175,12 @@ true function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T} svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) end +function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T<:Float16} + A=svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) + SVD(convert(AbstractArray{Float16}, A.U), + convert(Vector{Float16}, A.S), + convert(AbstractArray{Float16}, A.Vt)) +end function svd(x::Number; full::Bool = false, alg::Algorithm = default_svd_alg(x)) SVD(x == 0 ? fill(one(x), 1, 1) : fill(x/abs(x), 1, 1), [abs(x)], fill(one(x), 1, 1)) end diff --git a/stdlib/LinearAlgebra/test/cholesky.jl b/stdlib/LinearAlgebra/test/cholesky.jl index 83aed94de9e35..6ba635593433c 100644 --- a/stdlib/LinearAlgebra/test/cholesky.jl +++ b/stdlib/LinearAlgebra/test/cholesky.jl @@ -483,4 +483,13 @@ end @test F\b == F'\b end +@testset "Float16" begin + A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] + B = cholesky(A) + @test B isa Cholesky{Float16, Matrix{Float16}} + @test B.U isa UpperTriangular{Float16, Matrix{Float16}} + @test B.L isa LowerTriangular{Float16, Matrix{Float16}} + @test B.UL isa UpperTriangular{Float16, Matrix{Float16}} +end + end # module TestCholesky diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 6ac0dc6852df9..339d108e1de7e 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -177,4 +177,12 @@ end @test isequal(eigen(A), eigen(A)) end +@testset "Float16" begin + A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] + B = eigen(A) + @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} + @test B.values isa Vector{Float16} + @test B.vectors isa Matrix{Float16} +end + end # module TestEigen diff --git a/stdlib/LinearAlgebra/test/svd.jl b/stdlib/LinearAlgebra/test/svd.jl index e9361f65a1bca..820509b7aae70 100644 --- a/stdlib/LinearAlgebra/test/svd.jl +++ b/stdlib/LinearAlgebra/test/svd.jl @@ -248,4 +248,13 @@ end end end +@testset "Float16" begin + A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] + B = svd(A) + @test B isa SVD{Float16, Float16, Matrix{Float16}} + @test B.U isa Matrix{Float16} + @test B.Vt isa Matrix{Float16} + @test B.S isa Vector{Float16} +end + end # module TestSVD From 6ce856108500c230c1509e8dbe361ad375e0ceca Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 15:03:36 +0530 Subject: [PATCH 02/23] Update stdlib/LinearAlgebra/src/eigen.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/eigen.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index c54b5597540b1..8dd42ccea30d8 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -275,8 +275,8 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) return eigen!(AA; permute=permute, scale=scale, sortby=sortby, jvl=jvl, jvr=jvr, jce=jce, jcv=jcv) end -function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where T<:Float16 - AA = copy_oftype(A, eigtype(T)) +function eigen(A::AbstractMatrix{Float16}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) + AA = copy_oftype(A, eigtype(Float16)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) Eigen(convert(Vector{Float16}, A.values), From 2a5acfa52b18284ad486382cd28a8f108b50e76d Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 15:11:32 +0530 Subject: [PATCH 03/23] Update stdlib/LinearAlgebra/src/cholesky.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/cholesky.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stdlib/LinearAlgebra/src/cholesky.jl b/stdlib/LinearAlgebra/src/cholesky.jl index 76a6f50a124ce..2ad2135da5d9c 100644 --- a/stdlib/LinearAlgebra/src/cholesky.jl +++ b/stdlib/LinearAlgebra/src/cholesky.jl @@ -388,10 +388,9 @@ true cholesky(A::Union{StridedMatrix,RealHermSymComplexHerm{<:Real,<:StridedMatrix}}, ::Val{false}=Val(false); check::Bool = true) = cholesky!(cholcopy(A); check = check) -function cholesky(A::Union{StridedMatrix{T},RealHermSymComplexHerm{<:T,<:StridedMatrix}}, ::Val{false}=Val(false); check::Bool = true) where T<:Float16 +function cholesky(A::Union{StridedMatrix{Float16},RealHermSymComplexHerm{Float16,<:StridedMatrix}}, ::Val{false}=Val(false); check::Bool = true) X = cholesky!(cholcopy(A); check = check) - Xnew = convert(AbstractMatrix{T}, X.factors) - Cholesky{T, typeof(Xnew)}(Xnew, X.uplo, X.info) + return Cholesky{Float16}(X) end From 226e098cdd8ea5c75a6c03c4c765638aca15744a Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 25 Jun 2021 15:53:48 +0530 Subject: [PATCH 04/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index c54b5597540b1..4178e844bc482 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -275,13 +275,18 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) return eigen!(AA; permute=permute, scale=scale, sortby=sortby, jvl=jvl, jvr=jvr, jce=jce, jcv=jcv) end -function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where T<:Float16 - AA = copy_oftype(A, eigtype(T)) +function eigen(A::AbstractMatrix{Float16}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) + AA = copy_oftype(A, eigtype(Float16)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) - Eigen(convert(Vector{Float16}, A.values), - convert(AbstractArray{Float16}, A.vectors)) -end + if isreal(A.values) == false + Eigen(convert(Vector{Complex{Float16}}, A.values), + convert(AbstractArray{Complex{Float16}}, A.vectors)) + else + Eigen(convert(Vector{Float16}, A.values), + convert(AbstractArray{Float16}, A.vectors)) + end +end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) """ From 0bb1904f6c4ca61ae27ec3d60d70f27b1b656995 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 16:05:12 +0530 Subject: [PATCH 05/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 4178e844bc482..a5d40bb9c535f 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -286,7 +286,7 @@ function eigen(A::AbstractMatrix{Float16}; permute::Bool=true, scale::Bool=true, Eigen(convert(Vector{Float16}, A.values), convert(AbstractArray{Float16}, A.vectors)) end -end +end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) """ From 7f41e64c30de1215ab5502681bd1895a282c08f8 Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 25 Jun 2021 16:07:47 +0530 Subject: [PATCH 06/23] Update svd.jl --- stdlib/LinearAlgebra/src/svd.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/stdlib/LinearAlgebra/src/svd.jl b/stdlib/LinearAlgebra/src/svd.jl index cf8c272a894ea..b7a87e1d6bb21 100644 --- a/stdlib/LinearAlgebra/src/svd.jl +++ b/stdlib/LinearAlgebra/src/svd.jl @@ -175,11 +175,9 @@ true function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T} svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) end -function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T<:Float16} +function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T <: Union{Float16,Complex{Float16}} A=svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) - SVD(convert(AbstractArray{Float16}, A.U), - convert(Vector{Float16}, A.S), - convert(AbstractArray{Float16}, A.Vt)) + return SVD{T}(A) end function svd(x::Number; full::Bool = false, alg::Algorithm = default_svd_alg(x)) SVD(x == 0 ? fill(one(x), 1, 1) : fill(x/abs(x), 1, 1), [abs(x)], fill(one(x), 1, 1)) From 5f3bf76b6a7406bfb37875b79823e7797c859a66 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 16:17:00 +0530 Subject: [PATCH 07/23] Update stdlib/LinearAlgebra/src/eigen.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/eigen.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index a5d40bb9c535f..4941e8449d04f 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -279,12 +279,12 @@ function eigen(A::AbstractMatrix{Float16}; permute::Bool=true, scale::Bool=true, AA = copy_oftype(A, eigtype(Float16)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) - if isreal(A.values) == false - Eigen(convert(Vector{Complex{Float16}}, A.values), - convert(AbstractArray{Complex{Float16}}, A.vectors)) - else + if isreal(A.values) Eigen(convert(Vector{Float16}, A.values), convert(AbstractArray{Float16}, A.vectors)) + else + Eigen(convert(Vector{Complex{Float16}}, A.values), + convert(AbstractArray{Complex{Float16}}, A.vectors)) end end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) From 1ffd9c7c8efd4e6e6320874a05f54a085f375efe Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 16:17:14 +0530 Subject: [PATCH 08/23] Update stdlib/LinearAlgebra/src/svd.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/svd.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/svd.jl b/stdlib/LinearAlgebra/src/svd.jl index b7a87e1d6bb21..cd21b46d33f45 100644 --- a/stdlib/LinearAlgebra/src/svd.jl +++ b/stdlib/LinearAlgebra/src/svd.jl @@ -176,7 +176,7 @@ function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) end function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T <: Union{Float16,Complex{Float16}} - A=svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) + A = svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) return SVD{T}(A) end function svd(x::Number; full::Bool = false, alg::Algorithm = default_svd_alg(x)) From 641c408996682063fe0b67765a33fd39b00c5832 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 16:44:25 +0530 Subject: [PATCH 09/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 4941e8449d04f..1b293cf707694 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -275,7 +275,7 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) return eigen!(AA; permute=permute, scale=scale, sortby=sortby, jvl=jvl, jvr=jvr, jce=jce, jcv=jcv) end -function eigen(A::AbstractMatrix{Float16}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) +function eigen(A::AbstractMatrix{Union{Float16,Complex{Float16}}}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) AA = copy_oftype(A, eigtype(Float16)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) From d721eac8e67837655a74d10d6c080d5120f2881f Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Fri, 25 Jun 2021 17:09:14 +0530 Subject: [PATCH 10/23] Update stdlib/LinearAlgebra/src/svd.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/svd.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/svd.jl b/stdlib/LinearAlgebra/src/svd.jl index cd21b46d33f45..bee4c8451c0a6 100644 --- a/stdlib/LinearAlgebra/src/svd.jl +++ b/stdlib/LinearAlgebra/src/svd.jl @@ -175,7 +175,7 @@ true function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T} svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) end -function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T <: Union{Float16,Complex{Float16}} +function svd(A::StridedVecOrMat{T}; full::Bool = false, alg::Algorithm = default_svd_alg(A)) where {T <: Union{Float16,Complex{Float16}}} A = svd!(copy_oftype(A, eigtype(T)), full = full, alg = alg) return SVD{T}(A) end From fd459bbebbcaa61f0dc06f3957cc1f4feb3740bd Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 25 Jun 2021 18:10:34 +0530 Subject: [PATCH 11/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 1b293cf707694..64376c99db968 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -275,8 +275,8 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) return eigen!(AA; permute=permute, scale=scale, sortby=sortby, jvl=jvl, jvr=jvr, jce=jce, jcv=jcv) end -function eigen(A::AbstractMatrix{Union{Float16,Complex{Float16}}}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) - AA = copy_oftype(A, eigtype(Float16)) +function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where {T <: Union{Float16,Complex{Float16}}} + AA = copy_oftype(A, eigtype(T)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) if isreal(A.values) From 973b22acb821b021fc68c53bfe4c1e1541743046 Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 25 Jun 2021 18:17:58 +0530 Subject: [PATCH 12/23] Update eigen.jl --- stdlib/LinearAlgebra/test/eigen.jl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 339d108e1de7e..29d7e04713321 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -180,9 +180,19 @@ end @testset "Float16" begin A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] B = eigen(A) + C = Float16[3 -2; 4 -1] + D = eigen(C) + E = complex(C) + F = eigen(E) @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} + @test D isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} + @test D.values isa Vector{ComplexF16} + @test D.vectors isa Matrix{ComplexF16} + @test F isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} + @test F.values isa Vector{ComplexF16} + @test F.vectors isa Matrix{ComplexF16} end end # module TestEigen From 85169ed3808484cb229fa8679a458d87aa2760bf Mon Sep 17 00:00:00 2001 From: Arun Date: Sat, 26 Jun 2021 07:30:38 +0530 Subject: [PATCH 13/23] Update eigen.jl --- stdlib/LinearAlgebra/test/eigen.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 29d7e04713321..8a8d39a940c07 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -187,12 +187,21 @@ end @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} + @test B.rcondv isa Vector{Float16} + @test B.rconde isa Vector{Float16} + @test B.vectorsl isa Matrix{Float16} @test D isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test D.values isa Vector{ComplexF16} @test D.vectors isa Matrix{ComplexF16} + @test D.rcondv isa Vector{Float16} + @test D.rconde isa Vector{Float16} + @test D.vectorsl isa Matrix{ComplexF16} @test F isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test F.values isa Vector{ComplexF16} @test F.vectors isa Matrix{ComplexF16} + @test F.rcondv isa Vector{Float16} + @test F.rconde isa Vector{Float16} + @test F.vectorsl isa Matrix{ComplexF16} end end # module TestEigen From 27ea310e2a37f6e33916167ec32aec4b8cb656c6 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sat, 26 Jun 2021 17:27:31 +0530 Subject: [PATCH 14/23] Update eigen.jl --- stdlib/LinearAlgebra/test/eigen.jl | 9 --------- 1 file changed, 9 deletions(-) diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 8a8d39a940c07..29d7e04713321 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -187,21 +187,12 @@ end @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} - @test B.rcondv isa Vector{Float16} - @test B.rconde isa Vector{Float16} - @test B.vectorsl isa Matrix{Float16} @test D isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test D.values isa Vector{ComplexF16} @test D.vectors isa Matrix{ComplexF16} - @test D.rcondv isa Vector{Float16} - @test D.rconde isa Vector{Float16} - @test D.vectorsl isa Matrix{ComplexF16} @test F isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test F.values isa Vector{ComplexF16} @test F.vectors isa Matrix{ComplexF16} - @test F.rcondv isa Vector{Float16} - @test F.rconde isa Vector{Float16} - @test F.vectorsl isa Matrix{ComplexF16} end end # module TestEigen From a9951a7c7119c1b647915a4fe1fd4c59b62cc13f Mon Sep 17 00:00:00 2001 From: Arun Date: Sat, 26 Jun 2021 20:17:10 +0530 Subject: [PATCH 15/23] Added type converter for Eigen. --- stdlib/LinearAlgebra/src/eigen.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 64376c99db968..cdde4ce5811d5 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -57,6 +57,13 @@ struct Eigen{T,V,S<:AbstractMatrix,U<:AbstractVector,R<:AbstractVector} <: Facto Eigen{T,V,S,U,R}(values::AbstractVector{V}, vectors::AbstractMatrix{T}, vectorsl::AbstractMatrix{T}, unitary::Bool, rconde::R, rcondv::R) where {T,V,S,U,R} = new(values, vectors, vectorsl, unitary, rconde, rcondv) end +Eigen{T}(F::Eigen) where {T} = Eigen( + convert(AbstractVector{T}, F.values), + convert(AbstractMatrix{T}, F.vectors), + convert(AbstractMatrix{T}, F.vectorsl), + F.unitary::Bool, + convert(AbstractVector{T}, F.rconde), + convert(AbstractVector{T}, F.rcondv)) Eigen(values::AbstractVector{V}, vectors::AbstractMatrix{T}, vectorsl=vectors, uni=true, rce=zeros(real(T),0), rcv=zeros(real(T), 0)) where {T,V} = Eigen{T,V,typeof(vectors),typeof(values),typeof(rce)}(values, vectors, vectorsl, uni, rce, rcv) From ff71500bd54fc548bf5bdba312cff1a89f0a8763 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sat, 26 Jun 2021 20:54:35 +0530 Subject: [PATCH 16/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 7 ------- 1 file changed, 7 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index cdde4ce5811d5..64376c99db968 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -57,13 +57,6 @@ struct Eigen{T,V,S<:AbstractMatrix,U<:AbstractVector,R<:AbstractVector} <: Facto Eigen{T,V,S,U,R}(values::AbstractVector{V}, vectors::AbstractMatrix{T}, vectorsl::AbstractMatrix{T}, unitary::Bool, rconde::R, rcondv::R) where {T,V,S,U,R} = new(values, vectors, vectorsl, unitary, rconde, rcondv) end -Eigen{T}(F::Eigen) where {T} = Eigen( - convert(AbstractVector{T}, F.values), - convert(AbstractMatrix{T}, F.vectors), - convert(AbstractMatrix{T}, F.vectorsl), - F.unitary::Bool, - convert(AbstractVector{T}, F.rconde), - convert(AbstractVector{T}, F.rcondv)) Eigen(values::AbstractVector{V}, vectors::AbstractMatrix{T}, vectorsl=vectors, uni=true, rce=zeros(real(T),0), rcv=zeros(real(T), 0)) where {T,V} = Eigen{T,V,typeof(vectors),typeof(values),typeof(rce)}(values, vectors, vectorsl, uni, rce, rcv) From 9924e716bad6ebdb2ac6e3752b5af3fb82fbb2d8 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sat, 26 Jun 2021 20:54:48 +0530 Subject: [PATCH 17/23] Update stdlib/LinearAlgebra/src/eigen.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/eigen.jl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 64376c99db968..6f6dcbfd2979a 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -279,13 +279,10 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb AA = copy_oftype(A, eigtype(T)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) - if isreal(A.values) - Eigen(convert(Vector{Float16}, A.values), - convert(AbstractArray{Float16}, A.vectors)) - else - Eigen(convert(Vector{Complex{Float16}}, A.values), - convert(AbstractArray{Complex{Float16}}, A.vectors)) - end + values = convert(AbstractVector{isreal(A.values) ? Float16 : Complex{Float16}}, A.values) + vectors = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectors) + vectorsl = convert(AbstractMatrix{isreal(A.vectorsl) ? Float16 : Complex{Float16}}, A.vectorsl) + return Eigen(values, vectors, vectorsl, A.unitary, A.rconde, A.rcondv) end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) From 3ca6c902074f8b5544da20e9d931ce065c0f90c9 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sat, 26 Jun 2021 22:39:35 +0530 Subject: [PATCH 18/23] Update stdlib/LinearAlgebra/src/eigen.jl Co-authored-by: Daniel Karrasch --- stdlib/LinearAlgebra/src/eigen.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 6f6dcbfd2979a..997ddb74a96f6 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -281,7 +281,7 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) values = convert(AbstractVector{isreal(A.values) ? Float16 : Complex{Float16}}, A.values) vectors = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectors) - vectorsl = convert(AbstractMatrix{isreal(A.vectorsl) ? Float16 : Complex{Float16}}, A.vectorsl) + vectorsl = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectorsl) return Eigen(values, vectors, vectorsl, A.unitary, A.rconde, A.rcondv) end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) From 63fcccf982e429e7d7e899fb2992ab1de1b7ed3c Mon Sep 17 00:00:00 2001 From: Arun Date: Sat, 26 Jun 2021 23:39:26 +0530 Subject: [PATCH 19/23] updates --- stdlib/LinearAlgebra/src/eigen.jl | 4 +++- stdlib/LinearAlgebra/test/cholesky.jl | 4 ++++ stdlib/LinearAlgebra/test/eigen.jl | 15 +++++++++++++++ stdlib/LinearAlgebra/test/svd.jl | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 997ddb74a96f6..069ac6bca83ae 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -282,7 +282,9 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb values = convert(AbstractVector{isreal(A.values) ? Float16 : Complex{Float16}}, A.values) vectors = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectors) vectorsl = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectorsl) - return Eigen(values, vectors, vectorsl, A.unitary, A.rconde, A.rcondv) + rconde = convert(Vector{isreal(A.rconde) ? Float16 : Complex{Float16}}, A.rconde) + rcondv = convert(Vector{isreal(A.rcondv) ? Float16 : Complex{Float16}}, A.rcondv) + return Eigen(values, vectors, vectorsl, A.unitary, rconde, rcondv) end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) diff --git a/stdlib/LinearAlgebra/test/cholesky.jl b/stdlib/LinearAlgebra/test/cholesky.jl index 6ba635593433c..53a18c4a62186 100644 --- a/stdlib/LinearAlgebra/test/cholesky.jl +++ b/stdlib/LinearAlgebra/test/cholesky.jl @@ -486,10 +486,14 @@ end @testset "Float16" begin A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] B = cholesky(A) + B32 = cholesky(Float32.(A)) @test B isa Cholesky{Float16, Matrix{Float16}} @test B.U isa UpperTriangular{Float16, Matrix{Float16}} @test B.L isa LowerTriangular{Float16, Matrix{Float16}} @test B.UL isa UpperTriangular{Float16, Matrix{Float16}} + @test B.U ≈ B32.U + @test B.L ≈ B32.L + @test B.UL ≈ B32.UL end end # module TestCholesky diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 29d7e04713321..927160b724bce 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -180,19 +180,34 @@ end @testset "Float16" begin A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] B = eigen(A) + B32 = eigen(Float32.(A)) C = Float16[3 -2; 4 -1] D = eigen(C) + D32 = eigen(Float32.(C)) E = complex(C) F = eigen(E) + F32 = eigen(Float32.(E)) @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} + @test B.vectorsl is Matrix{Float16} + @test B.values ≈ B32.values + @test B.vectors ≈ B32.vectors + @test B.vectorsl ≈ B32.vectorsl @test D isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test D.values isa Vector{ComplexF16} @test D.vectors isa Matrix{ComplexF16} + @test D.vectorsl isa Matrix{ComplexF16} + @test D.values ≈ D32.values + @test D.vectors ≈ D32.vectors + @test D.vectorsl ≈ D32.vectorsl @test F isa Eigen{ComplexF16, ComplexF16, Matrix{ComplexF16}, Vector{ComplexF16}, Vector{Float16}} @test F.values isa Vector{ComplexF16} @test F.vectors isa Matrix{ComplexF16} + @test F.vectorsl isa Matrix{ComplexF16} + @test F.values ≈ F32.values + @test F.vectors ≈ F32.vectors + @test F.vectorsl ≈ F32.vectorsl end end # module TestEigen diff --git a/stdlib/LinearAlgebra/test/svd.jl b/stdlib/LinearAlgebra/test/svd.jl index 820509b7aae70..8bd3edadc911d 100644 --- a/stdlib/LinearAlgebra/test/svd.jl +++ b/stdlib/LinearAlgebra/test/svd.jl @@ -251,10 +251,14 @@ end @testset "Float16" begin A = Float16[4. 12. -16.; 12. 37. -43.; -16. -43. 98.] B = svd(A) + B32 = svd(Float32.(A)) @test B isa SVD{Float16, Float16, Matrix{Float16}} @test B.U isa Matrix{Float16} @test B.Vt isa Matrix{Float16} @test B.S isa Vector{Float16} + @test B.U ≈ B32.U + @test B.Vt ≈ B32.Vt + @test B.S ≈ B32.S end end # module TestSVD From 7be61147f1e6d059619da72c663c2b09911700d4 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sun, 27 Jun 2021 01:06:52 +0530 Subject: [PATCH 20/23] Update eigen.jl --- stdlib/LinearAlgebra/test/eigen.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index 927160b724bce..a8129532321a0 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -190,7 +190,7 @@ end @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} - @test B.vectorsl is Matrix{Float16} + @test B.vectorsl isa Matrix{Float16} @test B.values ≈ B32.values @test B.vectors ≈ B32.vectors @test B.vectorsl ≈ B32.vectorsl From 5a58bfadc4aebfae109c360f1469eda37160bfb2 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sun, 27 Jun 2021 01:09:31 +0530 Subject: [PATCH 21/23] Update eigen.jl --- stdlib/LinearAlgebra/src/eigen.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index 069ac6bca83ae..aa58c055231a1 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -282,8 +282,8 @@ function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortb values = convert(AbstractVector{isreal(A.values) ? Float16 : Complex{Float16}}, A.values) vectors = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectors) vectorsl = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectorsl) - rconde = convert(Vector{isreal(A.rconde) ? Float16 : Complex{Float16}}, A.rconde) - rcondv = convert(Vector{isreal(A.rcondv) ? Float16 : Complex{Float16}}, A.rcondv) + rconde = convert(Vector{Float16}, A.rconde) + rcondv = convert(Vector{Float16}, A.rcondv) return Eigen(values, vectors, vectorsl, A.unitary, rconde, rcondv) end eigen(x::Number) = Eigen([x], fill(one(x), 1, 1)) From e303b10c172935633053e5ad78022b63adddbea5 Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Sun, 27 Jun 2021 08:38:20 +0530 Subject: [PATCH 22/23] Update eigen.jl --- stdlib/LinearAlgebra/test/eigen.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stdlib/LinearAlgebra/test/eigen.jl b/stdlib/LinearAlgebra/test/eigen.jl index a8129532321a0..e87fc9cec1832 100644 --- a/stdlib/LinearAlgebra/test/eigen.jl +++ b/stdlib/LinearAlgebra/test/eigen.jl @@ -184,9 +184,8 @@ end C = Float16[3 -2; 4 -1] D = eigen(C) D32 = eigen(Float32.(C)) - E = complex(C) - F = eigen(E) - F32 = eigen(Float32.(E)) + F = eigen(complex(C)) + F32 = eigen(complex(Float32.(C))) @test B isa Eigen{Float16, Float16, Matrix{Float16}, Vector{Float16}, Vector{Float16}} @test B.values isa Vector{Float16} @test B.vectors isa Matrix{Float16} From 31d40195a9109340755e6b30167b51c30a841d4e Mon Sep 17 00:00:00 2001 From: Arun sanganal <74652697+ArunSanganal@users.noreply.github.com> Date: Mon, 28 Jun 2021 07:45:25 +0530 Subject: [PATCH 23/23] Update stdlib/LinearAlgebra/src/eigen.jl Co-authored-by: Fredrik Bagge Carlson --- stdlib/LinearAlgebra/src/eigen.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/eigen.jl b/stdlib/LinearAlgebra/src/eigen.jl index aa58c055231a1..27207541b3d5a 100644 --- a/stdlib/LinearAlgebra/src/eigen.jl +++ b/stdlib/LinearAlgebra/src/eigen.jl @@ -278,7 +278,7 @@ end function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where {T <: Union{Float16,Complex{Float16}}} AA = copy_oftype(A, eigtype(T)) isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby) - A = eigen!(AA; permute=permute, scale=scale, sortby=sortby) + A = eigen!(AA; permute, scale, sortby) values = convert(AbstractVector{isreal(A.values) ? Float16 : Complex{Float16}}, A.values) vectors = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectors) vectorsl = convert(AbstractMatrix{isreal(A.vectors) ? Float16 : Complex{Float16}}, A.vectorsl)