From dcfbf43ef06e91e2beeba7109974ebc6beb96ab7 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 1617834d..87218209 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 c266c715..df2b05dc 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 ee7f1fe0ae5e52c29a2d93de88b0b6510ded69bb 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 df2b05dc..81afcc2d 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 e78d6871341c19362936a8568a7aae41e797c780 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 81afcc2d..f56ad12f 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 5bd4939483622bd6aafcb7ea5dadb5cf53828e30 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 f56ad12f..3a339ea7 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 c8efca14d370a9c4ad04c84f8fc3e193f73a71df 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 3a339ea7..80ffd33b 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 2f3b95b986a2441d2e1036bddf7f57644ec72e83 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 87218209..eef88e4d 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, @@ -1031,6 +1034,14 @@ function MOI.supports( return true end +function MOI.supports( + ::Optimizer, + ::AllowObjectiveAndSolutionInput, + ::Bool, +) + return true +end + function MOI.set( model::Optimizer, ::NonLinearKKTJacobianFactorization, @@ -1040,10 +1051,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 80ffd33b..31ea608e 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 6cbf1a16a3fc9e217e341dbb401b71e247f71748 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 31ea608e..8c6ba2b8 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 c64d608b4ec179da40fae1d2e977edf07d70c971 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 eef88e4d..2647e8f7 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 @@ -605,6 +610,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 6372a4a3e627e1648a8b37d8edb0d56d5302709c 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 2647e8f7..cfc4cf07 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) @@ -613,7 +613,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( @@ -1044,11 +1044,7 @@ function MOI.supports( return true end -function MOI.supports( - ::Optimizer, - ::AllowObjectiveAndSolutionInput, - ::Bool, -) +function MOI.supports(::Optimizer, ::AllowObjectiveAndSolutionInput, ::Bool) return true end @@ -1061,11 +1057,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 8c6ba2b8..90624f67 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 20640367483dbe70c9f25848db7df9414f822e0d 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 90624f67..56a22814 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 fcf50ff86044a949f9a43d35edff0e9a8bc4ae7b 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 56a22814..f5edebd7 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 5f14ae485b9a993b9ba1cfc187fcf0461b502782 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 f5edebd7..a3adf3d6 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 763ecf53adf3b0844829af1076bf7836451c82c2 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'