Skip to content

Commit 50d83f1

Browse files
authored
[Utilities] use appropriate zero type for get_fallback (#2414)
1 parent 10d8edc commit 50d83f1

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

src/Utilities/mockoptimizer.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,14 +667,14 @@ function MOI.get(
667667
end
668668

669669
function MOI.get(
670-
mock::MockOptimizer,
670+
mock::MockOptimizer{<:MOI.ModelLike,T},
671671
attr::MOI.ConstraintDual,
672672
idx::MOI.ConstraintIndex{F},
673-
) where {F}
673+
) where {T,F}
674674
MOI.throw_if_not_valid(mock, idx)
675675
if mock.eval_variable_constraint_dual &&
676676
(F == MOI.VariableIndex || F == MOI.VectorOfVariables)
677-
return get_fallback(mock, attr, idx)
677+
return get_fallback(mock, attr, idx, T)
678678
else
679679
MOI.check_result_index_bounds(mock, attr)
680680
return _safe_get_result(mock.constraint_dual, attr, idx, "dual")

src/Utilities/results.jl

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -318,23 +318,25 @@ function _variable_coefficient(
318318
end
319319

320320
function _variable_dual(
321+
::Type{T},
321322
model::MOI.ModelLike,
322323
attr::MOI.ConstraintDual,
323324
vi::MOI.VariableIndex,
324325
ci::MOI.ConstraintIndex{<:MOI.ScalarAffineFunction},
325-
)
326+
) where {T}
326327
func = MOI.get(model, MOI.ConstraintFunction(), ci)
327328
coef = _variable_coefficient(func, vi)
328329
dual = MOI.get(model, attr, ci)
329330
return coef * dual
330331
end
331332

332333
function _variable_dual(
334+
::Type{T},
333335
model::MOI.ModelLike,
334336
attr::MOI.ConstraintDual,
335337
vi::MOI.VariableIndex,
336338
ci::MOI.ConstraintIndex{<:MOI.ScalarQuadraticFunction},
337-
)
339+
) where {T}
338340
func = MOI.get(model, MOI.ConstraintFunction(), ci)
339341
primal = MOI.VariablePrimal(attr.result_index)
340342
coef = _variable_coefficient(func, vi, vi -> MOI.get(model, primal, vi))
@@ -343,11 +345,12 @@ function _variable_dual(
343345
end
344346

345347
function _variable_dual(
348+
::Type{T},
346349
model::MOI.ModelLike,
347350
attr::MOI.ConstraintDual,
348351
vi::MOI.VariableIndex,
349352
ci::MOI.ConstraintIndex{<:MOI.VectorAffineFunction},
350-
)
353+
) where {T}
351354
func = MOI.get(model, MOI.ConstraintFunction(), ci)
352355
set = MOI.get(model, MOI.ConstraintSet(), ci)
353356
coef = _variable_coefficient(func, vi)
@@ -356,11 +359,12 @@ function _variable_dual(
356359
end
357360

358361
function _variable_dual(
362+
::Type{T},
359363
model::MOI.ModelLike,
360364
attr::MOI.ConstraintDual,
361365
vi::MOI.VariableIndex,
362366
ci::MOI.ConstraintIndex{<:MOI.VectorQuadraticFunction},
363-
)
367+
) where {T}
364368
func = MOI.get(model, MOI.ConstraintFunction(), ci)
365369
set = MOI.get(model, MOI.ConstraintSet(), ci)
366370
primal = MOI.VariablePrimal(attr.result_index)
@@ -370,28 +374,30 @@ function _variable_dual(
370374
end
371375

372376
function _variable_dual(
377+
::Type{T},
373378
model::MOI.ModelLike,
374379
attr::MOI.ConstraintDual,
375380
ci::MOI.ConstraintIndex,
376381
vi::MOI.VariableIndex,
377382
::Type{F},
378383
::Type{S},
379-
) where {F<:MOI.AbstractFunction,S<:MOI.AbstractSet}
380-
dual = 0.0
384+
) where {T,F<:MOI.AbstractFunction,S<:MOI.AbstractSet}
385+
dual = zero(T)
381386
for constraint_index in MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
382-
dual += _variable_dual(model, attr, vi, constraint_index)
387+
dual += _variable_dual(T, model, attr, vi, constraint_index)
383388
end
384389
return dual
385390
end
386391

387392
function _variable_dual(
393+
::Type{T},
388394
model::MOI.ModelLike,
389395
::MOI.ConstraintDual,
390396
ci::MOI.ConstraintIndex,
391397
vi::MOI.VariableIndex,
392398
::Type{F},
393399
::Type{S},
394-
) where {F<:Union{MOI.VariableIndex,MOI.VectorOfVariables},S<:MOI.AbstractSet}
400+
) where {T,F<:Union{MOI.VariableIndex,MOI.VectorOfVariables},S<:MOI.AbstractSet}
395401
for constraint_index in MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
396402
if constraint_index == ci
397403
continue
@@ -406,22 +412,23 @@ function _variable_dual(
406412
)
407413
end
408414
end
409-
return 0.0
415+
return zero(T)
410416
end
411417

412418
function _variable_dual(
419+
::Type{T},
413420
model::MOI.ModelLike,
414421
attr::MOI.ConstraintDual,
415422
ci::MOI.ConstraintIndex,
416423
vi::MOI.VariableIndex,
417-
)
424+
) where {T}
418425
ray = is_ray(MOI.get(model, MOI.DualStatus()))
419-
dual = 0.0
426+
dual = zero(T)
420427
if !ray
421428
sense = MOI.get(model, MOI.ObjectiveSense())
422429
# Dual definition for maximization problem corresponds to dual
423430
# definition for minimization problem with flipped objective in MOI
424-
sign = sense == MOI.MAX_SENSE ? -1.0 : 1.0
431+
sign = sense == MOI.MAX_SENSE ? T(-1) : T(1)
425432
F = MOI.get(model, MOI.ObjectiveFunctionType())
426433
obj_attr = MOI.ObjectiveFunction{F}()
427434
if F == MOI.VariableIndex
@@ -449,18 +456,19 @@ function _variable_dual(
449456
end
450457
end
451458
for FS in MOI.get(model, MOI.ListOfConstraintTypesPresent())
452-
dual -= _variable_dual(model, attr, ci, vi, FS[1], FS[2])
459+
dual -= _variable_dual(T, model, attr, ci, vi, FS[1], FS[2])
453460
end
454461
return dual
455462
end
456463

457464
function _variable_dual(
465+
::Type{T},
458466
model::MOI.ModelLike,
459467
attr::MOI.ConstraintDual,
460468
ci::MOI.ConstraintIndex{MOI.VectorOfVariables},
461469
func::MOI.VectorOfVariables,
462-
)
463-
dual = map(vi -> _variable_dual(model, attr, ci, vi), func.variables)
470+
) where {T}
471+
dual = map(vi -> _variable_dual(T, model, attr, ci, vi), func.variables)
464472
set = MOI.get(model, MOI.ConstraintSet(), ci)
465473
return dot_coefficients(dual, set)
466474
end
@@ -470,7 +478,8 @@ end
470478
model::MOI.ModelLike,
471479
attr::MOI.ConstraintDual,
472480
ci::MOI.ConstraintIndex{Union{MOI.VariableIndex,MOI.VectorOfVariables}},
473-
)
481+
::Type{T} = Float64,
482+
) where {T}
474483
475484
Compute the dual of the constraint of index `ci` using the `ConstraintDual` of
476485
other constraints and the `ConstraintFunction` values.
@@ -483,8 +492,9 @@ function get_fallback(
483492
model::MOI.ModelLike,
484493
attr::MOI.ConstraintDual,
485494
ci::MOI.ConstraintIndex{<:Union{MOI.VariableIndex,MOI.VectorOfVariables}},
486-
)
495+
::Type{T} = Float64,
496+
) where {T}
487497
MOI.check_result_index_bounds(model, attr)
488498
f = MOI.get(model, MOI.ConstraintFunction(), ci)
489-
return _variable_dual(model, attr, ci, f)
499+
return _variable_dual(T, model, attr, ci, f)
490500
end

0 commit comments

Comments
 (0)