@@ -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)
104105end
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
140142end
@@ -1594,13 +1596,75 @@ end
15941596#
15951597
15961598function 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
15981661end
15991662
16001663function 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
16061670end
0 commit comments