@@ -7,17 +7,24 @@ struct Map <: AbstractDict{MOI.VariableIndex, AbstractBridge}
77 # `i` -> `bridge`: `VariableIndex(-i)` was bridged by `bridge`.
88 bridges:: Vector{Union{Nothing, AbstractBridge}}
99 sets:: Vector{Union{Nothing, DataType}}
10+ unbridged_function:: Dict{MOI.VariableIndex, MOI.AbstractScalarFunction}
1011end
11- Map () = Map (Int[], Union{Nothing, AbstractBridge}[], Union{Nothing, DataType}[])
12+ Map () = Map (Int[], Union{Nothing, AbstractBridge}[], Union{Nothing, DataType}[], Dict {MOI.VariableIndex, MOI.AbstractScalarFunction} () )
1213Base. isempty (map:: Map ) = all (bridge -> bridge === nothing , map. bridges)
1314function Base. empty! (map:: Map )
1415 empty! (map. index_in_vector_of_variables)
1516 empty! (map. bridges)
1617 empty! (map. sets)
18+ empty! (map. unbridged_function)
1719 return map
1820end
1921function bridge_index (map:: Map , vi:: MOI.VariableIndex )
20- return - vi. value - map. index_in_vector_of_variables[- vi. value] + 1
22+ index = map. index_in_vector_of_variables[- vi. value]
23+ if iszero (index)
24+ return - vi. value
25+ else
26+ return - vi. value - index + 1
27+ end
2128end
2229function Base. haskey (map:: Map , vi:: MOI.VariableIndex )
2330 return - length (map. bridges) ≤ vi. value ≤ - 1 &&
@@ -27,8 +34,8 @@ function Base.getindex(map::Map, vi::MOI.VariableIndex)
2734 return map. bridges[bridge_index (map, vi)]
2835end
2936function Base. delete! (map:: Map , vi:: MOI.VariableIndex )
30- map. bridges[bridge_index (vi)] = nothing
31- map. sets[bridge_index (vi)] = nothing
37+ map. bridges[bridge_index (map, vi)] = nothing
38+ map. sets[bridge_index (map, vi)] = nothing
3239 return map
3340end
3441function Base. keys (map:: Map )
@@ -49,6 +56,16 @@ function index_in_vector_of_variables(map::Map, vi::MOI.VariableIndex)
4956 return IndexInVector (map. index_in_vector_of_variables[- vi. value])
5057end
5158has_bridges (map:: Map ) = ! isempty (map. index_in_vector_of_variables)
59+ function add_key_for_bridge (map:: Map , bridge:: AbstractBridge ,
60+ set:: MOI.AbstractScalarSet )
61+ index = - (length (map. bridges) + 1 )
62+ variable = MOI. VariableIndex (index)
63+ push! (map. index_in_vector_of_variables, 0 )
64+ push! (map. bridges, bridge)
65+ push! (map. sets, typeof (set))
66+ push! (map. unbridged_function, unbridged_map (bridge, variable))
67+ return variable, MOI. ConstraintIndex {MOI.SingleVariable, typeof(set)} (index)
68+ end
5269function add_keys_for_bridge (map:: Map , bridge:: AbstractBridge ,
5370 set:: MOI.AbstractVectorSet )
5471 if iszero (MOI. dimension (set))
@@ -64,6 +81,10 @@ function add_keys_for_bridge(map::Map, bridge::AbstractBridge,
6481 push! (map. bridges, nothing )
6582 push! (map. sets, nothing )
6683 end
84+ for i in 1 : MOI. dimension (set)
85+ push! (map. unbridged_function, unbridged_map (bridge, variables[i],
86+ IndexInVector (i)))
87+ end
6788 index = first (variables). value
6889 return variables, MOI. ConstraintIndex {MOI.VectorOfVariables, typeof(set)} (index)
6990 end
@@ -78,6 +99,9 @@ function Base.iterate(map::Map, state=1)
7899 return MOI. VariableIndex (- state) => map. bridges[state], state + 1
79100 end
80101end
102+ function unbridged_function (map:: Map , vi:: MOI.VariableIndex )
103+ return get (map. unbridged_function, vi, MOI. SingleVariable (vi))
104+ end
81105
82106struct EmptyMap <: AbstractDict{MOI.VariableIndex, AbstractBridge} end
83107Base. isempty (:: EmptyMap ) = true
@@ -109,19 +133,27 @@ function bridges(bridge::MOI.Bridges.AbstractBridgeOptimizer)
109133end
110134bridges (bridge:: SingleBridgeOptimizer ) = bridge. map
111135
136+ function MOIB. supports_bridging_constraint (
137+ b:: SingleBridgeOptimizer{BT} , :: Type{MOI.SingleVariable} ,
138+ S:: Type{<:MOI.AbstractScalarSet} ) where BT
139+ return supports_constrained_variables (BT, S)
140+ end
112141function MOIB. supports_bridging_constraint (
113142 b:: SingleBridgeOptimizer{BT} , :: Type{MOI.VectorOfVariables} ,
114143 S:: Type{<:MOI.AbstractVectorSet} ) where BT
115144 return supports_constrained_variables (BT, S)
116145end
146+ function MOIB. is_bridged (b:: SingleBridgeOptimizer , S:: Type{<:MOI.AbstractScalarSet} )
147+ return MOIB. supports_bridging_constraint (b, MOI. SingleVariable, S)
148+ end
149+ function MOIB. is_bridged (b:: SingleBridgeOptimizer , S:: Type{<:MOI.AbstractVectorSet} )
150+ return MOIB. supports_bridging_constraint (b, MOI. VectorOfVariables, S)
151+ end
117152function MOIB. is_bridged (:: SingleBridgeOptimizer ,
118153 :: Type{<:MOI.AbstractFunction} ,
119154 :: Type{<:MOI.AbstractSet} )
120155 return false
121156end
122- function MOIB. is_bridged (b:: SingleBridgeOptimizer , S:: Type{<:MOI.AbstractVectorSet} )
123- return MOIB. supports_bridging_constraint (b, MOI. VectorOfVariables, S)
124- end
125157function MOIB. bridge_type (:: SingleBridgeOptimizer{BT} ,
126158 :: Type{<:MOI.AbstractSet} ) where BT
127159 return BT
0 commit comments