@@ -318,23 +318,25 @@ function _variable_coefficient(
318
318
end
319
319
320
320
function _variable_dual (
321
+ :: Type{T} ,
321
322
model:: MOI.ModelLike ,
322
323
attr:: MOI.ConstraintDual ,
323
324
vi:: MOI.VariableIndex ,
324
325
ci:: MOI.ConstraintIndex{<:MOI.ScalarAffineFunction} ,
325
- )
326
+ ) where {T}
326
327
func = MOI. get (model, MOI. ConstraintFunction (), ci)
327
328
coef = _variable_coefficient (func, vi)
328
329
dual = MOI. get (model, attr, ci)
329
330
return coef * dual
330
331
end
331
332
332
333
function _variable_dual (
334
+ :: Type{T} ,
333
335
model:: MOI.ModelLike ,
334
336
attr:: MOI.ConstraintDual ,
335
337
vi:: MOI.VariableIndex ,
336
338
ci:: MOI.ConstraintIndex{<:MOI.ScalarQuadraticFunction} ,
337
- )
339
+ ) where {T}
338
340
func = MOI. get (model, MOI. ConstraintFunction (), ci)
339
341
primal = MOI. VariablePrimal (attr. result_index)
340
342
coef = _variable_coefficient (func, vi, vi -> MOI. get (model, primal, vi))
@@ -343,11 +345,12 @@ function _variable_dual(
343
345
end
344
346
345
347
function _variable_dual (
348
+ :: Type{T} ,
346
349
model:: MOI.ModelLike ,
347
350
attr:: MOI.ConstraintDual ,
348
351
vi:: MOI.VariableIndex ,
349
352
ci:: MOI.ConstraintIndex{<:MOI.VectorAffineFunction} ,
350
- )
353
+ ) where {T}
351
354
func = MOI. get (model, MOI. ConstraintFunction (), ci)
352
355
set = MOI. get (model, MOI. ConstraintSet (), ci)
353
356
coef = _variable_coefficient (func, vi)
@@ -356,11 +359,12 @@ function _variable_dual(
356
359
end
357
360
358
361
function _variable_dual (
362
+ :: Type{T} ,
359
363
model:: MOI.ModelLike ,
360
364
attr:: MOI.ConstraintDual ,
361
365
vi:: MOI.VariableIndex ,
362
366
ci:: MOI.ConstraintIndex{<:MOI.VectorQuadraticFunction} ,
363
- )
367
+ ) where {T}
364
368
func = MOI. get (model, MOI. ConstraintFunction (), ci)
365
369
set = MOI. get (model, MOI. ConstraintSet (), ci)
366
370
primal = MOI. VariablePrimal (attr. result_index)
@@ -370,28 +374,30 @@ function _variable_dual(
370
374
end
371
375
372
376
function _variable_dual (
377
+ :: Type{T} ,
373
378
model:: MOI.ModelLike ,
374
379
attr:: MOI.ConstraintDual ,
375
380
ci:: MOI.ConstraintIndex ,
376
381
vi:: MOI.VariableIndex ,
377
382
:: Type{F} ,
378
383
:: 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)
381
386
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)
383
388
end
384
389
return dual
385
390
end
386
391
387
392
function _variable_dual (
393
+ :: Type{T} ,
388
394
model:: MOI.ModelLike ,
389
395
:: MOI.ConstraintDual ,
390
396
ci:: MOI.ConstraintIndex ,
391
397
vi:: MOI.VariableIndex ,
392
398
:: Type{F} ,
393
399
:: 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 }
395
401
for constraint_index in MOI. get (model, MOI. ListOfConstraintIndices {F,S} ())
396
402
if constraint_index == ci
397
403
continue
@@ -406,22 +412,23 @@ function _variable_dual(
406
412
)
407
413
end
408
414
end
409
- return 0.0
415
+ return zero (T)
410
416
end
411
417
412
418
function _variable_dual (
419
+ :: Type{T} ,
413
420
model:: MOI.ModelLike ,
414
421
attr:: MOI.ConstraintDual ,
415
422
ci:: MOI.ConstraintIndex ,
416
423
vi:: MOI.VariableIndex ,
417
- )
424
+ ) where {T}
418
425
ray = is_ray (MOI. get (model, MOI. DualStatus ()))
419
- dual = 0.0
426
+ dual = zero (T)
420
427
if ! ray
421
428
sense = MOI. get (model, MOI. ObjectiveSense ())
422
429
# Dual definition for maximization problem corresponds to dual
423
430
# 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 )
425
432
F = MOI. get (model, MOI. ObjectiveFunctionType ())
426
433
obj_attr = MOI. ObjectiveFunction {F} ()
427
434
if F == MOI. VariableIndex
@@ -449,18 +456,19 @@ function _variable_dual(
449
456
end
450
457
end
451
458
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 ])
453
460
end
454
461
return dual
455
462
end
456
463
457
464
function _variable_dual (
465
+ :: Type{T} ,
458
466
model:: MOI.ModelLike ,
459
467
attr:: MOI.ConstraintDual ,
460
468
ci:: MOI.ConstraintIndex{MOI.VectorOfVariables} ,
461
469
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)
464
472
set = MOI. get (model, MOI. ConstraintSet (), ci)
465
473
return dot_coefficients (dual, set)
466
474
end
470
478
model::MOI.ModelLike,
471
479
attr::MOI.ConstraintDual,
472
480
ci::MOI.ConstraintIndex{Union{MOI.VariableIndex,MOI.VectorOfVariables}},
473
- )
481
+ ::Type{T} = Float64,
482
+ ) where {T}
474
483
475
484
Compute the dual of the constraint of index `ci` using the `ConstraintDual` of
476
485
other constraints and the `ConstraintFunction` values.
@@ -483,8 +492,9 @@ function get_fallback(
483
492
model:: MOI.ModelLike ,
484
493
attr:: MOI.ConstraintDual ,
485
494
ci:: MOI.ConstraintIndex{<:Union{MOI.VariableIndex,MOI.VectorOfVariables}} ,
486
- )
495
+ :: Type{T} = Float64,
496
+ ) where {T}
487
497
MOI. check_result_index_bounds (model, attr)
488
498
f = MOI. get (model, MOI. ConstraintFunction (), ci)
489
- return _variable_dual (model, attr, ci, f)
499
+ return _variable_dual (T, model, attr, ci, f)
490
500
end
0 commit comments