Skip to content

Commit da293ea

Browse files
committed
Filter Parameters in conflicts
1 parent 049737b commit da293ea

2 files changed

Lines changed: 69 additions & 2 deletions

File tree

src/MOI_wrapper.jl

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ function MOI.is_empty(model::Optimizer)
100100
isempty(model.multiplicative_parameters_pp) &&
101101
isempty(model.dual_value_of_parameters) &&
102102
model.number_of_parameters_in_model == 0 &&
103+
isempty(model.parameters_in_conflict) &&
103104
isempty(model.ext)
104105
end
105106

@@ -135,6 +136,7 @@ function MOI.empty!(model::Optimizer{T}) where {T}
135136
empty!(model.dual_value_of_parameters)
136137
#
137138
model.number_of_parameters_in_model = 0
139+
empty!(model.parameters_in_conflict)
138140
empty!(model.ext)
139141
return
140142
end
@@ -1594,13 +1596,75 @@ end
15941596
#
15951597

15961598
function MOI.compute_conflict!(model::Optimizer)
1597-
return MOI.compute_conflict!(model.optimizer)
1599+
empty!(model.parameters_in_conflict)
1600+
MOI.compute_conflict!(model.optimizer)
1601+
if MOI.get(model.optimizer, MOI.ConflictStatus()) == MOI.CONFLICT_FOUND
1602+
for (F, S) in keys(model.affine_constraint_cache.dict)
1603+
affine_constraint_cache_inner = model.affine_constraint_cache[F, S]
1604+
for (inner_ci, pf) in affine_constraint_cache_inner
1605+
if MOI.get(
1606+
model.optimizer,
1607+
MOI.ConstraintConflictStatus(),
1608+
inner_ci,
1609+
) == MOI.NOT_IN_CONFLICT
1610+
continue
1611+
end
1612+
for term in pf.p
1613+
push!(model.parameters_in_conflict, term.variable)
1614+
end
1615+
end
1616+
end
1617+
for (F, S) in keys(model.quadratic_constraint_cache.dict)
1618+
quadratic_constraint_cache_inner =
1619+
model.quadratic_constraint_cache[F, S]
1620+
for (inner_ci, pf) in quadratic_constraint_cache_inner
1621+
if MOI.get(
1622+
model.optimizer,
1623+
MOI.ConstraintConflictStatus(),
1624+
inner_ci,
1625+
) == MOI.NOT_IN_CONFLICT
1626+
continue
1627+
end
1628+
for term in pf.p
1629+
push!(model.parameters_in_conflict, term.variable)
1630+
end
1631+
for term in pf.pp
1632+
push!(model.parameters_in_conflict, term.variable_1)
1633+
push!(model.parameters_in_conflict, term.variable_2)
1634+
end
1635+
for term in pf.pv
1636+
push!(model.parameters_in_conflict, term.variable_1)
1637+
end
1638+
end
1639+
end
1640+
for (F, S) in keys(model.vector_affine_constraint_cache.dict)
1641+
vector_affine_constraint_cache_inner =
1642+
model.vector_affine_constraint_cache[F, S]
1643+
for (inner_ci, pf) in vector_affine_constraint_cache_inner
1644+
if MOI.get(
1645+
model.optimizer,
1646+
MOI.ConstraintConflictStatus(),
1647+
inner_ci,
1648+
) == MOI.NOT_IN_CONFLICT
1649+
continue
1650+
end
1651+
for term in pf.p
1652+
push!(
1653+
model.parameters_in_conflict,
1654+
term.scalar_term.variable,
1655+
)
1656+
end
1657+
end
1658+
end
1659+
end
1660+
return
15981661
end
15991662

16001663
function MOI.get(
16011664
model::Optimizer,
16021665
attr::MOI.ConstraintConflictStatus,
16031666
ci::MOI.ConstraintIndex{MOI.VariableIndex,<:MOI.Parameter},
16041667
)
1605-
return MOI.MAYBE_IN_CONFLICT
1668+
return MOI.VariableIndex(ci.value) in model.parameters_in_conflict ?
1669+
MOI.MAYBE_IN_CONFLICT : MOI.NOT_IN_CONFLICT
16061670
end

src/ParametricOptInterface.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer
168168
constraints_interpretation::ConstraintsInterpretationCode
169169
save_original_objective_and_constraints::Bool
170170

171+
parameters_in_conflict::Set{MOI.VariableIndex}
172+
171173
# extension data
172174
ext::Dict{Symbol,Any}
173175
function Optimizer(
@@ -228,6 +230,7 @@ mutable struct Optimizer{T,OT<:MOI.ModelLike} <: MOI.AbstractOptimizer
228230
0,
229231
ONLY_CONSTRAINTS,
230232
save_original_objective_and_constraints,
233+
Set{MOI.VariableIndex}(),
231234
Dict{Symbol,Any}(),
232235
)
233236
end

0 commit comments

Comments
 (0)