17
17
18
18
# Bad fallback: will fail if `A` is just a stand-in
19
19
# This should instead just create the factorization type.
20
- init_cacheval (alg:: AbstractFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = do_factorization (alg, A , b, u)
20
+ init_cacheval (alg:: AbstractFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = do_factorization (alg, convert (AbstractMatrix,A) , b, u)
21
21
22
22
# # LU Factorizations
23
23
@@ -35,28 +35,24 @@ function LUFactorization()
35
35
end
36
36
37
37
function do_factorization (alg:: LUFactorization , A, b, u)
38
- A isa Union{AbstractMatrix,AbstractDiffEqOperator} ||
39
- error (" LU is not defined for $(typeof (A)) " )
40
-
41
- if A isa DiffEqArrayOperator
42
- A = A. A
43
- end
38
+ A = convert (AbstractMatrix,A)
44
39
if A isa SparseMatrixCSC
45
- fact = lu (A, alg . pivot )
40
+ return lu (A)
46
41
else
47
42
fact = lu! (A, alg. pivot)
48
43
end
49
44
return fact
50
45
end
51
46
52
- init_cacheval (alg:: LUFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A )
47
+ init_cacheval (alg:: LUFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (convert (AbstractMatrix,A) )
53
48
54
49
# This could be a GenericFactorization perhaps?
55
50
Base. @kwdef struct UMFPACKFactorization <: AbstractFactorization
56
51
reuse_symbolic:: Bool = true
57
52
end
58
53
59
54
function init_cacheval (alg:: UMFPACKFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose)
55
+ A = convert (AbstractMatrix,A)
60
56
zerobased = SparseArrays. getcolptr (A)[1 ] == 0
61
57
res = SuiteSparse. UMFPACK. UmfpackLU (C_NULL , C_NULL , size (A, 1 ), size (A, 2 ),
62
58
zerobased ? copy (SparseArrays. getcolptr (A)) : SuiteSparse. decrement (SparseArrays. getcolptr (A)),
@@ -67,9 +63,7 @@ function init_cacheval(alg::UMFPACKFactorization, A, b, u, Pl, Pr, maxiters, abs
67
63
end
68
64
69
65
function do_factorization (:: UMFPACKFactorization , A, b, u)
70
- if A isa DiffEqArrayOperator
71
- A = A. A
72
- end
66
+ A = convert (AbstractMatrix,A)
73
67
if A isa SparseMatrixCSC
74
68
return lu (A)
75
69
else
79
73
80
74
function SciMLBase. solve (cache:: LinearCache , alg:: UMFPACKFactorization )
81
75
A = cache. A
82
- if A isa DiffEqArrayOperator
83
- A = A. A
84
- end
76
+ A = convert (AbstractMatrix,A)
85
77
if cache. isfresh
86
78
if cache. cacheval != = nothing && alg. reuse_symbolic
87
79
# If we have a cacheval already, run umfpack_symbolic to ensure the symbolic factorization exists
@@ -103,13 +95,11 @@ Base.@kwdef struct KLUFactorization <: AbstractFactorization
103
95
end
104
96
105
97
function init_cacheval (alg:: KLUFactorization , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose)
106
- return KLU. KLUFactorization (A ) # this takes care of the copy internally.
98
+ return KLU. KLUFactorization (convert (AbstractMatrix,A) ) # this takes care of the copy internally.
107
99
end
108
100
109
101
function do_factorization (:: KLUFactorization , A, b, u)
110
- if A isa DiffEqArrayOperator
111
- A = A. A
112
- end
102
+ A = convert (AbstractMatrix,A)
113
103
if A isa SparseMatrixCSC
114
104
return klu (A)
115
105
else
119
109
120
110
function SciMLBase. solve (cache:: LinearCache , alg:: KLUFactorization )
121
111
A = cache. A
122
- if A isa DiffEqArrayOperator
123
- A = A. A
124
- end
112
+ A = convert (AbstractMatrix,A)
125
113
if cache. isfresh
126
114
if cache. cacheval != = nothing && alg. reuse_symbolic
127
115
# If we have a cacheval already, run umfpack_symbolic to ensure the symbolic factorization exists
@@ -159,12 +147,7 @@ function QRFactorization(inplace = true)
159
147
end
160
148
161
149
function do_factorization (alg:: QRFactorization , A, b, u)
162
- A isa Union{AbstractMatrix,AbstractDiffEqOperator} ||
163
- error (" QR is not defined for $(typeof (A)) " )
164
-
165
- if A isa DiffEqArrayOperator
166
- A = A. A
167
- end
150
+ A = convert (AbstractMatrix,A)
168
151
if alg. inplace
169
152
fact = qr! (A, alg. pivot)
170
153
else
183
166
SVDFactorization () = SVDFactorization (false , LinearAlgebra. DivideAndConquer ())
184
167
185
168
function do_factorization (alg:: SVDFactorization , A, b, u)
186
- A isa Union{AbstractMatrix,AbstractDiffEqOperator} ||
187
- error (" SVD is not defined for $(typeof (A)) " )
188
-
189
- if A isa DiffEqArrayOperator
190
- A = A. A
191
- end
192
-
169
+ A = convert (AbstractMatrix,A)
193
170
fact = svd! (A; full = alg. full, alg = alg. alg)
194
171
return fact
195
172
end
@@ -204,18 +181,13 @@ GenericFactorization(;fact_alg = LinearAlgebra.factorize) =
204
181
GenericFactorization (fact_alg)
205
182
206
183
function do_factorization (alg:: GenericFactorization , A, b, u)
207
- A isa Union{AbstractMatrix,AbstractDiffEqOperator} ||
208
- error (" GenericFactorization is not defined for $(typeof (A)) " )
209
-
210
- if A isa DiffEqArrayOperator
211
- A = A. A
212
- end
184
+ A = convert (AbstractMatrix,A)
213
185
fact = alg. fact_alg (A)
214
186
return fact
215
187
end
216
188
217
- init_cacheval (alg:: GenericFactorization{typeof(lu)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A )
218
- init_cacheval (alg:: GenericFactorization{typeof(lu!)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A )
189
+ init_cacheval (alg:: GenericFactorization{typeof(lu)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (convert (AbstractMatrix,A) )
190
+ init_cacheval (alg:: GenericFactorization{typeof(lu!)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (convert (AbstractMatrix,A) )
219
191
220
192
init_cacheval (alg:: GenericFactorization{typeof(lu)} , A:: StridedMatrix{<:LinearAlgebra.BlasFloat} , b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A)
221
193
init_cacheval (alg:: GenericFactorization{typeof(lu!)} , A:: StridedMatrix{<:LinearAlgebra.BlasFloat} , b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A)
@@ -245,13 +217,13 @@ end
245
217
# Fallback, tries to make nonsingular and just factorizes
246
218
# Try to never use it.
247
219
function init_cacheval (alg:: Union{QRFactorization,SVDFactorization,GenericFactorization} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose)
248
- newA = copy (A )
220
+ newA = copy (convert (AbstractMatrix,A) )
249
221
fill! (newA,true )
250
222
do_factorization (alg, newA, b, u)
251
223
end
252
224
253
225
# # RFLUFactorization
254
226
255
227
RFLUFactorization () = GenericFactorization (;fact_alg= RecursiveFactorization. lu!)
256
- init_cacheval (alg:: GenericFactorization{typeof(RecursiveFactorization.lu!)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A )
257
- init_cacheval (alg:: GenericFactorization{typeof(RecursiveFactorization.lu!)} , A:: StridedMatrix{<:LinearAlgebra.BlasFloat} , b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (A )
228
+ init_cacheval (alg:: GenericFactorization{typeof(RecursiveFactorization.lu!)} , A, b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (convert (AbstractMatrix,A) )
229
+ init_cacheval (alg:: GenericFactorization{typeof(RecursiveFactorization.lu!)} , A:: StridedMatrix{<:LinearAlgebra.BlasFloat} , b, u, Pl, Pr, maxiters, abstol, reltol, verbose) = ArrayInterface. lu_instance (convert (AbstractMatrix,A) )
0 commit comments