From e3a5d42c4f80112c992bc80d58823270cc83b7fb Mon Sep 17 00:00:00 2001 From: basseche Date: Tue, 10 Feb 2026 17:09:44 +0100 Subject: [PATCH] Replace usage of BusbarSectionFinderTraverser class by the one from by Powsybl-core Signed-off-by: basseche --- .../BusbarSectionFinderTraverser.java | 105 ------------------ .../network/map/dto/utils/ElementUtils.java | 2 +- .../BusbarSectionFinderTraverserTest.java | 2 +- 3 files changed, 2 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/org/gridsuite/network/map/dto/definition/extension/BusbarSectionFinderTraverser.java diff --git a/src/main/java/org/gridsuite/network/map/dto/definition/extension/BusbarSectionFinderTraverser.java b/src/main/java/org/gridsuite/network/map/dto/definition/extension/BusbarSectionFinderTraverser.java deleted file mode 100644 index 78f5a718..00000000 --- a/src/main/java/org/gridsuite/network/map/dto/definition/extension/BusbarSectionFinderTraverser.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2023, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.network.map.dto.definition.extension; - -import com.powsybl.iidm.network.BusbarSection; -import com.powsybl.iidm.network.Switch; -import com.powsybl.iidm.network.Terminal; -import com.powsybl.iidm.network.VoltageLevel; -import com.powsybl.math.graph.TraversalType; -import com.powsybl.math.graph.TraverseResult; - -import java.util.*; - -/** - * @author Ghazwa Rehili - */ -// TODO : code to move to powsybl-core or powsybl-network-store -public final class BusbarSectionFinderTraverser { - - private BusbarSectionFinderTraverser() { - throw new UnsupportedOperationException(); - } - - public record SwitchInfo(String id, boolean isOpen) { } - - public record BusbarSectionResult(String busbarSectionId, int depth, SwitchInfo lastSwitch, boolean allClosedSwitch) { } - - public static String findBusbarSectionId(Terminal terminal) { - BusbarSectionResult result = getBusbarSectionResult(terminal); - return result != null ? result.busbarSectionId() : terminal.getVoltageLevel().getNodeBreakerView().getBusbarSections().iterator().next().getId(); - } - - public static BusbarSectionResult getBusbarSectionResult(Terminal terminal) { - int startNode = terminal.getNodeBreakerView().getNode(); - List allResults = searchAllBusbars(terminal.getVoltageLevel(), startNode); - if (allResults.isEmpty()) { - return null; - } - return selectBestBusbar(allResults); - } - - private static BusbarSectionResult selectBestBusbar(List results) { - List withAllClosedSwitch = results.stream().filter(r -> r.allClosedSwitch).toList(); - if (!withAllClosedSwitch.isEmpty()) { - return withAllClosedSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth) - .thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null); - } - List withClosedSwitch = results.stream().filter(r -> r.lastSwitch() != null && !r.lastSwitch().isOpen()).toList(); - if (!withClosedSwitch.isEmpty()) { - return withClosedSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth) - .thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null); - } - List withOpenSwitch = results.stream().filter(r -> r.lastSwitch() != null && r.lastSwitch().isOpen()).toList(); - if (!withOpenSwitch.isEmpty()) { - return withOpenSwitch.stream().min(Comparator.comparingInt(BusbarSectionResult::depth) - .thenComparing(BusbarSectionResult::busbarSectionId)).orElse(null); - } - return results.getFirst(); - } - - private static List searchAllBusbars(VoltageLevel voltageLevel, int startNode) { - List results = new ArrayList<>(); - record NodeState(int depth, boolean allClosed) { } - Map visitedNodes = new HashMap<>(); - visitedNodes.put(startNode, new NodeState(0, true)); - voltageLevel.getNodeBreakerView().getTerminal(startNode).traverse(new Terminal.TopologyTraverser() { - SwitchInfo lastSwitch = null; - @Override - public TraverseResult traverse(Terminal terminal, boolean connected) { - if (terminal.getVoltageLevel() != voltageLevel) { - return TraverseResult.TERMINATE_PATH; - } - NodeState currentNodeState = visitedNodes.get(terminal.getNodeBreakerView().getNode()); - if (terminal.getConnectable() instanceof BusbarSection busbarSection) { - if (currentNodeState != null) { - results.add(new BusbarSectionResult(busbarSection.getId(), currentNodeState.depth, lastSwitch, currentNodeState.allClosed)); - } - return TraverseResult.TERMINATE_PATH; - } - return TraverseResult.CONTINUE; - } - - @Override - public TraverseResult traverse(Switch aSwitch) { - int node1 = voltageLevel.getNodeBreakerView().getNode1(aSwitch.getId()); - int node2 = voltageLevel.getNodeBreakerView().getNode2(aSwitch.getId()); - int sourceNode = visitedNodes.containsKey(node1) ? node1 : node2; - int targetNode = visitedNodes.containsKey(node1) ? node2 : node1; - NodeState sourceState = visitedNodes.get(sourceNode); - if (sourceState == null) { - return TraverseResult.TERMINATE_PATH; - } - NodeState newState = new NodeState(sourceState.depth + 1, sourceState.allClosed && !aSwitch.isOpen()); - visitedNodes.put(targetNode, newState); - lastSwitch = new SwitchInfo(aSwitch.getId(), aSwitch.isOpen()); - return TraverseResult.CONTINUE; - } - }, TraversalType.BREADTH_FIRST); - return results; - } -} diff --git a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java index 01c4bc59..6c4e9bd1 100644 --- a/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java +++ b/src/main/java/org/gridsuite/network/map/dto/utils/ElementUtils.java @@ -8,11 +8,11 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.ConnectablePosition; +import com.powsybl.iidm.network.util.BusbarSectionFinderTraverser; import org.gridsuite.network.map.dto.ElementInfos; import org.gridsuite.network.map.dto.common.ReactiveCapabilityCurveMapData; import org.gridsuite.network.map.dto.common.TapChangerData; import org.gridsuite.network.map.dto.common.TapChangerStepData; -import org.gridsuite.network.map.dto.definition.extension.BusbarSectionFinderTraverser; import org.gridsuite.network.map.dto.definition.extension.ConnectablePositionInfos; import org.springframework.lang.NonNull; diff --git a/src/test/java/org/gridsuite/network/map/mapper/BusbarSectionFinderTraverserTest.java b/src/test/java/org/gridsuite/network/map/mapper/BusbarSectionFinderTraverserTest.java index c06bcb37..7de7b6e3 100644 --- a/src/test/java/org/gridsuite/network/map/mapper/BusbarSectionFinderTraverserTest.java +++ b/src/test/java/org/gridsuite/network/map/mapper/BusbarSectionFinderTraverserTest.java @@ -2,7 +2,7 @@ import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.BusbarSectionPositionAdder; -import org.gridsuite.network.map.dto.definition.extension.BusbarSectionFinderTraverser; +import com.powsybl.iidm.network.util.BusbarSectionFinderTraverser; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;