246
246
function _variable_coefficient (
247
247
func:: MOI.ScalarAffineFunction{T} ,
248
248
vi:: MOI.VariableIndex ,
249
+ value_fn:: Any ,
249
250
) where {T}
250
251
coef = zero (T)
251
252
for term in func. terms
@@ -259,12 +260,12 @@ end
259
260
function _variable_coefficient (
260
261
func:: MOI.VectorAffineFunction{T} ,
261
262
vi:: MOI.VariableIndex ,
263
+ value_fn:: Any ,
262
264
) where {T}
263
265
coef = zeros (T, MOI. output_dimension (func))
264
- for vector_term in func. terms
265
- term = vector_term. scalar_term
266
- if term. variable == vi
267
- coef[vector_term. output_index] += term. coefficient
266
+ for term in func. terms
267
+ if term. scalar_term. variable == vi
268
+ coef[term. output_index] += term. scalar_term. coefficient
268
269
end
269
270
end
270
271
return coef
273
274
function _variable_coefficient (
274
275
func:: MOI.ScalarQuadraticFunction{T} ,
275
276
vi:: MOI.VariableIndex ,
276
- value :: F ,
277
+ value_fn :: F ,
277
278
) where {T,F<: Function }
278
279
coef = zero (T)
279
280
# `vi`'th row of `Qx + a` where `func` is `x'Qx/2 + a'x + b`.
@@ -284,9 +285,9 @@ function _variable_coefficient(
284
285
end
285
286
for term in func. quadratic_terms
286
287
if term. variable_1 == vi
287
- coef += term. coefficient * value (term. variable_2)
288
+ coef += term. coefficient * value_fn (term. variable_2)
288
289
elseif term. variable_2 == vi
289
- coef += term. coefficient * value (term. variable_1)
290
+ coef += term. coefficient * value_fn (term. variable_1)
290
291
end
291
292
end
292
293
return coef
@@ -295,23 +296,21 @@ end
295
296
function _variable_coefficient (
296
297
func:: MOI.VectorQuadraticFunction{T} ,
297
298
vi:: MOI.VariableIndex ,
298
- value :: F ,
299
+ value_fn :: F ,
299
300
) where {T,F<: Function }
300
301
coef = zeros (T, MOI. output_dimension (func))
301
302
# `vi`'th row of `Qx + a` where `func` is `x'Qx/2 + a'x + b`.
302
- for vector_term in func. affine_terms
303
- term = vector_term. scalar_term
304
- if term. variable == vi
305
- coef[vector_term. output_index] += term. coefficient
303
+ for aff_term in func. affine_terms
304
+ if aff_term. scalar_term. variable == vi
305
+ coef[aff_term. output_index] += aff_term. scalar_term. coefficient
306
306
end
307
307
end
308
- for vector_term in func. quadratic_terms
309
- term = vector_term. scalar_term
310
- oi = vector_term. output_index
308
+ for q_term in func. quadratic_terms
309
+ index, term = q_term. output_index, q_term. scalar_term
311
310
if term. variable_1 == vi
312
- coef[oi ] += term. coefficient * value (term. variable_2)
313
- elseif term . variable_2 == vi
314
- coef[oi ] += term. coefficient * value (term. variable_1)
311
+ coef[index ] += term. coefficient * value_fn (term. variable_2)
312
+ elseif q_term . scalar_term . variable_2 == vi
313
+ coef[index ] += term. coefficient * value_fn (term. variable_1)
315
314
end
316
315
end
317
316
return coef
@@ -322,48 +321,14 @@ function _variable_dual(
322
321
model:: MOI.ModelLike ,
323
322
attr:: MOI.ConstraintDual ,
324
323
vi:: MOI.VariableIndex ,
325
- ci:: MOI.ConstraintIndex{<:MOI.ScalarAffineFunction} ,
326
- ) where {T}
327
- func = MOI. get (model, MOI. ConstraintFunction (), ci)
328
- coef = _variable_coefficient (func, vi)
329
- dual = MOI. get (model, attr, ci)
330
- return coef * dual
331
- end
332
-
333
- function _variable_dual (
334
- :: Type{T} ,
335
- model:: MOI.ModelLike ,
336
- attr:: MOI.ConstraintDual ,
337
- vi:: MOI.VariableIndex ,
338
- ci:: MOI.ConstraintIndex{<:MOI.ScalarQuadraticFunction} ,
339
- ) where {T}
340
- func = MOI. get (model, MOI. ConstraintFunction (), ci)
341
- primal = MOI. VariablePrimal (attr. result_index)
342
- coef = _variable_coefficient (func, vi, vi -> MOI. get (model, primal, vi))
343
- dual = MOI. get (model, attr, ci)
344
- return coef * dual
345
- end
346
-
347
- function _variable_dual (
348
- :: Type{T} ,
349
- model:: MOI.ModelLike ,
350
- attr:: MOI.ConstraintDual ,
351
- vi:: MOI.VariableIndex ,
352
- ci:: MOI.ConstraintIndex{<:MOI.VectorAffineFunction} ,
353
- ) where {T}
354
- func = MOI. get (model, MOI. ConstraintFunction (), ci)
355
- set = MOI. get (model, MOI. ConstraintSet (), ci)
356
- coef = _variable_coefficient (func, vi)
357
- dual = MOI. get (model, attr, ci)
358
- return set_dot (coef, dual, set)
359
- end
360
-
361
- function _variable_dual (
362
- :: Type{T} ,
363
- model:: MOI.ModelLike ,
364
- attr:: MOI.ConstraintDual ,
365
- vi:: MOI.VariableIndex ,
366
- ci:: MOI.ConstraintIndex{<:MOI.VectorQuadraticFunction} ,
324
+ ci:: MOI.ConstraintIndex {
325
+ <: Union {
326
+ MOI. ScalarAffineFunction,
327
+ MOI. ScalarQuadraticFunction,
328
+ MOI. VectorAffineFunction,
329
+ MOI. VectorQuadraticFunction,
330
+ },
331
+ },
367
332
) where {T}
368
333
func = MOI. get (model, MOI. ConstraintFunction (), ci)
369
334
set = MOI. get (model, MOI. ConstraintSet (), ci)
@@ -437,7 +402,7 @@ function _variable_dual(
437
402
end
438
403
elseif F <: MOI.ScalarAffineFunction
439
404
f = MOI. get (model, obj_attr)
440
- dual += sign * _variable_coefficient (f, vi)
405
+ dual += sign * _variable_coefficient (f, vi, nothing )
441
406
elseif F <: MOI.ScalarQuadraticFunction
442
407
f = MOI. get (model, obj_attr)
443
408
primal_attr = MOI. VariablePrimal (attr. result_index)
@@ -455,8 +420,8 @@ function _variable_dual(
455
420
)
456
421
end
457
422
end
458
- for FS in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
459
- dual -= _variable_dual (T, model, attr, ci, vi, FS[ 1 ], FS[ 2 ] )
423
+ for (F, S) in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
424
+ dual -= _variable_dual (T, model, attr, ci, vi, F, S )
460
425
end
461
426
return dual
462
427
end
0 commit comments