Skip to content

Commit 9b004d5

Browse files
committed
Create API
1 parent 5597235 commit 9b004d5

File tree

6 files changed

+839
-502
lines changed

6 files changed

+839
-502
lines changed

src/MathOptConflictSolver.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ module MathOptConflictSolver
88
import MathOptInterface as MOI
99

1010
include("iis.jl")
11+
include("bound.jl")
12+
include("range.jl")
13+
include("solver.jl")
1114

1215
end # module MathOptConflictSolver

src/bound.jl

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# Copyright (c) 2025: Joaquim Dias Garcia, Oscar Dowson and contributors
2+
#
3+
# Use of this source code is governed by an MIT-style license that can be found
4+
# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
5+
6+
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())
11+
12+
lb = Dict{MOI.VariableIndex,T}()
13+
lb_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()
14+
ub = Dict{MOI.VariableIndex,T}()
15+
ub_con = Dict{MOI.VariableIndex,MOI.ConstraintIndex}()
16+
17+
for con in MOI.get(
18+
optimizer.original_model,
19+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.EqualTo{T}}(),
20+
)
21+
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
22+
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
23+
lb[func] = set.value
24+
lb_con[func] = con
25+
ub[func] = set.value
26+
ub_con[func] = con
27+
end
28+
29+
for con in MOI.get(
30+
optimizer.original_model,
31+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.LessThan{T}}(),
32+
)
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+
ub[func] = set.upper
37+
ub_con[func] = con
38+
end
39+
40+
for con in MOI.get(
41+
optimizer.original_model,
42+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.GreaterThan{T}}(),
43+
)
44+
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
45+
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
46+
lb[func] = set.lower
47+
lb_con[func] = con
48+
# ub[func] = Inf
49+
end
50+
51+
for con in MOI.get(
52+
optimizer.original_model,
53+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Interval{T}}(),
54+
)
55+
set = MOI.get(optimizer.original_model, MOI.ConstraintSet(), con)
56+
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
57+
lb[func] = set.lower
58+
lb_con[func] = con
59+
ub[func] = set.upper
60+
ub_con[func] = con
61+
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)
66+
# lb[func] = 0 # set.lower
67+
# ub[func] = set.upper
68+
# 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)
73+
# lb[func] = 0 #set.lower
74+
# ub[func] = set.upper
75+
# end
76+
77+
bounds_consistent = true
78+
79+
for con in MOI.get(
80+
optimizer.original_model,
81+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.Integer}(),
82+
)
83+
func = MOI.get(optimizer.original_model, MOI.ConstraintFunction(), con)
84+
_lb = get(lb, func, -Inf)
85+
_ub = get(ub, func, Inf)
86+
if abs(_ub - _lb) < 1 && ceil(_ub) == ceil(_lb)
87+
push!(
88+
optimizer.results,
89+
InfeasibilityData(
90+
[con, lb_con[func], ub_con[func]],
91+
true,
92+
IntegralityData(_lb, _ub, MOI.Integer()),
93+
),
94+
)
95+
bounds_consistent = false
96+
end
97+
end
98+
99+
for con in MOI.get(
100+
optimizer.original_model,
101+
MOI.ListOfConstraintIndices{MOI.VariableIndex,MOI.ZeroOne}(),
102+
)
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
107+
push!(
108+
optimizer.results,
109+
InfeasibilityData(
110+
[con, lb_con[func], ub_con[func]],
111+
true,
112+
IntegralityData(_lb, _ub, MOI.ZeroOne()),
113+
),
114+
)
115+
bounds_consistent = false
116+
elseif _lb > 1
117+
push!(
118+
optimizer.results,
119+
InfeasibilityData(
120+
[con, lb_con[func]],
121+
true,
122+
IntegralityData(_lb, Inf, MOI.ZeroOne()),
123+
),
124+
)
125+
bounds_consistent = false
126+
elseif _ub < 0
127+
push!(
128+
optimizer.results,
129+
InfeasibilityData(
130+
[con, ub_con[func]],
131+
true,
132+
IntegralityData(-Inf, _ub, MOI.ZeroOne()),
133+
),
134+
)
135+
bounds_consistent = false
136+
end
137+
end
138+
139+
for var in variable_indices
140+
_lb = get(lb, var, -Inf)
141+
_ub = get(ub, var, Inf)
142+
if _lb > _ub
143+
push!(
144+
optimizer.results,
145+
InfeasibilityData(
146+
[lb_con[var], ub_con[var]],
147+
true,
148+
BoundsData(_lb, _ub),
149+
),
150+
)
151+
bounds_consistent = false
152+
else
153+
variables[var] = Interval(_lb, _ub)
154+
end
155+
end
156+
return bounds_consistent, variables, lb_con, ub_con
157+
end

0 commit comments

Comments
 (0)