17
17
18
18
import pyomo .common .unittest as unittest
19
19
20
- from pyomo .environ import ConcreteModel , AbstractModel , Expression , Var , Set , Param , Objective , value , sum_product
20
+ from pyomo .environ import (
21
+ ConcreteModel , AbstractModel , Expression , Var , Set , Param , Objective ,
22
+ value , sum_product ,
23
+ )
21
24
from pyomo .core .base .expression import _GeneralExpressionData
25
+ from pyomo .core .expr .compare import compare_expressions
22
26
from pyomo .common .tee import capture_output
23
27
24
28
class TestExpressionData (unittest .TestCase ):
@@ -902,6 +906,13 @@ def test_iadd(self):
902
906
expr += v
903
907
self .assertEqual (e .expr , 1 )
904
908
self .assertEqual (expr (), 2 )
909
+ # Make sure that using in-place operators on named expressions
910
+ # do not create loops inthe expression tree (test #1890)
911
+ m .x = Var ()
912
+ m .y = Var ()
913
+ m .e .expr = m .x
914
+ m .e += m .y
915
+ self .assertTrue (compare_expressions (m .e .expr , m .x + m .y ))
905
916
906
917
def test_isub (self ):
907
918
# make sure simple for loops that look like they
@@ -919,6 +930,13 @@ def test_isub(self):
919
930
expr -= v
920
931
self .assertEqual (e .expr , 1 )
921
932
self .assertEqual (expr (), - 2 )
933
+ # Make sure that using in-place operators on named expressions
934
+ # do not create loops inthe expression tree (test #1890)
935
+ m .x = Var ()
936
+ m .y = Var ()
937
+ m .e .expr = m .x
938
+ m .e -= m .y
939
+ self .assertTrue (compare_expressions (m .e .expr , m .x - m .y ))
922
940
923
941
def test_imul (self ):
924
942
# make sure simple for loops that look like they
@@ -936,6 +954,13 @@ def test_imul(self):
936
954
expr *= v
937
955
self .assertEqual (e .expr , 3 )
938
956
self .assertEqual (expr (), 6 )
957
+ # Make sure that using in-place operators on named expressions
958
+ # do not create loops inthe expression tree (test #1890)
959
+ m .x = Var ()
960
+ m .y = Var ()
961
+ m .e .expr = m .x
962
+ m .e *= m .y
963
+ self .assertTrue (compare_expressions (m .e .expr , m .x * m .y ))
939
964
940
965
def test_idiv (self ):
941
966
# make sure simple for loops that look like they
@@ -968,6 +993,13 @@ def test_idiv(self):
968
993
expr /= v
969
994
self .assertEqual (e .expr , 3 )
970
995
self .assertEqual (expr (), 1.5 )
996
+ # Make sure that using in-place operators on named expressions
997
+ # do not create loops inthe expression tree (test #1890)
998
+ m .x = Var ()
999
+ m .y = Var ()
1000
+ m .e .expr = m .x
1001
+ m .e /= m .y
1002
+ self .assertTrue (compare_expressions (m .e .expr , m .x / m .y ))
971
1003
972
1004
def test_ipow (self ):
973
1005
# make sure simple for loops that look like they
@@ -985,6 +1017,13 @@ def test_ipow(self):
985
1017
expr **= v
986
1018
self .assertEqual (e .expr , 3 )
987
1019
self .assertEqual (expr (), 9 )
1020
+ # Make sure that using in-place operators on named expressions
1021
+ # do not create loops inthe expression tree (test #1890)
1022
+ m .x = Var ()
1023
+ m .y = Var ()
1024
+ m .e .expr = m .x
1025
+ m .e **= m .y
1026
+ self .assertTrue (compare_expressions (m .e .expr , m .x ** m .y ))
988
1027
989
1028
if __name__ == "__main__" :
990
1029
unittest .main ()
0 commit comments