Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 49 additions & 57 deletions src/bound.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,146 +4,138 @@
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.

function _bound_infeasibility!(optimizer::Optimizer, ::Type{T}) where {T}
variables = Dict{MOI.VariableIndex,Interval{T}}()

variable_indices =
MOI.get(optimizer.original_model, MOI.ListOfVariableIndices())
return _bound_infeasibility!(optimizer.original_model, optimizer.results, T)
end

function _bound_infeasibility!(
original_model::MOI.ModelLike,
results::Vector{InfeasibilityData},
::Type{T},
) where {T}
variables = Dict{MOI.VariableIndex,Interval{T}}()
variable_indices = MOI.get(original_model, MOI.ListOfVariableIndices())
lb = Dict{MOI.VariableIndex,T}()
lb_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()
ub = Dict{MOI.VariableIndex,T}()
ub_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.EqualTo{T}}(),
)
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
set = MOI.get(original_model, MOI.ConstraintSet(), con)
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
lb[func] = set.value
lb_con[func] = con
ub[func] = set.value
ub_con[func] = con
end

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.LessThan{T}}(),
)
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
# lb[func] = -Inf
set = MOI.get(original_model, MOI.ConstraintSet(), con)
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
# lb[func] = typemin(T)
ub[func] = set.upper
ub_con[func] = con
end

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.GreaterThan{T}}(),
)
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
set = MOI.get(original_model, MOI.ConstraintSet(), con)
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
lb[func] = set.lower
lb_con[func] = con
# ub[func] = Inf
# ub[func] = typemax(T)
end

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Interval{T}}(),
)
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
set = MOI.get(original_model, MOI.ConstraintSet(), con)
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
lb[func] = set.lower
lb_con[func] = con
ub[func] = set.upper
ub_con[func] = con
end

# for con in MOI.get(optimizer.original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiContinuous{T}}())
# set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
# func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
# for con in MOI.get(original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiContinuous{T}}())
# set = MOI.get(original_model, MOI.ConstraintSet(), con)
# func = MOI.get(original_model, MOI.ConstraintFunction(), con)
# lb[func] = 0 # set.lower
# ub[func] = set.upper
# end

# for con in MOI.get(optimizer.original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiInteger{T}}())
# set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
# func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
# for con in MOI.get(original_model, MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.SemiInteger{T}}())
# set = MOI.get(original_model, MOI.ConstraintSet(), con)
# func = MOI.get(original_model, MOI.ConstraintFunction(), con)
# lb[func] = 0 #set.lower
# ub[func] = set.upper
# end

bounds_consistent = true

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Integer}(),
)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
_lb = get(lb, func, -Inf)
_ub = get(ub, func, Inf)
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
_lb, _ub = get(lb, func, typemin(T)), get(ub, func, typemax(T))
if abs(_ub - _lb) < 1 && ceil(_ub) == ceil(_lb)
push!(
optimizer.results,
results,
InfeasibilityData(
[con, lb_con[func], ub_con[func]],
MOI.ConstraintIndex[con, lb_con[func], ub_con[func]],
true,
IntegralityData(_lb, _ub, MOI.Integer()),
),
)
bounds_consistent = false
end
end

for con in MOI.get(
optimizer.original_model,
original_model,
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.ZeroOne}(),
)
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
_lb = get(lb, func, -Inf)
_ub = get(ub, func, Inf)
if _lb > 0 && _ub < 1
func = MOI.get(original_model, MOI.ConstraintFunction(), con)
_lb, _ub = get(lb, func, typemin(T)), get(ub, func, typemax(T))
if 0 < _lb && _ub < 1
push!(
optimizer.results,
results,
InfeasibilityData(
[con, lb_con[func], ub_con[func]],
MOI.ConstraintIndex[con, lb_con[func], ub_con[func]],
true,
IntegralityData(_lb, _ub, MOI.ZeroOne()),
),
)
bounds_consistent = false
elseif _lb > 1
push!(
optimizer.results,
results,
InfeasibilityData(
[con, lb_con[func]],
MOI.ConstraintIndex[con, lb_con[func]],
true,
IntegralityData(_lb, Inf, MOI.ZeroOne()),
IntegralityData(_lb, typemax(T), MOI.ZeroOne()),
),
)
bounds_consistent = false
elseif _ub < 0
push!(
optimizer.results,
results,
InfeasibilityData(
[con, ub_con[func]],
MOI.ConstraintIndex[con, ub_con[func]],
true,
IntegralityData(-Inf, _ub, MOI.ZeroOne()),
IntegralityData(typemin(T), _ub, MOI.ZeroOne()),
),
)
bounds_consistent = false
end
end

for var in variable_indices
_lb = get(lb, var, -Inf)
_ub = get(ub, var, Inf)
_lb, _ub = get(lb, var, typemin(T)), get(ub, var, typemax(T))
if _lb > _ub
push!(
optimizer.results,
results,
InfeasibilityData(
[lb_con[var], ub_con[var]],
MOI.ConstraintIndex[lb_con[var], ub_con[var]],
true,
BoundsData(_lb, _ub),
),
Expand Down
Loading