Skip to content

Commit 84b21d7

Browse files
committed
copy over basic cholesky support from old code. Just needs more ctors
1 parent 056b5ea commit 84b21d7

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

src/SuiteSparseGraphBLAS.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ include("mmread.jl")
106106
include("iterator.jl")
107107
include("solvers/klu.jl")
108108
include("solvers/umfpack.jl")
109+
include("solvers/cholmod.jl")
109110

110111
export SparseArrayCompat
111112
export LibGraphBLAS

src/solvers/cholmod.jl

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
module GBCHOLMOD
2+
import Base: (\), getproperty, show, size
3+
using LinearAlgebra
4+
import LinearAlgebra: (\),
5+
cholesky, cholesky!, det, diag, ishermitian, isposdef,
6+
issuccess, issymmetric, ldlt, ldlt!, logdet
7+
using ..SuiteSparseGraphBLAS: AbstractGBMatrix, AbstractGBVector, unsafepack!, unsafeunpack!, GBMatrix,
8+
GBVector, AbstractGBArray, LibGraphBLAS, ColMajor, sparsitystatus,
9+
_sizedjlmalloc, increment!, isshallow, nnz, tempunpack!, storedeltype
10+
using SuiteSparseGraphBLAS
11+
12+
using StorageOrders
13+
14+
import ..increment, ..increment!, ..decrement, ..decrement!
15+
16+
using SuiteSparse.LibSuiteSparse
17+
using SuiteSparse.CHOLMOD
18+
using SuiteSparse.CHOLMOD: VTypes, cholesky, cholesky!, ldlt!, Factor, FactorComponent,
19+
spsolve, CHOLMOD_A, change_stype!
20+
21+
function CHOLMOD.Sparse(A::AbstractGBMatrix{T}, stype::Integer) where T
22+
colptr, rowval, nzval, repack! = tempunpack!(A, SuiteSparseGraphBLAS.Sparse(); order = ColMajor())
23+
nzval = !(T <: VTypes) ? promote_type(T, Float64).(nzval) : nzval
24+
C = try
25+
CHOLMOD.Sparse(size(A)..., colptr, rowval, nzval, stype)
26+
catch
27+
rethrow()
28+
finally
29+
repack!()
30+
end
31+
if ishermitian(C)
32+
change_stype!(C, -1)
33+
end
34+
return C
35+
end
36+
CHOLMOD.Sparse(A::AbstractGBMatrix) = CHOLMOD.Sparse(A, 0)
37+
CHOLMOD.Sparse(A::Symmetric{Tv, AbstractGBMatrix{Tv}}) where {Tv<:Real} =
38+
CHOLMOD.Sparse(A.data, A.uplo == 'L' ? -1 : 1)
39+
CHOLMOD.Sparse(A::Hermitian{Tv,AbstractGBMatrix{Tv}}) where {Tv} =
40+
CHOLMOD.Sparse(A.data, A.uplo == 'L' ? -1 : 1)
41+
42+
function CHOLMOD.Dense(A::AbstractGBMatrix)
43+
x, repack! = tempunpack!(A, SuiteSparseGraphBLAS.Dense(); order = ColMajor())
44+
return try
45+
CHOLMOD.Dense(x)
46+
catch
47+
rethrow()
48+
finally
49+
repack!()
50+
end
51+
end
52+
53+
# TODO: Dense -> GBMatrix
54+
55+
LinearAlgebra.cholesky!(F::Factor, A::Union{AbstractGBMatrix{T},
56+
AbstractGBMatrix{Complex{T}},
57+
Symmetric{T,AbstractGBMatrix{T}},
58+
Hermitian{Complex{T},AbstractGBMatrix{Complex{T}}},
59+
Hermitian{T,AbstractGBMatrix{T}}};
60+
shift = 0.0, check::Bool = true) where {T<:Real} =
61+
CHOLMOD.cholesky!(F, CHOLMOD.Sparse(A); shift = shift, check = check)
62+
63+
LinearAlgebra.cholesky(A::Union{AbstractGBMatrix{T}, AbstractGBMatrix{Complex{T}},
64+
Symmetric{T,AbstractGBMatrix{T}},
65+
Hermitian{Complex{T},AbstractGBMatrix{Complex{T}}},
66+
Hermitian{T,AbstractGBMatrix{T}}};
67+
kws...) where {T<:Real} = CHOLMOD.cholesky(CHOLMOD.Sparse(A); kws...)
68+
69+
LinearAlgebra.ldlt!(F::Factor, A::Union{AbstractGBMatrix{T},
70+
AbstractGBMatrix{Complex{T}},
71+
Symmetric{T,AbstractGBMatrix{T}},
72+
Hermitian{Complex{T},AbstractGBMatrix{Complex{T}}},
73+
Hermitian{T,AbstractGBMatrix{T}}};
74+
shift = 0.0, check::Bool = true) where {T<:Real} =
75+
CHOLMOD.ldlt!(F, CHOLMOD.Sparse(A), shift = shift, check = check)
76+
77+
LinearAlgebra.ldlt(A::Union{AbstractGBMatrix{T},AbstractGBMatrix{Complex{T}},
78+
Symmetric{T,AbstractGBMatrix{T}},
79+
Hermitian{Complex{T},AbstractGBMatrix{Complex{T}}},
80+
Hermitian{T,AbstractGBMatrix{T}}};
81+
kws...) where {T<:Real} = CHOLMOD.ldlt(CHOLMOD.Sparse(A); kws...)
82+
83+
function (\)(L::FactorComponent, B::AbstractGBArray)
84+
sparse(L\CHOLMOD.Sparse(B,0))
85+
end
86+
87+
(\)(L::FactorComponent, B::Adjoint{<:Any,<:AbstractGBMatrix}) = L \ copy(B)
88+
(\)(L::FactorComponent, B::Transpose{<:Any,<:AbstractGBMatrix}) = L \ copy(B)
89+
\(adjL::Adjoint{<:Any,<:FactorComponent}, B::Union{VecOrMat,AbstractGBArray}) = (L = adjL.parent; adjoint(L)\B)
90+
(\)(L::Factor, B::S) where {S<:AbstractGBMatrix} = S(spsolve(CHOLMOD_A, L, CHOLMOD.Sparse(B, 0)))
91+
(\)(L::Factor, B::Adjoint{<:Any,<:AbstractGBMatrix}) = L \ copy(B)
92+
(\)(L::Factor, B::Transpose{<:Any,<:AbstractGBMatrix}) = L \ copy(B)
93+
(\)(L::Factor, B::V) where {V<:AbstractGBVector} = V(spsolve(CHOLMOD_A, L, CHOLMOD.Sparse(B)))
94+
\(adjL::Adjoint{<:Any,<:Factor}, B::AbstractGBArray) = (L = adjL.parent; \(adjoint(L), CHOLMOD.Sparse(B)))
95+
96+
# TODO: 1681 -> 1693
97+
# TODO: Correct Adjoint copy for GBMatrices
98+
# Dense -> GBMatrix
99+
# Sparse -> GBMatrix
100+
end

0 commit comments

Comments
 (0)