From 92424ea8c8bd2fcbadcc384899c716ace57c9aa5 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 09:54:35 +1300 Subject: [PATCH 1/6] Update tests for SCS.jl@2 --- src/MOI_wrapper.jl | 1 + test/Project.toml | 2 +- test/test_JuMP.jl | 33 ++++++++++++++++++--------------- test/test_MathOptInterface.jl | 17 ++++++++++++++++- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 71ac674d..c1f5f0c0 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -1950,6 +1950,7 @@ end function MOI.optimize!(model::Optimizer) if !isempty(model.updated_parameters) + MOI.Utilities.final_touch(model, nothing) update_parameters!(model) end MOI.optimize!(model.optimizer) diff --git a/test/Project.toml b/test/Project.toml index 4adebdb2..3642db5a 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -12,4 +12,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" HiGHS = "1" Ipopt = "1" JuMP = "1" -SCS = "1" +SCS = "2" diff --git a/test/test_JuMP.jl b/test/test_JuMP.jl index df6d1767..eb899715 100644 --- a/test/test_JuMP.jl +++ b/test/test_JuMP.jl @@ -31,6 +31,19 @@ function canonical_compare(f1, f2) return MOI.Utilities.canonical(f1) ≈ MOI.Utilities.canonical(f2) end +""" + SCSOptimizerWithModelCache() + +We don't use the default cache because it doesn't support modification of the +constraint matrix. +""" +function SCSOptimizerWithModelCache() + return MOI.Utilities.CachingOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + SCS.Optimizer(), + ) +end + function test_jump_direct_affine_parameters() optimizer = POI.Optimizer(HiGHS.Optimizer) model = direct_model(optimizer) @@ -1297,7 +1310,7 @@ function test_jump_psd_cone_with_parameter_p() end function test_jump_psd_cone_with_parameter_pv_v_pv() - model = Model(() -> POI.Optimizer(SCS.Optimizer)) + model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1326,7 +1339,7 @@ function test_jump_psd_cone_with_parameter_pv_v_pv() end function test_jump_psd_cone_with_parameter_pp_v_pv() - model = Model(() -> POI.Optimizer(SCS.Optimizer)) + model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1348,7 +1361,7 @@ function test_jump_psd_cone_with_parameter_pp_v_pv() end function test_jump_psd_cone_with_parameter_p_v_pv() - model = Model(() -> POI.Optimizer(SCS.Optimizer)) + model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1406,18 +1419,8 @@ function test_jump_psd_cone_without_parameter_v_and_vv() end function test_variable_and_constraint_not_registered() - cached1 = MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) - optimizer1 = POI.Optimizer(cached1) - model1 = direct_model(optimizer1) - cached2 = MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) - optimizer2 = POI.Optimizer(cached2) - model2 = direct_model(optimizer2) + model1 = direct_model(POI.Optimizer(SCSOptimizerWithModelCache)) + model2 = direct_model(POI.Optimizer(SCSOptimizerWithModelCache)) set_silent(model1) set_silent(model2) @variable(model1, x) diff --git a/test/test_MathOptInterface.jl b/test/test_MathOptInterface.jl index 8fc71675..54876eb8 100644 --- a/test/test_MathOptInterface.jl +++ b/test/test_MathOptInterface.jl @@ -30,6 +30,19 @@ function canonical_compare(f1, f2) return MOI.Utilities.canonical(f1) ≈ MOI.Utilities.canonical(f2) end +""" + SCSOptimizerWithModelCache() + +We don't use the default cache because it doesn't support modification of the +constraint matrix. +""" +function SCSOptimizerWithModelCache() + return MOI.Utilities.CachingOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + SCS.Optimizer(), + ) +end + MOI.Utilities.@model( NoFreeVariablesModel, (), @@ -1999,7 +2012,8 @@ function test_psd_cone_with_parameter() minobjective: 1x c1: [0, px + -1, 0] in PositiveSemidefiniteConeTriangle(2) =# - model = POI.Optimizer(SCS.Optimizer; with_bridge_type = Float64) + model = + POI.Optimizer(SCSOptimizerWithModelCache; with_bridge_type = Float64) MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) p = first.(MOI.add_constrained_variable.(model, MOI.Parameter(1.0))) @@ -2035,6 +2049,7 @@ function test_psd_cone_with_parameter() @test MOI.get(model, MOI.ConstraintName(), c_index) == "" MOI.set(model, MOI.ConstraintName(), c_index, "psd_cone") @test MOI.get(model, MOI.ConstraintName(), c_index) == "psd_cone" + return end function test_copy_model() From ac3fc1f643f3dd576b7fe211c85c2b03bc186918 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 10:26:24 +1300 Subject: [PATCH 2/6] Update --- src/ParametricOptInterface.jl | 9 ++++- test/test_JuMP.jl | 48 +++++------------------ test/test_MathOptInterface.jl | 72 ++++++----------------------------- 3 files changed, 28 insertions(+), 101 deletions(-) diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index ce0d9285..8639dc01 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -280,7 +280,14 @@ function Optimizer{T}( ) where {T} inner = MOI.instantiate(optimizer_fn; with_bridge_type) if !MOI.supports_incremental_interface(inner) - cache = MOI.default_cache(inner, T) + # Don't use `default_cache` for the cache because, for example, SCS's + # default cache doesn't support modifying coefficients of the constraint + # matrix. JuMP uses the default cache with SCS because it has an outer + # layer of caching; we don't have that here, so we can't use the + # default. + # + # We could revert to using the default cache if we fix this in MOI. + cache = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{T}()) inner = MOI.Utilities.CachingOptimizer(cache, inner) end return Optimizer{T}(inner; kwargs...) diff --git a/test/test_JuMP.jl b/test/test_JuMP.jl index eb899715..7a1e6c22 100644 --- a/test/test_JuMP.jl +++ b/test/test_JuMP.jl @@ -31,19 +31,6 @@ function canonical_compare(f1, f2) return MOI.Utilities.canonical(f1) ≈ MOI.Utilities.canonical(f2) end -""" - SCSOptimizerWithModelCache() - -We don't use the default cache because it doesn't support modification of the -constraint matrix. -""" -function SCSOptimizerWithModelCache() - return MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) -end - function test_jump_direct_affine_parameters() optimizer = POI.Optimizer(HiGHS.Optimizer) model = direct_model(optimizer) @@ -847,12 +834,7 @@ function test_jump_dual_delete_constraint_2() end function test_jump_dual_delete_constraint_3() - cached = MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) - optimizer = POI.Optimizer(cached) - model = direct_model(optimizer) + model = direct_model(POI.Optimizer(SCS.Optimizer)) set_silent(model) list = [] @variable(model, α in Parameter(1.0)) @@ -1224,15 +1206,8 @@ function test_parameter_Cannot_be_inf_2() end function test_jump_psd_cone_with_parameter_pv() - cached = MOI.Bridges.full_bridge_optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ), - Float64, - ) - optimizer = POI.Optimizer(cached) - model = direct_model(optimizer) + inner = POI.Optimizer(SCS.Optimizer; with_bridge_type = Float64) + model = direct_model(inner) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1310,7 +1285,7 @@ function test_jump_psd_cone_with_parameter_p() end function test_jump_psd_cone_with_parameter_pv_v_pv() - model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) + model = Model(() -> POI.Optimizer(SCS.Optimizer)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1339,7 +1314,7 @@ function test_jump_psd_cone_with_parameter_pv_v_pv() end function test_jump_psd_cone_with_parameter_pp_v_pv() - model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) + model = Model(() -> POI.Optimizer(SCS.Optimizer)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1361,7 +1336,7 @@ function test_jump_psd_cone_with_parameter_pp_v_pv() end function test_jump_psd_cone_with_parameter_p_v_pv() - model = Model(() -> POI.Optimizer(SCSOptimizerWithModelCache)) + model = Model(() -> POI.Optimizer(SCS.Optimizer)) set_silent(model) @variable(model, x) @variable(model, p in Parameter(1.0)) @@ -1419,8 +1394,8 @@ function test_jump_psd_cone_without_parameter_v_and_vv() end function test_variable_and_constraint_not_registered() - model1 = direct_model(POI.Optimizer(SCSOptimizerWithModelCache)) - model2 = direct_model(POI.Optimizer(SCSOptimizerWithModelCache)) + model1 = direct_model(POI.Optimizer(SCS.Optimizer)) + model2 = direct_model(POI.Optimizer(SCS.Optimizer)) set_silent(model1) set_silent(model2) @variable(model1, x) @@ -1508,12 +1483,7 @@ function test_variable_and_constraint_not_registered() end function test_jump_errors() - cached1 = MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) - optimizer1 = POI.Optimizer(cached1) - model = direct_model(optimizer1) + model = direct_model(POI.Optimizer(SCS.Optimizer)) @test_throws MOI.UnsupportedAttribute MOI.get( backend(model), MOI.NLPBlock(), diff --git a/test/test_MathOptInterface.jl b/test/test_MathOptInterface.jl index 54876eb8..1bee53bb 100644 --- a/test/test_MathOptInterface.jl +++ b/test/test_MathOptInterface.jl @@ -30,19 +30,6 @@ function canonical_compare(f1, f2) return MOI.Utilities.canonical(f1) ≈ MOI.Utilities.canonical(f2) end -""" - SCSOptimizerWithModelCache() - -We don't use the default cache because it doesn't support modification of the -constraint matrix. -""" -function SCSOptimizerWithModelCache() - return MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - SCS.Optimizer(), - ) -end - MOI.Utilities.@model( NoFreeVariablesModel, (), @@ -335,13 +322,7 @@ function test_moi_highs() end function test_moi_ipopt() - model = MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - MOI.Bridges.full_bridge_optimizer( - POI.Optimizer(Ipopt.Optimizer), - Float64, - ), - ) + model = POI.Optimizer(Ipopt.Optimizer; with_bridge_type = Float64) MOI.set(model, MOI.Silent(), true) # Without fixed_variable_treatment set, duals are not computed for variables # that have lower_bound == upper_bound. @@ -583,14 +564,7 @@ function test_production_problem_example_duals() end function test_production_problem_example_parameters_for_duals_and_intervals() - cached = MOI.Bridges.full_bridge_optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - HiGHS.Optimizer(), - ), - Float64, - ) - optimizer = POI.Optimizer(cached) + model = POI.Optimizer(HiGHS.Optimizer; with_bridge_type = Float64) MOI.set(optimizer, MOI.Silent(), true) c = [4.0, 3.0] A1 = [2.0, 1.0, 3.0] @@ -2012,8 +1986,7 @@ function test_psd_cone_with_parameter() minobjective: 1x c1: [0, px + -1, 0] in PositiveSemidefiniteConeTriangle(2) =# - model = - POI.Optimizer(SCSOptimizerWithModelCache; with_bridge_type = Float64) + model = POI.Optimizer(SCS.Optimizer; with_bridge_type = Float64) MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) p = first.(MOI.add_constrained_variable.(model, MOI.Parameter(1.0))) @@ -2141,14 +2114,8 @@ struct VariableAttributeForTest <: MOI.AbstractVariableAttribute end struct ConstraintAttributeForTest <: MOI.AbstractConstraintAttribute end function test_variable_attribute_error() - solver = HiGHS.Optimizer() - MOI.set(solver, MOI.Silent(), true) - model = POI.Optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - MOI.Bridges.full_bridge_optimizer(solver, Float64), - ), - ) + model = POI.Optimizer(HiGHS.Optimizer; with_bridge_type = Float64) + MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) MOI.set(model, VariableAttributeForTest(), x, 1.0) p, pc = MOI.add_constrained_variable(model, MOI.Parameter(1.0)) @@ -2163,13 +2130,8 @@ function test_variable_attribute_error() end function test_constraint_attribute_error() - solver = MOI.Utilities.Model{Float64}() - model = POI.Optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - MOI.Bridges.full_bridge_optimizer(solver, Float64), - ), - ) + model = + POI.Optimizer(MOI.Utilities.Model{Float64}; with_bridge_type = Float64) MOI.supports( model, ConstraintAttributeForTest(), @@ -2185,13 +2147,8 @@ function test_constraint_attribute_error() end function test_name_from_bound() - solver = MOI.Utilities.Model{Float64}() - model = POI.Optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - MOI.Bridges.full_bridge_optimizer(solver, Float64), - ), - ) + model = + POI.Optimizer(MOI.Utilities.Model{Float64}; with_bridge_type = Float64) x = MOI.add_variable(model) p, pc = MOI.add_constrained_variable(model, MOI.Parameter(1.0)) MOI.set(model, POI.ConstraintsInterpretation(), POI.ONLY_BOUNDS) @@ -2215,15 +2172,8 @@ function test_get_constraint_set() end function test_quadratic_variable_parameter() - # model = POI.Optimizer(MOI.Utilities.Model{Float64}()) - solver = Ipopt.Optimizer() - MOI.set(solver, MOI.Silent(), true) - model = POI.Optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - MOI.Bridges.full_bridge_optimizer(solver, Float64), - ), - ) + model = POI.Optimizer(Ipopt.Optimizer; with_bridge_type = Float64) + MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) p, pc = MOI.add_constrained_variable(model, MOI.Parameter(1.0)) f = 1.0 * x * x - 2.0 * p * p From 1a88422b11007287ad859764d99a4c9b8ae23e97 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 10:41:19 +1300 Subject: [PATCH 3/6] UPdate --- src/ParametricOptInterface.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index 8639dc01..4c177396 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -278,7 +278,7 @@ function Optimizer{T}( with_bridge_type = nothing, kwargs..., ) where {T} - inner = MOI.instantiate(optimizer_fn; with_bridge_type) + inner = MOI.instantiate(optimizer_fn) if !MOI.supports_incremental_interface(inner) # Don't use `default_cache` for the cache because, for example, SCS's # default cache doesn't support modifying coefficients of the constraint @@ -290,6 +290,9 @@ function Optimizer{T}( cache = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{T}()) inner = MOI.Utilities.CachingOptimizer(cache, inner) end + if with_bridge_type !== nothing + inner = MOI.Bridges.full_bridge_optimizer(inner, with_bridge_type) + end return Optimizer{T}(inner; kwargs...) end From 1aa94e4331ca8169f7a5bbba41fb89f78a179979 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 11:11:08 +1300 Subject: [PATCH 4/6] Update --- src/ParametricOptInterface.jl | 3 ++- test/test_MathOptInterface.jl | 26 +++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index 4c177396..2458dfca 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -276,9 +276,10 @@ Optimizer(arg; kwargs...) = Optimizer{Float64}(arg; kwargs...) function Optimizer{T}( optimizer_fn; with_bridge_type = nothing, + with_cache_type = nothing, kwargs..., ) where {T} - inner = MOI.instantiate(optimizer_fn) + inner = MOI.instantiate(optimizer_fn; with_cache_type) if !MOI.supports_incremental_interface(inner) # Don't use `default_cache` for the cache because, for example, SCS's # default cache doesn't support modifying coefficients of the constraint diff --git a/test/test_MathOptInterface.jl b/test/test_MathOptInterface.jl index 1bee53bb..5c486a07 100644 --- a/test/test_MathOptInterface.jl +++ b/test/test_MathOptInterface.jl @@ -322,7 +322,11 @@ function test_moi_highs() end function test_moi_ipopt() - model = POI.Optimizer(Ipopt.Optimizer; with_bridge_type = Float64) + model = POI.Optimizer( + Ipopt.Optimizer; + with_bridge_type = Float64, + with_cache_type = Float64, + ) MOI.set(model, MOI.Silent(), true) # Without fixed_variable_treatment set, duals are not computed for variables # that have lower_bound == upper_bound. @@ -564,7 +568,7 @@ function test_production_problem_example_duals() end function test_production_problem_example_parameters_for_duals_and_intervals() - model = POI.Optimizer(HiGHS.Optimizer; with_bridge_type = Float64) + optimizer = POI.Optimizer(HiGHS.Optimizer; with_bridge_type = Float64) MOI.set(optimizer, MOI.Silent(), true) c = [4.0, 3.0] A1 = [2.0, 1.0, 3.0] @@ -626,14 +630,14 @@ function test_production_problem_example_parameters_for_duals_and_intervals() MOI.set(optimizer, MOI.ConstraintSet(), cz, MOI.Parameter(1.0)) MOI.optimize!(optimizer) @test ≈(MOI.get(optimizer, MOI.ObjectiveValue()), 7.0, atol = ATOL) - @test MOI.get.(optimizer, MOI.VariablePrimal(), x) == [0.0, 1.0] + @test MOI.get.(optimizer, MOI.VariablePrimal(), x) ≈ [0.0, 1.0] @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cy), 9.0, atol = ATOL) @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cz), 0.0, atol = ATOL) @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cw), -2.0, atol = ATOL) MOI.set(optimizer, MOI.ConstraintSet(), cw, MOI.Parameter(0.0)) MOI.optimize!(optimizer) @test ≈(MOI.get(optimizer, MOI.ObjectiveValue()), 3.0, atol = ATOL) - @test MOI.get.(optimizer, MOI.VariablePrimal(), x) == [0.0, 1.0] + @test MOI.get.(optimizer, MOI.VariablePrimal(), x) ≈ [0.0, 1.0] @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cy), 9.0, atol = ATOL) @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cz), 0.0, atol = ATOL) @test ≈(MOI.get(optimizer, MOI.ConstraintDual(), cw), -2.0, atol = ATOL) @@ -2113,8 +2117,12 @@ end struct VariableAttributeForTest <: MOI.AbstractVariableAttribute end struct ConstraintAttributeForTest <: MOI.AbstractConstraintAttribute end -function test_variable_attribute_error() - model = POI.Optimizer(HiGHS.Optimizer; with_bridge_type = Float64) +function test_AA_variable_attribute_error() + model = POI.Optimizer( + HiGHS.Optimizer; + with_bridge_type = Float64, + with_cache_type = Float64, + ) MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) MOI.set(model, VariableAttributeForTest(), x, 1.0) @@ -2172,7 +2180,11 @@ function test_get_constraint_set() end function test_quadratic_variable_parameter() - model = POI.Optimizer(Ipopt.Optimizer; with_bridge_type = Float64) + model = POI.Optimizer( + Ipopt.Optimizer; + with_bridge_type = Float64, + with_cache_type = Float64, + ) MOI.set(model, MOI.Silent(), true) x = MOI.add_variable(model) p, pc = MOI.add_constrained_variable(model, MOI.Parameter(1.0)) From 1cc96424f2cbe582e72fbf16c035e21f4149654f Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 11:12:56 +1300 Subject: [PATCH 5/6] Update --- src/ParametricOptInterface.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ParametricOptInterface.jl b/src/ParametricOptInterface.jl index 2458dfca..5ade1c4c 100644 --- a/src/ParametricOptInterface.jl +++ b/src/ParametricOptInterface.jl @@ -57,13 +57,17 @@ include("parametric_cubic_function.jl") evaluate_duals::Bool = true, save_original_objective_and_constraints::Bool = true, with_bridge_type = nothing, + with_cache_type = nothing, ) Create an `Optimizer`, which allows the handling of parameters in an optimization model. If `optimizer` is not a `MOI.ModelLike,` the inner optimizer is constructed -using `MOI.instantiate(optimizer; with_bridge_type)`. +using `MOI.instantiate(optimizer; with_cache_type)`. + +If `with_bridge_type !== nothing`, a `MOI.Bridges.full_bridge_optimizer` is +applied as an outer layer. The `{T}` type parameter is optional; it defaults to `Float64`. @@ -82,8 +86,9 @@ The `{T}` type parameter is optional; it defaults to `Float64`. Note that this might break printing or queries such as `MOI.get(model, MOI.ConstraintFunction(), c)`. Defaults to `true`. -- `with_bridge_type`: this is ignroed if `optimizer::MOI.ModelLike`, otherwise - it is passed to `MOI.instantiate`. +- `with_bridge_type`: the type passed to `MOI.Bridges.full_bridge_optimizer` + +- `with_cache_type`: the type passed to `MOI.instantiate` ## Example From 81361a0756af879d63f071ee1c9e99d195dbbf94 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 18 Feb 2026 11:33:58 +1300 Subject: [PATCH 6/6] Update --- test/test_MathOptInterface.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_MathOptInterface.jl b/test/test_MathOptInterface.jl index 5c486a07..82fc5eae 100644 --- a/test/test_MathOptInterface.jl +++ b/test/test_MathOptInterface.jl @@ -362,6 +362,7 @@ function test_moi_ipopt() # - CachingOptimizer does not throw if optimizer not attached "test_model_copy_to_UnsupportedAttribute", "test_model_copy_to_UnsupportedConstraint", + "test_model_ModelFilter_AbstractConstraintAttribute", # - POI only supports cubic polynomial ScalarNonlinearFunction "test_nonlinear_duals", "test_nonlinear_expression_",