Skip to content

Commit 149f0b3

Browse files
authored
Improve constructor. (#722)
1 parent 736a9cd commit 149f0b3

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

ext/LinearSolveCliqueTreesExt.jl

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
module LinearSolveCliqueTreesExt
22

3-
using CliqueTrees: EliminationAlgorithm, SupernodeType, DEFAULT_ELIMINATION_ALGORITHM,
4-
DEFAULT_SUPERNODE_TYPE, symbolic, cholinit, lininit, cholesky!, linsolve!
3+
using CliqueTrees: symbolic, cholinit, lininit, cholesky!, linsolve!
54
using LinearSolve
65
using SparseArrays
76

8-
function LinearSolve.CliqueTreesFactorization(;
9-
alg::A=DEFAULT_ELIMINATION_ALGORITHM,
10-
snd::S=DEFAULT_SUPERNODE_TYPE,
11-
reuse_symbolic::Bool=true,
12-
) where {A <: EliminationAlgorithm, S <: SupernodeType}
13-
return CliqueTreesFactorization{A, S}(alg, snd, reuse_symbolic)
7+
function _symbolic(A::AbstractMatrix, alg::CliqueTreesFactorization)
8+
return symbolic(A; alg=alg.alg, snd=alg.snd)
9+
end
10+
11+
function _symbolic(A::AbstractMatrix, alg::CliqueTreesFactorization{Nothing})
12+
return symbolic(A; snd=alg.snd)
13+
end
14+
15+
function _symbolic(A::AbstractMatrix, alg::CliqueTreesFactorization{<:Any, Nothing})
16+
return symbolic(A; alg=alg.alg)
17+
end
18+
19+
function _symbolic(A::AbstractMatrix, alg::CliqueTreesFactorization{Nothing, Nothing})
20+
return symbolic(A)
1421
end
1522

1623
function LinearSolve.init_cacheval(
1724
alg::CliqueTreesFactorization, A::AbstractMatrix, b, u, Pl, Pr, maxiters::Int, abstol,
1825
reltol, verbose::Bool, assumptions::OperatorAssumptions)
19-
symbfact = symbolic(A; alg=alg.alg, snd=alg.snd)
26+
symbfact = _symbolic(A, alg)
2027
cholfact, cholwork = cholinit(A, symbfact)
2128
linwork = lininit(1, cholfact)
2229
return (cholfact, cholwork, linwork)
@@ -29,7 +36,7 @@ function SciMLBase.solve!(cache::LinearSolve.LinearCache, alg::CliqueTreesFactor
2936

3037
if cache.isfresh
3138
if isnothing(cache.cacheval) || !alg.reuse_symbolic
32-
symbfact = symbolic(A; alg=alg.alg, snd=alg.snd)
39+
symbfact = _symbolic(A, alg)
3340
cholfact, cholwork = cholinit(A, symbfact)
3441
linwork = lininit(1, cholfact)
3542
cache.cacheval = (cholfact, cholwork, linwork)

src/factorization.jl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,8 +1162,8 @@ end
11621162

11631163
"""
11641164
CliqueTreesFactorization(
1165-
alg = CliqueTrees.DEFAULT_ELIMINATION_ALGORITHM,
1166-
snd = CliqueTrees.DEFAULT_SUPERNODE_TYPE,
1165+
alg = nothing,
1166+
snd = nothing,
11671167
reuse_symbolic = true,
11681168
)
11691169
@@ -1175,6 +1175,22 @@ struct CliqueTreesFactorization{A, S} <: AbstractSparseFactorization
11751175
alg::A
11761176
snd::S
11771177
reuse_symbolic::Bool
1178+
1179+
function CliqueTreesFactorization(;
1180+
alg::A = nothing,
1181+
snd::S = nothing,
1182+
reuse_symbolic = true,
1183+
throwerror = true,
1184+
) where {A, S}
1185+
1186+
ext = Base.get_extension(@__MODULE__, :LinearSolveCliqueTreesExt)
1187+
1188+
if throwerror && isnothing(ext)
1189+
error("CliqueTreesFactorization requires that CliqueTrees is loaded, i.e. `using CliqueTrees`")
1190+
else
1191+
new{A, S}(alg, snd, reuse_symbolic)
1192+
end
1193+
end
11781194
end
11791195

11801196
function init_cacheval(::CliqueTreesFactorization, ::Union{AbstractMatrix, Nothing, AbstractSciMLOperator}, b, u, Pl, Pr,

0 commit comments

Comments
 (0)