@@ -70,98 +70,6 @@ function init_cacheval(alg::Union{LUFactorization, GenericLUFactorization}, A, b
70
70
ArrayInterfaceCore. lu_instance (convert (AbstractMatrix, A))
71
71
end
72
72
73
- # This could be a GenericFactorization perhaps?
74
- Base. @kwdef struct UMFPACKFactorization <: AbstractFactorization
75
- reuse_symbolic:: Bool = true
76
- end
77
-
78
- function init_cacheval (alg:: UMFPACKFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol,
79
- verbose)
80
- A = convert (AbstractMatrix, A)
81
- #=
82
- zerobased = SparseArrays.getcolptr(A)[1] == 0
83
- res = SuiteSparse.UMFPACK.UmfpackLU(C_NULL, C_NULL, size(A, 1), size(A, 2),
84
- zerobased ? copy(SparseArrays.getcolptr(A)) :
85
- SuiteSparse.decrement(SparseArrays.getcolptr(A)),
86
- zerobased ? copy(rowvals(A)) :
87
- SuiteSparse.decrement(rowvals(A)),
88
- copy(nonzeros(A)), 0)
89
- finalizer(SuiteSparse.UMFPACK.umfpack_free_symbolic, res)
90
- =#
91
- res = lu (A; check = false )
92
- @assert res isa SuiteSparse. UMFPACK. UmfpackLU
93
- res
94
- end
95
-
96
- function do_factorization (:: UMFPACKFactorization , A, b, u)
97
- A = convert (AbstractMatrix, A)
98
- if A isa SparseMatrixCSC
99
- return lu (A)
100
- else
101
- error (" Sparse LU is not defined for $(typeof (A)) " )
102
- end
103
- end
104
-
105
- function SciMLBase. solve (cache:: LinearCache , alg:: UMFPACKFactorization ; kwargs... )
106
- A = cache. A
107
- A = convert (AbstractMatrix, A)
108
- if cache. isfresh
109
- if cache. cacheval != = nothing && alg. reuse_symbolic
110
- # If we have a cacheval already, run umfpack_symbolic to ensure the symbolic factorization exists
111
- # This won't recompute if it does.
112
- SuiteSparse. UMFPACK. umfpack_symbolic! (cache. cacheval)
113
- fact = lu! (cache. cacheval, A)
114
- else
115
- fact = do_factorization (alg, A, cache. b, cache. u)
116
- end
117
- cache = set_cacheval (cache, fact)
118
- end
119
-
120
- y = ldiv! (cache. u, cache. cacheval, cache. b)
121
- SciMLBase. build_linear_solution (alg, y, nothing , cache)
122
- end
123
-
124
- Base. @kwdef struct KLUFactorization <: AbstractFactorization
125
- reuse_symbolic:: Bool = true
126
- end
127
-
128
- function init_cacheval (alg:: KLUFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol,
129
- verbose)
130
- return KLU. KLUFactorization (convert (AbstractMatrix, A)) # this takes care of the copy internally.
131
- end
132
-
133
- function do_factorization (:: KLUFactorization , A, b, u)
134
- A = convert (AbstractMatrix, A)
135
- if A isa SparseMatrixCSC
136
- return klu (A)
137
- else
138
- error (" KLU is not defined for $(typeof (A)) " )
139
- end
140
- end
141
-
142
- function SciMLBase. solve (cache:: LinearCache , alg:: KLUFactorization ; kwargs... )
143
- A = cache. A
144
- A = convert (AbstractMatrix, A)
145
- if cache. isfresh
146
- if cache. cacheval != = nothing && alg. reuse_symbolic
147
- # If we have a cacheval already, run umfpack_symbolic to ensure the symbolic factorization exists
148
- # This won't recompute if it does.
149
- KLU. klu_analyze! (cache. cacheval)
150
- copyto! (cache. cacheval. nzval, A. nzval)
151
- if cache. cacheval. _numeric === C_NULL # We MUST have a numeric factorization for reuse, unlike UMFPACK.
152
- KLU. klu_factor! (cache. cacheval)
153
- end
154
- fact = KLU. klu! (cache. cacheval, A)
155
- else
156
- fact = do_factorization (alg, A, cache. b, cache. u)
157
- end
158
- cache = set_cacheval (cache, fact)
159
- end
160
-
161
- y = ldiv! (cache. u, cache. cacheval, cache. b)
162
- SciMLBase. build_linear_solution (alg, y, nothing , cache)
163
- end
164
-
165
73
# # QRFactorization
166
74
167
75
struct QRFactorization{P} <: AbstractFactorization
@@ -331,6 +239,76 @@ function init_cacheval(alg::Union{GenericFactorization,
331
239
do_factorization (alg, newA, b, u)
332
240
end
333
241
242
+ # ################################# Factorizations which require solve overloads
243
+
244
+ Base. @kwdef struct UMFPACKFactorization <: AbstractFactorization
245
+ reuse_symbolic:: Bool = true
246
+ end
247
+
248
+ function init_cacheval (alg:: UMFPACKFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol,
249
+ verbose)
250
+ A = convert (AbstractMatrix, A)
251
+ zerobased = SparseArrays. getcolptr (A)[1 ] == 0
252
+ res = SuiteSparse. UMFPACK. UmfpackLU (C_NULL , C_NULL , size (A, 1 ), size (A, 2 ),
253
+ zerobased ? copy (SparseArrays. getcolptr (A)) :
254
+ SuiteSparse. decrement (SparseArrays. getcolptr (A)),
255
+ zerobased ? copy (rowvals (A)) :
256
+ SuiteSparse. decrement (rowvals (A)),
257
+ copy (nonzeros (A)), 0 )
258
+ finalizer (SuiteSparse. UMFPACK. umfpack_free_symbolic, res)
259
+ res
260
+ end
261
+
262
+ function SciMLBase. solve (cache:: LinearCache , alg:: UMFPACKFactorization ; kwargs... )
263
+ A = cache. A
264
+ A = convert (AbstractMatrix, A)
265
+ if cache. isfresh
266
+ if cache. cacheval != = nothing && alg. reuse_symbolic
267
+ # Caches the symbolic factorization: https://github.com/JuliaLang/julia/pull/33738
268
+ println (" factorize" ); display (A)
269
+ fact = lu! (cache. cacheval, A)
270
+ else
271
+ fact = do_factorization (alg, A, cache. b, cache. u)
272
+ end
273
+ cache = set_cacheval (cache, fact)
274
+ end
275
+
276
+ y = ldiv! (cache. u, cache. cacheval, cache. b)
277
+ SciMLBase. build_linear_solution (alg, y, nothing , cache)
278
+ end
279
+
280
+ Base. @kwdef struct KLUFactorization <: AbstractFactorization
281
+ reuse_symbolic:: Bool = true
282
+ end
283
+
284
+ function init_cacheval (alg:: KLUFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol,
285
+ verbose)
286
+ return KLU. KLUFactorization (convert (AbstractMatrix, A)) # this takes care of the copy internally.
287
+ end
288
+
289
+ function SciMLBase. solve (cache:: LinearCache , alg:: KLUFactorization ; kwargs... )
290
+ A = cache. A
291
+ A = convert (AbstractMatrix, A)
292
+ if cache. isfresh
293
+ if cache. cacheval != = nothing && alg. reuse_symbolic
294
+ # If we have a cacheval already, run umfpack_symbolic to ensure the symbolic factorization exists
295
+ # This won't recompute if it does.
296
+ KLU. klu_analyze! (cache. cacheval)
297
+ copyto! (cache. cacheval. nzval, A. nzval)
298
+ if cache. cacheval. _numeric === C_NULL # We MUST have a numeric factorization for reuse, unlike UMFPACK.
299
+ KLU. klu_factor! (cache. cacheval)
300
+ end
301
+ fact = KLU. klu! (cache. cacheval, A)
302
+ else
303
+ fact = do_factorization (alg, A, cache. b, cache. u)
304
+ end
305
+ cache = set_cacheval (cache, fact)
306
+ end
307
+
308
+ y = ldiv! (cache. u, cache. cacheval, cache. b)
309
+ SciMLBase. build_linear_solution (alg, y, nothing , cache)
310
+ end
311
+
334
312
# # RFLUFactorization
335
313
336
314
struct RFLUFactorization{P, T} <: AbstractFactorization
0 commit comments