246246function _variable_coefficient (
247247 func:: MOI.ScalarAffineFunction{T} ,
248248 vi:: MOI.VariableIndex ,
249+ value_fn:: Any ,
249250) where {T}
250251 coef = zero (T)
251252 for term in func. terms
@@ -259,12 +260,12 @@ end
259260function _variable_coefficient (
260261 func:: MOI.VectorAffineFunction{T} ,
261262 vi:: MOI.VariableIndex ,
263+ value_fn:: Any ,
262264) where {T}
263265 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
268269 end
269270 end
270271 return coef
273274function _variable_coefficient (
274275 func:: MOI.ScalarQuadraticFunction{T} ,
275276 vi:: MOI.VariableIndex ,
276- value :: F ,
277+ value_fn :: F ,
277278) where {T,F<: Function }
278279 coef = zero (T)
279280 # `vi`'th row of `Qx + a` where `func` is `x'Qx/2 + a'x + b`.
@@ -284,9 +285,9 @@ function _variable_coefficient(
284285 end
285286 for term in func. quadratic_terms
286287 if term. variable_1 == vi
287- coef += term. coefficient * value (term. variable_2)
288+ coef += term. coefficient * value_fn (term. variable_2)
288289 elseif term. variable_2 == vi
289- coef += term. coefficient * value (term. variable_1)
290+ coef += term. coefficient * value_fn (term. variable_1)
290291 end
291292 end
292293 return coef
@@ -295,23 +296,22 @@ end
295296function _variable_coefficient (
296297 func:: MOI.VectorQuadraticFunction{T} ,
297298 vi:: MOI.VariableIndex ,
298- value :: F ,
299+ value_fn :: F ,
299300) where {T,F<: Function }
300301 coef = zeros (T, MOI. output_dimension (func))
301302 # `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
306306 end
307307 end
308- for vector_term in func. quadratic_terms
309- term = vector_term . scalar_term
310- oi = vector_term . output_index
311- 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)
308+ for q_term in func. quadratic_terms
309+ if q_term . scalar_term. variable_1 == vi
310+ coef[q_term . output_index] +=
311+ term. coefficient * value_fn (q_term . scalar_term . variable_2)
312+ elseif q_term . scalar_term . variable_2 == vi
313+ coef[q_term . output_index] +=
314+ term. coefficient * value_fn (q_term . scalar_term . variable_1)
315315 end
316316 end
317317 return coef
@@ -322,48 +322,14 @@ function _variable_dual(
322322 model:: MOI.ModelLike ,
323323 attr:: MOI.ConstraintDual ,
324324 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} ,
325+ ci:: MOI.ConstraintIndex {
326+ <: Union {
327+ MOI. ScalarAffineFunction,
328+ MOI. ScalarQuadraticFunction,
329+ MOI. VectorAffineFunction,
330+ MOI. VectorQuadraticFunction,
331+ },
332+ },
367333) where {T}
368334 func = MOI. get (model, MOI. ConstraintFunction (), ci)
369335 set = MOI. get (model, MOI. ConstraintSet (), ci)
@@ -437,7 +403,7 @@ function _variable_dual(
437403 end
438404 elseif F <: MOI.ScalarAffineFunction
439405 f = MOI. get (model, obj_attr)
440- dual += sign * _variable_coefficient (f, vi)
406+ dual += sign * _variable_coefficient (f, vi, nothing )
441407 elseif F <: MOI.ScalarQuadraticFunction
442408 f = MOI. get (model, obj_attr)
443409 primal_attr = MOI. VariablePrimal (attr. result_index)
@@ -455,8 +421,8 @@ function _variable_dual(
455421 )
456422 end
457423 end
458- for FS in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
459- dual -= _variable_dual (T, model, attr, ci, vi, FS[ 1 ], FS[ 2 ] )
424+ for (F, S) in MOI. get (model, MOI. ListOfConstraintTypesPresent ())
425+ dual -= _variable_dual (T, model, attr, ci, vi, F, S )
460426 end
461427 return dual
462428end
0 commit comments