diff --git a/src/Bridges/Variable/map.jl b/src/Bridges/Variable/map.jl index 0ed3ad0c5a..a1efd6d047 100644 --- a/src/Bridges/Variable/map.jl +++ b/src/Bridges/Variable/map.jl @@ -174,7 +174,6 @@ function number_of_variables(map::Map) num += length_of_vector_of_variables(map, MOI.VariableIndex(-i)) end end - count(bridge -> bridge !== nothing, map.bridges) end return num end diff --git a/src/Bridges/bridge_optimizer.jl b/src/Bridges/bridge_optimizer.jl index 5eb5095783..fa2638e7a0 100644 --- a/src/Bridges/bridge_optimizer.jl +++ b/src/Bridges/bridge_optimizer.jl @@ -760,6 +760,11 @@ function _get_all_including_bridged( ret = MOI.VariableIndex[] for inner_variable in MOI.get(b.model, attr) outer_variable = get(inner_to_outer, inner_variable, missing) + # If there is a chain of variable bridges, the `outer_variable` may need + # to be mapped. + while haskey(inner_to_outer, outer_variable) + outer_variable = inner_to_outer[outer_variable] + end if ismissing(outer_variable) # inner_variable does not exist in inner_to_outer, which means that # it is not bridged. Pass through unchanged. diff --git a/test/Bridges/bridge_optimizer.jl b/test/Bridges/bridge_optimizer.jl index f028340a4e..da8a26a4b1 100644 --- a/test/Bridges/bridge_optimizer.jl +++ b/test/Bridges/bridge_optimizer.jl @@ -1422,6 +1422,36 @@ function test_fallback_delete_objective_bridge() return end +struct Model2714 <: MOI.ModelLike + dimensions::Vector{Int} + Model2714() = new(Int[]) +end + +MOI.is_empty(model::Model2714) = isempty(model.dimensions) + +function MOI.supports_add_constrained_variables( + ::Model2714, + ::Type{MOI.Nonnegatives}, +) + return true +end + +function MOI.add_constrained_variables(model::Model2714, set::MOI.Nonnegatives) + n = MOI.dimension(set) + x = MOI.VariableIndex(sum(model.dimensions) .+ (1:n)) + push!(model.dimensions, n) + F, S = MOI.VectorOfVariables, MOI.Nonnegatives + return x, MOI.ConstraintIndex{F,S}(length(model.dimensions)) +end + +function test_issue_2714() + model = MOI.instantiate(Model2714; with_bridge_type = Float64) + t, _ = MOI.add_constrained_variable(model, MOI.LessThan(10.0)) + @test MOI.get(model, MOI.NumberOfVariables()) == 1 + @test MOI.get(model, MOI.ListOfVariableIndices()) == [t] + return +end + end # module TestBridgeOptimizer.runtests()