diff --git a/Project.toml b/Project.toml index 37126969..eddb20bb 100644 --- a/Project.toml +++ b/Project.toml @@ -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" diff --git a/src/KKT/Krylov/defs.jl b/src/KKT/Krylov/defs.jl index d8e37345..ba9feb09 100644 --- a/src/KKT/Krylov/defs.jl +++ b/src/KKT/Krylov/defs.jl @@ -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 diff --git a/src/KKT/Krylov/krylov.jl b/src/KKT/Krylov/krylov.jl index 7353bb31..7a4bbf07 100644 --- a/src/KKT/Krylov/krylov.jl +++ b/src/KKT/Krylov/krylov.jl @@ -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. @@ -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 diff --git a/test/KKT/Krylov/krylov.jl b/test/KKT/Krylov/krylov.jl index 56eceab0..64ccca8f 100644 --- a/test/KKT/Krylov/krylov.jl +++ b/test/KKT/Krylov/krylov.jl @@ -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") diff --git a/test/KKT/Krylov/sid.jl b/test/KKT/Krylov/sid.jl index d594f5ff..9147f8ba 100644 --- a/test/KKT/Krylov/sid.jl +++ b/test/KKT/Krylov/sid.jl @@ -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 diff --git a/test/KKT/Krylov/spd.jl b/test/KKT/Krylov/spd.jl index ce13b9f9..17fa1fa0 100644 --- a/test/KKT/Krylov/spd.jl +++ b/test/KKT/Krylov/spd.jl @@ -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 diff --git a/test/KKT/Krylov/sqd.jl b/test/KKT/Krylov/sqd.jl index edfe401f..60abaa62 100644 --- a/test/KKT/Krylov/sqd.jl +++ b/test/KKT/Krylov/sqd.jl @@ -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 diff --git a/test/Project.toml b/test/Project.toml index ad12cc25..25ba421c 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -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"