|
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