Coverage for test/unit/elements/aggregation/test_consumer_distributor.py: 99%
92 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
1import unittest
3import bim2sim.elements.aggregation.hvac_aggregations
4from bim2sim.elements import aggregation
5from bim2sim.elements import hvac_elements as hvac
6from bim2sim.elements.graphs.hvac_graph import HvacGraph
7from test.unit.elements.helper import SetupHelperHVAC
10class ConsumerDistributorHelper(SetupHelperHVAC):
12 def get_setup_con_dist1(self):
13 """ Get a simple setup to test ConsumerHeatingDistributorModule.
15 The setup includes the following components:
16 * 1 Distributor with 4 ports
17 * 1 Consumer connected with 3 pipe each (flow and return) to
18 Distributor
19 * 1 Boiler connected with 3 pipe each (flow and return) to Distributor
20 """
21 flags = {}
22 with self.flag_manager(flags):
23 # generator circuit
24 con_vl = [self.element_generator(
25 hvac.Pipe, length=100, diameter=30, flags=['PipeCon'])
26 for i in range(1)]
27 con_rl = [self.element_generator(
28 hvac.Pipe, length=100, diameter=30, flags=['PipeCon'])
29 for i in range(1)]
30 consumer = self.element_generator(
31 hvac.SpaceHeater, flags=['spaceheater'])
32 boil_vl = [self.element_generator(
33 hvac.Pipe, length=100, diameter=30) for i in range(1)]
34 boil_rl = [self.element_generator(
35 hvac.Pipe, length=100, diameter=30) for i in range(1)]
36 boiler = self.element_generator(
37 hvac.Boiler, n_ports=2, flags=['boiler'],)
38 distributor = self.element_generator(
39 hvac.Distributor, n_ports=4, flags=["distributor"])
41 # connect elements
42 self.connect_strait([*con_vl, consumer, *con_rl])
43 self.connect_strait([*boil_rl, boiler, *boil_vl])
44 boil_vl[-1].ports[-1].connect(distributor.ports[0])
45 distributor.ports[1].connect(boil_rl[0].ports[0])
46 distributor.ports[2].connect(con_vl[0].ports[0])
47 distributor.ports[3].connect(con_rl[-1].ports[-1])
49 flags['edge_ports'] = [distributor.ports[0], distributor.ports[1]]
51 circuit = [
52 *con_vl, *con_rl, consumer, *boil_vl, *boil_rl, boiler, distributor]
54 graph = HvacGraph(circuit)
55 return graph, flags
57 def get_setup_con_dist2(self):
58 """ Get a simple setup to test ConsumerHeatingDistributorModule with
59 undefined consumer ports.
61 The setup includes the following components:
62 * 1 Distributor with 6 ports, 2 of them unconnected
63 * 1 Consumer connected with 3 pipe each (flow and return) to
64 Distributor
65 * 1 Boiler connected with 3 pipe each (flow and return) to Distributor
66 """
67 flags = {}
68 with self.flag_manager(flags):
69 # generator circuit
70 boil_vl = [self.element_generator(
71 hvac.Pipe, length=100, diameter=30) for i in range(1)]
72 boil_rl = [self.element_generator(
73 hvac.Pipe, length=100, diameter=30) for i in range(1)]
74 boiler = self.element_generator(
75 hvac.Boiler, n_ports=2, flags=['boiler'], )
76 # consumer circuit
77 con_vl = [self.element_generator(
78 hvac.Pipe, length=100, diameter=30, flags=['PipeCon'])
79 for i in range(1)]
80 con_rl = [self.element_generator(
81 hvac.Pipe, length=100, diameter=30, flags=['PipeCon'])
82 for i in range(1)]
83 consumer = self.element_generator(
84 hvac.SpaceHeater, flags=['spaceheater'])
85 distributor = self.element_generator(
86 hvac.Distributor, n_ports=6, flags=["distributor"])
87 # undefined circuit
88 undef_vl = [self.element_generator(
89 hvac.Pipe, length=100, diameter=30) for i in range(1)]
90 undef_rl = [self.element_generator(
91 hvac.Pipe, length=100, diameter=30) for i in range(1)]
93 # connect elements
94 self.connect_strait([*con_vl, consumer, *con_rl])
95 self.connect_strait([*boil_rl, boiler, *boil_vl])
96 boil_vl[-1].ports[-1].connect(distributor.ports[0])
97 distributor.ports[1].connect(boil_rl[0].ports[0])
98 distributor.ports[2].connect(con_vl[0].ports[0])
99 distributor.ports[3].connect(con_rl[-1].ports[-1])
100 distributor.ports[4].connect(undef_vl[0].ports[0])
101 distributor.ports[5].connect(undef_rl[-1].ports[-1])
103 flags['edge_ports'] = [distributor.ports[0], distributor.ports[1]]
104 flags['undefined_consumer_ports'] = [distributor.ports[4],
105 distributor.ports[5]]
107 circuit = [
108 *con_vl, *con_rl, consumer, *boil_vl, *boil_rl, boiler, distributor]
110 graph = HvacGraph(circuit)
111 return graph, flags
114class TestConsumerDistributorModule(unittest.TestCase):
115 helper = None
117 @classmethod
118 def setUpClass(cls) -> None:
119 cls.helper = ConsumerDistributorHelper()
121 def tearDown(self) -> None:
122 self.helper.reset()
124 def test_find_matches(self):
125 """ Test the find matches method."""
126 graph, flags = self.helper.get_setup_con_dist1()
127 con_heat_dist_mod = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule
128 matches, metas = con_heat_dist_mod.find_matches(graph)
129 self.assertEqual(
130 len(matches), 1,
131 "There is 1 case for ConsumerDistrubtorModule Cycles but "
132 "'find_matches' returned %d" % len(matches)
133 )
135 module = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule(
136 graph, matches[0], **metas[0])
137 module_elements = [item for item in flags['spaceheater']
138 + flags['distributor'] + flags['PipeCon']]
139 edge_ports_originals = [
140 edge_port.originals for edge_port in module.get_ports()]
141 self.assertNotEqual(edge_ports_originals, flags['edge_ports'])
142 self.assertCountEqual(module.elements, module_elements)
144 def test_aggregation(self):
145 """ Test the aggregation of consumer heating distribution module."""
146 graph, flags = self.helper.get_setup_con_dist1()
147 con_heat_dist_mod = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule
148 matches, metas = con_heat_dist_mod.find_matches(graph)
149 for match, meta in zip(matches, metas):
150 module = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule(
151 graph, match, **meta)
152 edge_ports = [edge_port.originals[0] for edge_port in
153 module.get_ports()]
154 self.assertEqual(set(edge_ports), set(flags['edge_ports']))
155 graph.merge(
156 mapping=module.get_replacement_mapping(),
157 inner_connections=module.inner_connections
158 )
160 aggregated_con_heat_dis_mod = [
161 ele for ele in graph.elements
162 if ele.__class__.__name__ == 'ConsumerHeatingDistributorModule']
163 self.assertEqual(len(aggregated_con_heat_dis_mod), 1)
165 def test_aggregation2(self):
166 """ Test the aggregation of consumer heating distribution module and
167 detection of undefined consumer ports."""
168 graph, flags = self.helper.get_setup_con_dist2()
169 con_heat_dist_mod = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule
170 matches, metas = con_heat_dist_mod.find_matches(graph)
171 for match, meta in zip(matches, metas):
172 module = bim2sim.elements.aggregation.hvac_aggregations.ConsumerHeatingDistributorModule(
173 graph, match, **meta)
174 graph.merge(
175 mapping=module.get_replacement_mapping(),
176 inner_connections=module.inner_connections
177 )
179 aggregated_con_heat_dis_mod = [
180 ele for ele in graph.elements
181 if ele.__class__.__name__ == 'ConsumerHeatingDistributorModule']
182 self.assertEqual(len(aggregated_con_heat_dis_mod), 1)
183 self.assertEqual(flags['undefined_consumer_ports'],
184 metas[0]['undefined_consumer_ports'])
187if __name__ == '__main__':
188 unittest.main()