Skip to content

Commit 1e3fe5e

Browse files
authored
Enhance busbar sections retrieval – rework BusbarSectionFinderTraverser (#104)
Signed-off-by: Rehili Ghazwa <[email protected]>
1 parent 35ca9c7 commit 1e3fe5e

File tree

6 files changed

+338
-49
lines changed

6 files changed

+338
-49
lines changed

src/main/java/org/gridsuite/modification/modifications/BusbarSectionFinderTraverser.java

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,44 +6,95 @@
66
*/
77
package org.gridsuite.modification.modifications;
88

9-
import com.powsybl.iidm.network.IdentifiableType;
10-
import com.powsybl.iidm.network.Switch;
11-
import com.powsybl.iidm.network.Terminal;
9+
import com.powsybl.iidm.network.*;
10+
import com.powsybl.math.graph.TraversalType;
1211
import com.powsybl.math.graph.TraverseResult;
1312

13+
import java.util.*;
14+
1415
/**
15-
* @author Slimane Amar <slimane.amar at rte-france.com>
16+
* @author Ghazwa Rehili <ghazwa.rehili at rte-france.com>
1617
*/
1718
// FIXME : to remove when this class is available in network-store
18-
public class BusbarSectionFinderTraverser implements Terminal.TopologyTraverser {
19+
public final class BusbarSectionFinderTraverser {
20+
21+
private BusbarSectionFinderTraverser() {
22+
throw new UnsupportedOperationException();
23+
}
1924

20-
private final boolean onlyConnectedBbs;
25+
public record SwitchInfo(String id, boolean isOpen) { }
2126

22-
private String firstTraversedBbsId;
27+
public record BusbarSectionResult(String busbarSectionId, int depth, SwitchInfo lastSwitch, boolean allClosedSwitch) { }
2328

24-
public BusbarSectionFinderTraverser(boolean onlyConnectedBbs) {
25-
this.onlyConnectedBbs = onlyConnectedBbs;
29+
public static String findBusbarSectionId(Terminal terminal) {
30+
BusbarSectionResult result = getBusbarSectionResult(terminal);
31+
return result != null ? result.busbarSectionId() : terminal.getVoltageLevel().getNodeBreakerView().getBusbarSections().iterator().next().getId();
2632
}
2733

28-
@Override
29-
public TraverseResult traverse(Terminal terminal, boolean connected) {
30-
if (terminal.getConnectable().getType() == IdentifiableType.BUSBAR_SECTION) {
31-
firstTraversedBbsId = terminal.getConnectable().getId();
32-
return TraverseResult.TERMINATE_TRAVERSER;
34+
public static BusbarSectionResult getBusbarSectionResult(Terminal terminal) {
35+
int startNode = terminal.getNodeBreakerView().getNode();
36+
List<BusbarSectionResult> allResults = searchAllBusbars(terminal.getVoltageLevel(), startNode);
37+
if (allResults.isEmpty()) {
38+
return null;
3339
}
34-
return TraverseResult.CONTINUE;
40+
return selectBestBusbar(allResults);
3541
}
3642

37-
@Override
38-
public TraverseResult traverse(Switch aSwitch) {
39-
if (onlyConnectedBbs && aSwitch.isOpen()) {
40-
return TraverseResult.TERMINATE_PATH;
43+
private static BusbarSectionResult selectBestBusbar(List<BusbarSectionResult> results) {
44+
List<BusbarSectionResult> withAllClosedSwitch = results.stream().filter(r -> r.allClosedSwitch).toList();
45+
if (!withAllClosedSwitch.isEmpty()) {
46+
return withAllClosedSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth)
47+
.thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null);
4148
}
42-
return TraverseResult.CONTINUE;
49+
List<BusbarSectionResult> withClosedSwitch = results.stream().filter(r -> r.lastSwitch() != null && !r.lastSwitch().isOpen()).toList();
50+
if (!withClosedSwitch.isEmpty()) {
51+
return withClosedSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth)
52+
.thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null);
53+
}
54+
List<BusbarSectionResult> withOpenSwitch = results.stream().filter(r -> r.lastSwitch() != null && r.lastSwitch().isOpen()).toList();
55+
if (!withOpenSwitch.isEmpty()) {
56+
return withOpenSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth)
57+
.thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null);
58+
}
59+
return results.getFirst();
4360
}
4461

45-
public String getFirstTraversedBbsId() {
46-
return firstTraversedBbsId;
62+
private static List<BusbarSectionResult> searchAllBusbars(VoltageLevel voltageLevel, int startNode) {
63+
List<BusbarSectionResult> results = new ArrayList<>();
64+
record NodeState(int depth, boolean allClosed) { }
65+
Map<Integer, NodeState> visitedNodes = new HashMap<>();
66+
visitedNodes.put(startNode, new NodeState(0, true));
67+
voltageLevel.getNodeBreakerView().getTerminal(startNode).traverse(new Terminal.TopologyTraverser() {
68+
SwitchInfo lastSwitch = null;
69+
@Override
70+
public TraverseResult traverse(Terminal terminal, boolean connected) {
71+
if (terminal.getVoltageLevel() != voltageLevel) {
72+
return TraverseResult.TERMINATE_PATH;
73+
}
74+
NodeState currentNodeState = visitedNodes.get(terminal.getNodeBreakerView().getNode());
75+
if (terminal.getConnectable() instanceof BusbarSection busbarSection) {
76+
if (currentNodeState != null) {
77+
results.add(new BusbarSectionResult(busbarSection.getId(), currentNodeState.depth, lastSwitch, currentNodeState.allClosed));
78+
}
79+
return TraverseResult.TERMINATE_PATH;
80+
}
81+
return TraverseResult.CONTINUE;
82+
}
83+
84+
@Override
85+
public TraverseResult traverse(Switch aSwitch) {
86+
int node1 = voltageLevel.getNodeBreakerView().getNode1(aSwitch.getId());
87+
int node2 = voltageLevel.getNodeBreakerView().getNode2(aSwitch.getId());
88+
int sourceNode = visitedNodes.containsKey(node1) ? node1 : node2;
89+
int targetNode = visitedNodes.containsKey(node1) ? node2 : node1;
90+
NodeState sourceState = visitedNodes.get(sourceNode);
91+
NodeState newState = new NodeState(sourceState.depth + 1, sourceState.allClosed && !aSwitch.isOpen());
92+
visitedNodes.put(targetNode, newState);
93+
lastSwitch = new SwitchInfo(aSwitch.getId(), aSwitch.isOpen());
94+
return TraverseResult.CONTINUE;
95+
}
96+
}, TraversalType.BREADTH_FIRST);
97+
return results;
4798
}
4899
}
49100

src/main/java/org/gridsuite/modification/utils/ModificationUtils.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.powsybl.iidm.modification.topology.*;
1111
import com.powsybl.iidm.network.*;
1212
import com.powsybl.iidm.network.extensions.*;
13-
import com.powsybl.math.graph.TraversalType;
1413
import com.powsybl.network.store.iidm.impl.MinMaxReactiveLimitsImpl;
1514
import org.apache.commons.math3.util.Pair;
1615
import org.gridsuite.modification.IFilterService;
@@ -944,17 +943,11 @@ public String getBusOrBusbarSection(Terminal terminal) {
944943
busOrBusbarSectionId = terminal.getBusBreakerView().getConnectableBus().getId();
945944
}
946945
} else {
947-
busOrBusbarSectionId = getBusbarSectionId(terminal);
946+
busOrBusbarSectionId = BusbarSectionFinderTraverser.findBusbarSectionId(terminal);
948947
}
949948
return busOrBusbarSectionId;
950949
}
951950

952-
private String getBusbarSectionId(Terminal terminal) {
953-
BusbarSectionFinderTraverser connectedBusbarSectionFinder = new BusbarSectionFinderTraverser(terminal.isConnected());
954-
terminal.traverse(connectedBusbarSectionFinder, TraversalType.BREADTH_FIRST);
955-
return connectedBusbarSectionFinder.getFirstTraversedBbsId();
956-
}
957-
958951
private int getPosition(AttributeModification<Integer> connectionPosition,
959952
AttributeModification<String> busOrBusbarSectionId,
960953
AttributeModification<String> voltageLevelId,
@@ -1902,7 +1895,7 @@ public void checkVoltageLevelModification(Network network,
19021895
ModificationUtils.getInstance().controlBus(targetTerminal.getVoltageLevel(), busOrBusbarSectionId.getValue());
19031896
} else if (checkAttributeModificationValue(voltageLevelId) && !checkAttributeModificationValue(busOrBusbarSectionId)) {
19041897
ModificationUtils.getInstance().controlBus(ModificationUtils.getInstance().getVoltageLevel(network, voltageLevelId.getValue()),
1905-
getBusbarSectionId(targetTerminal)
1898+
BusbarSectionFinderTraverser.findBusbarSectionId(terminal)
19061899
);
19071900
}
19081901
}

src/test/java/org/gridsuite/modification/modifications/GeneratorModificationTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.powsybl.iidm.network.extensions.ConnectablePosition;
1313
import com.powsybl.iidm.network.extensions.GeneratorShortCircuit;
1414
import com.powsybl.iidm.network.extensions.GeneratorStartup;
15-
import com.powsybl.math.graph.TraversalType;
1615
import org.gridsuite.modification.NetworkModificationException;
1716
import org.gridsuite.modification.dto.*;
1817
import org.gridsuite.modification.utils.NetworkCreation;
@@ -285,9 +284,8 @@ void testMoveFeederBay() {
285284
Generator generator = getNetwork().getGenerator("idGenerator");
286285
Terminal terminal = generator.getTerminal();
287286
assertEquals("v2", terminal.getVoltageLevel().getId());
288-
BusbarSectionFinderTraverser connectedBusbarSectionFinder = new BusbarSectionFinderTraverser(terminal.isConnected());
289-
generator.getTerminal().traverse(connectedBusbarSectionFinder, TraversalType.BREADTH_FIRST);
290-
assertEquals("1A", connectedBusbarSectionFinder.getFirstTraversedBbsId());
287+
BusbarSectionFinderTraverser.findBusbarSectionId(terminal);
288+
assertEquals("1A", BusbarSectionFinderTraverser.findBusbarSectionId(terminal));
291289

292290
// Change voltageLevel and busbar section
293291
generatorModificationInfos.setVoltageLevelId(new AttributeModification<>("v1", OperationType.SET));
@@ -296,8 +294,6 @@ void testMoveFeederBay() {
296294
generator = getNetwork().getGenerator("idGenerator");
297295
terminal = generator.getTerminal();
298296
assertEquals("v1", terminal.getVoltageLevel().getId());
299-
connectedBusbarSectionFinder = new BusbarSectionFinderTraverser(terminal.isConnected());
300-
terminal.traverse(connectedBusbarSectionFinder, TraversalType.BREADTH_FIRST);
301-
assertEquals("1.1", connectedBusbarSectionFinder.getFirstTraversedBbsId());
297+
assertEquals("1.1", BusbarSectionFinderTraverser.findBusbarSectionId(terminal));
302298
}
303299
}

src/test/java/org/gridsuite/modification/modifications/MoveVoltageLevelFeederBaysTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ void testConnectablePositionModificationOnSide1() {
267267
MoveFeederBayInfos moveFeederBayInfos = MoveFeederBayInfos.builder()
268268
.equipmentId("line2")
269269
.busbarSectionId("1.1")
270-
.connectionSide("TWO")
270+
.connectionSide("ONE")
271271
.connectionName("line2test")
272272
.connectionPosition(21)
273273
.connectionDirection(ConnectablePosition.Direction.BOTTOM)
@@ -286,9 +286,9 @@ void testConnectablePositionModificationOnSide1() {
286286
ConnectablePosition.Feeder feeder1 = lineConnectablePosition.getFeeder1();
287287
assertNotNull(feeder1);
288288
assertTrue(feeder1.getName().isPresent());
289-
assertEquals("cn1line2", feeder1.getName().get());
289+
assertEquals("line2test", feeder1.getName().get());
290290
assertTrue(feeder1.getOrder().isPresent());
291-
assertEquals(2, feeder1.getOrder().get());
292-
assertEquals(ConnectablePosition.Direction.TOP, feeder1.getDirection());
291+
assertEquals(21, feeder1.getOrder().get());
292+
assertEquals(ConnectablePosition.Direction.BOTTOM, feeder1.getDirection());
293293
}
294294
}

src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModificationTest.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.powsybl.iidm.network.extensions.Measurement;
1414
import com.powsybl.iidm.network.extensions.Measurements;
1515
import com.powsybl.iidm.network.extensions.TwoWindingsTransformerToBeEstimated;
16-
import com.powsybl.math.graph.TraversalType;
1716
import org.apache.commons.collections4.CollectionUtils;
1817
import org.gridsuite.modification.NetworkModificationException;
1918
import org.gridsuite.modification.dto.*;
@@ -982,12 +981,8 @@ void testMoveFeederBay() {
982981
Terminal terminal2 = twoWindingsTransformer.getTerminal2();
983982
assertEquals("v1", twoWindingsTransformer.getTerminal1().getVoltageLevel().getId());
984983
assertEquals("v2", terminal2.getVoltageLevel().getId());
985-
BusbarSectionFinderTraverser connectedBusbarSectionFinder1 = new BusbarSectionFinderTraverser(terminal1.isConnected());
986-
terminal1.traverse(connectedBusbarSectionFinder1, TraversalType.BREADTH_FIRST);
987-
assertEquals("1.1", connectedBusbarSectionFinder1.getFirstTraversedBbsId());
988-
BusbarSectionFinderTraverser connectedBusbarSectionFinder2 = new BusbarSectionFinderTraverser(terminal2.isConnected());
989-
terminal2.traverse(connectedBusbarSectionFinder2, TraversalType.BREADTH_FIRST);
990-
assertEquals("1A", connectedBusbarSectionFinder2.getFirstTraversedBbsId());
984+
assertEquals("1.1", BusbarSectionFinderTraverser.findBusbarSectionId(terminal1));
985+
assertEquals("1A", BusbarSectionFinderTraverser.findBusbarSectionId(terminal2));
991986
}
992987
}
993988

0 commit comments

Comments
 (0)