@@ -538,8 +538,6 @@ def _set_objective(self, obj):
538
538
self ._vars_referenced_by_obj = ComponentSet ()
539
539
self ._objective = None
540
540
541
- self ._solver_model .objective .set_linear ([(i , 0.0 ) for i in range (len (self ._pyomo_var_to_solver_var_map .values ()))])
542
-
543
541
if obj .active is False :
544
542
raise ValueError ('Cannot add inactive objective to solver.' )
545
543
@@ -560,12 +558,33 @@ def _set_objective(self, obj):
560
558
self ._solver_model .objective .set_sense (sense )
561
559
if hasattr (self ._solver_model .objective , 'set_offset' ):
562
560
self ._solver_model .objective .set_offset (cplex_expr .offset )
563
- if len (cplex_expr .coefficients ) != 0 :
564
- self ._solver_model .objective .set_linear (list (zip (cplex_expr .variables , cplex_expr .coefficients )))
565
- if len (cplex_expr .q_coefficients ) != 0 :
566
- self ._solver_model .objective .set_quadratic_coefficients (list (zip (cplex_expr .q_variables1 ,
567
- cplex_expr .q_variables2 ,
568
- cplex_expr .q_coefficients )))
561
+
562
+ linear_objective_already_exists = any (self ._solver_model .objective .get_linear ())
563
+ quadratic_objective_already_exists = self ._solver_model .objective .get_num_quadratic_nonzeros ()
564
+
565
+ contains_linear_terms = any (cplex_expr .coefficients )
566
+ contains_quadratic_terms = any (cplex_expr .q_coefficients )
567
+ num_cols = len (self ._pyomo_var_to_solver_var_map )
568
+
569
+ if linear_objective_already_exists or contains_linear_terms :
570
+ self ._solver_model .objective .set_linear ([(i , 0.0 ) for i in range (num_cols )])
571
+
572
+ if contains_linear_terms :
573
+ self ._solver_model .objective .set_linear (list (zip (cplex_expr .variables , cplex_expr .coefficients )))
574
+
575
+ if quadratic_objective_already_exists or contains_quadratic_terms :
576
+ self ._solver_model .objective .set_quadratic ([0 ] * num_cols )
577
+
578
+ if contains_quadratic_terms :
579
+ self ._solver_model .objective .set_quadratic_coefficients (
580
+ list (
581
+ zip (
582
+ cplex_expr .q_variables1 ,
583
+ cplex_expr .q_variables2 ,
584
+ cplex_expr .q_coefficients
585
+ )
586
+ )
587
+ )
569
588
self ._objective = obj
570
589
self ._vars_referenced_by_obj = referenced_vars
571
590
0 commit comments