Skip to content

Commit b3d1020

Browse files
committed
WIP test conflict count
1 parent 7896c49 commit b3d1020

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

src/Utilities/mockoptimizer.jl

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ mutable struct MockOptimizer{MT<:MOI.ModelLike,T} <: MOI.AbstractOptimizer
6565
# Constraint conflicts
6666
compute_conflict_called::Bool
6767
conflict_status::MOI.ConflictStatusCode
68+
conflict_count::Int
6869
constraint_conflict_status::Dict{
6970
MOI.ConstraintIndex,
70-
MOI.ConflictParticipationStatusCode,
71+
Dict{Int,MOI.ConflictParticipationStatusCode},
7172
}
7273
# Basis status
7374
constraint_basis_status::Dict{
@@ -124,7 +125,8 @@ function MockOptimizer(
124125
#
125126
false,
126127
MOI.COMPUTE_CONFLICT_NOT_CALLED,
127-
Dict{MOI.ConstraintIndex,MOI.ConflictParticipationStatusCode}(),
128+
0,
129+
Dict{MOI.ConstraintIndex,Dict{Int,MOI.ConflictParticipationStatusCode}}(),
128130
# Basis status
129131
Dict{MOI.ConstraintIndex,Dict{Int,MOI.BasisStatusCode}}(),
130132
Dict{MOI.VariableIndex,Dict{Int,MOI.BasisStatusCode}}(),
@@ -449,11 +451,12 @@ end
449451

450452
function MOI.set(
451453
mock::MockOptimizer,
452-
::MOI.ConstraintConflictStatus,
454+
attr::MOI.ConstraintConflictStatus,
453455
idx::MOI.ConstraintIndex,
454456
value,
455457
)
456-
mock.constraint_conflict_status[xor_index(idx)] = value
458+
_safe_set_result(mock.constraint_conflict_status, attr, idx, value)
459+
# mock.constraint_conflict_status[xor_index(idx)] = value
457460
return
458461
end
459462

@@ -723,11 +726,18 @@ end
723726

724727
function MOI.get(
725728
mock::MockOptimizer,
726-
::MOI.ConstraintConflictStatus,
729+
attr::MOI.ConstraintConflictStatus,
727730
idx::MOI.ConstraintIndex,
728731
)
732+
MOI.check_result_index_bounds(mock, attr)
729733
MOI.throw_if_not_valid(mock, idx)
730-
return mock.constraint_conflict_status[xor_index(idx)]
734+
# return mock.constraint_conflict_status[xor_index(idx)]
735+
return _safe_get_result(
736+
mock.variable_basis_status,
737+
attr,
738+
idx,
739+
"conflict status",
740+
)
731741
end
732742

733743
function _safe_set_result(
@@ -996,10 +1006,10 @@ end
9961006
<:Vector,
9971007
}
9981008
dual_status::MOI.ResultStatusCode,
999-
constraint_duals::Pair{Tuple{DataTypeDataType},<:Vector}...;
1000-
constraint_basis_status = Pair{Tuple{DataTypeDataType},<:Vector}[],
1009+
constraint_duals::Pair{Tuple{DataType,DataType},<:Vector}...;
1010+
constraint_basis_status = Pair{Tuple{DataType,DataType},<:Vector}[],
10011011
variable_basis_status = MOI.BasisStatusCode[],
1002-
constraint_conflict_status = Pair{Tuple{Type,Type},<:Vector}[],
1012+
constraint_conflict_status = Pair{Tuple{DataType,DataType},<:Vector}[],
10031013
)
10041014
10051015
Fake the result of a call to `optimize!` in the mock optimizer by storing the
@@ -1053,15 +1063,14 @@ function mock_optimize!(
10531063
MOI.set(mock, MOI.ResultCount(), 1)
10541064
_set_mock_primal(mock, primal)
10551065
_set_mock_dual(mock, dual_status_constraint_duals...)
1056-
for con_basis_pair in constraint_basis_status
1057-
F, S = con_basis_pair.first
1066+
for ((F, S), result) in constraint_basis_status
10581067
indices = MOI.get(mock, MOI.ListOfConstraintIndices{F,S}())
10591068
for (i, ci) in enumerate(indices)
10601069
MOI.set(
10611070
mock,
10621071
MOI.ConstraintBasisStatus(),
10631072
ci,
1064-
con_basis_pair.second[i],
1073+
result,
10651074
)
10661075
end
10671076
end

src/attributes.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2683,7 +2683,7 @@ end
26832683
)
26842684

26852685
"""
2686-
ConstraintConflictStatus()
2686+
ConstraintConflictStatus(conflict_index = 1)
26872687
26882688
A constraint attribute to query the [`ConflictParticipationStatusCode`](@ref)
26892689
indicating whether the constraint participates in the conflict.
@@ -2693,6 +2693,12 @@ indicating whether the constraint participates in the conflict.
26932693
The optimizer may return multiple conflicts. See [`ConflictCount`](@ref)
26942694
for querying the number of conflicts found.
26952695
2696+
If the solver does not have a conflict because the
2697+
`conflict_index` is beyond the available solutions (whose number is indicated by
2698+
the [`ConflictCount`](@ref) attribute), then
2699+
`MOI.check_result_index_bounds(model, ConstraintConflictStatus(conflict_index))`
2700+
will throw a [`ResultIndexBoundsError`](@ref).
2701+
26962702
## Implementation
26972703
26982704
Optimizers should implement the following methods:
@@ -2710,6 +2716,14 @@ function attribute_value_type(::ConstraintConflictStatus)
27102716
return ConflictParticipationStatusCode
27112717
end
27122718

2719+
function check_result_index_bounds(model::ModelLike, attr::ConstraintConflictStatus)
2720+
result_count = get(model, ConflictCount())
2721+
if !(1 <= attr.result_index <= result_count)
2722+
throw(ResultIndexBoundsError(attr, result_count))
2723+
end
2724+
return
2725+
end
2726+
27132727
"""
27142728
UserDefinedFunction(name::Symbol, arity::Int) <: AbstractModelAttribute
27152729

0 commit comments

Comments
 (0)