From 212981bf29b03ba460d3251ee9aa4399931b3f2d Mon Sep 17 00:00:00 2001 From: Daniel Karrasch Date: Thu, 16 Jan 2025 10:33:54 +0100 Subject: [PATCH] Solve with `AdjointFactorization` of Cholmod and `Adjoint` rhs (#595) Fixes #594. --- src/solvers/cholmod.jl | 3 ++- test/cholmod.jl | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/solvers/cholmod.jl b/src/solvers/cholmod.jl index 2770bf48..2d282099 100644 --- a/src/solvers/cholmod.jl +++ b/src/solvers/cholmod.jl @@ -15,7 +15,7 @@ import Base: (*), convert, copy, eltype, getindex, getproperty, show, size, using Base: require_one_based_indexing using LinearAlgebra -using LinearAlgebra: RealHermSymComplexHerm, AdjOrTrans +using LinearAlgebra: RealHermSymComplexHerm, AdjOrTrans, AdjOrTransAbsMat import LinearAlgebra: (\), AdjointFactorization, cholesky, cholesky!, det, diag, ishermitian, isposdef, issuccess, issymmetric, ldiv!, ldlt, ldlt!, logdet, @@ -1928,6 +1928,7 @@ function \(adjL::AdjointFactorization{<:VTypes,<:Factor}, B::StridedMatrix) L = adjL.parent return Matrix(solve(CHOLMOD_A, L, Dense(B))) end +(\)(adjL::AdjointFactorization{<:VTypes,<:Factor}, B::AdjOrTransAbsMat) = adjL \ copy(B) const RealHermSymComplexHermSSL{Ti, Tr} = Union{ Symmetric{Tr, SparseMatrixCSC{Tr, Ti}}, diff --git a/test/cholmod.jl b/test/cholmod.jl index cbcc0ea9..113a66ab 100644 --- a/test/cholmod.jl +++ b/test/cholmod.jl @@ -1019,6 +1019,21 @@ end # @test_throws ErrorException cholesky(view(A, :, :), NoPivot()) end +@testset "solve with adjoint factorization and adjoint rhs" begin + n = 10 + A = sprand(Tv, n, n, 1/n) + A = A + A' + 10I + + B = rand(n, 2) + Bt = Matrix(B') + Bts = sparse(B') + + F = cholesky(A)' + @test F \ B ≈ F \ Bt' + @test F \ B ≈ F \ Bts' + @test issparse(F \ Bts') +end + end # for Tv ∈ (Float32, Float64) end # Base.USE_GPL_LIBS