coin-or / python-mip

Python-MIP: collection of Python tools for the modeling and solution of Mixed-Integer Linear programs
Eclipse Public License 2.0
540 stars 95 forks source link

Duplicate Variables Bandaid #397

Open ItsNiklas opened 2 weeks ago

ItsNiklas commented 2 weeks ago

Attempting to fix #396. If we have two identical objects in the Var overrides, the previous code would allow the LinExpr constructor to void anything but the last coefficient.

I also added the relevant tests, which now pass. The last constraint would fail, because I only modified the Var functions, not the constructor itself.


Alternative:

diff --git a/mip/entities.py b/mip/entities.py
index fcd3ecd..71091b5 100644
--- a/mip/entities.py
+++ b/mip/entities.py
@@ -92,7 +92,8 @@ class LinExpr:
                     "You should pass eiter 'expr' or 'variables and coeffs' to the"
                     "constructor, not the three simultaneously."
                 )
-            self.__expr = dict(zip(variables, coeffs))
+            for var, coef in zip(variables, coeffs):
+                self.add_var(var, coef)

         elif expr is not None:
             self.__expr = expr.copy()

However, this would tank a performance slightly if users create the LinExpr manually. For this benchmark, the using_lists method runs in 0.71s vs 0.33s for n=2000. Considering the last change was made due to performance reasons, I did not want to revert this right away, but feel free to approve this.

CLAassistant commented 2 weeks ago

CLA assistant check
All committers have signed the CLA.