Skip to content

Commit 5d2fd3b

Browse files
committed
Support Krylov.jl v0.10
1 parent aa69fac commit 5d2fd3b

File tree

6 files changed

+35
-54
lines changed

6 files changed

+35
-54
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
2323
[compat]
2424
CodecBzip2 = "0.7.2, 0.8"
2525
CodecZlib = "0.7.0"
26-
Krylov = "0.8, 0.9"
27-
LDLFactorizations = "0.8, 0.9, 0.10"
26+
Krylov = "0.10"
27+
LDLFactorizations = "0.10.1"
2828
LinearOperators = "2.0"
2929
MathOptInterface = "1"
3030
QPSReader = "0.2"

src/KKT/Krylov/defs.jl

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,29 @@
11
const _KRYLOV_SPD = Union{
2-
Krylov.CgSolver,
3-
Krylov.CrSolver,
2+
Krylov.CgWorkspace,
3+
Krylov.CrWorkspace,
4+
Krylov.CarWorkspace,
45
}
56

67
const _KRYLOV_SID = Union{
7-
Krylov.MinresSolver,
8-
Krylov.MinresQlpSolver,
9-
Krylov.SymmlqSolver
8+
Krylov.MinresWorkspace,
9+
Krylov.MinaresWorkspace,
10+
Krylov.MinresQlpWorkspace,
11+
Krylov.SymmlqWorkspace
1012
}
1113

1214
const _KRYLOV_SQD = Union{
13-
Krylov.TricgSolver,
14-
Krylov.TrimrSolver,
15+
Krylov.TricgWorkspace,
16+
Krylov.TrimrWorkspace,
1517
}
1618

1719
const _KRYLOV_LN = Union{
18-
Krylov.LnlqSolver,
19-
Krylov.CraigSolver,
20-
Krylov.CraigmrSolver,
20+
Krylov.LnlqWorkspace,
21+
Krylov.CraigWorkspace,
22+
Krylov.CraigmrWorkspace,
2123
}
2224

2325
const _KRYLOV_LS = Union{
24-
Krylov.LslqSolver,
25-
Krylov.LsqrSolver,
26-
Krylov.LsmrSolver,
26+
Krylov.LslqWorkspace,
27+
Krylov.LsqrWorkspace,
28+
Krylov.LsmrWorkspace,
2729
}
28-
29-
# Helper functions
30-
for (KS, fun) in [
31-
(Krylov.CgSolver,Krylov.cg!)
32-
(Krylov.CrSolver,Krylov.cr!)
33-
(Krylov.MinresSolver,Krylov.minres!)
34-
(Krylov.MinresQlpSolver,Krylov.minres_qlp!)
35-
(Krylov.SymmlqSolver,Krylov.symmlq!)
36-
(Krylov.TricgSolver,Krylov.tricg!)
37-
(Krylov.TrimrSolver,Krylov.trimr!)
38-
(Krylov.LnlqSolver,Krylov.lnlq!)
39-
(Krylov.CraigSolver,Krylov.craig!)
40-
(Krylov.CraigmrSolver,Krylov.craigmr!)
41-
(Krylov.LslqSolver,Krylov.lslq!)
42-
(Krylov.LsqrSolver,Krylov.lsqr!)
43-
(Krylov.LsmrSolver,Krylov.lsmr!)
44-
]
45-
@eval begin
46-
@inline _krylov!(solver::$KS, args...; kwargs...) = $(fun)(solver, args...; kwargs...)
47-
end
48-
end

src/KKT/Krylov/krylov.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ import ..KKT: setup, update!, solve!
1414
include("defs.jl")
1515

1616
"""
17-
Backend{KS<:Krylov.KrylovSolver,V<:AbstractVector}
17+
Backend{KS<:Krylov.KrylovWorkspace,V<:AbstractVector}
1818
1919
[Krylov.jl](https://github.com/JuliaSmoothOptimizers/Krylov.jl)-based backend for solving linear systems.
2020
2121
The type is parametrized by:
22-
* `KS<:Krylov.KrylovSolver`: workspace type for the Krylov method.
22+
* `KS<:Krylov.KrylovWorkspace`: workspace type for the Krylov method.
2323
Also defines the Krylov method to be used.
2424
* `V<:AbstractVector`: the vector storage type used within the Krylov method.
2525
This should be set to `Vector{T}` (for arithmetic `T`) unless, e.g., one uses a GPU.
@@ -31,15 +31,15 @@ See the [Krylov.jl documentation](https://juliasmoothoptimizers.github.io/Krylov
3131
All the following examples assume everything runs on a CPU in `Float64` arithmetic.
3232
* To use the conjugate gradient:
3333
```julia
34-
backend = KKT.TlpKrylov.Backend(Krylov.CgSolver, Vector{Float64})
34+
backend = KKT.TlpKrylov.Backend(Krylov.CgWorkspace, Vector{Float64})
3535
```
3636
* To use MINRES:
3737
```julia
38-
backend = KKT.TlpKrylov.Backend(Krylov.MinresSolver, Vector{Float64})
38+
backend = KKT.TlpKrylov.Backend(Krylov.MinresWorkspace, Vector{Float64})
3939
```
4040
"""
41-
struct Backend{KS,V} <: AbstractKKTBackend
42-
krylov_solver::Type{KS}
41+
struct Backend{KW,V} <: AbstractKKTBackend
42+
krylov_workspace::Type{KW}
4343
vector_storage::Type{V}
4444
end
4545

src/KKT/Krylov/sid.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
SIDSolver
33
"""
4-
mutable struct SIDSolver{T,V,Ta,KL,KS} <: AbstractKrylovSolver{T}
4+
mutable struct SIDSolver{T,V,Ta,KL,KW} <: AbstractKrylovSolver{T}
55
# Problem data
66
m::Int
77
n::Int
@@ -21,15 +21,15 @@ mutable struct SIDSolver{T,V,Ta,KL,KS} <: AbstractKrylovSolver{T}
2121
# Krylov solver & related options
2222
atol::T
2323
rtol::T
24-
krylov_solver::KS
24+
krylov_workspace::KW
2525

2626
# TODO: preconditioner
2727
end
2828

29-
backend(kkt::SIDSolver) = "$(typeof(kkt.krylov_solver))"
29+
backend(kkt::SIDSolver) = "$(typeof(kkt.krylov_workspace))"
3030
linear_system(kkt::SIDSolver) = "K2"
3131

32-
function setup(A, ::K2, backend::Backend{KS,V}) where{KS<:_KRYLOV_SID,V}
32+
function setup(A, ::K2, backend::Backend{KW,V}) where{KW<:_KRYLOV_SID,V}
3333
Ta = typeof(A)
3434
T = eltype(A)
3535
T == eltype(V) || error("eltype(A)=$T incompatible with eltype of Krylov vector storage $V.")
@@ -66,15 +66,15 @@ function setup(A, ::K2, backend::Backend{KS,V}) where{KS<:_KRYLOV_SID,V}
6666
# Allocate Krylov solver's workspace
6767
atol = sqrt(eps(T))
6868
rtol = sqrt(eps(T))
69-
krylov_solver = KS(m+n, m+n, V)
69+
krylov_workspace = KW(m+n, m+n, V)
7070

71-
return SIDSolver{T,V,Ta,typeof(opK),typeof(krylov_solver)}(
71+
return SIDSolver{T,V,Ta,typeof(opK),typeof(krylov_workspace)}(
7272
m, n, A,
7373
θ, regP, regD,
7474
Θp, Θd, ξ,
7575
opK,
7676
atol, rtol,
77-
krylov_solver
77+
krylov_workspace
7878
)
7979
end
8080

@@ -97,11 +97,11 @@ function solve!(dx, dy, kkt::SIDSolver{T}, ξp, ξd) where{T}
9797
@views copyto!(kkt.ξ[(m+1):(m+n)], ξd)
9898

9999
# Solve the augmented system
100-
_krylov!(kkt.krylov_solver, kkt.opK, kkt.ξ; atol=kkt.atol, rtol=kkt.rtol)
100+
krylov_solve!(kkt.krylov_workspace, kkt.opK, kkt.ξ; atol=kkt.atol, rtol=kkt.rtol)
101101

102102
# Recover dx, dy
103-
copyto!(dx, kkt.krylov_solver.x[1:n])
104-
copyto!(dy, kkt.krylov_solver.x[(n+1):(m+n)])
103+
copyto!(dx, kkt.krylov_workspace.x[1:n])
104+
copyto!(dy, kkt.krylov_workspace.x[(n+1):(m+n)])
105105

106106
# TODO: iterative refinement (?)
107107
return nothing

src/KKT/Krylov/spd.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ function solve!(dx, dy, kkt::SPDSolver{T}, ξp, ξd) where{T}
9797
mul!(kkt.ξ, kkt.A, kkt.D * ξd, true, true)
9898

9999
# Solve the normal equations
100-
_krylov!(kkt.krylov_solver, kkt.opK, kkt.ξ; atol=kkt.atol, rtol=kkt.rtol)
100+
krylov_solve!(kkt.krylov_solver, kkt.opK, kkt.ξ; atol=kkt.atol, rtol=kkt.rtol)
101101
copyto!(dy, kkt.krylov_solver.x)
102102

103103
# Recover dx

src/KKT/Krylov/sqd.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ function solve!(dx, dy, kkt::SQDSolver{T}, ξp, ξd) where{T}
8484
copyto!(kkt.ξd, ξd)
8585

8686
# Solve the augmented system
87-
_krylov!(kkt.krylov_solver, kkt.A, kkt.ξp, kkt.ξd;
87+
krylov_solve!(kkt.krylov_solver, kkt.A, kkt.ξp, kkt.ξd;
8888
M=kkt.Θd⁻¹,
8989
N=kkt.Θp⁻¹,
9090
atol=kkt.atol,

0 commit comments

Comments
 (0)