|
2 | 2 | # For SciML algorithms already using `defaultalg`, all assume square matrix.
|
3 | 3 | defaultalg(A, b) = defaultalg(A, b, OperatorAssumptions(Val(true)))
|
4 | 4 |
|
5 |
| -function defaultalg(A::DiffEqArrayOperator, b, assumptions::OperatorAssumptions) |
| 5 | +function defaultalg(A::Union{DiffEqArrayOperator, MatrixOperator}, b, |
| 6 | + assumptions::OperatorAssumptions) |
6 | 7 | defaultalg(A.A, b, assumptions)
|
7 | 8 | end
|
8 | 9 |
|
9 | 10 | # Ambiguity handling
|
10 |
| -function defaultalg(A::DiffEqArrayOperator, b, assumptions::OperatorAssumptions{nothing}) |
| 11 | +function defaultalg(A::Union{DiffEqArrayOperator, MatrixOperator}, b, |
| 12 | + assumptions::OperatorAssumptions{nothing}) |
11 | 13 | defaultalg(A.A, b, assumptions)
|
12 | 14 | end
|
13 | 15 |
|
14 |
| -function defaultalg(A::DiffEqArrayOperator, b, assumptions::OperatorAssumptions{false}) |
| 16 | +function defaultalg(A::Union{DiffEqArrayOperator, MatrixOperator}, b, |
| 17 | + assumptions::OperatorAssumptions{false}) |
15 | 18 | defaultalg(A.A, b, assumptions)
|
16 | 19 | end
|
17 | 20 |
|
18 |
| -function defaultalg(A::DiffEqArrayOperator, b, assumptions::OperatorAssumptions{true}) |
| 21 | +function defaultalg(A::Union{DiffEqArrayOperator, MatrixOperator}, b, |
| 22 | + assumptions::OperatorAssumptions{true}) |
19 | 23 | defaultalg(A.A, b, assumptions)
|
20 | 24 | end
|
21 | 25 |
|
22 | 26 | function defaultalg(A, b, ::OperatorAssumptions{Nothing})
|
23 |
| - issquare = size(A, 1) == size(A, 2) |
24 |
| - defaultalg(A, b, OperatorAssumptions(Val(issquare))) |
| 27 | + issq = issquare(A) |
| 28 | + defaultalg(A, b, OperatorAssumptions(Val(issq))) |
25 | 29 | end
|
26 | 30 |
|
27 | 31 | function defaultalg(A::Tridiagonal, b, ::OperatorAssumptions{true})
|
|
33 | 37 | function defaultalg(A::SymTridiagonal, b, ::OperatorAssumptions{true})
|
34 | 38 | GenericFactorization(; fact_alg = ldlt!)
|
35 | 39 | end
|
36 |
| -function defaultalg(A::Diagonal, b, ::OperatorAssumptions{true}) |
37 |
| - DiagonalFactorization() |
| 40 | +function defaultalg(A::Bidiagonal, b, ::OperatorAssumptions{true}) |
| 41 | + DirectLdiv!() |
| 42 | +end |
| 43 | +function defaultalg(A::Factorization, b, ::OperatorAssumptions{true}) |
| 44 | + DirectLdiv!() |
38 | 45 | end
|
39 |
| -function defaultalg(A::Diagonal, b, ::OperatorAssumptions{false}) |
| 46 | +function defaultalg(A::Diagonal, b, ::OperatorAssumptions{true}) |
40 | 47 | DiagonalFactorization()
|
41 | 48 | end
|
42 | 49 | function defaultalg(A::Diagonal, b, ::OperatorAssumptions{Nothing})
|
@@ -75,18 +82,26 @@ function defaultalg(A, b::GPUArraysCore.AbstractGPUArray, ::OperatorAssumptions{
|
75 | 82 | end
|
76 | 83 | end
|
77 | 84 |
|
78 |
| -function defaultalg(A::SciMLBase.AbstractDiffEqOperator, b, |
79 |
| - assumptions::OperatorAssumptions) |
| 85 | +function defaultalg(A::SciMLBase.AbstractSciMLOperator, b, |
| 86 | + assumptions::OperatorAssumptions{true}) |
| 87 | + if has_ldiv!(A) |
| 88 | + return DirectLdiv!() |
| 89 | + end |
| 90 | + |
80 | 91 | KrylovJL_GMRES()
|
81 | 92 | end
|
82 | 93 |
|
83 | 94 | # Ambiguity handling
|
84 |
| -function defaultalg(A::SciMLBase.AbstractDiffEqOperator, b, |
| 95 | +function defaultalg(A::SciMLBase.AbstractSciMLOperator, b, |
85 | 96 | assumptions::OperatorAssumptions{Nothing})
|
| 97 | + if has_ldiv!(A) |
| 98 | + return DirectLdiv!() |
| 99 | + end |
| 100 | + |
86 | 101 | KrylovJL_GMRES()
|
87 | 102 | end
|
88 | 103 |
|
89 |
| -function defaultalg(A::SciMLBase.AbstractDiffEqOperator, b, |
| 104 | +function defaultalg(A::SciMLBase.AbstractSciMLOperator, b, |
90 | 105 | assumptions::OperatorAssumptions{false})
|
91 | 106 | m, n = size(A)
|
92 | 107 | if m < n
|
|
0 commit comments