# ___________________________________________________________________________ # # Pyomo: Python Optimization Modeling Objects # Copyright 2017 National Technology and Engineering Solutions of Sandia, LLC # Under the terms of Contract DE-NA0003525 with National Technology and # Engineering Solutions of Sandia, LLC, the U.S. Government retains certain # rights in this software. # This software is distributed under the 3-clause BSD License. # ___________________________________________________________________________ # # Unit Tests for Arc # import pyutilib.th as unittest from six import StringIO import logging from pyomo.environ import * from pyomo.network import * class TestArc(unittest.TestCase): def test_default_scalar_constructor(self): m = ConcreteModel() m.c1 = Arc() self.assertEqual(len(m.c1), 0) self.assertIsNone(m.c1.directed) self.assertIsNone(m.c1.ports) self.assertIsNone(m.c1.source) self.assertIsNone(m.c1.destination) m = AbstractModel() m.c1 = Arc() self.assertEqual(len(m.c1), 0) self.assertIsNone(m.c1.directed) self.assertIsNone(m.c1.ports) self.assertIsNone(m.c1.source) self.assertIsNone(m.c1.destination) inst = m.create_instance() self.assertEqual(len(inst.c1), 0) self.assertIsNone(inst.c1.directed) self.assertIsNone(inst.c1.ports) self.assertIsNone(inst.c1.source) self.assertIsNone(inst.c1.destination) def test_default_indexed_constructor(self): m = ConcreteModel() m.c1 = Arc([1, 2, 3]) self.assertEqual(len(m.c1), 0) self.assertIs(m.c1.ctype, Arc) m = AbstractModel() m.c1 = Arc([1, 2, 3]) self.assertEqual(len(m.c1), 0) self.assertIs(m.c1.ctype, Arc) inst = m.create_instance() self.assertEqual(len(m.c1), 0) self.assertIs(m.c1.ctype, Arc) def test_with_scalar_ports(self): def rule(m): return dict(source=m.prt1, destination=m.prt2) m = ConcreteModel() m.prt1 = Port() m.prt2 = Port() m.c1 = Arc(rule=rule) self.assertEqual(len(m.c1), 1) self.assertTrue(m.c1.directed) self.assertIs(m.c1.source, m.prt1) self.assertIs(m.c1.destination, m.prt2) self.assertIs(m.c1.ports[0], m.prt1) self.assertIs(m.c1.ports[1], m.prt2) m.c2 = Arc(ports=(m.prt1, m.prt2)) self.assertEqual(len(m.c2), 1) self.assertFalse(m.c2.directed) self.assertIsInstance(m.c2.ports, tuple) self.assertEqual(len(m.c2.ports), 2) self.assertIs(m.c2.ports[0], m.prt1) self.assertIs(m.c2.ports[1], m.prt2) self.assertIsNone(m.c2.source) self.assertIsNone(m.c2.destination) m = AbstractModel() m.prt1 = Port() m.prt2 = Port() m.c1 = Arc(source=m.prt1, destination=m.prt2) self.assertEqual(len(m.c1), 0) self.assertIsNone(m.c1.directed) self.assertIsNone(m.c1.ports) self.assertIsNone(m.c1.source) self.assertIsNone(m.c1.destination) m.c2 = Arc(ports=(m.prt1, m.prt2)) self.assertEqual(len(m.c2), 0) self.assertIsNone(m.c2.directed) self.assertIsNone(m.c2.ports) self.assertIsNone(m.c2.source) self.assertIsNone(m.c2.destination) inst = m.create_instance() self.assertEqual(len(inst.c1), 1) self.assertTrue(inst.c1.directed) self.assertIs(inst.c1.source, inst.prt1) self.assertIs(inst.c1.destination, inst.prt2) self.assertIs(inst.c1.ports[0], inst.prt1) self.assertIs(inst.c1.ports[1], inst.prt2) self.assertEqual(len(inst.c2), 1) self.assertFalse(inst.c2.directed) self.assertIsInstance(inst.c2.ports, tuple) self.assertEqual(len(inst.c2.ports), 2) self.assertIs(inst.c2.ports[0], inst.prt1) self.assertIs(inst.c2.ports[1], inst.prt2) self.assertIsNone(inst.c2.source) self.assertIsNone(inst.c2.destination) def test_with_indexed_ports(self): def rule1(m, i): return dict(source=m.prt1[i], destination=m.prt2[i]) def rule2(m, i): return dict(ports=(m.prt1[i], m.prt2[i])) def rule3(m, i): # should accept any two-member iterable return (c for c in (m.prt1[i], m.prt2[i])) m = ConcreteModel() m.s = RangeSet(1, 5) m.prt1 = Port(m.s) m.prt2 = Port(m.s) m.c1 = Arc(m.s, rule=rule1) self.assertEqual(len(m.c1), 5) self.assertTrue(m.c1[4].directed) self.assertIs(m.c1[4].source, m.prt1[4]) self.assertIs(m.c1[4].destination, m.prt2[4]) self.assertIs(m.c1[4].ports[0], m.prt1[4]) self.assertIs(m.c1[4].ports[1], m.prt2[4]) m.c2 = Arc(m.s, rule=rule2) self.assertEqual(len(m.c2), 5) self.assertFalse(m.c2[4].directed) self.assertIsInstance(m.c2[4].ports, tuple) self.assertEqual(len(m.c2[4].ports), 2) self.assertIs(m.c2[4].ports[0], m.prt1[4]) self.assertIs(m.c2[4].ports[1], m.prt2[4]) self.assertIsNone(m.c2[4].source) self.assertIsNone(m.c2[4].destination) m.c3 = Arc(m.s, rule=rule3, directed=True) self.assertEqual(len(m.c3), 5) self.assertTrue(m.c3[4].directed) self.assertIs(m.c3[4].source, m.prt1[4]) self.assertIs(m.c3[4].destination, m.prt2[4]) self.assertIs(m.c3[4].ports[0], m.prt1[4]) self.assertIs(m.c3[4].ports[1], m.prt2[4]) m.c4 = Arc(m.s, rule=rule3) self.assertEqual(len(m.c4), 5) self.assertFalse(m.c4[4].directed) self.assertIsInstance(m.c4[4].ports, tuple) self.assertEqual(len(m.c4[4].ports), 2) self.assertIs(m.c4[4].ports[0], m.prt1[4]) self.assertIs(m.c4[4].ports[1], m.prt2[4]) self.assertIsNone(m.c4[4].source) self.assertIsNone(m.c4[4].destination) logging.disable(logging.ERROR) with self.assertRaises(ValueError): m.c5 = Arc(m.s, rule=rule1, directed=False) logging.disable(logging.NOTSET) m = AbstractModel() m.s = RangeSet(1, 5) m.prt1 = Port(m.s) m.prt2 = Port(m.s) m.c1 = Arc(m.s, rule=rule1) self.assertEqual(len(m.c1), 0) self.assertIs(m.c1.ctype, Arc) m.c2 = Arc(m.s, rule=rule2) self.assertEqual(len(m.c2), 0) self.assertIs(m.c1.ctype, Arc) inst = m.create_instance() self.assertEqual(len(inst.c1), 5) self.assertTrue(inst.c1[4].directed) self.assertIs(inst.c1[4].source, inst.prt1[4]) self.assertIs(inst.c1[4].destination, inst.prt2[4]) self.assertIs(inst.c2[4].ports[0], inst.prt1[4]) self.assertIs(inst.c2[4].ports[1], inst.prt2[4]) self.assertEqual(len(inst.c2), 5) self.assertFalse(inst.c2[4].directed) self.assertIs(inst.c2[4].ports[0], inst.prt1[4]) self.assertIs(inst.c2[4].ports[1], inst.prt2[4]) self.assertIsNone(inst.c2[4].source) self.assertIsNone(inst.c2[4].destination) def test_getattr(self): m = ConcreteModel() m.x = Var() m.p1 = Port(initialize=[m.x]) m.p2 = Port(extends=m.p1) m.a = Arc(ports=(m.p1, m.p2)) TransformationFactory('network.expand_arcs').apply_to(m) self.assertIs(m.a.x_equality, m.a.expanded_block.x_equality) with self.assertRaises(AttributeError): m.a.something def test_set_value(self): m = ConcreteModel() m.p1 = Port() m.p2 = Port() m.p3 = Port() m.p4 = Port() m.a = Arc(source=m.p1, destination=m.p2) self.assertIn(m.a, m.p1.dests()) self.assertIn(m.a, m.p2.sources()) self.assertIn(m.a, m.p1.arcs()) self.assertIn(m.a, m.p2.arcs()) m.a = dict(ports=(m.p3, m.p4)) self.assertEqual(len(m.p1.dests()), 0) self.assertEqual(len(m.p2.sources()), 0) self.assertEqual(len(m.p1.arcs()), 0) self.assertEqual(len(m.p2.arcs()), 0) self.assertIn(m.a, m.p3.dests()) self.assertIn(m.a, m.p4.sources()) self.assertIn(m.a, m.p3.arcs()) self.assertIn(m.a, m.p4.arcs()) m.a = dict(ports=(m.p3, m.p4), directed=False) self.assertEqual(len(m.p3.dests()), 0) self.assertEqual(len(m.p4.sources()), 0) self.assertIn(m.a, m.p3.arcs()) self.assertIn(m.a, m.p4.arcs()) m.a = (m.p1, m.p2) self.assertEqual(len(m.p3.dests()), 0) self.assertEqual(len(m.p4.sources()), 0) self.assertEqual(len(m.p3.arcs()), 0) self.assertEqual(len(m.p4.arcs()), 0) self.assertEqual(len(m.p1.dests()), 0) self.assertEqual(len(m.p2.sources()), 0) self.assertIn(m.a, m.p1.arcs()) self.assertIn(m.a, m.p2.arcs()) m.a = dict(ports=(m.p3, m.p4), directed=True) self.assertEqual(len(m.p1.dests()), 0) self.assertEqual(len(m.p2.sources()), 0) self.assertEqual(len(m.p1.arcs()), 0) self.assertEqual(len(m.p2.arcs()), 0) self.assertIn(m.a, m.p3.dests()) self.assertIn(m.a, m.p4.sources()) self.assertIn(m.a, m.p3.arcs()) self.assertIn(m.a, m.p4.arcs()) m.a = (m.p1, m.p2) self.assertEqual(len(m.p3.dests()), 0) self.assertEqual(len(m.p4.sources()), 0) self.assertEqual(len(m.p3.arcs()), 0) self.assertEqual(len(m.p4.arcs()), 0) self.assertIn(m.a, m.p1.dests()) self.assertIn(m.a, m.p2.sources()) self.assertIn(m.a, m.p1.arcs()) self.assertIn(m.a, m.p2.arcs()) def test_pprint(self): m = ConcreteModel() m.s = RangeSet(1, 5) m.prt1 = Port(m.s) m.prt2 = Port(m.s) @m.Arc(m.s) def friend(m, i): return dict(source=m.prt1[i], destination=m.prt2[i]) os = StringIO() m.friend.pprint(ostream=os) self.assertEqual(os.getvalue(), """friend : Size=5, Index=s, Active=True Key : Ports : Directed : Active 1 : (prt1[1], prt2[1]) : True : True 2 : (prt1[2], prt2[2]) : True : True 3 : (prt1[3], prt2[3]) : True : True 4 : (prt1[4], prt2[4]) : True : True 5 : (prt1[5], prt2[5]) : True : True """) m = ConcreteModel() m.z = RangeSet(1, 2) m.prt1 = Port(m.z) m.prt2 = Port(m.z) @m.Arc(m.z) def pal(m, i): return (m.prt1[i], m.prt2[i]) m.pal[2].deactivate() os = StringIO() m.pal.pprint(ostream=os) self.assertEqual(os.getvalue(), """pal : Size=2, Index=z, Active=True Key : Ports : Directed : Active 1 : (prt1[1], prt2[1]) : False : True 2 : (prt1[2], prt2[2]) : False : False """) def test_expand_single_scalar(self): m = ConcreteModel() m.x = Var() m.y = Var() m.prt1 = Port() m.prt1.add(m.x, "v") m.prt2 = Port() m.prt2.add(m.y, "v") # Both should be expanded, but for d all we get is an empty block m.c = Arc(source=m.prt1, destination=m.prt2) m.d = Arc() self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 1) self.assertEqual(len(list(m.component_data_objects(Constraint))), 1) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('v_equality').active) self.assertTrue(m.d_expanded.active) self.assertEqual(len(list(m.d_expanded.component_objects())), 0) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 1 Constraint Declarations v_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - y : 0.0 : True 1 Declarations: v_equality """) def test_expand_scalar(self): m = ConcreteModel() m.x = Var() m.y = Var() m.z = Var() m.w = Var() m.prt1 = Port() m.prt1.add(m.x, "a") m.prt1.add(m.y, "b") m.prt2 = Port() m.prt2.add(m.z, "a") m.prt2.add(m.w, "b") m.c = Arc(ports=(m.prt1, m.prt2)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 2) self.assertEqual(len(list(m.component_data_objects(Constraint))), 2) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('a_equality').active) self.assertTrue(blk.component('b_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations a_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - z : 0.0 : True b_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - w : 0.0 : True 2 Declarations: a_equality b_equality """) def test_expand_expression(self): m = ConcreteModel() m.x = Var() m.y = Var() m.z = Var() m.w = Var() m.prt1 = Port() m.prt1.add(-m.x, name='expr1') m.prt1.add(1 + m.y, name='expr2') m.prt2 = Port() m.prt2.add(-m.z, name='expr1') m.prt2.add(1 + m.w, name='expr2') m.c = Arc(ports=(m.prt1, m.prt2)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 2) self.assertEqual(len(list(m.component_data_objects(Constraint))), 2) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('expr1_equality').active) self.assertTrue(blk.component('expr2_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations expr1_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : - x + z : 0.0 : True expr2_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : 1 + y - (1 + w) : 0.0 : True 2 Declarations: expr1_equality expr2_equality """) def test_expand_indexed(self): m = ConcreteModel() m.x = Var([1,2]) m.y = Var([1,2], [1,2]) m.z = Var() m.t = Var([1,2]) m.u = Var([1,2], [1,2]) m.v = Var() m.prt1 = Port() m.prt1.add(m.x, "a") m.prt1.add(m.y, "b") m.prt1.add(m.z, "c") m.prt2 = Port() m.prt2.add(m.t, "a") m.prt2.add(m.u, "b") m.prt2.add(m.v, "c") m.c = Arc(ports=(m.prt1, m.prt2)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 3) self.assertEqual(len(list(m.component_data_objects(Constraint))), 7) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('a_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 3 Constraint Declarations a_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : x[1] - t[1] : 0.0 : True 2 : 0.0 : x[2] - t[2] : 0.0 : True b_equality : Size=4, Index=y_index, Active=True Key : Lower : Body : Upper : Active (1, 1) : 0.0 : y[1,1] - u[1,1] : 0.0 : True (1, 2) : 0.0 : y[1,2] - u[1,2] : 0.0 : True (2, 1) : 0.0 : y[2,1] - u[2,1] : 0.0 : True (2, 2) : 0.0 : y[2,2] - u[2,2] : 0.0 : True c_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : z - v : 0.0 : True 3 Declarations: a_equality b_equality c_equality """) def test_expand_trivial(self): m = ConcreteModel() m.x = Var() m.prt = Port() m.prt.add(m.x, "a") m.c = Arc(ports=(m.prt, m.prt)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 1) self.assertEqual(len(list(m.component_data_objects(Constraint))), 1) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('a_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 1 Constraint Declarations a_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - x : 0.0 : True 1 Declarations: a_equality """) def test_expand_empty_scalar(self): m = ConcreteModel() m.x = Var(bounds=(1,3)) m.y = Var(domain=Binary) m.PRT = Port() m.PRT.add(m.x) m.PRT.add(m.y) m.EPRT = Port() m.c = Arc(ports=(m.PRT, m.EPRT)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 2) self.assertEqual(len(list(m.component_data_objects(Constraint))), 2) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.component('x_equality').active) self.assertTrue(blk.component('y_equality').active) self.assertIs( m.x.domain, m.component('EPRT_auto_x').domain ) self.assertIs( m.y.domain, m.component('EPRT_auto_y').domain ) self.assertEqual( m.x.bounds, m.component('EPRT_auto_x').bounds ) self.assertEqual( m.y.bounds, m.component('EPRT_auto_y').bounds ) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - EPRT_auto_x : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - EPRT_auto_y : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_empty_expression(self): m = ConcreteModel() m.x = Var() m.y = Var() m.PRT = Port() m.PRT.add(-m.x, 'x') m.PRT.add(1 + m.y, 'y') m.EPRT = Port() m.c = Arc(ports=(m.PRT, m.EPRT)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 2) self.assertEqual(len(list(m.component_data_objects(Constraint))), 2) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.component('x_equality').active) self.assertTrue(blk.component('y_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : - x - EPRT_auto_x : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : 1 + y - EPRT_auto_y : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_empty_indexed(self): m = ConcreteModel() m.x = Var([1,2], domain=Binary) m.y = Var(bounds=(1,3)) m.PRT = Port() m.PRT.add(m.x) m.PRT.add(m.y) m.EPRT = Port() m.c = Arc(ports=(m.PRT, m.EPRT)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 2) self.assertEqual(len(list(m.component_data_objects(Constraint))), 3) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.component('x_equality').active) self.assertTrue(blk.component('y_equality').active) self.assertIs( m.x[1].domain, m.component('EPRT_auto_x')[1].domain ) self.assertIs( m.x[2].domain, m.component('EPRT_auto_x')[2].domain ) self.assertIs( m.y.domain, m.component('EPRT_auto_y').domain ) self.assertEqual( m.x[1].bounds, m.component('EPRT_auto_x')[1].bounds ) self.assertEqual( m.x[2].bounds, m.component('EPRT_auto_x')[2].bounds ) self.assertEqual( m.y.bounds, m.component('EPRT_auto_y').bounds ) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : x[1] - EPRT_auto_x[1] : 0.0 : True 2 : 0.0 : x[2] - EPRT_auto_x[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - EPRT_auto_y : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_multiple_empty_indexed(self): m = ConcreteModel() m.x = Var([1,2], domain=Binary) m.y = Var(bounds=(1,3)) m.PRT = Port() m.PRT.add(m.x) m.PRT.add(m.y) m.EPRT2 = Port() m.EPRT1 = Port() # Define d first to test that it knows how to expand the EPRTs m.d = Arc(ports=(m.EPRT2, m.EPRT1)) m.c = Arc(ports=(m.PRT, m.EPRT1)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 4) self.assertEqual(len(list(m.component_data_objects(Constraint))), 6) self.assertFalse(m.c.active) blk_c = m.component('c_expanded') self.assertTrue(blk_c.component('x_equality').active) self.assertTrue(blk_c.component('y_equality').active) self.assertFalse(m.d.active) blk_d = m.component('d_expanded') self.assertTrue(blk_d.component('x_equality').active) self.assertTrue(blk_d.component('y_equality').active) self.assertIs( m.x[1].domain, m.component('EPRT1_auto_x')[1].domain ) self.assertIs( m.x[2].domain, m.component('EPRT1_auto_x')[2].domain ) self.assertIs( m.y.domain, m.component('EPRT1_auto_y').domain ) self.assertEqual( m.x[1].bounds, m.component('EPRT1_auto_x')[1].bounds ) self.assertEqual( m.x[2].bounds, m.component('EPRT1_auto_x')[2].bounds ) self.assertEqual( m.y.bounds, m.component('EPRT1_auto_y').bounds ) self.assertIs( m.x[1].domain, m.component('EPRT2_auto_x')[1].domain ) self.assertIs( m.x[2].domain, m.component('EPRT2_auto_x')[2].domain ) self.assertIs( m.y.domain, m.component('EPRT2_auto_y').domain ) self.assertEqual( m.x[1].bounds, m.component('EPRT2_auto_x')[1].bounds ) self.assertEqual( m.x[2].bounds, m.component('EPRT2_auto_x')[2].bounds ) self.assertEqual( m.y.bounds, m.component('EPRT2_auto_y').bounds ) os = StringIO() blk_c.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : x[1] - EPRT1_auto_x[1] : 0.0 : True 2 : 0.0 : x[2] - EPRT1_auto_x[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - EPRT1_auto_y : 0.0 : True 2 Declarations: x_equality y_equality """) os = StringIO() blk_d.pprint(ostream=os) self.assertEqual(os.getvalue(), """d_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : EPRT2_auto_x[1] - EPRT1_auto_x[1] : 0.0 : True 2 : 0.0 : EPRT2_auto_x[2] - EPRT1_auto_x[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : EPRT2_auto_y - EPRT1_auto_y : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_multiple_indexed(self): m = ConcreteModel() m.x = Var([1,2], domain=Binary) m.y = Var(bounds=(1,3)) m.PRT = Port() m.PRT.add(m.x) m.PRT.add(m.y) m.a1 = Var([1,2]) m.a2 = Var([1,2]) m.b1 = Var() m.b2 = Var() m.EPRT1 = Port() m.EPRT1.add(m.a1,'x') m.EPRT1.add(m.b1,'y') m.EPRT2 = Port() m.EPRT2.add(m.a2,'x') m.EPRT2.add(m.b2,'y') m.c = Arc(ports=(m.PRT, m.EPRT1)) m.d = Arc(ports=(m.EPRT2, m.EPRT1)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 4) self.assertEqual(len(list(m.component_data_objects(Constraint))), 6) self.assertFalse(m.c.active) blk_c = m.component('c_expanded') self.assertTrue(blk_c.component('x_equality').active) self.assertTrue(blk_c.component('y_equality').active) self.assertFalse(m.d.active) blk_d = m.component('d_expanded') self.assertTrue(blk_d.component('x_equality').active) self.assertTrue(blk_d.component('y_equality').active) os = StringIO() blk_c.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : x[1] - a1[1] : 0.0 : True 2 : 0.0 : x[2] - a1[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - b1 : 0.0 : True 2 Declarations: x_equality y_equality """) os = StringIO() blk_d.pprint(ostream=os) self.assertEqual(os.getvalue(), """d_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=x_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : a2[1] - a1[1] : 0.0 : True 2 : 0.0 : a2[2] - a1[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : b2 - b1 : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_implicit_indexed(self): m = ConcreteModel() m.x = Var([1,2], domain=Binary) m.y = Var(bounds=(1,3)) m.PRT = Port() m.PRT.add(m.x) m.PRT.add(m.y) m.a2 = Var([1,2]) m.b1 = Var() m.EPRT2 = Port(implicit=['x']) m.EPRT2.add(m.b1,'y') m.EPRT1 = Port(implicit=['y']) m.EPRT1.add(m.a2,'x') m.c = Arc(ports=(m.EPRT1, m.PRT)) m.d = Arc(ports=(m.EPRT2, m.PRT)) self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) os = StringIO() m.EPRT1.pprint(ostream=os) self.assertEqual(os.getvalue(), """EPRT1 : Size=1, Index=None Key : Name : Size : Variable None : x : 2 : a2 : y : - : None """) TransformationFactory('network.expand_arcs').apply_to(m) os = StringIO() m.EPRT1.pprint(ostream=os) self.assertEqual(os.getvalue(), """EPRT1 : Size=1, Index=None Key : Name : Size : Variable None : x : 2 : a2 : y : 1 : EPRT1_auto_y """) self.assertEqual(len(list(m.component_objects(Constraint))), 4) self.assertEqual(len(list(m.component_data_objects(Constraint))), 6) self.assertFalse(m.c.active) blk_c = m.component('c_expanded') self.assertTrue(blk_c.component('x_equality').active) self.assertTrue(blk_c.component('y_equality').active) self.assertFalse(m.d.active) blk_d = m.component('d_expanded') self.assertTrue(blk_d.component('x_equality').active) self.assertTrue(blk_d.component('y_equality').active) os = StringIO() blk_c.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=a2_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : a2[1] - x[1] : 0.0 : True 2 : 0.0 : a2[2] - x[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : EPRT1_auto_y - y : 0.0 : True 2 Declarations: x_equality y_equality """) os = StringIO() blk_d.pprint(ostream=os) self.assertEqual(os.getvalue(), """d_expanded : Size=1, Index=None, Active=True 2 Constraint Declarations x_equality : Size=2, Index=a2_index, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : EPRT2_auto_x[1] - x[1] : 0.0 : True 2 : 0.0 : EPRT2_auto_x[2] - x[2] : 0.0 : True y_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : b1 - y : 0.0 : True 2 Declarations: x_equality y_equality """) def test_expand_indexed_arc(self): def rule(m, i): return (m.c1[i], m.c2[i]) m = ConcreteModel() m.x = Var(initialize=1, domain=Reals) m.y = Var(initialize=2, domain=Reals) m.c1 = Port([1, 2]) m.c1[1].add(m.x, name='v') m.c1[2].add(m.y, name='t') m.z = Var(initialize=1, domain=Reals) m.w = Var(initialize=2, domain=Reals) m.c2 = Port([1, 2]) m.c2[1].add(m.z, name='v') m.c2[2].add(m.w, name='t') m.eq = Arc([1, 2], rule=rule) TransformationFactory('network.expand_arcs').apply_to(m) self.assertFalse(m.eq.active) self.assertFalse(m.eq[1].active) self.assertFalse(m.eq[2].active) self.assertIs(m.eq.expanded_block, m.eq_expanded) self.assertIs(m.eq.expanded_block[1], m.eq_expanded[1]) self.assertIs(m.eq.expanded_block[2], m.eq_expanded[2]) os = StringIO() m.component('eq_expanded').pprint(ostream=os) self.assertEqual(os.getvalue(), """eq_expanded : Size=2, Index=eq_index, Active=True eq_expanded[1] : Active=True 1 Constraint Declarations v_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - z : 0.0 : True 1 Declarations: v_equality eq_expanded[2] : Active=True 1 Constraint Declarations t_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : y - w : 0.0 : True 1 Declarations: t_equality """) def test_inactive(self): m = ConcreteModel() m.x = Var() m.y = Var() m.z = Var() m.prt1 = Port() m.prt1.add(m.x, "v") m.prt2 = Port() m.prt2.add(m.y, "v") m.prt3 = Port() m.prt3.add(m.z, "v") # The active arc should be deactivated and expanded, # but not the inactive Arc m.c = Arc(source=m.prt1, destination=m.prt2) m.inactive = Arc(ports=(m.prt3, m.prt2)) m.inactive.deactivate() self.assertEqual(len(list(m.component_objects(Constraint))), 0) self.assertEqual(len(list(m.component_data_objects(Constraint))), 0) TransformationFactory('network.expand_arcs').apply_to(m) self.assertEqual(len(list(m.component_objects(Constraint))), 1) self.assertEqual(len(list(m.component_data_objects(Constraint))), 1) self.assertFalse(m.inactive.active) self.assertIsNone(m.component('inactive_expanded')) self.assertFalse(m.c.active) blk = m.component('c_expanded') self.assertTrue(blk.active) self.assertTrue(blk.component('v_equality').active) os = StringIO() blk.pprint(ostream=os) self.assertEqual(os.getvalue(), """c_expanded : Size=1, Index=None, Active=True 1 Constraint Declarations v_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : x - y : 0.0 : True 1 Declarations: v_equality """) def test_extensive_no_splitfrac_single_var(self): m = ConcreteModel() m.x = Var() m.y = Var() m.z = Var() m.p1 = Port(initialize={'v': (m.x, Port.Extensive, {'include_splitfrac':False})}) m.p2 = Port(initialize={'v': (m.y, Port.Extensive, {'include_splitfrac':False})}) m.p3 = Port(initialize={'v': (m.z, Port.Extensive, {'include_splitfrac':False})}) m.a1 = Arc(source=m.p1, destination=m.p2) m.a2 = Arc(source=m.p1, destination=m.p3) TransformationFactory('network.expand_arcs').apply_to(m) os = StringIO() m.pprint(ostream=os) self.assertEqual(os.getvalue(), """3 Var Declarations x : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals y : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals z : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations p1_v_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a1_expanded.v + a2_expanded.v - x : 0.0 : True p2_v_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a1_expanded.v - y : 0.0 : True p3_v_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a2_expanded.v - z : 0.0 : True 2 Block Declarations a1_expanded : Size=1, Index=None, Active=True 1 Var Declarations v : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 1 Declarations: v a2_expanded : Size=1, Index=None, Active=True 1 Var Declarations v : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 1 Declarations: v 2 Arc Declarations a1 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (p1, p2) : True : False a2 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (p1, p3) : True : False 3 Port Declarations p1 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : x p2 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : y p3 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : z 13 Declarations: x y z p1 p2 p3 a1 a2 a1_expanded a2_expanded p1_v_outsum p2_v_insum p3_v_insum """) def test_extensive_single_var(self): m = ConcreteModel() m.x = Var() m.y = Var() m.z = Var() m.p1 = Port(initialize={'v': (m.x, Port.Extensive)}) m.p2 = Port(initialize={'v': (m.y, Port.Extensive)}) m.p3 = Port(initialize={'v': (m.z, Port.Extensive)}) m.a1 = Arc(source=m.p1, destination=m.p2) m.a2 = Arc(source=m.p1, destination=m.p3) TransformationFactory('network.expand_arcs').apply_to(m) os = StringIO() m.pprint(ostream=os) self.assertEqual(os.getvalue(), """3 Var Declarations x : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals y : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals z : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations p1_v_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a1_expanded.v + a2_expanded.v - x : 0.0 : True p2_v_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a1_expanded.v - y : 0.0 : True p3_v_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : a2_expanded.v - z : 0.0 : True 2 Block Declarations a1_expanded : Size=1, Index=None, Active=True 1 Var Declarations v : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 1 Declarations: v a2_expanded : Size=1, Index=None, Active=True 1 Var Declarations v : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 1 Declarations: v 2 Arc Declarations a1 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (p1, p2) : True : False a2 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (p1, p3) : True : False 3 Port Declarations p1 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : x p2 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : y p3 : Size=1, Index=None Key : Name : Size : Variable None : v : 1 : z 13 Declarations: x y z p1 p2 p3 a1 a2 a1_expanded a2_expanded p1_v_outsum p2_v_insum p3_v_insum """) def test_extensive_no_splitfrac_expansion(self): m = ConcreteModel() m.time = Set(initialize=[1, 2, 3]) m.source = Block() m.load1 = Block() m.load2 = Block() def source_block(b): b.p_out = Var(b.model().time) b.outlet = Port(initialize={'p': (b.p_out, Port.Extensive, {'include_splitfrac':False})}) def load_block(b): b.p_in = Var(b.model().time) b.inlet = Port(initialize={'p': (b.p_in, Port.Extensive, {'include_splitfrac':False})}) source_block(m.source) load_block(m.load1) load_block(m.load2) m.cs1 = Arc(source=m.source.outlet, destination=m.load1.inlet) m.cs2 = Arc(source=m.source.outlet, destination=m.load2.inlet) TransformationFactory("network.expand_arcs").apply_to(m) ref = """ 1 Set Declarations time : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 3 : {1, 2, 3} 5 Block Declarations cs1_expanded : Size=1, Index=None, Active=True 1 Var Declarations p : Size=3, Index=time Key : Lower : Value : Upper : Fixed : Stale : Domain 1 : None : None : None : False : True : Reals 2 : None : None : None : False : True : Reals 3 : None : None : None : False : True : Reals 1 Declarations: p cs2_expanded : Size=1, Index=None, Active=True 1 Var Declarations p : Size=3, Index=time Key : Lower : Value : Upper : Fixed : Stale : Domain 1 : None : None : None : False : True : Reals 2 : None : None : None : False : True : Reals 3 : None : None : None : False : True : Reals 1 Declarations: p load1 : Size=1, Index=None, Active=True 1 Var Declarations p_in : Size=3, Index=time Key : Lower : Value : Upper : Fixed : Stale : Domain 1 : None : None : None : False : True : Reals 2 : None : None : None : False : True : Reals 3 : None : None : None : False : True : Reals 1 Constraint Declarations inlet_p_insum : Size=3, Index=time, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : cs1_expanded.p[1] - load1.p_in[1] : 0.0 : True 2 : 0.0 : cs1_expanded.p[2] - load1.p_in[2] : 0.0 : True 3 : 0.0 : cs1_expanded.p[3] - load1.p_in[3] : 0.0 : True 1 Port Declarations inlet : Size=1, Index=None Key : Name : Size : Variable None : p : 3 : load1.p_in 3 Declarations: p_in inlet inlet_p_insum load2 : Size=1, Index=None, Active=True 1 Var Declarations p_in : Size=3, Index=time Key : Lower : Value : Upper : Fixed : Stale : Domain 1 : None : None : None : False : True : Reals 2 : None : None : None : False : True : Reals 3 : None : None : None : False : True : Reals 1 Constraint Declarations inlet_p_insum : Size=3, Index=time, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : cs2_expanded.p[1] - load2.p_in[1] : 0.0 : True 2 : 0.0 : cs2_expanded.p[2] - load2.p_in[2] : 0.0 : True 3 : 0.0 : cs2_expanded.p[3] - load2.p_in[3] : 0.0 : True 1 Port Declarations inlet : Size=1, Index=None Key : Name : Size : Variable None : p : 3 : load2.p_in 3 Declarations: p_in inlet inlet_p_insum source : Size=1, Index=None, Active=True 1 Var Declarations p_out : Size=3, Index=time Key : Lower : Value : Upper : Fixed : Stale : Domain 1 : None : None : None : False : True : Reals 2 : None : None : None : False : True : Reals 3 : None : None : None : False : True : Reals 1 Constraint Declarations outlet_p_outsum : Size=3, Index=time, Active=True Key : Lower : Body : Upper : Active 1 : 0.0 : cs1_expanded.p[1] + cs2_expanded.p[1] - source.p_out[1] : 0.0 : True 2 : 0.0 : cs1_expanded.p[2] + cs2_expanded.p[2] - source.p_out[2] : 0.0 : True 3 : 0.0 : cs1_expanded.p[3] + cs2_expanded.p[3] - source.p_out[3] : 0.0 : True 1 Port Declarations outlet : Size=1, Index=None Key : Name : Size : Variable None : p : 3 : source.p_out 3 Declarations: p_out outlet outlet_p_outsum 2 Arc Declarations cs1 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (source.outlet, load1.inlet) : True : False cs2 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (source.outlet, load2.inlet) : True : False 8 Declarations: time source load1 load2 cs1 cs2 cs1_expanded cs2_expanded """ os = StringIO() m.pprint(ostream=os) self.assertEqual(os.getvalue().strip(), ref.strip()) def test_extensive_expansion(self): m = ConcreteModel() m.comp = Set(initialize=["a", "b", "c"]) # Feed m.feed = Block() m.feed.flow = Var(m.comp, domain=NonNegativeReals) m.feed.mass = Var() m.feed.temp = Var() m.feed.outlet = Port() m.feed.outlet.add(m.feed.flow, "flow", rule=Port.Extensive, write_var_sum=False) m.feed.outlet.add(m.feed.mass, "mass", rule=Port.Extensive) m.feed.outlet.add(m.feed.temp, "temp") # Treatment Unit m.tru = Block() m.tru.flow_in = Var(m.comp, domain=NonNegativeReals) m.tru.flow_out = Var(m.comp, domain=NonNegativeReals) m.tru.mass = Var() m.tru.temp = Var() m.tru.inlet = Port() m.tru.inlet.add(m.tru.flow_in, "flow", rule=Port.Extensive) m.tru.inlet.add(m.tru.mass, "mass", rule=Port.Extensive) m.tru.inlet.add(m.tru.temp, "temp") m.tru.outlet = Port() m.tru.outlet.add(m.tru.flow_out, "flow", rule=Port.Extensive) m.tru.outlet.add(m.tru.mass, "mass", rule=Port.Extensive) m.tru.outlet.add(m.tru.temp, "temp") # Ports with both in and out, connected to each other 1-to-1 m.node1 = Block() m.node1.flow = Var(m.comp, domain=NonNegativeReals) m.node1.mass = Var() m.node1.temp = Var() m.node1.port = Port(initialize=[(m.node1.flow, Port.Extensive), (m.node1.mass, Port.Extensive), m.node1.temp]) m.node2 = Block() m.node2.flow = Var(m.comp, domain=NonNegativeReals) m.node2.mass = Var() m.node2.temp = Var() m.node2.port = Port(initialize=[(m.node2.flow, Port.Extensive), (m.node2.mass, Port.Extensive), m.node2.temp]) # Port with multiple inlets and outlets m.multi = Block() m.multi.flow = Var(m.comp, domain=NonNegativeReals) m.multi.mass = Var() m.multi.temp = Var() m.multi.port = Port(initialize=[(m.multi.flow, Port.Extensive), (m.multi.mass, Port.Extensive), m.multi.temp]) # Product m.prod = Block() m.prod.flow = Var(m.comp, domain=NonNegativeReals) m.prod.mass = Var() m.prod.temp = Var() m.prod.inlet = Port() m.prod.inlet.add(m.prod.flow, "flow", rule=Port.Extensive) m.prod.inlet.add(m.prod.mass, "mass", rule=Port.Extensive) m.prod.inlet.add(m.prod.temp, "temp") # Arcs m.stream0 = Arc(source=m.tru.outlet, destination=m.node1.port) m.stream1 = Arc(source=m.feed.outlet, destination=m.tru.inlet) m.stream2 = Arc(source=m.feed.outlet, destination=m.prod.inlet) m.stream3 = Arc(source=m.feed.outlet, destination=m.node1.port) m.stream4 = Arc(source=m.node1.port, destination=m.node2.port) m.stream5 = Arc(source=m.tru.outlet, destination=m.prod.inlet) m.stream6 = Arc(source=m.node2.port, destination=m.prod.inlet) m.stream7 = Arc(source=m.feed.outlet, destination=m.multi.port) m.stream8 = Arc(source=m.tru.outlet, destination=m.multi.port) m.stream9 = Arc(source=m.multi.port, destination=m.prod.inlet) m.stream10 = Arc(source=m.multi.port, destination=m.tru.inlet) # SplitFrac specifications m.feed.outlet.set_split_fraction(m.stream1, .6, fix=True) m.stream0.deactivate() TransformationFactory('network.expand_arcs').apply_to(m) os = StringIO() m.pprint(ostream=os) self.assertEqual(os.getvalue(), """1 Set Declarations comp : Size=1, Index=None, Ordered=Insertion Key : Dimen : Domain : Size : Members None : 1 : Any : 3 : {'a', 'b', 'c'} 16 Block Declarations feed : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 2 Constraint Declarations outlet_frac_sum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 1.0 : stream1_expanded.splitfrac + stream2_expanded.splitfrac + stream3_expanded.splitfrac + stream7_expanded.splitfrac : 1.0 : True outlet_mass_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream1_expanded.mass + stream2_expanded.mass + stream3_expanded.mass + stream7_expanded.mass - feed.mass : 0.0 : True 1 Port Declarations outlet : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : feed.flow : mass : 1 : feed.mass : temp : 1 : feed.temp 6 Declarations: flow mass temp outlet outlet_frac_sum outlet_mass_outsum multi : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 4 Constraint Declarations port_flow_insum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream7_expanded.flow[a] + stream8_expanded.flow[a] - multi.flow[a] : 0.0 : True b : 0.0 : stream7_expanded.flow[b] + stream8_expanded.flow[b] - multi.flow[b] : 0.0 : True c : 0.0 : stream7_expanded.flow[c] + stream8_expanded.flow[c] - multi.flow[c] : 0.0 : True port_flow_outsum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream9_expanded.flow[a] + stream10_expanded.flow[a] - multi.flow[a] : 0.0 : True b : 0.0 : stream9_expanded.flow[b] + stream10_expanded.flow[b] - multi.flow[b] : 0.0 : True c : 0.0 : stream9_expanded.flow[c] + stream10_expanded.flow[c] - multi.flow[c] : 0.0 : True port_mass_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream7_expanded.mass + stream8_expanded.mass - multi.mass : 0.0 : True port_mass_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream9_expanded.mass + stream10_expanded.mass - multi.mass : 0.0 : True 1 Port Declarations port : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : multi.flow : mass : 1 : multi.mass : temp : 1 : multi.temp 8 Declarations: flow mass temp port port_flow_outsum port_flow_insum port_mass_outsum port_mass_insum node1 : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 2 Constraint Declarations port_flow_insum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream3_expanded.flow[a] - node1.flow[a] : 0.0 : True b : 0.0 : stream3_expanded.flow[b] - node1.flow[b] : 0.0 : True c : 0.0 : stream3_expanded.flow[c] - node1.flow[c] : 0.0 : True port_mass_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream3_expanded.mass - node1.mass : 0.0 : True 1 Port Declarations port : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : node1.flow : mass : 1 : node1.mass : temp : 1 : node1.temp 6 Declarations: flow mass temp port port_flow_insum port_mass_insum node2 : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 2 Constraint Declarations port_flow_outsum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream6_expanded.flow[a] - node2.flow[a] : 0.0 : True b : 0.0 : stream6_expanded.flow[b] - node2.flow[b] : 0.0 : True c : 0.0 : stream6_expanded.flow[c] - node2.flow[c] : 0.0 : True port_mass_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream6_expanded.mass - node2.mass : 0.0 : True 1 Port Declarations port : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : node2.flow : mass : 1 : node2.mass : temp : 1 : node2.temp 6 Declarations: flow mass temp port port_flow_outsum port_mass_outsum prod : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 2 Constraint Declarations inlet_flow_insum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream2_expanded.flow[a] + stream5_expanded.flow[a] + stream6_expanded.flow[a] + stream9_expanded.flow[a] - prod.flow[a] : 0.0 : True b : 0.0 : stream2_expanded.flow[b] + stream5_expanded.flow[b] + stream6_expanded.flow[b] + stream9_expanded.flow[b] - prod.flow[b] : 0.0 : True c : 0.0 : stream2_expanded.flow[c] + stream5_expanded.flow[c] + stream6_expanded.flow[c] + stream9_expanded.flow[c] - prod.flow[c] : 0.0 : True inlet_mass_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream2_expanded.mass + stream5_expanded.mass + stream6_expanded.mass + stream9_expanded.mass - prod.mass : 0.0 : True 1 Port Declarations inlet : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : prod.flow : mass : 1 : prod.mass : temp : 1 : prod.temp 6 Declarations: flow mass temp inlet inlet_flow_insum inlet_mass_insum stream10_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream10_expanded.flow[a] - stream10_expanded.splitfrac*multi.flow[a] : 0.0 : True b : 0.0 : stream10_expanded.flow[b] - stream10_expanded.splitfrac*multi.flow[b] : 0.0 : True c : 0.0 : stream10_expanded.flow[c] - stream10_expanded.splitfrac*multi.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream10_expanded.mass - stream10_expanded.splitfrac*multi.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : multi.temp - tru.temp : 0.0 : True 6 Declarations: flow mass temp_equality splitfrac flow_split mass_split stream1_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : 0.6 : None : True : False : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream1_expanded.flow[a] - stream1_expanded.splitfrac*feed.flow[a] : 0.0 : True b : 0.0 : stream1_expanded.flow[b] - stream1_expanded.splitfrac*feed.flow[b] : 0.0 : True c : 0.0 : stream1_expanded.flow[c] - stream1_expanded.splitfrac*feed.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream1_expanded.mass - stream1_expanded.splitfrac*feed.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : feed.temp - tru.temp : 0.0 : True 6 Declarations: flow splitfrac flow_split mass mass_split temp_equality stream2_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream2_expanded.flow[a] - stream2_expanded.splitfrac*feed.flow[a] : 0.0 : True b : 0.0 : stream2_expanded.flow[b] - stream2_expanded.splitfrac*feed.flow[b] : 0.0 : True c : 0.0 : stream2_expanded.flow[c] - stream2_expanded.splitfrac*feed.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream2_expanded.mass - stream2_expanded.splitfrac*feed.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : feed.temp - prod.temp : 0.0 : True 6 Declarations: flow splitfrac flow_split mass mass_split temp_equality stream3_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : Reals b : 0 : None : None : False : True : Reals c : 0 : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream3_expanded.flow[a] - stream3_expanded.splitfrac*feed.flow[a] : 0.0 : True b : 0.0 : stream3_expanded.flow[b] - stream3_expanded.splitfrac*feed.flow[b] : 0.0 : True c : 0.0 : stream3_expanded.flow[c] - stream3_expanded.splitfrac*feed.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream3_expanded.mass - stream3_expanded.splitfrac*feed.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : feed.temp - node1.temp : 0.0 : True 6 Declarations: flow splitfrac flow_split mass mass_split temp_equality stream4_expanded : Size=1, Index=None, Active=True 3 Constraint Declarations flow_equality : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : node1.flow[a] - node2.flow[a] : 0.0 : True b : 0.0 : node1.flow[b] - node2.flow[b] : 0.0 : True c : 0.0 : node1.flow[c] - node2.flow[c] : 0.0 : True mass_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : node1.mass - node2.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : node1.temp - node2.temp : 0.0 : True 3 Declarations: flow_equality mass_equality temp_equality stream5_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream5_expanded.flow[a] - stream5_expanded.splitfrac*tru.flow_out[a] : 0.0 : True b : 0.0 : stream5_expanded.flow[b] - stream5_expanded.splitfrac*tru.flow_out[b] : 0.0 : True c : 0.0 : stream5_expanded.flow[c] - stream5_expanded.splitfrac*tru.flow_out[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream5_expanded.mass - stream5_expanded.splitfrac*tru.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : tru.temp - prod.temp : 0.0 : True 6 Declarations: flow mass temp_equality splitfrac flow_split mass_split stream6_expanded : Size=1, Index=None, Active=True 2 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : Reals b : 0 : None : None : False : True : Reals c : 0 : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 1 Constraint Declarations temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : node2.temp - prod.temp : 0.0 : True 3 Declarations: flow mass temp_equality stream7_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream7_expanded.flow[a] - stream7_expanded.splitfrac*feed.flow[a] : 0.0 : True b : 0.0 : stream7_expanded.flow[b] - stream7_expanded.splitfrac*feed.flow[b] : 0.0 : True c : 0.0 : stream7_expanded.flow[c] - stream7_expanded.splitfrac*feed.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream7_expanded.mass - stream7_expanded.splitfrac*feed.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : feed.temp - multi.temp : 0.0 : True 6 Declarations: flow splitfrac flow_split mass mass_split temp_equality stream8_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream8_expanded.flow[a] - stream8_expanded.splitfrac*tru.flow_out[a] : 0.0 : True b : 0.0 : stream8_expanded.flow[b] - stream8_expanded.splitfrac*tru.flow_out[b] : 0.0 : True c : 0.0 : stream8_expanded.flow[c] - stream8_expanded.splitfrac*tru.flow_out[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream8_expanded.mass - stream8_expanded.splitfrac*tru.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : tru.temp - multi.temp : 0.0 : True 6 Declarations: flow splitfrac flow_split mass mass_split temp_equality stream9_expanded : Size=1, Index=None, Active=True 3 Var Declarations flow : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : None : None : None : False : True : Reals b : None : None : None : False : True : Reals c : None : None : None : False : True : Reals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals splitfrac : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 3 Constraint Declarations flow_split : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream9_expanded.flow[a] - stream9_expanded.splitfrac*multi.flow[a] : 0.0 : True b : 0.0 : stream9_expanded.flow[b] - stream9_expanded.splitfrac*multi.flow[b] : 0.0 : True c : 0.0 : stream9_expanded.flow[c] - stream9_expanded.splitfrac*multi.flow[c] : 0.0 : True mass_split : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream9_expanded.mass - stream9_expanded.splitfrac*multi.mass : 0.0 : True temp_equality : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : multi.temp - prod.temp : 0.0 : True 6 Declarations: flow mass temp_equality splitfrac flow_split mass_split tru : Size=1, Index=None, Active=True 4 Var Declarations flow_in : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals flow_out : Size=3, Index=comp Key : Lower : Value : Upper : Fixed : Stale : Domain a : 0 : None : None : False : True : NonNegativeReals b : 0 : None : None : False : True : NonNegativeReals c : 0 : None : None : False : True : NonNegativeReals mass : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals temp : Size=1, Index=None Key : Lower : Value : Upper : Fixed : Stale : Domain None : None : None : None : False : True : Reals 4 Constraint Declarations inlet_flow_insum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream1_expanded.flow[a] + stream10_expanded.flow[a] - tru.flow_in[a] : 0.0 : True b : 0.0 : stream1_expanded.flow[b] + stream10_expanded.flow[b] - tru.flow_in[b] : 0.0 : True c : 0.0 : stream1_expanded.flow[c] + stream10_expanded.flow[c] - tru.flow_in[c] : 0.0 : True inlet_mass_insum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream1_expanded.mass + stream10_expanded.mass - tru.mass : 0.0 : True outlet_flow_outsum : Size=3, Index=comp, Active=True Key : Lower : Body : Upper : Active a : 0.0 : stream5_expanded.flow[a] + stream8_expanded.flow[a] - tru.flow_out[a] : 0.0 : True b : 0.0 : stream5_expanded.flow[b] + stream8_expanded.flow[b] - tru.flow_out[b] : 0.0 : True c : 0.0 : stream5_expanded.flow[c] + stream8_expanded.flow[c] - tru.flow_out[c] : 0.0 : True outlet_mass_outsum : Size=1, Index=None, Active=True Key : Lower : Body : Upper : Active None : 0.0 : stream5_expanded.mass + stream8_expanded.mass - tru.mass : 0.0 : True 2 Port Declarations inlet : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : tru.flow_in : mass : 1 : tru.mass : temp : 1 : tru.temp outlet : Size=1, Index=None Key : Name : Size : Variable None : flow : 3 : tru.flow_out : mass : 1 : tru.mass : temp : 1 : tru.temp 10 Declarations: flow_in flow_out mass temp inlet outlet inlet_flow_insum inlet_mass_insum outlet_flow_outsum outlet_mass_outsum 11 Arc Declarations stream0 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (tru.outlet, node1.port) : True : False stream1 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (feed.outlet, tru.inlet) : True : False stream10 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (multi.port, tru.inlet) : True : False stream2 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (feed.outlet, prod.inlet) : True : False stream3 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (feed.outlet, node1.port) : True : False stream4 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (node1.port, node2.port) : True : False stream5 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (tru.outlet, prod.inlet) : True : False stream6 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (node2.port, prod.inlet) : True : False stream7 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (feed.outlet, multi.port) : True : False stream8 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (tru.outlet, multi.port) : True : False stream9 : Size=1, Index=None, Active=False Key : Ports : Directed : Active None : (multi.port, prod.inlet) : True : False 28 Declarations: comp feed tru node1 node2 multi prod stream0 stream1 stream2 stream3 stream4 stream5 stream6 stream7 stream8 stream9 stream10 stream1_expanded stream2_expanded stream3_expanded stream4_expanded stream5_expanded stream6_expanded stream7_expanded stream8_expanded stream9_expanded stream10_expanded """) if __name__ == "__main__": unittest.main()