From eb66cddabf7bcf9377b0106a1155f5492d4151a0 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Tue, 21 Nov 2023 14:59:47 +0100 Subject: [PATCH 01/14] Import pypowsybl voltage level nominal voltage filter into powsybl-diagram Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 58 ++ .../powsybl/nad/NetworkAreaDiagramTest.java | 33 + .../resources/IEEE_14_bus_voltage_filter1.svg | 482 +++++++++++ .../resources/IEEE_14_bus_voltage_filter2.svg | 812 ++++++++++++++++++ 4 files changed, 1385 insertions(+) create mode 100644 network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg create mode 100644 network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index a6312e472..9d8e596b9 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -99,6 +99,64 @@ private static void traverseVoltageLevels(Set voltageLevelsDepth, traverseVoltageLevels(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels); } + private static void traverseVoltageLevelsWithVoltageFilter(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, + double highNominalVoltageBound, double lowNominalVoltageBound) { + if (depth >= 0) { + Set nextDepthVoltageLevels = new HashSet<>(); + for (VoltageLevel vl : voltageLevelsDepth) { + if (!visitedVoltageLevels.contains(vl)) { + if (highNominalVoltageBound > 0 && lowNominalVoltageBound > 0) { + if (vl.getNominalV() >= lowNominalVoltageBound + && vl.getNominalV() <= highNominalVoltageBound) { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); + } + } else if (highNominalVoltageBound > 0) { + if (vl.getNominalV() <= highNominalVoltageBound) { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); + } + } else if (lowNominalVoltageBound > 0) { + if (vl.getNominalV() >= lowNominalVoltageBound) { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); + } + } else { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); + } + } + } + traverseVoltageLevelsWithVoltageFilter(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, highNominalVoltageBound, lowNominalVoltageBound); + } + } + + private static void traverseVoltageLevel(Set visitedVoltageLevels, Set nextDepthVoltageLevels, VoltageLevel vl) { + visitedVoltageLevels.add(vl); + vl.visitEquipments(new VlVisitor(nextDepthVoltageLevels, visitedVoltageLevels)); + } + + public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, + double highNominalVoltageBound, + double lowNominalVoltageBound, int depth) { + Objects.requireNonNull(network); + Objects.requireNonNull(voltageLevelIds); + Set startingSet = new HashSet<>(); + + for (String voltageLevelId : voltageLevelIds) { + VoltageLevel vl = network.getVoltageLevel(voltageLevelId); + if (vl == null) { + throw new PowsyblException("Unknown voltage level id '" + voltageLevelId + "'"); + } + if (lowNominalVoltageBound > 0 && vl.getNominalV() < lowNominalVoltageBound || + highNominalVoltageBound > 0 && vl.getNominalV() > highNominalVoltageBound) { + throw new PowsyblException("vl '" + voltageLevelId + + "' has his nominal voltage out of the indicated thresholds"); + } + startingSet.add(vl); + } + + Set voltageLevels = new HashSet<>(); + VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, highNominalVoltageBound, lowNominalVoltageBound); + return new VoltageLevelFilter(voltageLevels); + } + private static class VlVisitor extends DefaultTopologyVisitor { private final Set nextDepthVoltageLevels; private final Set visitedVoltageLevels; diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 2043ff871..2fb5eefea 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -10,6 +10,7 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; import com.powsybl.diagram.test.Networks; +import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.test.*; import com.powsybl.nad.build.iidm.VoltageLevelFilter; @@ -75,4 +76,36 @@ void testGetVisibleVoltageLevels() { ids = NetworkAreaDiagram.getDisplayedVoltageLevels(network, List.of("VLHV1"), 2); assertEquals("VLGEN, VLHV1, VLHV2, VLLOAD", String.join(", ", ids)); } + + @Test + void testVoltageFilteredDiagramTwoBounds() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 180, 120, 2)); + assertEquals(toString("/IEEE_14_bus_voltage_filter1.svg"), getContentFile(svgFileVoltageFilter)); + } + + @Test + void testVoltageFilteredDiagramLowBound() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), -1, 120, 2)); + assertEquals(toString("/IEEE_14_bus_voltage_filter1.svg"), getContentFile(svgFileVoltageFilter)); + } + + @Test + void testVoltageFilteredDiagramHighBound() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 180, -1, 2)); + assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); + } + + @Test + void testVoltageFilteredDiagramNoBound() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), -1, -1, 2)); + assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); + } } diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg new file mode 100644 index 000000000..ca39f2e68 --- /dev/null +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter1.svg @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
VL1
+ + + + + +
+
+
143.1 kV / 0.0°
+
+
+ +
+
VL2
+ + + + + +
+
+
141.1 kV / -5.0°
+
+
+ +
+
VL3
+ + + + + +
+
+
136.3 kV / -12.7°
+
+
+ +
+
VL4
+ + + + + +
+
+
137.6 kV / -10.3°
+
+
+ +
+
VL5
+ + + + + +
+
+
137.7 kV / -8.8°
+
+
+
+
diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg new file mode 100644 index 000000000..3369ce1bc --- /dev/null +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter2.svg @@ -0,0 +1,812 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
VL1
+ + + + + +
+
+
143.1 kV / 0.0°
+
+
+ +
+
VL10
+ + + + + +
+
+
12.6 kV / -15.1°
+
+
+ +
+
VL14
+ + + + + +
+
+
12.4 kV / -16.0°
+
+
+ +
+
VL2
+ + + + + +
+
+
141.1 kV / -5.0°
+
+
+ +
+
VL3
+ + + + + +
+
+
136.3 kV / -12.7°
+
+
+ +
+
VL4
+ + + + + +
+
+
137.6 kV / -10.3°
+
+
+ +
+
VL5
+ + + + + +
+
+
137.7 kV / -8.8°
+
+
+ +
+
VL6
+ + + + + +
+
+
12.8 kV / -14.2°
+
+
+ +
+
VL7
+ + + + + +
+
+
14.9 kV / -13.4°
+
+
+ +
+
VL8
+ + + + + +
+
+
21.8 kV / -13.4°
+
+
+ +
+
VL9
+ + + + + +
+
+
12.7 kV / -14.9°
+
+
+
+
From 14fac17d78313ce6f24b191d4a18ab218078873e Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Tue, 21 Nov 2023 15:13:52 +0100 Subject: [PATCH 02/14] Fix 1 code smell Signed-off-by: Sophie Frasnedo --- .../com/powsybl/nad/build/iidm/VoltageLevelFilter.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 9d8e596b9..ba16b9a5b 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -35,6 +35,8 @@ private Set getVoltageLevels() { return voltageLevels; } + private static final String UNKNOWN_VOLTAGE_LEVEL = "Unknown voltage level id '"; + @Override public boolean test(VoltageLevel voltageLevel) { return voltageLevels.contains(voltageLevel); @@ -47,7 +49,7 @@ public static VoltageLevelFilter createVoltageLevelDepthFilter(Network network, Set voltageLevels = new HashSet<>(); VoltageLevel vl = network.getVoltageLevel(voltageLevelId); if (vl == null) { - throw new PowsyblException("Unknown voltage level id '" + voltageLevelId + "'"); + throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } Set startingSet = new HashSet<>(); @@ -63,7 +65,7 @@ public static VoltageLevelFilter createVoltageLevelsDepthFilter(Network network, for (String voltageLevelId : voltageLevelIds) { VoltageLevel vl = network.getVoltageLevel(voltageLevelId); if (vl == null) { - throw new PowsyblException("Unknown voltage level id '" + voltageLevelId + "'"); + throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } startingSet.add(vl); } @@ -142,7 +144,7 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis for (String voltageLevelId : voltageLevelIds) { VoltageLevel vl = network.getVoltageLevel(voltageLevelId); if (vl == null) { - throw new PowsyblException("Unknown voltage level id '" + voltageLevelId + "'"); + throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } if (lowNominalVoltageBound > 0 && vl.getNominalV() < lowNominalVoltageBound || highNominalVoltageBound > 0 && vl.getNominalV() > highNominalVoltageBound) { From f484cf0bb9816fe8b698c995bc57431ff2ae4fc1 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Tue, 21 Nov 2023 15:29:53 +0100 Subject: [PATCH 03/14] Improve code coverage Signed-off-by: Sophie Frasnedo --- .../powsybl/nad/NetworkAreaDiagramTest.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 2fb5eefea..515e43171 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -9,6 +9,7 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; +import com.powsybl.commons.PowsyblException; import com.powsybl.diagram.test.Networks; import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; import com.powsybl.iidm.network.Network; @@ -27,7 +28,7 @@ import java.nio.file.Path; import java.util.*; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; /** * @author Thomas Adam {@literal } @@ -108,4 +109,20 @@ void testVoltageFilteredDiagramNoBound() { NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), -1, -1, 2)); assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); } + + @Test + void testVoltageFilteredDiagramOutOfBound() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + PowsyblException e = assertThrows(PowsyblException.class, () -> NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 90, -1, 2))); + assertTrue(e.getMessage().contains("vl 'VL4' has his nominal voltage out of the indicated thresholds")); + } + + @Test + void testVoltageFilteredDiagramUnexistingVoltageLevel() { + Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); + PowsyblException e = assertThrows(PowsyblException.class, () -> NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL456"), 90, -1, 2))); + assertTrue(e.getMessage().contains("Unknown voltage level id 'VL456'")); + } } From 414155308087fd6b9d1cba8acc35488c4ecedd01 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Tue, 21 Nov 2023 15:41:44 +0100 Subject: [PATCH 04/14] Simplify added tests to avoid 2 new code smells Signed-off-by: Sophie Frasnedo --- .../test/java/com/powsybl/nad/NetworkAreaDiagramTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 515e43171..33d4b7394 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -113,16 +113,16 @@ void testVoltageFilteredDiagramNoBound() { @Test void testVoltageFilteredDiagramOutOfBound() { Network network = IeeeCdfNetworkFactory.create14(); - Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - PowsyblException e = assertThrows(PowsyblException.class, () -> NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 90, -1, 2))); + List voltageLevelList = List.of("VL4"); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, 90, -1, 2)); assertTrue(e.getMessage().contains("vl 'VL4' has his nominal voltage out of the indicated thresholds")); } @Test void testVoltageFilteredDiagramUnexistingVoltageLevel() { Network network = IeeeCdfNetworkFactory.create14(); - Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - PowsyblException e = assertThrows(PowsyblException.class, () -> NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL456"), 90, -1, 2))); + List voltageLevelList = List.of("VL456"); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, 90, -1, 2)); assertTrue(e.getMessage().contains("Unknown voltage level id 'VL456'")); } } From 814dab1603c9113a6a68161fc58fef8d53d2d1c4 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Wed, 6 Dec 2023 15:03:43 +0100 Subject: [PATCH 05/14] Changes following review Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 62 +++++++++++-------- .../powsybl/nad/NetworkAreaDiagramTest.java | 30 +++++---- 2 files changed, 54 insertions(+), 38 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index ba16b9a5b..c450db21e 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -102,31 +102,22 @@ private static void traverseVoltageLevels(Set voltageLevelsDepth, } private static void traverseVoltageLevelsWithVoltageFilter(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, - double highNominalVoltageBound, double lowNominalVoltageBound) { - if (depth >= 0) { - Set nextDepthVoltageLevels = new HashSet<>(); - for (VoltageLevel vl : voltageLevelsDepth) { - if (!visitedVoltageLevels.contains(vl)) { - if (highNominalVoltageBound > 0 && lowNominalVoltageBound > 0) { - if (vl.getNominalV() >= lowNominalVoltageBound - && vl.getNominalV() <= highNominalVoltageBound) { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } - } else if (highNominalVoltageBound > 0) { - if (vl.getNominalV() <= highNominalVoltageBound) { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } - } else if (lowNominalVoltageBound > 0) { - if (vl.getNominalV() >= lowNominalVoltageBound) { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } - } else { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } + double lowNominalVoltageBound, double highNominalVoltageBound) { + if (depth < 0) { + return; + } + + Set nextDepthVoltageLevels = new HashSet<>(); + for (VoltageLevel vl : voltageLevelsDepth) { + if (!visitedVoltageLevels.contains(vl)) { + if (vl.getNominalV() >= lowNominalVoltageBound + && vl.getNominalV() <= highNominalVoltageBound) { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); } } - traverseVoltageLevelsWithVoltageFilter(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, highNominalVoltageBound, lowNominalVoltageBound); } + traverseVoltageLevelsWithVoltageFilter(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, lowNominalVoltageBound, highNominalVoltageBound); + } private static void traverseVoltageLevel(Set visitedVoltageLevels, Set nextDepthVoltageLevels, VoltageLevel vl) { @@ -135,10 +126,11 @@ private static void traverseVoltageLevel(Set visitedVoltageLevels, } public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, - double highNominalVoltageBound, - double lowNominalVoltageBound, int depth) { + double lowNominalVoltageBound, double highNominalVoltageBound, + int depth) { Objects.requireNonNull(network); Objects.requireNonNull(voltageLevelIds); + checkVoltageBoundValues(lowNominalVoltageBound, highNominalVoltageBound); Set startingSet = new HashSet<>(); for (String voltageLevelId : voltageLevelIds) { @@ -146,8 +138,7 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis if (vl == null) { throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } - if (lowNominalVoltageBound > 0 && vl.getNominalV() < lowNominalVoltageBound || - highNominalVoltageBound > 0 && vl.getNominalV() > highNominalVoltageBound) { + if (vl.getNominalV() < lowNominalVoltageBound || vl.getNominalV() > highNominalVoltageBound) { throw new PowsyblException("vl '" + voltageLevelId + "' has his nominal voltage out of the indicated thresholds"); } @@ -155,10 +146,27 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis } Set voltageLevels = new HashSet<>(); - VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, highNominalVoltageBound, lowNominalVoltageBound); + VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, lowNominalVoltageBound, highNominalVoltageBound); return new VoltageLevelFilter(voltageLevels); } + private static void checkVoltageBoundValues(double lowNominalVoltageBound, double highNominalVoltageBound) { + if (lowNominalVoltageBound < 0 || highNominalVoltageBound < 0) { + throw new PowsyblException("Voltage bounds must be positive"); + } + if (lowNominalVoltageBound > highNominalVoltageBound) { + throw new PowsyblException("Low bound must be less than or equal to high bound"); + } + } + + public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network network, List voltageLevelIds, double lowNominalVoltageBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, lowNominalVoltageBound, Double.MAX_VALUE, depth); + } + + public static VoltageLevelFilter createNominalVoltageHigherBoundFilter(Network network, List voltageLevelIds, double highNominalVoltageBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, 0, highNominalVoltageBound, depth); + } + private static class VlVisitor extends DefaultTopologyVisitor { private final Set nextDepthVoltageLevels; private final Set visitedVoltageLevels; diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 33d4b7394..597e351fa 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -82,7 +82,7 @@ void testGetVisibleVoltageLevels() { void testVoltageFilteredDiagramTwoBounds() { Network network = IeeeCdfNetworkFactory.create14(); Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 180, 120, 2)); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 120, 180, 2)); assertEquals(toString("/IEEE_14_bus_voltage_filter1.svg"), getContentFile(svgFileVoltageFilter)); } @@ -90,7 +90,7 @@ void testVoltageFilteredDiagramTwoBounds() { void testVoltageFilteredDiagramLowBound() { Network network = IeeeCdfNetworkFactory.create14(); Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), -1, 120, 2)); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageLowerBoundFilter(network, List.of("VL4"), 120, 2)); assertEquals(toString("/IEEE_14_bus_voltage_filter1.svg"), getContentFile(svgFileVoltageFilter)); } @@ -98,31 +98,39 @@ void testVoltageFilteredDiagramLowBound() { void testVoltageFilteredDiagramHighBound() { Network network = IeeeCdfNetworkFactory.create14(); Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), 180, -1, 2)); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, List.of("VL4"), 180, 2)); assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); } @Test - void testVoltageFilteredDiagramNoBound() { + void testVoltageFilteredDiagramOutOfBound() { Network network = IeeeCdfNetworkFactory.create14(); - Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageFilter(network, List.of("VL4"), -1, -1, 2)); - assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); + List voltageLevelList = List.of("VL4"); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2)); + assertTrue(e.getMessage().contains("vl 'VL4' has his nominal voltage out of the indicated thresholds")); } @Test - void testVoltageFilteredDiagramOutOfBound() { + void testVoltageFilteredDiagramNegativeBound() { Network network = IeeeCdfNetworkFactory.create14(); List voltageLevelList = List.of("VL4"); - PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, 90, -1, 2)); - assertTrue(e.getMessage().contains("vl 'VL4' has his nominal voltage out of the indicated thresholds")); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, -100, 180, 2)); + assertTrue(e.getMessage().contains("Voltage bounds must be positive")); + } + + @Test + void testVoltageFilteredDiagramInconsistentBounds() { + Network network = IeeeCdfNetworkFactory.create14(); + List voltageLevelList = List.of("VL4"); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, 180, 90, 2)); + assertTrue(e.getMessage().contains("Low bound must be less than or equal to high bound")); } @Test void testVoltageFilteredDiagramUnexistingVoltageLevel() { Network network = IeeeCdfNetworkFactory.create14(); List voltageLevelList = List.of("VL456"); - PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageFilter(network, voltageLevelList, 90, -1, 2)); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2)); assertTrue(e.getMessage().contains("Unknown voltage level id 'VL456'")); } } From 3d96d05d7d81735059a1543fc71f43f6007c174e Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Wed, 6 Dec 2023 17:03:28 +0100 Subject: [PATCH 06/14] Fix code smell Signed-off-by: Sophie Frasnedo --- .../com/powsybl/nad/build/iidm/VoltageLevelFilter.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index c450db21e..819e72378 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -109,11 +109,10 @@ private static void traverseVoltageLevelsWithVoltageFilter(Set vol Set nextDepthVoltageLevels = new HashSet<>(); for (VoltageLevel vl : voltageLevelsDepth) { - if (!visitedVoltageLevels.contains(vl)) { - if (vl.getNominalV() >= lowNominalVoltageBound - && vl.getNominalV() <= highNominalVoltageBound) { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } + if (!visitedVoltageLevels.contains(vl) + && vl.getNominalV() >= lowNominalVoltageBound + && vl.getNominalV() <= highNominalVoltageBound) { + traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); } } traverseVoltageLevelsWithVoltageFilter(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, lowNominalVoltageBound, highNominalVoltageBound); From 1168c00d4d278e6802277348def930d642780d03 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Thu, 7 Dec 2023 12:26:45 +0100 Subject: [PATCH 07/14] Replace exception with log warn Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 9 +++++++-- .../com/powsybl/nad/NetworkAreaDiagramTest.java | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 819e72378..bbe10b515 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -9,6 +9,8 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.*; import com.powsybl.nad.utils.iidm.IidmUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; import java.util.function.Predicate; @@ -19,6 +21,8 @@ */ public class VoltageLevelFilter implements Predicate { + protected static final Logger LOGGER = LoggerFactory.getLogger(VoltageLevelFilter.class); + public static final Predicate NO_FILTER = voltageLevel -> true; private final Set voltageLevels; @@ -138,10 +142,11 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } if (vl.getNominalV() < lowNominalVoltageBound || vl.getNominalV() > highNominalVoltageBound) { - throw new PowsyblException("vl '" + voltageLevelId + + LOGGER.warn("vl '" + voltageLevelId + "' has his nominal voltage out of the indicated thresholds"); + } else { + startingSet.add(vl); } - startingSet.add(vl); } Set voltageLevels = new HashSet<>(); diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 597e351fa..8cca2f477 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -7,13 +7,15 @@ */ package com.powsybl.nad; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; import com.powsybl.commons.PowsyblException; import com.powsybl.diagram.test.Networks; import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.test.*; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import com.powsybl.nad.build.iidm.VoltageLevelFilter; import com.powsybl.nad.layout.LayoutParameters; import com.powsybl.nad.svg.LabelProvider; @@ -23,10 +25,12 @@ import com.powsybl.nad.svg.iidm.NominalVoltageStyleProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import ch.qos.logback.classic.Logger; +import org.slf4j.LoggerFactory; import java.nio.file.FileSystem; import java.nio.file.Path; -import java.util.*; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -104,10 +108,15 @@ void testVoltageFilteredDiagramHighBound() { @Test void testVoltageFilteredDiagramOutOfBound() { + ListAppender logWatcher = new ListAppender<>(); + logWatcher.start(); + ((Logger) LoggerFactory.getLogger(VoltageLevelFilter.class)).addAppender(logWatcher); Network network = IeeeCdfNetworkFactory.create14(); List voltageLevelList = List.of("VL4"); - PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2)); - assertTrue(e.getMessage().contains("vl 'VL4' has his nominal voltage out of the indicated thresholds")); + VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2); + List logsList = logWatcher.list; + assertEquals(1, logsList.size()); + assertEquals("vl 'VL4' has his nominal voltage out of the indicated thresholds", logsList.get(0).getFormattedMessage()); } @Test From 9ea2ce666f8eb99fe97b43d57987943a740c7c2f Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Thu, 7 Dec 2023 14:39:44 +0100 Subject: [PATCH 08/14] Refactor traverse method to avoid code duplication Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index bbe10b515..39b66572c 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -91,41 +91,29 @@ public static Collection getNextDepthVoltageLevels(Network network return voltageLevelSet; } - private static void traverseVoltageLevels(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels) { + private static void traverseVoltageLevels(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, Predicate predicate) { if (depth < 0) { return; } Set nextDepthVoltageLevels = new HashSet<>(); for (VoltageLevel vl : voltageLevelsDepth) { - if (!visitedVoltageLevels.contains(vl)) { + if (!visitedVoltageLevels.contains(vl) && predicate.test(vl)) { visitedVoltageLevels.add(vl); vl.visitEquipments(new VlVisitor(nextDepthVoltageLevels, visitedVoltageLevels)); } } - traverseVoltageLevels(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels); + traverseVoltageLevels(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, predicate); + } + + private static void traverseVoltageLevels(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels) { + traverseVoltageLevels(voltageLevelsDepth, depth, visitedVoltageLevels, NO_FILTER); } private static void traverseVoltageLevelsWithVoltageFilter(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, double lowNominalVoltageBound, double highNominalVoltageBound) { - if (depth < 0) { - return; - } - - Set nextDepthVoltageLevels = new HashSet<>(); - for (VoltageLevel vl : voltageLevelsDepth) { - if (!visitedVoltageLevels.contains(vl) - && vl.getNominalV() >= lowNominalVoltageBound - && vl.getNominalV() <= highNominalVoltageBound) { - traverseVoltageLevel(visitedVoltageLevels, nextDepthVoltageLevels, vl); - } - } - traverseVoltageLevelsWithVoltageFilter(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, lowNominalVoltageBound, highNominalVoltageBound); - - } - private static void traverseVoltageLevel(Set visitedVoltageLevels, Set nextDepthVoltageLevels, VoltageLevel vl) { - visitedVoltageLevels.add(vl); - vl.visitEquipments(new VlVisitor(nextDepthVoltageLevels, visitedVoltageLevels)); + Predicate voltageFilterPredicate = voltageLevel -> voltageLevel.getNominalV() >= lowNominalVoltageBound && voltageLevel.getNominalV() <= highNominalVoltageBound; + traverseVoltageLevels(voltageLevelsDepth, depth, visitedVoltageLevels, voltageFilterPredicate); } public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, From 6cabb596f7bcf6ca8e98ee00192eaabaa59778c6 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Thu, 7 Dec 2023 15:43:32 +0100 Subject: [PATCH 09/14] Fix code smells Signed-off-by: Sophie Frasnedo --- .../java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 39b66572c..0d925da42 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -130,8 +130,7 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } if (vl.getNominalV() < lowNominalVoltageBound || vl.getNominalV() > highNominalVoltageBound) { - LOGGER.warn("vl '" + voltageLevelId + - "' has his nominal voltage out of the indicated thresholds"); + LOGGER.warn("vl '{}' has his nominal voltage out of the indicated thresholds", voltageLevelId); } else { startingSet.add(vl); } From bfc343158d5254b093c46c891558ce6ee9ff08c9 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Fri, 8 Dec 2023 09:24:56 +0100 Subject: [PATCH 10/14] Change function name (upper bound seems to be the usual term) Signed-off-by: Sophie Frasnedo --- .../java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java | 2 +- .../test/java/com/powsybl/nad/NetworkAreaDiagramTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 0d925da42..d9799a5f6 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -154,7 +154,7 @@ public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network ne return createNominalVoltageFilter(network, voltageLevelIds, lowNominalVoltageBound, Double.MAX_VALUE, depth); } - public static VoltageLevelFilter createNominalVoltageHigherBoundFilter(Network network, List voltageLevelIds, double highNominalVoltageBound, int depth) { + public static VoltageLevelFilter createNominalVoltageUpperBoundFilter(Network network, List voltageLevelIds, double highNominalVoltageBound, int depth) { return createNominalVoltageFilter(network, voltageLevelIds, 0, highNominalVoltageBound, depth); } diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index 8cca2f477..e502d47fd 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -102,7 +102,7 @@ void testVoltageFilteredDiagramLowBound() { void testVoltageFilteredDiagramHighBound() { Network network = IeeeCdfNetworkFactory.create14(); Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); - NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, List.of("VL4"), 180, 2)); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), VoltageLevelFilter.createNominalVoltageUpperBoundFilter(network, List.of("VL4"), 180, 2)); assertEquals(toString("/IEEE_14_bus_voltage_filter2.svg"), getContentFile(svgFileVoltageFilter)); } @@ -113,7 +113,7 @@ void testVoltageFilteredDiagramOutOfBound() { ((Logger) LoggerFactory.getLogger(VoltageLevelFilter.class)).addAppender(logWatcher); Network network = IeeeCdfNetworkFactory.create14(); List voltageLevelList = List.of("VL4"); - VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2); + VoltageLevelFilter.createNominalVoltageUpperBoundFilter(network, voltageLevelList, 90, 2); List logsList = logWatcher.list; assertEquals(1, logsList.size()); assertEquals("vl 'VL4' has his nominal voltage out of the indicated thresholds", logsList.get(0).getFormattedMessage()); @@ -139,7 +139,7 @@ void testVoltageFilteredDiagramInconsistentBounds() { void testVoltageFilteredDiagramUnexistingVoltageLevel() { Network network = IeeeCdfNetworkFactory.create14(); List voltageLevelList = List.of("VL456"); - PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageHigherBoundFilter(network, voltageLevelList, 90, 2)); + PowsyblException e = assertThrows(PowsyblException.class, () -> VoltageLevelFilter.createNominalVoltageUpperBoundFilter(network, voltageLevelList, 90, 2)); assertTrue(e.getMessage().contains("Unknown voltage level id 'VL456'")); } } From 43adbe4386fada4319b8940cb852f9a0ae4e2247 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Fri, 8 Dec 2023 16:05:07 +0100 Subject: [PATCH 11/14] Change variable names to keep consistency with function names Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index d9799a5f6..091d65306 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -110,18 +110,18 @@ private static void traverseVoltageLevels(Set voltageLevelsDepth, } private static void traverseVoltageLevelsWithVoltageFilter(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, - double lowNominalVoltageBound, double highNominalVoltageBound) { + double nominalVoltageLowerBound, double nominalVoltageUpperBound) { - Predicate voltageFilterPredicate = voltageLevel -> voltageLevel.getNominalV() >= lowNominalVoltageBound && voltageLevel.getNominalV() <= highNominalVoltageBound; + Predicate voltageFilterPredicate = voltageLevel -> voltageLevel.getNominalV() >= nominalVoltageLowerBound && voltageLevel.getNominalV() <= nominalVoltageUpperBound; traverseVoltageLevels(voltageLevelsDepth, depth, visitedVoltageLevels, voltageFilterPredicate); } public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, - double lowNominalVoltageBound, double highNominalVoltageBound, + double nominalVoltageLowerBound, double nominalVoltageUpperBound, int depth) { Objects.requireNonNull(network); Objects.requireNonNull(voltageLevelIds); - checkVoltageBoundValues(lowNominalVoltageBound, highNominalVoltageBound); + checkVoltageBoundValues(nominalVoltageLowerBound, nominalVoltageUpperBound); Set startingSet = new HashSet<>(); for (String voltageLevelId : voltageLevelIds) { @@ -129,7 +129,7 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis if (vl == null) { throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } - if (vl.getNominalV() < lowNominalVoltageBound || vl.getNominalV() > highNominalVoltageBound) { + if (vl.getNominalV() < nominalVoltageLowerBound || vl.getNominalV() > nominalVoltageUpperBound) { LOGGER.warn("vl '{}' has his nominal voltage out of the indicated thresholds", voltageLevelId); } else { startingSet.add(vl); @@ -137,25 +137,25 @@ public static VoltageLevelFilter createNominalVoltageFilter(Network network, Lis } Set voltageLevels = new HashSet<>(); - VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, lowNominalVoltageBound, highNominalVoltageBound); + VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, nominalVoltageLowerBound, nominalVoltageUpperBound); return new VoltageLevelFilter(voltageLevels); } - private static void checkVoltageBoundValues(double lowNominalVoltageBound, double highNominalVoltageBound) { - if (lowNominalVoltageBound < 0 || highNominalVoltageBound < 0) { + private static void checkVoltageBoundValues(double nominalVoltageLowerBound, double nominalVoltageUpperBound) { + if (nominalVoltageLowerBound < 0 || nominalVoltageUpperBound < 0) { throw new PowsyblException("Voltage bounds must be positive"); } - if (lowNominalVoltageBound > highNominalVoltageBound) { + if (nominalVoltageLowerBound > nominalVoltageUpperBound) { throw new PowsyblException("Low bound must be less than or equal to high bound"); } } - public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network network, List voltageLevelIds, double lowNominalVoltageBound, int depth) { - return createNominalVoltageFilter(network, voltageLevelIds, lowNominalVoltageBound, Double.MAX_VALUE, depth); + public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network network, List voltageLevelIds, double nominalVoltageLowerBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, nominalVoltageLowerBound, Double.MAX_VALUE, depth); } - public static VoltageLevelFilter createNominalVoltageUpperBoundFilter(Network network, List voltageLevelIds, double highNominalVoltageBound, int depth) { - return createNominalVoltageFilter(network, voltageLevelIds, 0, highNominalVoltageBound, depth); + public static VoltageLevelFilter createNominalVoltageUpperBoundFilter(Network network, List voltageLevelIds, double nominalVoltageUpperBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, 0, nominalVoltageUpperBound, depth); } private static class VlVisitor extends DefaultTopologyVisitor { From 951c1134298aa2e3194e17d3c45a706e5bb24887 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Fri, 8 Dec 2023 16:31:53 +0100 Subject: [PATCH 12/14] Refactor createVoltageLevelFilter methods to avoid code duplication Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 96 +++++++------------ 1 file changed, 32 insertions(+), 64 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 091d65306..7ff324cdf 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -46,43 +46,56 @@ public boolean test(VoltageLevel voltageLevel) { return voltageLevels.contains(voltageLevel); } + public static VoltageLevelFilter createVoltageLevelsFilter(Network network, List voltageLevelIds) { + return createVoltageLevelsDepthFilter(network, voltageLevelIds, 0); + } + public static VoltageLevelFilter createVoltageLevelDepthFilter(Network network, String voltageLevelId, int depth) { - Objects.requireNonNull(network); - Objects.requireNonNull(voltageLevelId); + return createVoltageLevelsDepthFilter(network, List.of(voltageLevelId), depth); + } - Set voltageLevels = new HashSet<>(); - VoltageLevel vl = network.getVoltageLevel(voltageLevelId); - if (vl == null) { - throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); - } + public static VoltageLevelFilter createVoltageLevelsDepthFilter(Network network, List voltageLevelIds, int depth) { + return createVoltageLevelFilterWithPredicate(network, voltageLevelIds, depth, NO_FILTER); + } - Set startingSet = new HashSet<>(); - startingSet.add(vl); - traverseVoltageLevels(startingSet, depth, voltageLevels); - return new VoltageLevelFilter(voltageLevels); + public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network network, List voltageLevelIds, double nominalVoltageLowerBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, nominalVoltageLowerBound, Double.MAX_VALUE, depth); } - public static VoltageLevelFilter createVoltageLevelsDepthFilter(Network network, List voltageLevelIds, int depth) { + public static VoltageLevelFilter createNominalVoltageUpperBoundFilter(Network network, List voltageLevelIds, double nominalVoltageUpperBound, int depth) { + return createNominalVoltageFilter(network, voltageLevelIds, 0, nominalVoltageUpperBound, depth); + } + + public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, + double nominalVoltageLowerBound, double nominalVoltageUpperBound, + int depth) { + checkVoltageBoundValues(nominalVoltageLowerBound, nominalVoltageUpperBound); + Predicate voltageLevelPredicate = voltageLevel -> voltageLevel.getNominalV() >= nominalVoltageLowerBound && voltageLevel.getNominalV() <= nominalVoltageUpperBound; + + return createVoltageLevelFilterWithPredicate(network, voltageLevelIds, depth, voltageLevelPredicate); + } + + public static VoltageLevelFilter createVoltageLevelFilterWithPredicate(Network network, List voltageLevelIds, int depth, Predicate voltageLevelPredicate) { Objects.requireNonNull(network); Objects.requireNonNull(voltageLevelIds); Set startingSet = new HashSet<>(); + for (String voltageLevelId : voltageLevelIds) { VoltageLevel vl = network.getVoltageLevel(voltageLevelId); if (vl == null) { throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } - startingSet.add(vl); + if (!voltageLevelPredicate.test(vl)) { + LOGGER.warn("vl '{}' has his nominal voltage out of the indicated thresholds", voltageLevelId); + } else { + startingSet.add(vl); + } } - Set voltageLevels = new HashSet<>(); - traverseVoltageLevels(startingSet, depth, voltageLevels); + VoltageLevelFilter.traverseVoltageLevels(startingSet, depth, voltageLevels, voltageLevelPredicate); return new VoltageLevelFilter(voltageLevels); } - public static VoltageLevelFilter createVoltageLevelsFilter(Network network, List voltageLevelIds) { - return createVoltageLevelsDepthFilter(network, voltageLevelIds, 0); - } - public static Collection getNextDepthVoltageLevels(Network network, List voltageLevels) { List voltageLevelIds = voltageLevels.stream().map(VoltageLevel::getId).collect(Collectors.toList()); VoltageLevelFilter voltageLevelFilter = createVoltageLevelsDepthFilter(network, voltageLevelIds, 1); @@ -105,42 +118,6 @@ private static void traverseVoltageLevels(Set voltageLevelsDepth, traverseVoltageLevels(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, predicate); } - private static void traverseVoltageLevels(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels) { - traverseVoltageLevels(voltageLevelsDepth, depth, visitedVoltageLevels, NO_FILTER); - } - - private static void traverseVoltageLevelsWithVoltageFilter(Set voltageLevelsDepth, int depth, Set visitedVoltageLevels, - double nominalVoltageLowerBound, double nominalVoltageUpperBound) { - - Predicate voltageFilterPredicate = voltageLevel -> voltageLevel.getNominalV() >= nominalVoltageLowerBound && voltageLevel.getNominalV() <= nominalVoltageUpperBound; - traverseVoltageLevels(voltageLevelsDepth, depth, visitedVoltageLevels, voltageFilterPredicate); - } - - public static VoltageLevelFilter createNominalVoltageFilter(Network network, List voltageLevelIds, - double nominalVoltageLowerBound, double nominalVoltageUpperBound, - int depth) { - Objects.requireNonNull(network); - Objects.requireNonNull(voltageLevelIds); - checkVoltageBoundValues(nominalVoltageLowerBound, nominalVoltageUpperBound); - Set startingSet = new HashSet<>(); - - for (String voltageLevelId : voltageLevelIds) { - VoltageLevel vl = network.getVoltageLevel(voltageLevelId); - if (vl == null) { - throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); - } - if (vl.getNominalV() < nominalVoltageLowerBound || vl.getNominalV() > nominalVoltageUpperBound) { - LOGGER.warn("vl '{}' has his nominal voltage out of the indicated thresholds", voltageLevelId); - } else { - startingSet.add(vl); - } - } - - Set voltageLevels = new HashSet<>(); - VoltageLevelFilter.traverseVoltageLevelsWithVoltageFilter(startingSet, depth, voltageLevels, nominalVoltageLowerBound, nominalVoltageUpperBound); - return new VoltageLevelFilter(voltageLevels); - } - private static void checkVoltageBoundValues(double nominalVoltageLowerBound, double nominalVoltageUpperBound) { if (nominalVoltageLowerBound < 0 || nominalVoltageUpperBound < 0) { throw new PowsyblException("Voltage bounds must be positive"); @@ -150,14 +127,6 @@ private static void checkVoltageBoundValues(double nominalVoltageLowerBound, dou } } - public static VoltageLevelFilter createNominalVoltageLowerBoundFilter(Network network, List voltageLevelIds, double nominalVoltageLowerBound, int depth) { - return createNominalVoltageFilter(network, voltageLevelIds, nominalVoltageLowerBound, Double.MAX_VALUE, depth); - } - - public static VoltageLevelFilter createNominalVoltageUpperBoundFilter(Network network, List voltageLevelIds, double nominalVoltageUpperBound, int depth) { - return createNominalVoltageFilter(network, voltageLevelIds, 0, nominalVoltageUpperBound, depth); - } - private static class VlVisitor extends DefaultTopologyVisitor { private final Set nextDepthVoltageLevels; private final Set visitedVoltageLevels; @@ -214,5 +183,4 @@ public void visitDanglingLine(DanglingLine danglingLine) { } } } - } From 06c6dbf885dfb6326cc2a706f61822cbd65e9816 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Fri, 8 Dec 2023 16:33:50 +0100 Subject: [PATCH 13/14] Put static field at the beginning of the class Signed-off-by: Sophie Frasnedo --- .../java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index 7ff324cdf..f73ced816 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -25,6 +25,8 @@ public class VoltageLevelFilter implements Predicate { public static final Predicate NO_FILTER = voltageLevel -> true; + private static final String UNKNOWN_VOLTAGE_LEVEL = "Unknown voltage level id '"; + private final Set voltageLevels; public VoltageLevelFilter(Set voltageLevels) { @@ -39,8 +41,6 @@ private Set getVoltageLevels() { return voltageLevels; } - private static final String UNKNOWN_VOLTAGE_LEVEL = "Unknown voltage level id '"; - @Override public boolean test(VoltageLevel voltageLevel) { return voltageLevels.contains(voltageLevel); From c6ee6ffd39bf129ea4288295ebf0470efeb40411 Mon Sep 17 00:00:00 2001 From: Sophie Frasnedo Date: Fri, 8 Dec 2023 18:49:25 +0100 Subject: [PATCH 14/14] Allow input voltage levels that do not comply with the predicate to be displayed Signed-off-by: Sophie Frasnedo --- .../nad/build/iidm/VoltageLevelFilter.java | 15 +- .../powsybl/nad/NetworkAreaDiagramTest.java | 13 +- .../resources/IEEE_14_bus_voltage_filter3.svg | 501 ++++++++++++++++++ 3 files changed, 518 insertions(+), 11 deletions(-) create mode 100644 network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg diff --git a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java index f73ced816..66d24b108 100644 --- a/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java +++ b/network-area-diagram/src/main/java/com/powsybl/nad/build/iidm/VoltageLevelFilter.java @@ -86,10 +86,9 @@ public static VoltageLevelFilter createVoltageLevelFilterWithPredicate(Network n throw new PowsyblException(UNKNOWN_VOLTAGE_LEVEL + voltageLevelId + "'"); } if (!voltageLevelPredicate.test(vl)) { - LOGGER.warn("vl '{}' has his nominal voltage out of the indicated thresholds", voltageLevelId); - } else { - startingSet.add(vl); + LOGGER.warn("vl '{}' does not comply with the predicate", voltageLevelId); } + startingSet.add(vl); } Set voltageLevels = new HashSet<>(); VoltageLevelFilter.traverseVoltageLevels(startingSet, depth, voltageLevels, voltageLevelPredicate); @@ -110,9 +109,9 @@ private static void traverseVoltageLevels(Set voltageLevelsDepth, } Set nextDepthVoltageLevels = new HashSet<>(); for (VoltageLevel vl : voltageLevelsDepth) { - if (!visitedVoltageLevels.contains(vl) && predicate.test(vl)) { + if (!visitedVoltageLevels.contains(vl)) { visitedVoltageLevels.add(vl); - vl.visitEquipments(new VlVisitor(nextDepthVoltageLevels, visitedVoltageLevels)); + vl.visitEquipments(new VlVisitor(nextDepthVoltageLevels, visitedVoltageLevels, predicate)); } } traverseVoltageLevels(nextDepthVoltageLevels, depth - 1, visitedVoltageLevels, predicate); @@ -130,10 +129,12 @@ private static void checkVoltageBoundValues(double nominalVoltageLowerBound, dou private static class VlVisitor extends DefaultTopologyVisitor { private final Set nextDepthVoltageLevels; private final Set visitedVoltageLevels; + private final Predicate voltageLevelPredicate; - public VlVisitor(Set nextDepthVoltageLevels, Set visitedVoltageLevels) { + public VlVisitor(Set nextDepthVoltageLevels, Set visitedVoltageLevels, Predicate voltageLevelPredicate) { this.nextDepthVoltageLevels = nextDepthVoltageLevels; this.visitedVoltageLevels = visitedVoltageLevels; + this.voltageLevelPredicate = voltageLevelPredicate; } @Override @@ -171,7 +172,7 @@ private void visitBranch(Branch branch, Branch.Side side) { private void visitTerminal(Terminal terminal) { VoltageLevel voltageLevel = terminal.getVoltageLevel(); - if (!visitedVoltageLevels.contains(voltageLevel)) { + if (!visitedVoltageLevels.contains(voltageLevel) && voltageLevelPredicate.test(voltageLevel)) { nextDepthVoltageLevels.add(voltageLevel); } } diff --git a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java index e502d47fd..4eb75d46c 100644 --- a/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java +++ b/network-area-diagram/src/test/java/com/powsybl/nad/NetworkAreaDiagramTest.java @@ -7,6 +7,7 @@ */ package com.powsybl.nad; +import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; import com.google.common.jimfs.Configuration; @@ -25,13 +26,13 @@ import com.powsybl.nad.svg.iidm.NominalVoltageStyleProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import ch.qos.logback.classic.Logger; import org.slf4j.LoggerFactory; import java.nio.file.FileSystem; import java.nio.file.Path; import java.util.List; +import static com.powsybl.nad.build.iidm.VoltageLevelFilter.NO_FILTER; import static org.junit.jupiter.api.Assertions.*; /** @@ -68,7 +69,7 @@ void testDrawSvg() { NadParameters nadParameters = new NadParameters() .setSvgParameters(getSvgParameters()) .setStyleProviderFactory(this::getStyleProvider); - NetworkAreaDiagram.draw(network, svgFile, nadParameters, VoltageLevelFilter.NO_FILTER); + NetworkAreaDiagram.draw(network, svgFile, nadParameters, NO_FILTER); assertEquals(toString("/dangling_line_connected.svg"), getContentFile(svgFile)); } @@ -112,11 +113,15 @@ void testVoltageFilteredDiagramOutOfBound() { logWatcher.start(); ((Logger) LoggerFactory.getLogger(VoltageLevelFilter.class)).addAppender(logWatcher); Network network = IeeeCdfNetworkFactory.create14(); + Path svgFileVoltageFilter = fileSystem.getPath("nad-test-voltage-filter.svg"); List voltageLevelList = List.of("VL4"); - VoltageLevelFilter.createNominalVoltageUpperBoundFilter(network, voltageLevelList, 90, 2); + VoltageLevelFilter voltageLevelFilter = VoltageLevelFilter.createNominalVoltageUpperBoundFilter(network, voltageLevelList, 130, 2); + NetworkAreaDiagram.draw(network, svgFileVoltageFilter, new NadParameters(), voltageLevelFilter); + List logsList = logWatcher.list; assertEquals(1, logsList.size()); - assertEquals("vl 'VL4' has his nominal voltage out of the indicated thresholds", logsList.get(0).getFormattedMessage()); + assertEquals("vl 'VL4' does not comply with the predicate", logsList.get(0).getFormattedMessage()); + assertEquals(toString("/IEEE_14_bus_voltage_filter3.svg"), getContentFile(svgFileVoltageFilter)); } @Test diff --git a/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg new file mode 100644 index 000000000..92c77bac8 --- /dev/null +++ b/network-area-diagram/src/test/resources/IEEE_14_bus_voltage_filter3.svg @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
VL10
+ + + + + +
+
+
12.6 kV / -15.1°
+
+
+ +
+
VL14
+ + + + + +
+
+
12.4 kV / -16.0°
+
+
+ +
+
VL4
+ + + + + +
+
+
137.6 kV / -10.3°
+
+
+ +
+
VL7
+ + + + + +
+
+
14.9 kV / -13.4°
+
+
+ +
+
VL8
+ + + + + +
+
+
21.8 kV / -13.4°
+
+
+ +
+
VL9
+ + + + + +
+
+
12.7 kV / -14.9°
+
+
+
+