Skip to content

Commit 68c7a11

Browse files
authored
Merge pull request #3751 from michaelbynum/lin_expr_tuples
LinearExpression should return tuples instead of lists
2 parents 307330d + bcee6d0 commit 68c7a11

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

pyomo/core/expr/numeric_expr.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,8 @@ def _build_cache(self):
13331333
assert arg.is_potentially_variable()
13341334
coef.append(1)
13351335
var.append(arg)
1336+
coef = tuple(coef)
1337+
var = tuple(var)
13361338
LinearExpression._cache = (self, const, coef, var)
13371339

13381340
@property

pyomo/core/tests/unit/test_numeric_expr.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4255,14 +4255,16 @@ def test_LinearExpression(self):
42554255
e = LinearExpression()
42564256
f = e.clone()
42574257
self.assertIsNot(e, f)
4258-
self.assertIsNot(e.linear_coefs, f.linear_coefs)
4259-
self.assertIsNot(e.linear_vars, f.linear_vars)
4258+
# turns out that two empty tuples, a and b, return True for a is b
4259+
# self.assertIsNot(e.linear_coefs, f.linear_coefs)
4260+
# self.assertIsNot(e.linear_vars, f.linear_vars)
4261+
self.assertIsNot(e._args_, f._args_)
42604262
self.assertEqual(e.constant, f.constant)
42614263
self.assertEqual(e.linear_coefs, f.linear_coefs)
42624264
self.assertEqual(e.linear_vars, f.linear_vars)
42634265
self.assertEqual(f.constant, 0)
4264-
self.assertEqual(f.linear_coefs, [])
4265-
self.assertEqual(f.linear_vars, [])
4266+
self.assertEqual(f.linear_coefs, tuple())
4267+
self.assertEqual(f.linear_vars, tuple())
42664268

42674269
e = LinearExpression(
42684270
constant=5, linear_vars=[m.x, m.y[1]], linear_coefs=[10, 20]
@@ -4275,8 +4277,8 @@ def test_LinearExpression(self):
42754277
self.assertEqual(e.linear_coefs, f.linear_coefs)
42764278
self.assertEqual(e.linear_vars, f.linear_vars)
42774279
self.assertEqual(f.constant, 5)
4278-
self.assertEqual(f.linear_coefs, [10, 20])
4279-
self.assertEqual(f.linear_vars, [m.x, m.y[1]])
4280+
self.assertEqual(f.linear_coefs, (10, 20))
4281+
self.assertEqual(f.linear_vars, (m.x, m.y[1]))
42804282

42814283
def test_getitem(self):
42824284
# Testing cloning of the abs() function
@@ -4824,13 +4826,13 @@ def test_init(self):
48244826

48254827
e = LinearExpression(constant=5, linear_vars=[m.x, m.y], linear_coefs=[2, 3])
48264828
self.assertEqual(e.constant, 5)
4827-
self.assertEqual(e.linear_vars, [m.x, m.y])
4828-
self.assertEqual(e.linear_coefs, [2, 3])
4829+
self.assertEqual(e.linear_vars, (m.x, m.y))
4830+
self.assertEqual(e.linear_coefs, (2, 3))
48294831

48304832
f = LinearExpression([5, 2 * m.x, 3 * m.y])
48314833
self.assertEqual(e.constant, 5)
4832-
self.assertEqual(e.linear_vars, [m.x, m.y])
4833-
self.assertEqual(e.linear_coefs, [2, 3])
4834+
self.assertEqual(e.linear_vars, (m.x, m.y))
4835+
self.assertEqual(e.linear_coefs, (2, 3))
48344836

48354837
self.assertExpressionsEqual(e, f)
48364838

@@ -4840,8 +4842,8 @@ def test_init(self):
48404842
self.assertEqual(OUT.getvalue(), "")
48414843
self.assertIs(e._args_, args)
48424844
self.assertEqual(e.constant, 10)
4843-
self.assertEqual(e.linear_vars, [m.y, m.x])
4844-
self.assertEqual(e.linear_coefs, [4, 5])
4845+
self.assertEqual(e.linear_vars, (m.y, m.x))
4846+
self.assertEqual(e.linear_coefs, (4, 5))
48454847

48464848
def test_to_string(self):
48474849
m = ConcreteModel()

pyomo/core/tests/unit/test_numeric_expr_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -640,21 +640,21 @@ def test_linear(self):
640640
self.assertIs(type(e), LinearExpression)
641641
self.assertEqual(e.constant, 2)
642642
cache = e._cache
643-
self.assertEqual(e.linear_coefs, [0, 1, 2, 1])
643+
self.assertEqual(e.linear_coefs, (0, 1, 2, 1))
644644
self.assertIs(cache, e._cache)
645-
self.assertEqual(e.linear_vars, [m.x[0], m.x[1], m.x[2], m.y])
645+
self.assertEqual(e.linear_vars, (m.x[0], m.x[1], m.x[2], m.y))
646646
self.assertIs(cache, e._cache)
647647

648648
e = LinearExpression()
649-
self.assertEqual(e.linear_coefs, [])
649+
self.assertEqual(e.linear_coefs, tuple())
650650
self.assertIsNot(cache, e._cache)
651651
cache = e._cache
652652
e = LinearExpression()
653653
self.assertEqual(e.constant, 0)
654654
self.assertIsNot(cache, e._cache)
655655
cache = e._cache
656656
e = LinearExpression()
657-
self.assertEqual(e.linear_vars, [])
657+
self.assertEqual(e.linear_vars, tuple())
658658
self.assertIsNot(cache, e._cache)
659659

660660
self.assertTrue(e.is_potentially_variable())

0 commit comments

Comments
 (0)