@@ -492,13 +492,22 @@ function MOI.set(
492492end
493493
494494function MOI. get (
495- model:: Optimizer ,
495+ model:: Optimizer{T} ,
496496 attr:: MOI.ConstraintFunction ,
497497 ci:: MOI.ConstraintIndex ,
498- )
498+ ) where {T}
499499 if haskey (model. quadratic_outer_to_inner, ci)
500500 inner_ci = model. quadratic_outer_to_inner[ci]
501- return _original_function (model. quadratic_constraint_cache[inner_ci])
501+ if haskey (model. quadratic_constraint_cache, inner_ci)
502+ return _original_function (
503+ model. quadratic_constraint_cache[inner_ci],
504+ )
505+ else
506+ return convert (
507+ MOI. ScalarQuadraticFunction{T},
508+ MOI. get (model. optimizer, attr, inner_ci),
509+ )
510+ end
502511 elseif haskey (model. affine_outer_to_inner, ci)
503512 inner_ci = model. affine_outer_to_inner[ci]
504513 return _original_function (model. affine_constraint_cache[inner_ci])
@@ -781,6 +790,31 @@ function MOI.add_constraint(
781790 set:: MOI.AbstractScalarSet ,
782791) where {T}
783792 if ! _has_parameters (f)
793+ # The user might construct the expression `*(f::Vector{AffExpr}, p)`
794+ # where `p` is a parameter. This results in a `Vector{QuadExpr}`
795+ # and hence in `ScalarQuadraticFunction` constraints.
796+ # If some entries of `f` are zero, then `has_parameters` will be zero for
797+ # the resulting constraint. We should however still turn it into an affine
798+ # function like the other entries.
799+ if _is_affine (f)
800+ fa = MOI. ScalarAffineFunction (f. affine_terms, f. constant)
801+ inner_ci = MOI. Utilities. normalize_and_add_constraint (
802+ model. optimizer,
803+ fa,
804+ set,
805+ )
806+ model. last_quad_add_added += 1
807+ outer_ci =
808+ MOI. ConstraintIndex {MOI.ScalarQuadraticFunction{T},typeof(set)} (
809+ model. last_quad_add_added,
810+ )
811+ model. quadratic_outer_to_inner[outer_ci] = inner_ci
812+ model. constraint_outer_to_inner[outer_ci] = inner_ci
813+ model. quadratic_constraint_cache_set[inner_ci] = set
814+ return outer_ci
815+ else
816+ return _add_constraint_direct_and_cache_map! (model, f, set)
817+ end
784818 return _add_constraint_direct_and_cache_map! (model, f, set)
785819 else
786820 return _add_constraint_with_parameters_on_function (model, f, set)
0 commit comments