@@ -318,23 +318,25 @@ function _variable_coefficient(
318318end
319319
320320function _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
330331end
331332
332333function _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(
343345end
344346
345347function _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(
356359end
357360
358361function _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(
370374end
371375
372376function _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
385390end
386391
387392function _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)
410416end
411417
412418function _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
455462end
456463
457464function _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)
466474end
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
475484Compute the dual of the constraint of index `ci` using the `ConstraintDual` of
476485other 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)
490500end
0 commit comments