Skip to content

Commit ebdb187

Browse files
authored
Fix type stability of src/bound.jl (#27)
1 parent 0590ca5 commit ebdb187

File tree

1 file changed

+49
-57
lines changed

1 file changed

+49
-57
lines changed

src/bound.jl

Lines changed: 49 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,146 +4,138 @@
44
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
55

66
function _bound_infeasibility!(optimizer::Optimizer, ::Type{T}) where {T}
7-
variables = Dict{MOI.VariableIndex,Interval{T}}()
8-
9-
variable_indices =
10-
MOI.get(optimizer.original_model, MOI.ListOfVariableIndices())
7+
return _bound_infeasibility!(optimizer.original_model, optimizer.results, T)
8+
end
119

10+
function _bound_infeasibility!(
11+
original_model::MOI.ModelLike,
12+
results::Vector{InfeasibilityData},
13+
::Type{T},
14+
) where {T}
15+
variables = Dict{MOI.VariableIndex,Interval{T}}()
16+
variable_indices = MOI.get(original_model, MOI.ListOfVariableIndices())
1217
lb = Dict{MOI.VariableIndex,T}()
1318
lb_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()
1419
ub = Dict{MOI.VariableIndex,T}()
1520
ub_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()
16-
1721
for con in MOI.get(
18-
optimizer.original_model,
22+
original_model,
1923
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.EqualTo{T}}(),
2024
)
21-
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
22-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
25+
set = MOI.get(original_model, MOI.ConstraintSet(), con)
26+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
2327
lb[func] = set.value
2428
lb_con[func] = con
2529
ub[func] = set.value
2630
ub_con[func] = con
2731
end
28-
2932
for con in MOI.get(
30-
optimizer.original_model,
33+
original_model,
3134
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.LessThan{T}}(),
3235
)
33-
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
34-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
35-
# lb[func] = -Inf
36+
set = MOI.get(original_model, MOI.ConstraintSet(), con)
37+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
38+
# lb[func] = typemin(T)
3639
ub[func] = set.upper
3740
ub_con[func] = con
3841
end
39-
4042
for con in MOI.get(
41-
optimizer.original_model,
43+
original_model,
4244
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.GreaterThan{T}}(),
4345
)
44-
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
45-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
46+
set = MOI.get(original_model, MOI.ConstraintSet(), con)
47+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
4648
lb[func] = set.lower
4749
lb_con[func] = con
48-
# ub[func] = Inf
50+
# ub[func] = typemax(T)
4951
end
50-
5152
for con in MOI.get(
52-
optimizer.original_model,
53+
original_model,
5354
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Interval{T}}(),
5455
)
55-
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
56-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
56+
set = MOI.get(original_model, MOI.ConstraintSet(), con)
57+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
5758
lb[func] = set.lower
5859
lb_con[func] = con
5960
ub[func] = set.upper
6061
ub_con[func] = con
6162
end
62-
63-
# for con in MOI.get(optimizer.original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiContinuous{T}}())
64-
# set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
65-
# func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
63+
# for con in MOI.get(original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiContinuous{T}}())
64+
# set = MOI.get(original_model, MOI.ConstraintSet(), con)
65+
# func = MOI.get(original_model, MOI.ConstraintFunction(), con)
6666
# lb[func] = 0 # set.lower
6767
# ub[func] = set.upper
6868
# end
69-
70-
# for con in MOI.get(optimizer.original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiInteger{T}}())
71-
# set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
72-
# func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
69+
# for con in MOI.get(original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiInteger{T}}())
70+
# set = MOI.get(original_model, MOI.ConstraintSet(), con)
71+
# func = MOI.get(original_model, MOI.ConstraintFunction(), con)
7372
# lb[func] = 0 #set.lower
7473
# ub[func] = set.upper
7574
# end
76-
7775
bounds_consistent = true
78-
7976
for con in MOI.get(
80-
optimizer.original_model,
77+
original_model,
8178
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Integer}(),
8279
)
83-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
84-
_lb = get(lb, func, -Inf)
85-
_ub = get(ub, func, Inf)
80+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
81+
_lb, _ub = get(lb, func, typemin(T)), get(ub, func, typemax(T))
8682
if abs(_ub - _lb) < 1 && ceil(_ub) == ceil(_lb)
8783
push!(
88-
optimizer.results,
84+
results,
8985
InfeasibilityData(
90-
[con, lb_con[func], ub_con[func]],
86+
MOI.ConstraintIndex[con, lb_con[func], ub_con[func]],
9187
true,
9288
IntegralityData(_lb, _ub, MOI.Integer()),
9389
),
9490
)
9591
bounds_consistent = false
9692
end
9793
end
98-
9994
for con in MOI.get(
100-
optimizer.original_model,
95+
original_model,
10196
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.ZeroOne}(),
10297
)
103-
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
104-
_lb = get(lb, func, -Inf)
105-
_ub = get(ub, func, Inf)
106-
if _lb > 0 && _ub < 1
98+
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
99+
_lb, _ub = get(lb, func, typemin(T)), get(ub, func, typemax(T))
100+
if 0 < _lb && _ub < 1
107101
push!(
108-
optimizer.results,
102+
results,
109103
InfeasibilityData(
110-
[con, lb_con[func], ub_con[func]],
104+
MOI.ConstraintIndex[con, lb_con[func], ub_con[func]],
111105
true,
112106
IntegralityData(_lb, _ub, MOI.ZeroOne()),
113107
),
114108
)
115109
bounds_consistent = false
116110
elseif _lb > 1
117111
push!(
118-
optimizer.results,
112+
results,
119113
InfeasibilityData(
120-
[con, lb_con[func]],
114+
MOI.ConstraintIndex[con, lb_con[func]],
121115
true,
122-
IntegralityData(_lb, Inf, MOI.ZeroOne()),
116+
IntegralityData(_lb, typemax(T), MOI.ZeroOne()),
123117
),
124118
)
125119
bounds_consistent = false
126120
elseif _ub < 0
127121
push!(
128-
optimizer.results,
122+
results,
129123
InfeasibilityData(
130-
[con, ub_con[func]],
124+
MOI.ConstraintIndex[con, ub_con[func]],
131125
true,
132-
IntegralityData(-Inf, _ub, MOI.ZeroOne()),
126+
IntegralityData(typemin(T), _ub, MOI.ZeroOne()),
133127
),
134128
)
135129
bounds_consistent = false
136130
end
137131
end
138-
139132
for var in variable_indices
140-
_lb = get(lb, var, -Inf)
141-
_ub = get(ub, var, Inf)
133+
_lb, _ub = get(lb, var, typemin(T)), get(ub, var, typemax(T))
142134
if _lb > _ub
143135
push!(
144-
optimizer.results,
136+
results,
145137
InfeasibilityData(
146-
[lb_con[var], ub_con[var]],
138+
MOI.ConstraintIndex[lb_con[var], ub_con[var]],
147139
true,
148140
BoundsData(_lb, _ub),
149141
),

0 commit comments

Comments
 (0)