Skip to content

Support Krylov 0.10 #157

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
[compat]
CodecBzip2 = "0.7.2, 0.8"
CodecZlib = "0.7.0"
Krylov = "0.8, 0.9"
Krylov = "0.8, 0.9, 0.10"
LDLFactorizations = "0.8, 0.9, 0.10"
LinearOperators = "2.0"
MathOptInterface = "1"
Expand Down
75 changes: 48 additions & 27 deletions src/KKT/Krylov/defs.jl
Original file line number Diff line number Diff line change
@@ -1,47 +1,68 @@
if isdefined(Krylov, :CgWorkspace)
const _Krylov = Krylov
else
@eval module _Krylov
using Krylov
const MinresWorkspace = Krylov.MinresSolver
const CgWorkspace = Krylov.CgSolver
const CrWorkspace = Krylov.CrSolver
const SymmlqWorkspace = Krylov.SymmlqSolver
const MinresQlpWorkspace = Krylov.MinresQlpSolver
const TricgWorkspace = Krylov.TricgSolver
const TrimrWorkspace = Krylov.TrimrSolver
const LslqWorkspace = Krylov.LslqSolver
const LsqrWorkspace = Krylov.LsqrSolver
const LsmrWorkspace = Krylov.LsmrSolver
const LnlqWorkspace = Krylov.LnlqSolver
const CraigWorkspace = Krylov.CraigSolver
const CraigmrWorkspace = Krylov.CraigmrSolver
end
end

const _KRYLOV_SPD = Union{
Krylov.CgSolver,
Krylov.CrSolver,
_Krylov.CgWorkspace,
_Krylov.CrWorkspace,
}

const _KRYLOV_SID = Union{
Krylov.MinresSolver,
Krylov.MinresQlpSolver,
Krylov.SymmlqSolver
_Krylov.MinresWorkspace,
_Krylov.MinresQlpWorkspace,
_Krylov.SymmlqWorkspace
}

const _KRYLOV_SQD = Union{
Krylov.TricgSolver,
Krylov.TrimrSolver,
_Krylov.TricgWorkspace,
_Krylov.TrimrWorkspace,
}

const _KRYLOV_LN = Union{
Krylov.LnlqSolver,
Krylov.CraigSolver,
Krylov.CraigmrSolver,
_Krylov.LnlqWorkspace,
_Krylov.CraigWorkspace,
_Krylov.CraigmrWorkspace,
}

const _KRYLOV_LS = Union{
Krylov.LslqSolver,
Krylov.LsqrSolver,
Krylov.LsmrSolver,
_Krylov.LslqWorkspace,
_Krylov.LsqrWorkspace,
_Krylov.LsmrWorkspace,
}

# Helper functions
for (KS, fun) in [
(Krylov.CgSolver,Krylov.cg!)
(Krylov.CrSolver,Krylov.cr!)
(Krylov.MinresSolver,Krylov.minres!)
(Krylov.MinresQlpSolver,Krylov.minres_qlp!)
(Krylov.SymmlqSolver,Krylov.symmlq!)
(Krylov.TricgSolver,Krylov.tricg!)
(Krylov.TrimrSolver,Krylov.trimr!)
(Krylov.LnlqSolver,Krylov.lnlq!)
(Krylov.CraigSolver,Krylov.craig!)
(Krylov.CraigmrSolver,Krylov.craigmr!)
(Krylov.LslqSolver,Krylov.lslq!)
(Krylov.LsqrSolver,Krylov.lsqr!)
(Krylov.LsmrSolver,Krylov.lsmr!)
]
(_Krylov.CgWorkspace,Krylov.cg!)
(_Krylov.CrWorkspace,Krylov.cr!)
(_Krylov.MinresWorkspace,Krylov.minres!)
(_Krylov.MinresQlpWorkspace,Krylov.minres_qlp!)
(_Krylov.SymmlqWorkspace,Krylov.symmlq!)
(_Krylov.TricgWorkspace,Krylov.tricg!)
(_Krylov.TrimrWorkspace,Krylov.trimr!)
(_Krylov.LnlqWorkspace,Krylov.lnlq!)
(_Krylov.CraigWorkspace,Krylov.craig!)
(_Krylov.CraigmrWorkspace,Krylov.craigmr!)
(_Krylov.LslqWorkspace,Krylov.lslq!)
(_Krylov.LsqrWorkspace,Krylov.lsqr!)
(_Krylov.LsmrWorkspace,Krylov.lsmr!)
]
@eval begin
@inline _krylov!(solver::$KS, args...; kwargs...) = $(fun)(solver, args...; kwargs...)
end
Expand Down
8 changes: 4 additions & 4 deletions src/KKT/Krylov/krylov.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import ..KKT: setup, update!, solve!
include("defs.jl")

"""
Backend{KS<:Krylov.KrylovSolver,V<:AbstractVector}
Backend{KS<:Krylov.KrylovWorkspace,V<:AbstractVector}

[Krylov.jl](https://github.com/JuliaSmoothOptimizers/Krylov.jl)-based backend for solving linear systems.

The type is parametrized by:
* `KS<:Krylov.KrylovSolver`: workspace type for the Krylov method.
* `KS<:Krylov.KrylovWorkspace`: workspace type for the Krylov method.
Also defines the Krylov method to be used.
* `V<:AbstractVector`: the vector storage type used within the Krylov method.
This should be set to `Vector{T}` (for arithmetic `T`) unless, e.g., one uses a GPU.
Expand All @@ -31,11 +31,11 @@ See the [Krylov.jl documentation](https://juliasmoothoptimizers.github.io/Krylov
All the following examples assume everything runs on a CPU in `Float64` arithmetic.
* To use the conjugate gradient:
```julia
backend = KKT.TlpKrylov.Backend(Krylov.CgSolver, Vector{Float64})
backend = KKT.TlpKrylov.Backend(Krylov.CgWorkspace, Vector{Float64})
```
* To use MINRES:
```julia
backend = KKT.TlpKrylov.Backend(Krylov.MinresSolver, Vector{Float64})
backend = KKT.TlpKrylov.Backend(Krylov.MinresWorkspace, Vector{Float64})
```
"""
struct Backend{KS,V} <: AbstractKKTBackend
Expand Down
9 changes: 9 additions & 0 deletions test/KKT/Krylov/krylov.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
using Krylov

if !isdefined(Krylov, :CgWorkspace)
const CgWorkspace = Krylov.CgSolver
const MinresWorkspace = Krylov.MinresSolver
const MinresQlpWorkspace = Krylov.MinresQlpSolver
const SymmlqWorkspace = Krylov.SymmlqSolver
const TricgWorkspace = Krylov.TricgSolver
const TrimrWorkspace = Krylov.TrimrSolver
end

@testset "Krylov" begin
include("spd.jl")
include("sid.jl")
Expand Down
2 changes: 1 addition & 1 deletion test/KKT/Krylov/sid.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function test_krylov_sid(T, ksolver)
end

@testset "SID" begin
for T in TvTYPES, ksolver in [MinresSolver, MinresQlpSolver, SymmlqSolver]
for T in TvTYPES, ksolver in [MinresWorkspace, MinresQlpWorkspace, SymmlqWorkspace]
@testset "$ksolver ($T)" begin
test_krylov_sid(T, ksolver)
end
Expand Down
2 changes: 1 addition & 1 deletion test/KKT/Krylov/spd.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function test_krylov_spd(T, ksolver)
end

@testset "SPD" begin
for T in TvTYPES, ksolver in [CgSolver, MinresSolver]
for T in TvTYPES, ksolver in [CgWorkspace, MinresWorkspace]
@testset "$ksolver ($T)" begin
test_krylov_spd(T, ksolver)
end
Expand Down
2 changes: 1 addition & 1 deletion test/KKT/Krylov/sqd.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function test_krylov_sqd(T, ksolver)
end

@testset "SQD" begin
for T in TvTYPES, ksolver in [TricgSolver, TrimrSolver]
for T in TvTYPES, ksolver in [TricgWorkspace, TrimrWorkspace]
@testset "$ksolver ($T)" begin
test_krylov_sqd(T, ksolver)
end
Expand Down
2 changes: 1 addition & 1 deletion test/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[compat]
Krylov = "0.8, 0.9"
Krylov = "0.8, 0.9, 0.10"
MathOptInterface= "1"