Skip to content

Commit 7e339f0

Browse files
committed
Deduce the calculated bus id in the node/breaker topology (#163)
Signed-off-by: Slimane AMAR <[email protected]>
1 parent 90eaf8e commit 7e339f0

File tree

6 files changed

+123
-48
lines changed

6 files changed

+123
-48
lines changed

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/AbstractTopology.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import com.powsybl.iidm.network.*;
1010
import com.powsybl.network.store.model.*;
11+
import org.apache.commons.lang3.tuple.Pair;
1112
import org.jgrapht.Graph;
1213
import org.jgrapht.alg.connectivity.ConnectivityInspector;
1314
import org.jgrapht.graph.Pseudograph;
@@ -294,8 +295,8 @@ protected void buildGraph(NetworkObjectIndex index, Resource<VoltageLevelAttribu
294295

295296
protected abstract boolean isCalculatedBusValid(Set<T> nodesOrBusesConnectedSet, Map<T, List<Vertex>> verticesByNodeOrBus, boolean isBusView);
296297

297-
public List<Set<Vertex>> findConnectedVerticesList(NetworkObjectIndex index, Resource<VoltageLevelAttributes> voltageLevelResource, boolean includeOpenSwitches, boolean isBusView) {
298-
List<Set<Vertex>> connectedVerticesList = new ArrayList<>();
298+
public List<Pair<Set<Vertex>, Set<T>>> findConnectedVerticesAndNodesOrBusesList(NetworkObjectIndex index, Resource<VoltageLevelAttributes> voltageLevelResource, boolean includeOpenSwitches, boolean isBusView) {
299+
List<Pair<Set<Vertex>, Set<T>>> connectedVerticesList = new ArrayList<>();
299300

300301
// build graph
301302
Map<T, List<Vertex>> verticesByNodeOrBus = new HashMap<>();
@@ -308,7 +309,7 @@ public List<Set<Vertex>> findConnectedVerticesList(NetworkObjectIndex index, Res
308309
Set<Vertex> connectedVertices = nodesOrBusesConnected.stream()
309310
.flatMap(nodeOrBus -> verticesByNodeOrBus.getOrDefault(nodeOrBus, Collections.emptyList()).stream())
310311
.collect(Collectors.toSet());
311-
connectedVerticesList.add(connectedVertices);
312+
connectedVerticesList.add(Pair.of(connectedVertices, nodesOrBusesConnected));
312313
}
313314
}
314315

@@ -348,18 +349,17 @@ private CalculationResult<T> getCalculatedBusAttributesList(NetworkObjectIndex i
348349
calculatedBusAttributesList = voltageLevelResource.getAttributes().getCalculatedBuses();
349350
nodeOrBusToCalculatedBusNum = getNodeOrBusToCalculatedBusNum(voltageLevelResource);
350351
} else {
351-
calculatedBusAttributesList = findConnectedVerticesList(index, voltageLevelResource, includeOpenSwitches, isBusView)
352+
List<Pair<Set<Vertex>, Set<T>>> connectedVerticesAndNodesOrBuses = findConnectedVerticesAndNodesOrBusesList(index, voltageLevelResource, includeOpenSwitches, isBusView);
353+
calculatedBusAttributesList = connectedVerticesAndNodesOrBuses
352354
.stream()
353-
.map(connectedVertices -> new CalculatedBusAttributes(connectedVertices, null, null, Double.NaN, Double.NaN))
355+
.map(connectedVertices -> new CalculatedBusAttributes(connectedVertices.getLeft(), null, null, Double.NaN, Double.NaN))
354356
.collect(Collectors.toList());
355357
voltageLevelResource.getAttributes().setCalculatedBuses(calculatedBusAttributesList);
356358

357359
// index calculated buses per node or bus
358360
nodeOrBusToCalculatedBusNum = new HashMap<>();
359361
for (int calculatedBusNum = 0; calculatedBusNum < calculatedBusAttributesList.size(); calculatedBusNum++) {
360-
CalculatedBusAttributes calculatedBusAttributes = calculatedBusAttributesList.get(calculatedBusNum);
361-
for (Vertex vertex : calculatedBusAttributes.getVertices()) {
362-
T nodeOrBus = getNodeOrBus(vertex);
362+
for (T nodeOrBus : connectedVerticesAndNodesOrBuses.get(calculatedBusNum).getRight()) {
363363
nodeOrBusToCalculatedBusNum.put(nodeOrBus, calculatedBusNum);
364364
}
365365
}

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusBreakerTopology.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected Vertex createVertex(String id, ConnectableType connectableType, String
3232

3333
@Override
3434
public <U extends InjectionAttributes> String getInjectionNodeOrBus(Resource<U> resource) {
35-
return resource.getAttributes().getBus();
35+
return resource.getAttributes().getConnectableBus();
3636
}
3737

3838
@Override

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/NodeBreakerTopology.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,11 @@ protected void buildEdges(NetworkObjectIndex index, Resource<VoltageLevelAttribu
119119
}
120120

121121
@Override
122-
protected CalculatedBus createCalculatedBus(NetworkObjectIndex index, Resource<VoltageLevelAttributes> voltageLevelResource,
123-
int calculatedBusNum) {
124-
125-
String busId = voltageLevelResource.getId() + "_" + calculatedBusNum;
126-
String busName = null;
127-
if (voltageLevelResource.getAttributes().getName() != null) {
128-
busName = voltageLevelResource.getAttributes().getName() != null ? voltageLevelResource.getAttributes().getName() + "_" + calculatedBusNum : null;
129-
}
122+
protected CalculatedBus createCalculatedBus(NetworkObjectIndex index, Resource<VoltageLevelAttributes> voltageLevelResource, int calculatedBusNum) {
123+
// to have a unique and stable calculated bus id, we use voltage level id as a base id plus the minimum node
124+
int firstNode = voltageLevelResource.getAttributes().getNodeToCalculatedBus().entrySet().stream().filter(e -> e.getValue() == calculatedBusNum).map(Map.Entry::getKey).min(Integer::compare).orElseThrow(IllegalStateException::new);
125+
String busId = voltageLevelResource.getId() + "_" + firstNode;
126+
String busName = voltageLevelResource.getAttributes().getName() != null ? voltageLevelResource.getAttributes().getName() + "_" + firstNode : null;
130127
return new CalculatedBus(index, voltageLevelResource.getId(), busId, busName, voltageLevelResource, calculatedBusNum);
131-
132128
}
133129
}

network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/BusBreakerTerminalTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,20 @@ public void testBusView() {
3434
assertEquals(0, vl1.getBusView().getBusStream().filter(b -> b instanceof ConfiguredBusImpl).count());
3535
assertEquals(gt.getBusView().getBus(), gt.getBusView().getConnectableBus());
3636
assertEquals(l1t.getBusView().getBus(), l1t.getBusView().getConnectableBus());
37+
assertEquals(5, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
3738

3839
assertTrue(gt.disconnect());
3940
assertFalse(gt.isConnected());
4041
assertNull(gt.getBusView().getBus());
4142
assertNotNull(gt.getBusView().getConnectableBus());
4243
assertEquals(vl1.getBusView().getBus("VL1_0"), gt.getBusView().getConnectableBus());
44+
assertEquals(5, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
4345

4446
assertTrue(l1t.disconnect());
4547
assertFalse(l1t.isConnected());
4648
assertEquals(0, vl1.getBusView().getBusStream().count()); // Because no line in the VL
4749
assertNull(l1t.getBusView().getBus());
48-
assertNull(l1t.getBusView().getConnectableBus()); //
50+
assertNull(l1t.getBusView().getConnectableBus()); // Because no buses
4951
assertEquals(vl1.getBusView().getBus("VL1_0"), l1t.getBusView().getConnectableBus());
5052
assertTrue(l1t.connect());
5153
assertTrue(l1t.isConnected());
@@ -73,11 +75,15 @@ public void testBusBreakerView() {
7375

7476
Bus configuredBus = gt.getBusBreakerView().getBus();
7577
assertNotNull(configuredBus);
78+
assertEquals(3, vl1.getBusBreakerView().getBus("B1").getConnectedTerminalCount());
79+
7680
assertTrue(gt.disconnect());
7781
assertFalse(gt.isConnected());
7882
assertNull(gt.getBusBreakerView().getBus());
7983
assertNotNull(gt.getBusBreakerView().getConnectableBus());
8084
assertEquals(configuredBus, gt.getBusBreakerView().getConnectableBus());
85+
assertEquals(2, vl1.getBusBreakerView().getBus("B1").getConnectedTerminalCount());
86+
8187
assertTrue(gt.connect());
8288
assertTrue(gt.isConnected());
8389
assertEquals(gt.getBusBreakerView().getBus(), gt.getBusBreakerView().getConnectableBus());

network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/CalculatedBusTest.java

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void testCalculatedBusesNodeBreaker() {
8080

8181
VoltageLevel.BusView bv = vl1.getBusView();
8282
assertThrows(AssertionError.class, () -> {
83-
bv.getMergedBus("TOTO");
83+
bv.getMergedBus("FOO");
8484
});
8585
}
8686

@@ -105,13 +105,14 @@ public void testCalculatedBusesNodeBreakerSwitchRetain() {
105105
Bus b1 = vl1.getBusView().getMergedBus("BBS1");
106106
Bus b2 = vl1.getBusView().getMergedBus("BBS12");
107107
assertEquals(b1, b2);
108-
assertEquals(6, b1.getConnectedTerminalCount());
108+
assertEquals(b1, vl1.getBusView().getBus("VL1_0"));
109+
assertEquals(b2, vl1.getBusView().getBus("VL1_0"));
109110

110111
// BusBreakerView
111112
assertEquals(2, vl1.getBusBreakerView().getBusStream().count());
112113
assertEquals(0, vl1.getBusBreakerView().getBusStream().filter(b -> b instanceof ConfiguredBusImpl).count());
113114
assertEquals(4, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
114-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
115+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_10").getConnectedTerminalCount());
115116
assertEquals(1, vl1.getBusBreakerView().getSwitchCount());
116117

117118
s.setRetained(false);
@@ -122,7 +123,8 @@ public void testCalculatedBusesNodeBreakerSwitchRetain() {
122123
b1 = vl1.getBusView().getMergedBus("BBS1");
123124
b2 = vl1.getBusView().getMergedBus("BBS12");
124125
assertEquals(b1, b2);
125-
assertEquals(6, b1.getConnectedTerminalCount());
126+
assertEquals(b1, vl1.getBusView().getBus("VL1_0"));
127+
assertEquals(b2, vl1.getBusView().getBus("VL1_0"));
126128

127129
// BusBreakerView
128130
assertEquals(1, vl1.getBusBreakerView().getBusStream().count());
@@ -144,17 +146,17 @@ public void testCalculatedBusesNodeBreakerSwitch1() {
144146
// BusView
145147
assertEquals(2, vl1.getBusView().getBusStream().count());
146148
assertEquals(4, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
147-
assertEquals(2, vl1.getBusView().getBus("VL1_1").getConnectedTerminalCount());
149+
assertEquals(2, vl1.getBusView().getBus("VL1_10").getConnectedTerminalCount());
148150
Bus b1 = vl1.getBusView().getMergedBus("BBS1");
149151
Bus b2 = vl1.getBusView().getMergedBus("BBS12");
150152
assertNotEquals(b1, b2);
151-
assertEquals(4, b1.getConnectedTerminalCount());
152-
assertEquals(2, b2.getConnectedTerminalCount());
153+
assertEquals(b1, vl1.getBusView().getBus("VL1_0"));
154+
assertEquals(b2, vl1.getBusView().getBus("VL1_10"));
153155

154156
// BusBreakerView
155157
assertEquals(2, vl1.getBusBreakerView().getBusStream().count());
156158
assertEquals(4, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
157-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
159+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_10").getConnectedTerminalCount());
158160
assertEquals(0, vl1.getBusBreakerView().getSwitchCount());
159161
}
160162

@@ -169,19 +171,19 @@ public void testCalculatedBusesNodeBreakerSwitch2() {
169171

170172
// BusView
171173
assertEquals(2, vl1.getBusView().getBusStream().count());
172-
assertEquals(2, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
173-
assertEquals(3, vl1.getBusView().getBus("VL1_1").getConnectedTerminalCount());
174+
assertEquals(3, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
175+
assertEquals(2, vl1.getBusView().getBus("VL1_10").getConnectedTerminalCount());
174176
Bus b1 = vl1.getBusView().getMergedBus("BBS1");
175177
Bus b2 = vl1.getBusView().getMergedBus("BBS12");
176178
assertNotEquals(b1, b2);
177-
assertEquals(3, b1.getConnectedTerminalCount());
178-
assertEquals(2, b2.getConnectedTerminalCount());
179+
assertEquals(b1, vl1.getBusView().getBus("VL1_0"));
180+
assertEquals(b2, vl1.getBusView().getBus("VL1_10"));
179181

180182
// BusBreakerView
181183
assertEquals(3, vl1.getBusBreakerView().getBusStream().count());
182-
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
183-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
184-
assertEquals(3, vl1.getBusBreakerView().getBus("VL1_2").getConnectedTerminalCount());
184+
assertEquals(3, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
185+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_10").getConnectedTerminalCount());
186+
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
185187
assertEquals(0, vl1.getBusBreakerView().getSwitchCount());
186188
}
187189

@@ -198,14 +200,18 @@ public void testCalculatedBusesNodeBreakerSwitch3() {
198200
// BusView
199201
assertEquals(2, vl1.getBusView().getBusStream().count());
200202
assertEquals(2, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
201-
Bus b1 = vl1.getBusView().getMergedBus("BBS12");
202-
assertEquals(2, b1.getConnectedTerminalCount());
203+
assertEquals(2, vl1.getBusView().getBus("VL1_10").getConnectedTerminalCount());
204+
Bus b1 = vl1.getBusView().getMergedBus("BBS1");
205+
Bus b2 = vl1.getBusView().getMergedBus("BBS12");
206+
assertNotEquals(b1, b2);
207+
assertEquals(b1, vl1.getBusView().getBus("VL1_0"));
208+
assertEquals(b2, vl1.getBusView().getBus("VL1_10"));
203209

204210
// BusBreakerView
205211
assertEquals(4, vl1.getBusBreakerView().getBusStream().count());
206-
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
207-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
208-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_2").getConnectedTerminalCount());
212+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
213+
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
214+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_10").getConnectedTerminalCount());
209215
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_3").getConnectedTerminalCount());
210216
assertEquals(0, vl1.getBusBreakerView().getSwitchCount());
211217
}
@@ -223,14 +229,17 @@ public void testCalculatedBusesNodeBreakerSwitch4() {
223229

224230
// BusView
225231
assertEquals(1, vl1.getBusView().getBusStream().count());
232+
assertEquals(2, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
233+
Bus b = vl1.getBusView().getMergedBus("BBS1");
234+
assertEquals(b, vl1.getBusView().getBus("VL1_0"));
226235

227236
// BusBreakerView
228237
assertEquals(5, vl1.getBusBreakerView().getBusStream().count());
229-
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
238+
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_0").getConnectedTerminalCount());
230239
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_1").getConnectedTerminalCount());
231-
assertEquals(2, vl1.getBusBreakerView().getBus("VL1_2").getConnectedTerminalCount());
240+
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_10").getConnectedTerminalCount());
241+
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_11").getConnectedTerminalCount());
232242
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_3").getConnectedTerminalCount());
233-
assertEquals(1, vl1.getBusBreakerView().getBus("VL1_4").getConnectedTerminalCount());
234243
assertEquals(0, vl1.getBusBreakerView().getSwitchCount());
235244
}
236245

@@ -249,7 +258,7 @@ public void testCalculatedBusesBusBreakerWithMultiBuses() {
249258
assertNull(vl1.getBusView().getMergedBus("B1"));
250259
assertNull(vl1.getBusView().getMergedBus("B2"));
251260
assertNull(vl1.getBusView().getMergedBus("B3"));
252-
assertNull(vl1.getBusView().getMergedBus("TOTO"));
261+
assertNull(vl1.getBusView().getMergedBus("FOO"));
253262
}
254263

255264
@Test
@@ -273,7 +282,7 @@ public void testCalculatedBusesBusBreaker() {
273282
assertNotNull(vl1.getBusView().getMergedBus("B1"));
274283
assertNotNull(vl1.getBusView().getMergedBus("B2"));
275284
assertNotNull(vl1.getBusView().getMergedBus("B3"));
276-
assertNull(vl1.getBusView().getMergedBus("TOTO"));
285+
assertNull(vl1.getBusView().getMergedBus("FOO"));
277286
assertEquals(2, vl1.getBusBreakerView().getSwitchCount());
278287

279288
VoltageLevel vl2 = network.getVoltageLevel("VL2");
@@ -282,7 +291,7 @@ public void testCalculatedBusesBusBreaker() {
282291
assertEquals(1, calculatedBuses.size());
283292
assertEquals(1, configurededBuses.size());
284293
assertNotNull(vl2.getBusView().getMergedBus("B21"));
285-
assertNull(vl2.getBusView().getMergedBus("TOTO"));
294+
assertNull(vl2.getBusView().getMergedBus("FOO"));
286295
assertEquals(0, vl2.getBusBreakerView().getSwitchCount());
287296
}
288297

@@ -295,32 +304,66 @@ public void testCalculatedBusesBusBreakerSwitchRetain() {
295304

296305
assertThrows(ValidationException.class, () -> s.setRetained(true));
297306

307+
}
308+
309+
@Test
310+
public void testCalculatedBusesBusBreakerSwitch1() {
311+
Network network = CreateNetworksUtil.createBusBreakerNetworkWithLine();
312+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
313+
298314
vl1.getBusBreakerView().getSwitch("BR1").setOpen(true);
299315
vl1.getBusBreakerView().getSwitch("BR2").setOpen(false);
316+
300317
assertEquals(1, vl1.getBusView().getBusStream().count());
301318
assertEquals(3, vl1.getBusBreakerView().getBusStream().count());
319+
320+
assertEquals(3, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
321+
assertEquals(3, vl1.getBusBreakerView().getBus("B1").getConnectedTerminalCount());
322+
assertEquals(1, vl1.getBusBreakerView().getBus("B2").getConnectedTerminalCount());
323+
assertEquals(1, vl1.getBusBreakerView().getBus("B3").getConnectedTerminalCount());
324+
302325
assertNotNull(vl1.getBusView().getMergedBus("B1"));
303326
assertNull(vl1.getBusView().getMergedBus("B2"));
304327
assertNull(vl1.getBusView().getMergedBus("B3"));
305328
}
306329

307330
@Test
308-
public void testCalculatedBusesBusBreakerSwitches() {
331+
public void testCalculatedBusesBusBreakerSwitch2() {
309332
Network network = CreateNetworksUtil.createBusBreakerNetworkWithLine();
310333
VoltageLevel vl1 = network.getVoltageLevel("VL1");
311334

312335
vl1.getBusBreakerView().getSwitch("BR1").setOpen(false);
313336
vl1.getBusBreakerView().getSwitch("BR2").setOpen(true);
337+
314338
assertEquals(1, vl1.getBusView().getBusStream().count());
315339
assertEquals(3, vl1.getBusBreakerView().getBusStream().count());
340+
341+
assertEquals(4, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
342+
assertEquals(3, vl1.getBusBreakerView().getBus("B1").getConnectedTerminalCount());
343+
assertEquals(1, vl1.getBusBreakerView().getBus("B2").getConnectedTerminalCount());
344+
assertEquals(1, vl1.getBusBreakerView().getBus("B3").getConnectedTerminalCount());
345+
316346
assertNotNull(vl1.getBusView().getMergedBus("B1"));
317347
assertNotNull(vl1.getBusView().getMergedBus("B2"));
318348
assertNull(vl1.getBusView().getMergedBus("B3"));
349+
}
350+
351+
@Test
352+
public void testCalculatedBusesBusBreakerSwitch3() {
353+
Network network = CreateNetworksUtil.createBusBreakerNetworkWithLine();
354+
VoltageLevel vl1 = network.getVoltageLevel("VL1");
319355

320356
vl1.getBusBreakerView().getSwitch("BR1").setOpen(true);
321357
vl1.getBusBreakerView().getSwitch("BR2").setOpen(true);
358+
322359
assertEquals(1, vl1.getBusView().getBusStream().count());
323360
assertEquals(3, vl1.getBusBreakerView().getBusStream().count());
361+
362+
assertEquals(3, vl1.getBusView().getBus("VL1_0").getConnectedTerminalCount());
363+
assertEquals(3, vl1.getBusBreakerView().getBus("B1").getConnectedTerminalCount());
364+
assertEquals(1, vl1.getBusBreakerView().getBus("B2").getConnectedTerminalCount());
365+
assertEquals(1, vl1.getBusBreakerView().getBus("B3").getConnectedTerminalCount());
366+
324367
assertNotNull(vl1.getBusView().getMergedBus("B1"));
325368
assertNull(vl1.getBusView().getMergedBus("B2"));
326369
assertNull(vl1.getBusView().getMergedBus("B3"));

0 commit comments

Comments
 (0)