From fe4f805f47f093fa507369d86a61109a2815c44d Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Thu, 12 Feb 2026 12:57:18 -0500 Subject: [PATCH 01/13] allow both obj and sol sens in reverse mode --- src/NonLinearProgram/NonLinearProgram.jl | 7 ++++-- src/moi_wrapper.jl | 10 ++++----- test/nlp_program.jl | 28 ++++++++++++++++++------ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/NonLinearProgram/NonLinearProgram.jl b/src/NonLinearProgram/NonLinearProgram.jl index c31eb2e7..559309fd 100644 --- a/src/NonLinearProgram/NonLinearProgram.jl +++ b/src/NonLinearProgram/NonLinearProgram.jl @@ -552,8 +552,11 @@ function DiffOpt.reverse_differentiate!(model::Model; tol = 1e-6) # Compute Jacobian Δs, df_dp = _compute_sensitivity(model; tol = tol) Δp = if !iszero(model.input_cache.dobj) - model.input_cache.dobj * df_dp + df_dp'model.input_cache.dobj else + zeros(length(cache.params)) + end + begin num_primal = length(cache.primal_vars) # Fetch primal sensitivities Δx = zeros(num_primal) @@ -589,7 +592,7 @@ function DiffOpt.reverse_differentiate!(model::Model; tol = 1e-6) Δw = zeros(size(Δs, 1)) Δw[1:num_primal] = Δx Δw[cache.index_duals] = Δdual - Δp = Δs' * Δw + Δp += Δs' * Δw end Δp_dict = Dict{MOI.ConstraintIndex,Float64}( diff --git a/src/moi_wrapper.jl b/src/moi_wrapper.jl index 9c14bc52..7d847782 100644 --- a/src/moi_wrapper.jl +++ b/src/moi_wrapper.jl @@ -555,12 +555,10 @@ function reverse_differentiate!(model::Optimizer) "Trying to compute the reverse differentiation on a model with termination status $(st)", ) end - if !iszero(model.input_cache.dobj) && - (!isempty(model.input_cache.dx) || !isempty(model.input_cache.dy)) - error( - "Cannot compute the reverse differentiation with both solution sensitivities and objective sensitivities.", - ) - end + # if !iszero(model.input_cache.dobj) && + # (!isempty(model.input_cache.dx) || !isempty(model.input_cache.dy)) + # @warn "Computing reverse differentiation with both solution sensitivities and objective sensitivities." + # end diff = _diff(model) MOI.set( diff, diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 53fd9c12..7a150dd5 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -644,14 +644,15 @@ function test_ObjectiveSensitivity_model1() set_silent(model) # Parameters - @variable(model, p ∈ MOI.Parameter(1.5)) + p_val = 1.5 + @variable(model, p ∈ MOI.Parameter(p_val)) # Variables @variable(model, x) # Constraints @constraint(model, x * sin(p) == 1) - @objective(model, Min, sum(x)) + @objective(model, Min, 2 * x) optimize!(model) @assert is_solved_and_feasible(model) @@ -665,19 +666,32 @@ function test_ObjectiveSensitivity_model1() # Test Objective Sensitivity wrt parameters df_dp = MOI.get(model, DiffOpt.ForwardObjectiveSensitivity()) - @test isapprox(df_dp, -0.0071092; atol = 1e-4) + df = -2cos(p_val) / sin(p_val)^2 + @test isapprox(df_dp, df * Δp; atol = 1e-4) # Clean up DiffOpt.empty_input_sensitivities!(model) - # Set Too Many Sensitivities + # Test both obj and solution inputs Δf = 0.5 MOI.set(model, DiffOpt.ReverseObjectiveSensitivity(), Δf) + MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) - MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, 1.0) + # @test_warn "Computing reverse differentiation with both" + DiffOpt.reverse_differentiate!(model) + dp_combined = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value - # Compute derivatives - @test_throws ErrorException DiffOpt.reverse_differentiate!(model) + ε = 1e-6 + df_dp_fd = (begin + set_parameter_value(p, p_val + ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end - begin + set_parameter_value(p, p_val - ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end) / (2ε) + @test isapprox(df_dp_fd, dp_combined) DiffOpt.empty_input_sensitivities!(model) From 201424d210e4a0459f5cb6f0eedd6a702141d86a Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Thu, 12 Feb 2026 13:04:08 -0500 Subject: [PATCH 02/13] format --- test/nlp_program.jl | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 7a150dd5..b50a6edd 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -679,18 +679,22 @@ function test_ObjectiveSensitivity_model1() # @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!(model) - dp_combined = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value + dp_combined = + MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value ε = 1e-6 - df_dp_fd = (begin - set_parameter_value(p, p_val + ε) - optimize!(model) - Δf * objective_value(model) + Δp * value(x) - end - begin - set_parameter_value(p, p_val - ε) - optimize!(model) - Δf * objective_value(model) + Δp * value(x) - end) / (2ε) + df_dp_fd = + ( + begin + set_parameter_value(p, p_val + ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end - begin + set_parameter_value(p, p_val - ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end + ) / (2ε) @test isapprox(df_dp_fd, dp_combined) DiffOpt.empty_input_sensitivities!(model) From b7e1e25b90291e8bb9eea8adb7f145d8392760d5 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Thu, 12 Feb 2026 13:23:26 -0500 Subject: [PATCH 03/13] reset param value after fd --- test/nlp_program.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index b50a6edd..2f767df7 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -697,6 +697,8 @@ function test_ObjectiveSensitivity_model1() ) / (2ε) @test isapprox(df_dp_fd, dp_combined) + set_parameter_value(p, p_val) + DiffOpt.empty_input_sensitivities!(model) # Set Reverse Objective Sensitivity From ca6be7a0810ee6054c025cfee961a630919af5e6 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Thu, 12 Feb 2026 13:29:33 -0500 Subject: [PATCH 04/13] update for objective `x -> 2x` --- test/nlp_program.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 2f767df7..682e2cee 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -711,7 +711,7 @@ function test_ObjectiveSensitivity_model1() # Test Objective Sensitivity wrt parameters dp = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value - @test isapprox(dp, -0.0355464; atol = 1e-4) + @test isapprox(dp, df * Δf; atol = 1e-4) end function test_ObjectiveSensitivity_model2() From 8c5ea2d875c1d2b2a4e20bc5ddfdefa1d6be5687 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Thu, 12 Feb 2026 13:30:15 -0500 Subject: [PATCH 05/13] re-optimize as well --- test/nlp_program.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 682e2cee..afc32570 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -698,6 +698,7 @@ function test_ObjectiveSensitivity_model1() @test isapprox(df_dp_fd, dp_combined) set_parameter_value(p, p_val) + optimize!(model) DiffOpt.empty_input_sensitivities!(model) From 713d3b2653b743385febfe2d2c5d59c47004ef9d Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 20:58:48 -0500 Subject: [PATCH 06/13] attr --- src/diff_opt.jl | 12 ++++++++++++ src/jump_moi_overloads.jl | 8 ++++++++ src/moi_wrapper.jl | 32 ++++++++++++++++++++++++++++---- test/nlp_program.jl | 7 +++++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/diff_opt.jl b/src/diff_opt.jl index 83f9063d..7619e5cc 100644 --- a/src/diff_opt.jl +++ b/src/diff_opt.jl @@ -31,6 +31,7 @@ Base.@kwdef mutable struct InputCache MOIDD.DoubleDict{MOI.VectorAffineFunction{Float64}}() # also includes G for QPs objective::Union{Nothing,MOI.AbstractScalarFunction} = nothing factorization::Union{Nothing,Function} = nothing + allow_objective_and_solution_input::Bool = false end function Base.empty!(cache::InputCache) @@ -122,6 +123,8 @@ MOI.set(model, DiffOpt.NonLinearKKTJacobianFactorization(), factorization) """ struct NonLinearKKTJacobianFactorization <: MOI.AbstractModelAttribute end +struct AllowObjectiveAndSolutionInput <: MOI.AbstractModelAttribute end + """ ForwardConstraintFunction <: MOI.AbstractConstraintAttribute @@ -440,6 +443,15 @@ function MOI.set( return end +function MOI.set( + model::AbstractModel, + ::AllowObjectiveAndSolutionInput, + allow::Function, +) + model.input_cache.allow_objective_and_solution_input = allow + return +end + function MOI.set( model::AbstractModel, ::ReverseVariablePrimal, diff --git a/src/jump_moi_overloads.jl b/src/jump_moi_overloads.jl index f402ac35..6251215a 100644 --- a/src/jump_moi_overloads.jl +++ b/src/jump_moi_overloads.jl @@ -29,6 +29,14 @@ function MOI.set( return MOI.set(JuMP.backend(model), attr, factorization) end +function MOI.set( + model::JuMP.Model, + attr::AllowObjectiveAndSolutionInput, + allow::Bool, +) + return MOI.set(JuMP.backend(model), attr, allow) +end + function MOI.set( model::JuMP.Model, attr::ForwardObjectiveFunction, diff --git a/src/moi_wrapper.jl b/src/moi_wrapper.jl index 7d847782..a661287d 100644 --- a/src/moi_wrapper.jl +++ b/src/moi_wrapper.jl @@ -555,10 +555,13 @@ function reverse_differentiate!(model::Optimizer) "Trying to compute the reverse differentiation on a model with termination status $(st)", ) end - # if !iszero(model.input_cache.dobj) && - # (!isempty(model.input_cache.dx) || !isempty(model.input_cache.dy)) - # @warn "Computing reverse differentiation with both solution sensitivities and objective sensitivities." - # end + if !iszero(model.input_cache.dobj) && + (!isempty(model.input_cache.dx) || !isempty(model.input_cache.dy)) + if !MOI.get(model, AllowObjectiveAndSolutionInput()) + @warn "Computing reverse differentiation with both solution sensitivities and objective sensitivities. " * + "Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." + end + end diff = _diff(model) MOI.set( diff, @@ -1123,6 +1126,14 @@ function MOI.supports( return true end +function MOI.supports( + ::Optimizer, + ::AllowObjectiveAndSolutionInput, + ::Bool, +) + return true +end + function MOI.set( model::Optimizer, ::NonLinearKKTJacobianFactorization, @@ -1132,10 +1143,23 @@ function MOI.set( return end +function MOI.set( + model::Optimizer, + ::AllowObjectiveAndSolutionInput, + allow, +) + model.input_cache.allow_objective_and_solution_input = allow + return +end + function MOI.get(model::Optimizer, ::NonLinearKKTJacobianFactorization) return model.input_cache.factorization end +function MOI.get(model::Optimizer, ::AllowObjectiveAndSolutionInput) + return model.input_cache.allow_objective_and_solution_input +end + function MOI.set(model::Optimizer, attr::MOI.AbstractOptimizerAttribute, value) return MOI.set(model.optimizer, attr, value) end diff --git a/test/nlp_program.jl b/test/nlp_program.jl index afc32570..1175577e 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -677,8 +677,11 @@ function test_ObjectiveSensitivity_model1() MOI.set(model, DiffOpt.ReverseObjectiveSensitivity(), Δf) MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) - # @test_warn "Computing reverse differentiation with both" - DiffOpt.reverse_differentiate!(model) + @test !MOI.get(model, DiffOpt.AllowObjectiveAndSolutionInput()) + @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!(model) + MOI.set(model, DiffOpt.AllowObjectiveAndSolutionInput(), true) + @test_nowarn DiffOpt.reverse_differentiate!(model) + dp_combined = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value From 5cb06b2b51ce87b5317c0291efd0d39e16cb4833 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 21:00:27 -0500 Subject: [PATCH 07/13] update test --- test/nlp_program.jl | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 1175577e..e5cff30c 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -685,19 +685,19 @@ function test_ObjectiveSensitivity_model1() dp_combined = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value - ε = 1e-6 - df_dp_fd = - ( - begin - set_parameter_value(p, p_val + ε) - optimize!(model) - Δf * objective_value(model) + Δp * value(x) - end - begin - set_parameter_value(p, p_val - ε) - optimize!(model) - Δf * objective_value(model) + Δp * value(x) - end - ) / (2ε) + ε = 1e-6 + df_dp_fdpos = begin + set_parameter_value(p, p_val + ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end + df_dp_fdneg = begin + set_parameter_value(p, p_val - ε) + optimize!(model) + Δf * objective_value(model) + Δp * value(x) + end + df_dp_fd = (df_dp_fdpos - df_dp_fdneg) / (2ε) + @test isapprox(df_dp_fd, dp_combined) set_parameter_value(p, p_val) From db962898492b9bd14066a0832fe6eac809bd9453 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 21:11:33 -0500 Subject: [PATCH 08/13] update attr --- src/diff_opt.jl | 2 +- src/moi_wrapper.jl | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/diff_opt.jl b/src/diff_opt.jl index 7619e5cc..065fc4a8 100644 --- a/src/diff_opt.jl +++ b/src/diff_opt.jl @@ -446,7 +446,7 @@ end function MOI.set( model::AbstractModel, ::AllowObjectiveAndSolutionInput, - allow::Function, + allow::Bool, ) model.input_cache.allow_objective_and_solution_input = allow return diff --git a/src/moi_wrapper.jl b/src/moi_wrapper.jl index a661287d..e09317fa 100644 --- a/src/moi_wrapper.jl +++ b/src/moi_wrapper.jl @@ -568,6 +568,11 @@ function reverse_differentiate!(model::Optimizer) NonLinearKKTJacobianFactorization(), model.input_cache.factorization, ) + MOI.set( + diff, + AllowObjectiveAndSolutionInput(), + model.input_cache.allow_objective_and_solution_input, + ) for (vi, value) in model.input_cache.dx MOI.set(diff, ReverseVariablePrimal(), model.index_map[vi], value) end @@ -674,6 +679,11 @@ function forward_differentiate!(model::Optimizer) NonLinearKKTJacobianFactorization(), model.input_cache.factorization, ) + MOI.set( + diff, + AllowObjectiveAndSolutionInput(), + model.input_cache.allow_objective_and_solution_input + ) T = Float64 list = MOI.get( model, From 8471f31cc4ad9692070fecc6c2dd23e0af48f711 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 21:12:15 -0500 Subject: [PATCH 09/13] format --- src/moi_wrapper.jl | 16 ++++------------ test/nlp_program.jl | 6 ++++-- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/moi_wrapper.jl b/src/moi_wrapper.jl index e09317fa..c3d94edb 100644 --- a/src/moi_wrapper.jl +++ b/src/moi_wrapper.jl @@ -559,7 +559,7 @@ function reverse_differentiate!(model::Optimizer) (!isempty(model.input_cache.dx) || !isempty(model.input_cache.dy)) if !MOI.get(model, AllowObjectiveAndSolutionInput()) @warn "Computing reverse differentiation with both solution sensitivities and objective sensitivities. " * - "Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." + "Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." end end diff = _diff(model) @@ -682,7 +682,7 @@ function forward_differentiate!(model::Optimizer) MOI.set( diff, AllowObjectiveAndSolutionInput(), - model.input_cache.allow_objective_and_solution_input + model.input_cache.allow_objective_and_solution_input, ) T = Float64 list = MOI.get( @@ -1136,11 +1136,7 @@ function MOI.supports( return true end -function MOI.supports( - ::Optimizer, - ::AllowObjectiveAndSolutionInput, - ::Bool, -) +function MOI.supports(::Optimizer, ::AllowObjectiveAndSolutionInput, ::Bool) return true end @@ -1153,11 +1149,7 @@ function MOI.set( return end -function MOI.set( - model::Optimizer, - ::AllowObjectiveAndSolutionInput, - allow, -) +function MOI.set(model::Optimizer, ::AllowObjectiveAndSolutionInput, allow) model.input_cache.allow_objective_and_solution_input = allow return end diff --git a/test/nlp_program.jl b/test/nlp_program.jl index e5cff30c..2a35cc35 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -678,14 +678,16 @@ function test_ObjectiveSensitivity_model1() MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) @test !MOI.get(model, DiffOpt.AllowObjectiveAndSolutionInput()) - @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!(model) + @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!( + model, + ) MOI.set(model, DiffOpt.AllowObjectiveAndSolutionInput(), true) @test_nowarn DiffOpt.reverse_differentiate!(model) dp_combined = MOI.get(model, DiffOpt.ReverseConstraintSet(), ParameterRef(p)).value - ε = 1e-6 + ε = 1e-6 df_dp_fdpos = begin set_parameter_value(p, p_val + ε) optimize!(model) From 898ed27f6f3ce3e9d54f4544c35221c4674039e5 Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 21:18:05 -0500 Subject: [PATCH 10/13] remove get before set test --- test/nlp_program.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 2a35cc35..0399a335 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -677,7 +677,6 @@ function test_ObjectiveSensitivity_model1() MOI.set(model, DiffOpt.ReverseObjectiveSensitivity(), Δf) MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) - @test !MOI.get(model, DiffOpt.AllowObjectiveAndSolutionInput()) @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!( model, ) From 7c095ad5ddf1630024499bc7a2162f6dc873952d Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Sun, 15 Feb 2026 22:10:37 -0500 Subject: [PATCH 11/13] try to fix the issue with julia 1.6 --- test/nlp_program.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 0399a335..854a61a7 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -677,9 +677,8 @@ function test_ObjectiveSensitivity_model1() MOI.set(model, DiffOpt.ReverseObjectiveSensitivity(), Δf) MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) - @test_warn "Computing reverse differentiation with both" DiffOpt.reverse_differentiate!( - model, - ) + warning = "Computing reverse differentiation with both solution sensitivities and objective sensitivities. Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." + @test_warn warning DiffOpt.reverse_differentiate!(model) MOI.set(model, DiffOpt.AllowObjectiveAndSolutionInput(), true) @test_nowarn DiffOpt.reverse_differentiate!(model) From dc8793683e929d7c710bb07d7d022395383c6eec Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Mon, 16 Feb 2026 20:29:02 -0500 Subject: [PATCH 12/13] support 1.6 https://docs.julialang.org/en/v1.6/stdlib/Test/#:~:text=Use%20%40test%5Flogs%20instead --- test/nlp_program.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/nlp_program.jl b/test/nlp_program.jl index 854a61a7..384072e4 100644 --- a/test/nlp_program.jl +++ b/test/nlp_program.jl @@ -677,8 +677,8 @@ function test_ObjectiveSensitivity_model1() MOI.set(model, DiffOpt.ReverseObjectiveSensitivity(), Δf) MOI.set(model, DiffOpt.ReverseVariablePrimal(), x, Δp) - warning = "Computing reverse differentiation with both solution sensitivities and objective sensitivities. Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." - @test_warn warning DiffOpt.reverse_differentiate!(model) + msg = "Computing reverse differentiation with both solution sensitivities and objective sensitivities. Set `DiffOpt.AllowObjectiveAndSolutionInput()` to `true` to silence this warning." + @test_logs (:warn, msg) DiffOpt.reverse_differentiate!(model) MOI.set(model, DiffOpt.AllowObjectiveAndSolutionInput(), true) @test_nowarn DiffOpt.reverse_differentiate!(model) From ec095ed8fa4466903db3f4ab44d743e6afac644c Mon Sep 17 00:00:00 2001 From: "Klamkin, Michael" Date: Mon, 16 Feb 2026 21:06:12 -0500 Subject: [PATCH 13/13] test lts instead of 1.6 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8bec27c..f62da45b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: include: - - version: '1.6' + - version: 'lts' os: ubuntu-latest arch: x64 - version: '1'