diff --git a/.github/workflows/dev-ci.yml b/.github/workflows/dev-ci.yml index f54338e238..87e670dd17 100644 --- a/.github/workflows/dev-ci.yml +++ b/.github/workflows/dev-ci.yml @@ -33,7 +33,7 @@ jobs: - name: Setup GraalVM uses: graalvm/setup-graalvm@v1.1.5 # !!! this is last version compatible with manylinux 2014 with: - java-version: '17' + java-version: '21' distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -134,7 +134,7 @@ jobs: - name: Setup GraalVM uses: graalvm/setup-graalvm@v1 with: - java-version: '17' + java-version: '21' distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/full-ci.yml b/.github/workflows/full-ci.yml index d9fdf9e82d..3b11be7b2c 100644 --- a/.github/workflows/full-ci.yml +++ b/.github/workflows/full-ci.yml @@ -53,7 +53,7 @@ jobs: - name: Setup GraalVM uses: graalvm/setup-graalvm@v1.1.5 # !!! this is last version compatible with manylinux 2014 with: - java-version: '17' + java-version: '21' distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -172,7 +172,7 @@ jobs: - name: Setup GraalVM uses: graalvm/setup-graalvm@v1 with: - java-version: '17' + java-version: '21' distribution: 'graalvm' github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 58baeac319..c63af0cdf1 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Requirements: - Cmake >= 3.14 - C++11 compiler - Python >= 3.8 for Linux, Windows and MacOS (amd64 and arm64) -- [Oracle GraalVM Java 17](https://www.graalvm.org/downloads/) +- [Oracle GraalVM Java 21](https://www.graalvm.org/downloads/) To build from sources and install PyPowSyBl package: diff --git a/cpp/pypowsybl-java/CMakeLists.txt b/cpp/pypowsybl-java/CMakeLists.txt index 7678717a78..39ecd7b1f6 100644 --- a/cpp/pypowsybl-java/CMakeLists.txt +++ b/cpp/pypowsybl-java/CMakeLists.txt @@ -72,7 +72,7 @@ ExternalProject_Add(native-image DEPENDS mvn SOURCE_DIR ${PYPOWSYBL_JAVA_BIN_DIR} DOWNLOAD_COMMAND "" - PATCH_COMMAND $ENV{JAVA_HOME}/bin/native-image ${NATIVE_IMAGE_BUILD_OPTIONS} --class-path ${PYPOWSYBL_JAVA_SRC_DIR}/target/pypowsybl-java.jar${EXTRA_JARS} -march=compatibility --no-fallback --shared --gc=${NATIVE_IMAGE_GC} -H:Name=pypowsybl-java -H:CLibraryPath=${CMAKE_CURRENT_SOURCE_DIR} + PATCH_COMMAND $ENV{JAVA_HOME}/bin/native-image ${NATIVE_IMAGE_BUILD_OPTIONS} --class-path ${PYPOWSYBL_JAVA_SRC_DIR}/target/pypowsybl-java.jar${EXTRA_JARS} -march=compatibility --no-fallback --shared --gc=${NATIVE_IMAGE_GC} -o pypowsybl-java -H:CLibraryPath=${CMAKE_CURRENT_SOURCE_DIR} --add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.c=ALL-UNNAMED CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ${PYPOWSYBL_JAVA_BIN_DIR}/${PYPOWSYBL_JAVA_OLD_LIB} ${PYPOWSYBL_JAVA_BIN_DIR}/${PYPOWSYBL_JAVA_LIB} ${NATIVE_IMAGE_INSTALL_EXTRA_COMMAND} diff --git a/java/pom.xml b/java/pom.xml index 845521d841..e49ab5c7ea 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -61,9 +61,9 @@ 1.7.0-SNAPSHOT - 17 + 21 4.4 - 23.0.0 + 23.1.2 3.1.0 5.10.0 3.0.8 @@ -188,7 +188,7 @@ org.graalvm.sdk - graal-sdk + nativeimage ${graalvm.version} provided diff --git a/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java b/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java index d55fb3707a..6035a65e71 100644 --- a/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java +++ b/java/src/main/java/com/powsybl/python/commons/CTypeUtil.java @@ -7,12 +7,10 @@ */ package com.powsybl.python.commons; -import com.oracle.svm.core.SubstrateUtil; import com.powsybl.dataframe.SeriesMetadata; import com.powsybl.python.commons.PyPowsyblApiHeader.DataframeMetadataPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.SeriesMetadataPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.StringMap; - import org.graalvm.nativeimage.UnmanagedMemory; import org.graalvm.nativeimage.c.struct.SizeOf; import org.graalvm.nativeimage.c.type.*; @@ -62,7 +60,7 @@ public static CCharPointer toBytePtr(byte[] bytes) { */ public static String toString(CCharPointer charPtr) { // pybind11 convert std::string and char* to python utf-8 string - return CTypeConversion.toJavaString(charPtr, SubstrateUtil.strlen(charPtr), StandardCharsets.UTF_8); + return CTypeConversion.utf8ToJavaString(charPtr); } /** diff --git a/java/src/main/java/com/powsybl/python/commons/CommonCFunctions.java b/java/src/main/java/com/powsybl/python/commons/CommonCFunctions.java index 65b5bd05b8..f35795879a 100644 --- a/java/src/main/java/com/powsybl/python/commons/CommonCFunctions.java +++ b/java/src/main/java/com/powsybl/python/commons/CommonCFunctions.java @@ -8,6 +8,7 @@ package com.powsybl.python.commons; import com.powsybl.iidm.network.Network; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.dataframe.CDataframeHandler; import com.powsybl.tools.Version; import org.graalvm.nativeimage.IsolateThread; @@ -26,6 +27,7 @@ /** * @author Geoffroy Jamgotchian {@literal } */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class CommonCFunctions { @@ -34,12 +36,22 @@ private CommonCFunctions() { @CEntryPoint(name = "setJavaLibraryPath") public static void setJavaLibraryPath(IsolateThread thread, CCharPointer javaLibraryPath, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> System.setProperty("java.library.path", CTypeUtil.toString(javaLibraryPath))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + System.setProperty("java.library.path", CTypeUtil.toString(javaLibraryPath)); + } + }); } @CEntryPoint(name = "setConfigRead") public static void setConfigRead(IsolateThread thread, boolean read, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> PyPowsyblConfiguration.setReadConfig(read)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PyPowsyblConfiguration.setReadConfig(read); + } + }); } @CEntryPoint(name = "isConfigRead") @@ -49,30 +61,45 @@ public static boolean isConfigRead(IsolateThread thread, ExceptionHandlerPointer @CEntryPoint(name = "getVersionTable") public static CCharPointer getVersionTable(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(Version.getTableString())); + return doCatch(exceptionHandlerPtr, () -> { + return CTypeUtil.toCharPtr(Version.getTableString()); + }); } @CEntryPoint(name = "freeStringArray") public static void freeStringArray(IsolateThread thread, ArrayPointer arrayPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> freeArrayContent(arrayPtr)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeArrayContent(arrayPtr); + } + }); } @CEntryPoint(name = "freeArray") public static void freeArray(IsolateThread thread, ArrayPointer arrayPointer, ExceptionHandlerPointer exceptionHandlerPtr) { - UnmanagedMemory.free(arrayPointer.getPtr()); - UnmanagedMemory.free(arrayPointer); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UnmanagedMemory.free(arrayPointer.getPtr()); + UnmanagedMemory.free(arrayPointer); + } + }); } @CEntryPoint(name = "freeSeriesArray") public static void freeSeriesArray(IsolateThread thread, ArrayPointer seriesPtrArrayPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < seriesPtrArrayPtr.getLength(); i++) { - freeSeries(seriesPtrArrayPtr.getPtr().addressOf(i)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < seriesPtrArrayPtr.getLength(); i++) { + freeSeries(seriesPtrArrayPtr.getPtr().addressOf(i)); + } + freeArrayPointer(seriesPtrArrayPtr); } - freeArrayPointer(seriesPtrArrayPtr); }); } @@ -97,20 +124,33 @@ private static void freeArrayContent(ArrayPointer array) { @CEntryPoint(name = "destroyObjectHandle") public static void destroyObjectHandle(IsolateThread thread, ObjectHandle objectHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().destroy(objectHandle)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + ObjectHandles.getGlobal().destroy(objectHandle); + } + }); } @CEntryPoint(name = "getWorkingVariantId") public static CCharPointer getWorkingVariantId(IsolateThread thread, ObjectHandle networkHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - return CTypeUtil.toCharPtr(network.getVariantManager().getWorkingVariantId()); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + return CTypeUtil.toCharPtr(network.getVariantManager().getWorkingVariantId()); + } }); } @CEntryPoint(name = "freeString") public static void freeString(IsolateThread thread, CCharPointer string, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> UnmanagedMemory.free(string)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UnmanagedMemory.free(string); + } + }); } @CEntryPoint(name = "closePypowsybl") @@ -120,12 +160,15 @@ public static void closePypowsybl(IsolateThread thread, ExceptionHandlerPointer @CEntryPoint(name = "freeStringMap") public static void freeStringMap(IsolateThread thread, StringMap map, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < map.getLength(); i++) { - UnmanagedMemory.free(map.getKeys().read(i)); - UnmanagedMemory.free(map.getValues().read(i)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < map.getLength(); i++) { + UnmanagedMemory.free(map.getKeys().read(i)); + UnmanagedMemory.free(map.getValues().read(i)); + } + UnmanagedMemory.free(map); } - UnmanagedMemory.free(map); }); } } diff --git a/java/src/main/java/com/powsybl/python/dataframe/CDataframeHandler.java b/java/src/main/java/com/powsybl/python/dataframe/CDataframeHandler.java index 2a767cec9f..956bfae8ea 100644 --- a/java/src/main/java/com/powsybl/python/dataframe/CDataframeHandler.java +++ b/java/src/main/java/com/powsybl/python/dataframe/CDataframeHandler.java @@ -26,6 +26,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) public class CDataframeHandler implements DataframeHandler { public static final int STRING_SERIES_TYPE = 0; @@ -55,42 +56,72 @@ public void allocate(int seriesCount) { public StringSeriesWriter newStringIndex(String name, int size) { CCharPointerPointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CCharPointerPointer.class)); addIndex(name, size, dataPtr, STRING_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(CTypeUtil.toCharPtr(v)); + return new StringSeriesWriter() { + @Override + public void set(int i, String v) { + dataPtr.addressOf(i).write(CTypeUtil.toCharPtr(v)); + } + }; } @Override public IntSeriesWriter newIntIndex(String name, int size) { CIntPointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CIntPointer.class)); addIndex(name, size, dataPtr, INT_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(v); + return new IntSeriesWriter() { + @Override + public void set(int i, int v) { + dataPtr.addressOf(i).write(v); + } + }; } @Override public StringSeriesWriter newStringSeries(String name, int size) { CCharPointerPointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CCharPointerPointer.class)); addSeries(name, size, dataPtr, STRING_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(CTypeUtil.toCharPtr(v)); + return new StringSeriesWriter() { + @Override + public void set(int i, String v) { + dataPtr.addressOf(i).write(CTypeUtil.toCharPtr(v)); + } + }; } @Override public IntSeriesWriter newIntSeries(String name, int size) { CIntPointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CIntPointer.class)); addSeries(name, size, dataPtr, INT_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(v); + return new IntSeriesWriter() { + @Override + public void set(int i, int v) { + dataPtr.addressOf(i).write(v); + } + }; } @Override public BooleanSeriesWriter newBooleanSeries(String name, int size) { CCharPointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CCharPointer.class)); addSeries(name, size, dataPtr, BOOLEAN_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(v ? (byte) 1 : 0); + return new BooleanSeriesWriter() { + @Override + public void set(int i, boolean v) { + dataPtr.addressOf(i).write(v ? (byte) 1 : 0); + } + }; } @Override public DoubleSeriesWriter newDoubleSeries(String name, int size) { CDoublePointer dataPtr = UnmanagedMemory.calloc(size * SizeOf.get(CDoublePointer.class)); addSeries(name, size, dataPtr, DOUBLE_SERIES_TYPE); - return (i, v) -> dataPtr.addressOf(i).write(v); + return new DoubleSeriesWriter() { + @Override + public void set(int i, double v) { + dataPtr.addressOf(i).write(v); + } + }; } private void addSeries(String name, int count, PointerBase dataPtr, int type) { diff --git a/java/src/main/java/com/powsybl/python/dynamic/DynamicSimulationCFunctions.java b/java/src/main/java/com/powsybl/python/dynamic/DynamicSimulationCFunctions.java index 433ae8c689..1805b94449 100644 --- a/java/src/main/java/com/powsybl/python/dynamic/DynamicSimulationCFunctions.java +++ b/java/src/main/java/com/powsybl/python/dynamic/DynamicSimulationCFunctions.java @@ -9,8 +9,10 @@ import static com.powsybl.python.commons.Util.doCatch; +import java.io.IOException; import java.util.ArrayList; +import com.powsybl.python.commons.Util.PointerProvider; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.ObjectHandle; import org.graalvm.nativeimage.ObjectHandles; @@ -46,6 +48,7 @@ /** * @author Nicolas Pierre */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class DynamicSimulationCFunctions { @@ -59,25 +62,45 @@ private static Logger logger() { @CEntryPoint(name = "createDynamicSimulationContext") public static ObjectHandle createDynamicSimulationContext(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new DynamicSimulationContext())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() throws IOException { + return ObjectHandles.getGlobal().create(new DynamicSimulationContext()); + } + }); } @CEntryPoint(name = "createDynamicModelMapping") public static ObjectHandle createDynamicModelMapping(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new PythonDynamicModelsSupplier())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + return ObjectHandles.getGlobal().create(new PythonDynamicModelsSupplier()); + } + }); } @CEntryPoint(name = "createTimeseriesMapping") public static ObjectHandle createTimeseriesMapping(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new CurveMappingSupplier())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() throws IOException { + return ObjectHandles.getGlobal().create(new CurveMappingSupplier()); + } + }); } @CEntryPoint(name = "createEventMapping") public static ObjectHandle createEventMapping(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new EventSupplier())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() throws IOException { + return ObjectHandles.getGlobal().create(new EventSupplier()); + } + }); } @CEntryPoint(name = "runDynamicModel") @@ -89,21 +112,24 @@ public static ObjectHandle runDynamicModel(IsolateThread thread, ObjectHandle curvesSupplierHandle, int startTime, int stopTime, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DynamicSimulationContext dynamicContext = ObjectHandles.getGlobal().get(dynamicContextHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - PythonDynamicModelsSupplier dynamicMapping = ObjectHandles.getGlobal().get(dynamicMappingHandle); - EventModelsSupplier eventModelsSupplier = ObjectHandles.getGlobal().get(eventModelsSupplierHandle); - CurvesSupplier curvesSupplier = ObjectHandles.getGlobal().get(curvesSupplierHandle); - DynamicSimulationParameters dynamicSimulationParameters = new DynamicSimulationParameters(startTime, - stopTime); - DynamicSimulationResult result = dynamicContext.run(network, - dynamicMapping, - eventModelsSupplier, - curvesSupplier, - dynamicSimulationParameters); - logger().info("Dynamic simulation ran successfully in java"); - return ObjectHandles.getGlobal().create(result); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() throws IOException { + DynamicSimulationContext dynamicContext = ObjectHandles.getGlobal().get(dynamicContextHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + PythonDynamicModelsSupplier dynamicMapping = ObjectHandles.getGlobal().get(dynamicMappingHandle); + EventModelsSupplier eventModelsSupplier = ObjectHandles.getGlobal().get(eventModelsSupplierHandle); + CurvesSupplier curvesSupplier = ObjectHandles.getGlobal().get(curvesSupplierHandle); + DynamicSimulationParameters dynamicSimulationParameters = new DynamicSimulationParameters(startTime, + stopTime); + DynamicSimulationResult result = dynamicContext.run(network, + dynamicMapping, + eventModelsSupplier, + curvesSupplier, + dynamicSimulationParameters); + logger().info("Dynamic simulation ran successfully in java"); + return ObjectHandles.getGlobal().create(result); + } }); } @@ -112,10 +138,13 @@ public static void addDynamicMapping(IsolateThread thread, ObjectHandle dynamicM DynamicMappingType mappingType, DataframePointer mappingDataframePtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - PythonDynamicModelsSupplier dynamicMapping = ObjectHandles.getGlobal().get(dynamicMappingHandle); - UpdatingDataframe mappingDataframe = NetworkCFunctions.createDataframe(mappingDataframePtr); - DynamicMappingAdderFactory.getAdder(mappingType).addElements(dynamicMapping, mappingDataframe); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PythonDynamicModelsSupplier dynamicMapping = ObjectHandles.getGlobal().get(dynamicMappingHandle); + UpdatingDataframe mappingDataframe = NetworkCFunctions.createDataframe(mappingDataframePtr); + DynamicMappingAdderFactory.getAdder(mappingType).addElements(dynamicMapping, mappingDataframe); + } }); } @@ -123,7 +152,12 @@ public static void addDynamicMapping(IsolateThread thread, ObjectHandle dynamicM public static DataframeMetadataPointer getDynamicMappingsMetaData(IsolateThread thread, DynamicMappingType mappingType, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.createSeriesMetadata(DynamicMappingAdderFactory.getAdder(mappingType).getMetadata())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframeMetadataPointer get() throws IOException { + return CTypeUtil.createSeriesMetadata(DynamicMappingAdderFactory.getAdder(mappingType).getMetadata()); + } + }); } @CEntryPoint(name = "addCurve") @@ -132,11 +166,14 @@ public static void addCurve(IsolateThread thread, CCharPointer dynamicIdPtr, CCharPointer variablePtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - String dynamicId = CTypeUtil.toString(dynamicIdPtr); - String variable = CTypeUtil.toString(variablePtr); - CurveMappingSupplier timeSeriesSupplier = ObjectHandles.getGlobal().get(timeseriesSupplier); - timeSeriesSupplier.addCurve(dynamicId, variable); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + String dynamicId = CTypeUtil.toString(dynamicIdPtr); + String variable = CTypeUtil.toString(variablePtr); + CurveMappingSupplier timeSeriesSupplier = ObjectHandles.getGlobal().get(timeseriesSupplier); + timeSeriesSupplier.addCurve(dynamicId, variable); + } }); } @@ -147,10 +184,13 @@ public static void addEventDisconnection(IsolateThread thread, double eventTime, int disconnectOnly, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - String staticId = CTypeUtil.toString(staticIdPtr); - EventSupplier eventSupplier = ObjectHandles.getGlobal().get(eventSupplierHandle); - eventSupplier.addEventDisconnection(staticId, eventTime, Util.convert(PyPowsyblApiHeader.ThreeSideType.fromCValue(disconnectOnly)).toTwoSides()); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + String staticId = CTypeUtil.toString(staticIdPtr); + EventSupplier eventSupplier = ObjectHandles.getGlobal().get(eventSupplierHandle); + eventSupplier.addEventDisconnection(staticId, eventTime, Util.convert(PyPowsyblApiHeader.ThreeSideType.fromCValue(disconnectOnly)).toTwoSides()); + } }); } @@ -158,9 +198,12 @@ public static void addEventDisconnection(IsolateThread thread, public static CCharPointer getDynamicSimulationResultsStatus(IsolateThread thread, ObjectHandle dynamicSimulationResultsHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DynamicSimulationResult simulationResult = ObjectHandles.getGlobal().get(dynamicSimulationResultsHandle); - return CTypeUtil.toCharPtr(simulationResult.isOk() ? "Ok" : "Not OK"); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() throws IOException { + DynamicSimulationResult simulationResult = ObjectHandles.getGlobal().get(dynamicSimulationResultsHandle); + return CTypeUtil.toCharPtr(simulationResult.isOk() ? "Ok" : "Not OK"); + } }); } @@ -169,11 +212,14 @@ public static ArrayPointer getDynamicCurve(IsolateThread thread, ObjectHandle resultHandle, CCharPointer curveNamePtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DynamicSimulationResult result = ObjectHandles.getGlobal().get(resultHandle); - String curveName = CTypeUtil.toString(curveNamePtr); - TimeSeries curve = result.getCurve(curveName); - return Dataframes.createCDataframe(CurvesSeries.curvesDataFrameMapper(curveName), curve); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() throws IOException { + DynamicSimulationResult result = ObjectHandles.getGlobal().get(resultHandle); + String curveName = CTypeUtil.toString(curveNamePtr); + TimeSeries curve = result.getCurve(curveName); + return Dataframes.createCDataframe(CurvesSeries.curvesDataFrameMapper(curveName), curve); + } }); } @@ -181,9 +227,12 @@ public static ArrayPointer getDynamicCurve(IsolateThread thread, public static ArrayPointer getAllDynamicCurvesIds(IsolateThread thread, ObjectHandle resultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DynamicSimulationResult result = ObjectHandles.getGlobal().get(resultHandle); - return Util.createCharPtrArray(new ArrayList<>(result.getCurves().keySet())); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() throws IOException { + DynamicSimulationResult result = ObjectHandles.getGlobal().get(resultHandle); + return Util.createCharPtrArray(new ArrayList<>(result.getCurves().keySet())); + } }); } diff --git a/java/src/main/java/com/powsybl/python/flow_decomposition/FlowDecompositionCFunctions.java b/java/src/main/java/com/powsybl/python/flow_decomposition/FlowDecompositionCFunctions.java index 1a8cc89dfb..205c22f2ab 100644 --- a/java/src/main/java/com/powsybl/python/flow_decomposition/FlowDecompositionCFunctions.java +++ b/java/src/main/java/com/powsybl/python/flow_decomposition/FlowDecompositionCFunctions.java @@ -14,11 +14,10 @@ import com.powsybl.iidm.network.Network; import com.powsybl.loadflow.LoadFlowParameters; import com.powsybl.loadflow.LoadFlowProvider; -import com.powsybl.python.commons.CTypeUtil; -import com.powsybl.python.commons.CommonCFunctions; -import com.powsybl.python.commons.Directives; -import com.powsybl.python.commons.PyPowsyblApiHeader; -import com.powsybl.python.commons.PyPowsyblConfiguration; +import com.powsybl.python.commons.*; +import com.powsybl.python.commons.PyPowsyblApiHeader.ArrayPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.SeriesPointer; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.loadflow.LoadFlowCUtils; import com.powsybl.python.network.Dataframes; import org.graalvm.nativeimage.IsolateThread; @@ -33,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -42,6 +42,7 @@ /** * @author Hugo Schindler {@literal } */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class FlowDecompositionCFunctions { @@ -52,7 +53,9 @@ private FlowDecompositionCFunctions() { @CEntryPoint(name = "createFlowDecomposition") public static ObjectHandle createFlowDecomposition(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new FlowDecompositionContext())); + return doCatch(exceptionHandlerPtr, () -> { + return ObjectHandles.getGlobal().create(new FlowDecompositionContext()); + }); } @CEntryPoint(name = "addContingencyForFlowDecomposition") @@ -60,11 +63,14 @@ public static void addContingency(IsolateThread thread, ObjectHandle flowDecompo CCharPointer contingencyIdPtr, CCharPointerPointer elementIdPtrPtr, int elementCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); - Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); - String contingencyId = CTypeUtil.toString(contingencyIdPtr); - flowDecompositionContext.getXnecProviderByIdsBuilder().addContingency(contingencyId, elementsIds); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); + Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); + String contingencyId = CTypeUtil.toString(contingencyIdPtr); + flowDecompositionContext.getXnecProviderByIdsBuilder().addContingency(contingencyId, elementsIds); + } }); } @@ -72,10 +78,13 @@ public static void addContingency(IsolateThread thread, ObjectHandle flowDecompo public static void addPrecontingencyMonitoredElements(IsolateThread thread, ObjectHandle flowDecompositionContextHandle, CCharPointerPointer elementIdPtrPtr, int elementCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); - Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); - flowDecompositionContext.getXnecProviderByIdsBuilder().addNetworkElementsOnBasecase(elementsIds); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); + Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); + flowDecompositionContext.getXnecProviderByIdsBuilder().addNetworkElementsOnBasecase(elementsIds); + } }); } @@ -84,11 +93,14 @@ public static void addPostcontingencyMonitoredElements(IsolateThread thread, Obj CCharPointerPointer elementIdPtrPtr, int elementCount, CCharPointerPointer contingenciesIdPtrPtr, int contingenciesCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); - Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); - Set contingenciesIds = new HashSet<>(toStringList(contingenciesIdPtrPtr, contingenciesCount)); - flowDecompositionContext.getXnecProviderByIdsBuilder().addNetworkElementsAfterContingencies(elementsIds, contingenciesIds); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); + Set elementsIds = new HashSet<>(toStringList(elementIdPtrPtr, elementCount)); + Set contingenciesIds = new HashSet<>(toStringList(contingenciesIdPtrPtr, contingenciesCount)); + flowDecompositionContext.getXnecProviderByIdsBuilder().addNetworkElementsAfterContingencies(elementsIds, contingenciesIds); + } }); } @@ -96,49 +108,62 @@ public static void addPostcontingencyMonitoredElements(IsolateThread thread, Obj public static void addAdditionalXnecProvider(IsolateThread thread, ObjectHandle flowDecompositionContextHandle, int additionalXnecProviderId, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); - flowDecompositionContext.addAdditionalXnecProviderList(FlowDecompositionContext.DefaultXnecProvider.values()[additionalXnecProviderId]); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); + flowDecompositionContext.addAdditionalXnecProviderList(FlowDecompositionContext.DefaultXnecProvider.values()[additionalXnecProviderId]); + } + }); } @CEntryPoint(name = "runFlowDecomposition") - public static PyPowsyblApiHeader.ArrayPointer runFlowDecomposition(IsolateThread thread, - ObjectHandle flowDecompositionContextHandle, - ObjectHandle networkHandle, - PyPowsyblApiHeader.FlowDecompositionParametersPointer flowDecompositionParametersPtr, - PyPowsyblApiHeader.LoadFlowParametersPointer loadFlowParametersPtr, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - - String lfProviderName = PyPowsyblConfiguration.getDefaultLoadFlowProvider(); - LoadFlowProvider loadFlowProvider = LoadFlowCUtils.getLoadFlowProvider(lfProviderName); - String sensiProviderName = PyPowsyblConfiguration.getDefaultSensitivityAnalysisProvider(); - LoadFlowParameters loadFlowParameters = LoadFlowCUtils.createLoadFlowParameters(DC, loadFlowParametersPtr, loadFlowProvider); - FlowDecompositionParameters flowDecompositionParameters = FlowDecompositionCUtils.createFlowDecompositionParameters(flowDecompositionParametersPtr); - - logger().debug("Loadflow provider used is : {}", loadFlowProvider.getName()); - logger().debug("Sensitivity analysis provider used is : {}", sensiProviderName); - logger().debug("Load flow parameters : {}", loadFlowParameters); - logger().debug("Flow decomposition parameters : {}", flowDecompositionParameters); - - FlowDecompositionComputer flowDecompositionComputer = new FlowDecompositionComputer(flowDecompositionParameters, loadFlowParameters, lfProviderName, sensiProviderName); - XnecProvider xnecProvider = flowDecompositionContext.getXnecProvider(); - FlowDecompositionResults flowDecompositionResults = flowDecompositionComputer.run(xnecProvider, network); - - return Dataframes.createCDataframe(Dataframes.flowDecompositionMapper(flowDecompositionResults.getZoneSet()), flowDecompositionResults); + public static ArrayPointer runFlowDecomposition(IsolateThread thread, + ObjectHandle flowDecompositionContextHandle, + ObjectHandle networkHandle, + PyPowsyblApiHeader.FlowDecompositionParametersPointer flowDecompositionParametersPtr, + PyPowsyblApiHeader.LoadFlowParametersPointer loadFlowParametersPtr, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() throws IOException { + FlowDecompositionContext flowDecompositionContext = ObjectHandles.getGlobal().get(flowDecompositionContextHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + + String lfProviderName = PyPowsyblConfiguration.getDefaultLoadFlowProvider(); + LoadFlowProvider loadFlowProvider = LoadFlowCUtils.getLoadFlowProvider(lfProviderName); + String sensiProviderName = PyPowsyblConfiguration.getDefaultSensitivityAnalysisProvider(); + LoadFlowParameters loadFlowParameters = LoadFlowCUtils.createLoadFlowParameters(DC, loadFlowParametersPtr, loadFlowProvider); + FlowDecompositionParameters flowDecompositionParameters = FlowDecompositionCUtils.createFlowDecompositionParameters(flowDecompositionParametersPtr); + + logger().debug("Loadflow provider used is : {}", loadFlowProvider.getName()); + logger().debug("Sensitivity analysis provider used is : {}", sensiProviderName); + logger().debug("Load flow parameters : {}", loadFlowParameters); + logger().debug("Flow decomposition parameters : {}", flowDecompositionParameters); + + FlowDecompositionComputer flowDecompositionComputer = new FlowDecompositionComputer(flowDecompositionParameters, loadFlowParameters, lfProviderName, sensiProviderName); + XnecProvider xnecProvider = flowDecompositionContext.getXnecProvider(); + FlowDecompositionResults flowDecompositionResults = flowDecompositionComputer.run(xnecProvider, network); + + return Dataframes.createCDataframe(Dataframes.flowDecompositionMapper(flowDecompositionResults.getZoneSet()), flowDecompositionResults); + } }); } @CEntryPoint(name = "createFlowDecompositionParameters") public static PyPowsyblApiHeader.FlowDecompositionParametersPointer createFlowDecompositionParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToFlowDecompositionParametersPointer(FlowDecompositionCUtils.createFlowDecompositionParameters())); + return doCatch(exceptionHandlerPtr, FlowDecompositionCFunctions::get); } @CEntryPoint(name = "freeFlowDecompositionParameters") public static void freeFlowDecompositionParameters(IsolateThread thread, PyPowsyblApiHeader.FlowDecompositionParametersPointer flowDecompositionParametersPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> UnmanagedMemory.free(flowDecompositionParametersPtr)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UnmanagedMemory.free(flowDecompositionParametersPtr); + } + }); } private static PyPowsyblApiHeader.FlowDecompositionParametersPointer convertToFlowDecompositionParametersPointer(FlowDecompositionParameters parameters) { @@ -155,4 +180,8 @@ private static PyPowsyblApiHeader.FlowDecompositionParametersPointer convertToFl private static Logger logger() { return LoggerFactory.getLogger(CommonCFunctions.class); } + + private static PyPowsyblApiHeader.FlowDecompositionParametersPointer get() { + return convertToFlowDecompositionParametersPointer(FlowDecompositionCUtils.createFlowDecompositionParameters()); + } } diff --git a/java/src/main/java/com/powsybl/python/glsk/GlskCFunctions.java b/java/src/main/java/com/powsybl/python/glsk/GlskCFunctions.java index a6acfc68e5..7ac2ba70db 100644 --- a/java/src/main/java/com/powsybl/python/glsk/GlskCFunctions.java +++ b/java/src/main/java/com/powsybl/python/glsk/GlskCFunctions.java @@ -23,6 +23,7 @@ import java.time.Instant; import java.util.List; +import java.util.function.LongSupplier; import static com.powsybl.python.commons.Util.*; @@ -39,56 +40,74 @@ private GlskCFunctions() { @CEntryPoint(name = "createGLSKdocument") public static ObjectHandle createGLSKdocument(IsolateThread thread, CCharPointer fileNamePtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - GlskDocumentContext importer = new GlskDocumentContext(); - String filename = CTypeUtil.toString(fileNamePtr); - importer.load(filename); - return ObjectHandles.getGlobal().create(importer); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + GlskDocumentContext importer = new GlskDocumentContext(); + String filename = CTypeUtil.toString(fileNamePtr); + importer.load(filename); + return ObjectHandles.getGlobal().create(importer); + } }); } @CEntryPoint(name = "getGLSKinjectionkeys") public static ArrayPointer getGLSKinjectionkeys(IsolateThread thread, ObjectHandle networkHandle, ObjectHandle importerHandle, CCharPointer countryPtr, long instant, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - String country = CTypeUtil.toString(countryPtr); - return createCharPtrArray(importer.getInjectionIdForCountry(network, country, Instant.ofEpochSecond(instant))); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + String country = CTypeUtil.toString(countryPtr); + return createCharPtrArray(importer.getInjectionIdForCountry(network, country, Instant.ofEpochSecond(instant))); + } }); } @CEntryPoint(name = "getGLSKcountries") public static ArrayPointer getGLSKcountries(IsolateThread thread, ObjectHandle importerHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); - return createCharPtrArray(importer.getCountries()); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); + return createCharPtrArray(importer.getCountries()); + } }); } @CEntryPoint(name = "getInjectionFactor") public static ArrayPointer getInjectionFactor(IsolateThread thread, ObjectHandle networkHandle, ObjectHandle importerHandle, CCharPointer countryPtr, long instant, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); - String country = CTypeUtil.toString(countryPtr); - List values = importer.getInjectionFactorForCountryTimeinterval(network, country, Instant.ofEpochSecond(instant)); - return createDoubleArray(values); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); + String country = CTypeUtil.toString(countryPtr); + List values = importer.getInjectionFactorForCountryTimeinterval(network, country, Instant.ofEpochSecond(instant)); + return createDoubleArray(values); + } }); } @CEntryPoint(name = "getInjectionFactorStartTimestamp") public static long getInjectionFactorStartTimestamp(IsolateThread thread, ObjectHandle importerHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); - return importer.getInjectionFactorStart().getEpochSecond(); + return doCatch(exceptionHandlerPtr, new LongSupplier() { + @Override + public long getAsLong() { + GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); + return importer.getInjectionFactorStart().getEpochSecond(); + } }); } @CEntryPoint(name = "getInjectionFactorEndTimestamp") public static long getInjectionFactorEndTimestamp(IsolateThread thread, ObjectHandle importerHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); - return importer.getInjectionFactorEnd().getEpochSecond(); + return doCatch(exceptionHandlerPtr, new LongSupplier() { + @Override + public long getAsLong() { + GlskDocumentContext importer = ObjectHandles.getGlobal().get(importerHandle); + return importer.getInjectionFactorEnd().getEpochSecond(); + } }); } } diff --git a/java/src/main/java/com/powsybl/python/loadflow/LoadFlowCFunctions.java b/java/src/main/java/com/powsybl/python/loadflow/LoadFlowCFunctions.java index 6e72b626ab..5aec174a6a 100644 --- a/java/src/main/java/com/powsybl/python/loadflow/LoadFlowCFunctions.java +++ b/java/src/main/java/com/powsybl/python/loadflow/LoadFlowCFunctions.java @@ -16,7 +16,11 @@ import com.powsybl.loadflow.LoadFlowProvider; import com.powsybl.loadflow.LoadFlowResult; import com.powsybl.python.commons.*; +import com.powsybl.python.commons.PyPowsyblApiHeader.ArrayPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.LoadFlowComponentResultPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.LoadFlowParametersPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.SeriesPointer; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.network.Dataframes; import com.powsybl.python.report.ReportCUtils; import org.graalvm.nativeimage.IsolateThread; @@ -45,6 +49,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class LoadFlowCFunctions { @@ -53,67 +58,96 @@ private LoadFlowCFunctions() { @CEntryPoint(name = "setDefaultLoadFlowProvider") public static void setDefaultLoadFlowProvider(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> PyPowsyblConfiguration.setDefaultLoadFlowProvider(CTypeUtil.toString(provider))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PyPowsyblConfiguration.setDefaultLoadFlowProvider(CTypeUtil.toString(provider)); + } + }); } @CEntryPoint(name = "getDefaultLoadFlowProvider") public static CCharPointer getDefaultLoadFlowProvider(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultLoadFlowProvider())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + return CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultLoadFlowProvider()); + } + }); } @CEntryPoint(name = "freeLoadFlowComponentResultPointer") - public static void freeLoadFlowComponentResultPointer(IsolateThread thread, PyPowsyblApiHeader.ArrayPointer componentResultArrayPtr, + public static void freeLoadFlowComponentResultPointer(IsolateThread thread, ArrayPointer componentResultArrayPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < componentResultArrayPtr.getLength(); i++) { - PyPowsyblApiHeader.LoadFlowComponentResultPointer loadFlowComponentResultPointer = componentResultArrayPtr.getPtr().addressOf(i); - UnmanagedMemory.free(loadFlowComponentResultPointer.getStatusText()); - UnmanagedMemory.free(loadFlowComponentResultPointer.getReferenceBusId()); - for (int j = 0; j < loadFlowComponentResultPointer.slackBusResults().getLength(); j++) { - PyPowsyblApiHeader.SlackBusResultPointer slackBusResultPointer = loadFlowComponentResultPointer.slackBusResults().getPtr().addressOf(j); - UnmanagedMemory.free(slackBusResultPointer.getId()); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < componentResultArrayPtr.getLength(); i++) { + LoadFlowComponentResultPointer loadFlowComponentResultPointer = componentResultArrayPtr.getPtr().addressOf(i); + UnmanagedMemory.free(loadFlowComponentResultPointer.getStatusText()); + UnmanagedMemory.free(loadFlowComponentResultPointer.getReferenceBusId()); + for (int j = 0; j < loadFlowComponentResultPointer.slackBusResults().getLength(); j++) { + PyPowsyblApiHeader.SlackBusResultPointer slackBusResultPointer = loadFlowComponentResultPointer.slackBusResults().getPtr().addressOf(j); + UnmanagedMemory.free(slackBusResultPointer.getId()); + } } + freeArrayPointer(componentResultArrayPtr); } - freeArrayPointer(componentResultArrayPtr); }); } @CEntryPoint(name = "getLoadFlowProviderNames") - public static PyPowsyblApiHeader.ArrayPointer getLoadFlowProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(LoadFlowProvider.findAll() - .stream().map(LoadFlowProvider::getName).collect(Collectors.toList()))); + public static ArrayPointer getLoadFlowProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(LoadFlowProvider.findAll() + .stream().map(LoadFlowProvider::getName).collect(Collectors.toList())); + } + }); } @CEntryPoint(name = "runLoadFlow") - public static PyPowsyblApiHeader.ArrayPointer runLoadFlow(IsolateThread thread, ObjectHandle networkHandle, boolean dc, - LoadFlowParametersPointer loadFlowParametersPtr, - CCharPointer provider, ObjectHandle reportNodeHandle, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return Util.doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String providerStr = CTypeUtil.toString(provider); - LoadFlowProvider loadFlowProvider = LoadFlowCUtils.getLoadFlowProvider(providerStr); - logger().info("loadflow provider used is : {}", loadFlowProvider.getName()); - - LoadFlowParameters parameters = LoadFlowCUtils.createLoadFlowParameters(dc, loadFlowParametersPtr, loadFlowProvider); - LoadFlow.Runner runner = new LoadFlow.Runner(loadFlowProvider); - ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); - LoadFlowResult result = runner.run(network, network.getVariantManager().getWorkingVariantId(), + public static ArrayPointer runLoadFlow(IsolateThread thread, ObjectHandle networkHandle, boolean dc, + LoadFlowParametersPointer loadFlowParametersPtr, + CCharPointer provider, ObjectHandle reportNodeHandle, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return Util.doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String providerStr = CTypeUtil.toString(provider); + LoadFlowProvider loadFlowProvider = LoadFlowCUtils.getLoadFlowProvider(providerStr); + logger().info("loadflow provider used is : {}", loadFlowProvider.getName()); + + LoadFlowParameters parameters = LoadFlowCUtils.createLoadFlowParameters(dc, loadFlowParametersPtr, loadFlowProvider); + LoadFlow.Runner runner = new LoadFlow.Runner(loadFlowProvider); + ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); + LoadFlowResult result = runner.run(network, network.getVariantManager().getWorkingVariantId(), CommonObjects.getComputationManager(), parameters, reportNode); - return createLoadFlowComponentResultArrayPointer(result); + return createLoadFlowComponentResultArrayPointer(result); + } }); } @CEntryPoint(name = "createLoadFlowParameters") public static LoadFlowParametersPointer createLoadFlowParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToLoadFlowParametersPointer(LoadFlowCUtils.createLoadFlowParameters())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public LoadFlowParametersPointer get() { + return convertToLoadFlowParametersPointer(LoadFlowCUtils.createLoadFlowParameters()); + } + }); } @CEntryPoint(name = "freeLoadFlowParameters") public static void freeLoadFlowParameters(IsolateThread thread, LoadFlowParametersPointer loadFlowParametersPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - freeLoadFlowParametersPointer(loadFlowParametersPtr); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeLoadFlowParametersPointer(loadFlowParametersPtr); + } }); } @@ -122,12 +156,12 @@ public static void freeLoadFlowParametersPointer(LoadFlowParametersPointer loadF UnmanagedMemory.free(loadFlowParametersPtr); } - private static PyPowsyblApiHeader.ArrayPointer createLoadFlowComponentResultArrayPointer(LoadFlowResult result) { + private static ArrayPointer createLoadFlowComponentResultArrayPointer(LoadFlowResult result) { List componentResults = result.getComponentResults(); - PyPowsyblApiHeader.LoadFlowComponentResultPointer componentResultPtr = UnmanagedMemory.calloc(componentResults.size() * SizeOf.get(PyPowsyblApiHeader.LoadFlowComponentResultPointer.class)); + LoadFlowComponentResultPointer componentResultPtr = UnmanagedMemory.calloc(componentResults.size() * SizeOf.get(LoadFlowComponentResultPointer.class)); for (int index = 0; index < componentResults.size(); index++) { LoadFlowResult.ComponentResult componentResult = componentResults.get(index); - PyPowsyblApiHeader.LoadFlowComponentResultPointer ptr = componentResultPtr.addressOf(index); + LoadFlowComponentResultPointer ptr = componentResultPtr.addressOf(index); ptr.setConnectedComponentNum(componentResult.getConnectedComponentNum()); ptr.setSynchronousComponentNum(componentResult.getSynchronousComponentNum()); ptr.setStatus(componentResult.getStatus().ordinal()); @@ -140,7 +174,7 @@ private static PyPowsyblApiHeader.ArrayPointer slackBusResults) { + private static void createSlackBusResultPtr(LoadFlowComponentResultPointer ptr, List slackBusResults) { PyPowsyblApiHeader.SlackBusResultPointer slackBusResultPointer = UnmanagedMemory.calloc(slackBusResults.size() * SizeOf.get(PyPowsyblApiHeader.SlackBusResultPointer.class)); for (int i = 0; i < slackBusResults.size(); i++) { LoadFlowResult.SlackBusResult slackBusResult = slackBusResults.get(i); @@ -186,20 +220,26 @@ public static LoadFlowParametersPointer convertToLoadFlowParametersPointer(LoadF } @CEntryPoint(name = "getLoadFlowProviderParametersNames") - public static PyPowsyblApiHeader.ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String providerStr = CTypeUtil.toString(provider); - return Util.createCharPtrArray(LoadFlowCUtils.getLoadFlowProvider(providerStr).getSpecificParameters().stream().map(Parameter::getName).collect(Collectors.toList())); + public static ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String providerStr = CTypeUtil.toString(provider); + return Util.createCharPtrArray(LoadFlowCUtils.getLoadFlowProvider(providerStr).getSpecificParameters().stream().map(Parameter::getName).collect(Collectors.toList())); + } }); } @CEntryPoint(name = "createLoadFlowProviderParametersSeriesArray") - static PyPowsyblApiHeader.ArrayPointer createLoadFlowProviderParametersSeriesArray(IsolateThread thread, CCharPointer providerNamePtr, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String providerName = CTypeUtil.toString(providerNamePtr); - LoadFlowProvider provider = LoadFlowCUtils.getLoadFlowProvider(providerName); - return Dataframes.createCDataframe(LoadFlowCUtils.SPECIFIC_PARAMETERS_MAPPER, provider); + static ArrayPointer createLoadFlowProviderParametersSeriesArray(IsolateThread thread, CCharPointer providerNamePtr, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String providerName = CTypeUtil.toString(providerNamePtr); + LoadFlowProvider provider = LoadFlowCUtils.getLoadFlowProvider(providerName); + return Dataframes.createCDataframe(LoadFlowCUtils.SPECIFIC_PARAMETERS_MAPPER, provider); + } }); } diff --git a/java/src/main/java/com/powsybl/python/loadflow/validation/LoadFlowValidationCFunctions.java b/java/src/main/java/com/powsybl/python/loadflow/validation/LoadFlowValidationCFunctions.java index 945ef005f6..b56d62db96 100644 --- a/java/src/main/java/com/powsybl/python/loadflow/validation/LoadFlowValidationCFunctions.java +++ b/java/src/main/java/com/powsybl/python/loadflow/validation/LoadFlowValidationCFunctions.java @@ -14,9 +14,8 @@ import com.powsybl.loadflow.LoadFlowParameters; import com.powsybl.loadflow.validation.ValidationConfig; import com.powsybl.loadflow.validation.ValidationType; -import com.powsybl.python.commons.Directives; -import com.powsybl.python.commons.PyPowsyblApiHeader; -import com.powsybl.python.commons.PyPowsyblConfiguration; +import com.powsybl.python.commons.*; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.network.Dataframes; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.ObjectHandle; @@ -25,7 +24,6 @@ import org.graalvm.nativeimage.c.function.CEntryPoint; import org.graalvm.nativeimage.UnmanagedMemory; import org.graalvm.nativeimage.c.struct.SizeOf; -import com.powsybl.python.commons.CTypeUtil; import com.powsybl.python.loadflow.LoadFlowCUtils; import com.powsybl.python.loadflow.LoadFlowCFunctions; @@ -37,6 +35,7 @@ * * @author Yichen TANG */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class LoadFlowValidationCFunctions { @@ -48,9 +47,12 @@ public static ArrayPointer createLoadFlowValidationSeriesArray(Is PyPowsyblApiHeader.ValidationType validationType, PyPowsyblApiHeader.LoadFlowValidationParametersPointer loadFlowValidationParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - return createLoadFlowValidationSeriesArray(network, validationType, loadFlowValidationParametersPtr); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + return createLoadFlowValidationSeriesArray(network, validationType, loadFlowValidationParametersPtr); + } }); } @@ -110,7 +112,12 @@ private static ArrayPointer createCDataFrame(InMemoryValidationWr @CEntryPoint(name = "createValidationConfig") public static LoadFlowValidationParametersPointer createValidationConfig(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToLoadFlowValidationParametersPointer(createValidationConfig())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public LoadFlowValidationParametersPointer get() { + return convertToLoadFlowValidationParametersPointer(createValidationConfig()); + } + }); } public static void copyToCLoadFlowValidationParameters(ValidationConfig parameters, LoadFlowValidationParametersPointer cParameters) { @@ -140,7 +147,12 @@ public static LoadFlowValidationParametersPointer convertToLoadFlowValidationPar @CEntryPoint(name = "freeValidationConfig") public static void freeValidationConfig(IsolateThread thread, LoadFlowValidationParametersPointer loadFlowValidationParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> freeLoadFlowValidationParametersPointer(loadFlowValidationParametersPtr)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeLoadFlowValidationParametersPointer(loadFlowValidationParametersPtr); + } + }); } public static void freeLoadFlowValidationParametersPointer(LoadFlowValidationParametersPointer loadFlowValidationParametersPtr) { diff --git a/java/src/main/java/com/powsybl/python/logging/LoggingCFunctions.java b/java/src/main/java/com/powsybl/python/logging/LoggingCFunctions.java index 16f4762a53..f4936f8f39 100644 --- a/java/src/main/java/com/powsybl/python/logging/LoggingCFunctions.java +++ b/java/src/main/java/com/powsybl/python/logging/LoggingCFunctions.java @@ -10,6 +10,7 @@ import ch.qos.logback.classic.Logger; import com.powsybl.python.commons.Directives; import com.powsybl.python.commons.PyPowsyblApiHeader; +import com.powsybl.python.commons.Util.PointerProvider; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.c.CContext; import org.graalvm.nativeimage.c.function.CEntryPoint; @@ -25,6 +26,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class LoggingCFunctions { @@ -40,14 +42,22 @@ public interface LoggerCallback extends CFunctionPointer { @CEntryPoint(name = "setupLoggerCallback") public static void setupLoggerCallback(IsolateThread thread, LoggerCallback fpointer, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> loggerCallback = fpointer); + doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CFunctionPointer get() { + return loggerCallback = fpointer; + } + }); } @CEntryPoint(name = "setLogLevel") public static void setLogLevel(IsolateThread thread, int logLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Logger powsyblLogger = (Logger) LoggerFactory.getLogger("com.powsybl"); - powsyblLogger.setLevel(PyLoggingUtil.pythonLevelToLogbackLevel(logLevel)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Logger powsyblLogger = (Logger) LoggerFactory.getLogger("com.powsybl"); + powsyblLogger.setLevel(PyLoggingUtil.pythonLevelToLogbackLevel(logLevel)); + } }); } } diff --git a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java index c744a29faf..a87b24e5c3 100644 --- a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java +++ b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java @@ -17,9 +17,9 @@ import com.powsybl.dataframe.DataframeFilter.AttributeFilterType; import com.powsybl.dataframe.SeriesDataType; import com.powsybl.dataframe.SeriesMetadata; +import com.powsybl.dataframe.network.NetworkDataframeContext; import com.powsybl.dataframe.network.NetworkDataframeMapper; import com.powsybl.dataframe.network.NetworkDataframes; -import com.powsybl.dataframe.network.NetworkDataframeContext; import com.powsybl.dataframe.network.adders.AliasDataframeAdder; import com.powsybl.dataframe.network.adders.NetworkElementAdders; import com.powsybl.dataframe.network.extensions.NetworkExtensions; @@ -66,6 +66,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.*; +import java.util.function.BooleanSupplier; import java.util.zip.ZipOutputStream; import static com.powsybl.nad.svg.SvgParameters.EdgeInfoEnum.*; @@ -79,48 +80,67 @@ * * @author Etienne Lesot */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class NetworkCFunctions { - private static final ExportersLoader EXPORTERS_LOADER_SUPPLIER = new ExportersServiceLoader(); - private static final ImportersLoader IMPORTERS_LOADER_SUPPLIER = new ImportersServiceLoader(); - private NetworkCFunctions() { } @CEntryPoint(name = "getNetworkImportFormats") public static ArrayPointer getNetworkImportFormats(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(Importer.getFormats().stream().sorted().toList())); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(Importer.getFormats().stream().sorted().toList()); + } + }); } @CEntryPoint(name = "getNetworkExportFormats") public static ArrayPointer getNetworkExportFormats(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(Exporter.getFormats().stream().sorted().toList())); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(Exporter.getFormats().stream().sorted().toList()); + } + }); } @CEntryPoint(name = "createNetwork") public static ObjectHandle createNetwork(IsolateThread thread, CCharPointer name, CCharPointer id, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String networkName = CTypeUtil.toString(name); - String networkId = CTypeUtil.toString(id); - Network network = Networks.create(networkName, networkId); - return ObjectHandles.getGlobal().create(network); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + String networkName = CTypeUtil.toString(name); + String networkId = CTypeUtil.toString(id); + Network network = Networks.create(networkName, networkId); + return ObjectHandles.getGlobal().create(network); + } }); } @CEntryPoint(name = "getNetworkMetadata") public static NetworkMetadataPointer getNetworkMetadata(IsolateThread thread, ObjectHandle networkHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - return createNetworkMetadata(network); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public NetworkMetadataPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + return createNetworkMetadata(network); + } }); } @CEntryPoint(name = "freeNetworkMetadata") public static void freeNetworkMetadata(IsolateThread thread, NetworkMetadataPointer ptr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> freeNetworkMetadata(ptr)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeNetworkMetadata(ptr); + } + }); } private static NetworkMetadataPointer createNetworkMetadata(Network network) { @@ -144,15 +164,18 @@ private static void freeNetworkMetadata(NetworkMetadataPointer networkMetadataPo public static ObjectHandle loadNetwork(IsolateThread thread, CCharPointer file, CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String fileStr = CTypeUtil.toString(file); - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - if (reportNode == null) { - reportNode = ReportNode.NO_OP; + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + String fileStr = CTypeUtil.toString(file); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + if (reportNode == null) { + reportNode = ReportNode.NO_OP; + } + Network network = Network.read(Paths.get(fileStr), LocalComputationManager.getDefault(), ImportConfig.load(), parameters, new ImportersServiceLoader(), reportNode); + return ObjectHandles.getGlobal().create(network); } - Network network = Network.read(Paths.get(fileStr), LocalComputationManager.getDefault(), ImportConfig.load(), parameters, IMPORTERS_LOADER_SUPPLIER, reportNode); - return ObjectHandles.getGlobal().create(network); }); } @@ -161,19 +184,22 @@ public static ObjectHandle loadNetworkFromString(IsolateThread thread, CCharPoin CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String fileNameStr = CTypeUtil.toString(fileName); - String fileContentStr = CTypeUtil.toString(fileContent); - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); - try (InputStream is = new ByteArrayInputStream(fileContentStr.getBytes(StandardCharsets.UTF_8))) { - if (reportNode == null) { - reportNode = ReportNode.NO_OP; + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + String fileNameStr = CTypeUtil.toString(fileName); + String fileContentStr = CTypeUtil.toString(fileContent); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); + try (InputStream is = new ByteArrayInputStream(fileContentStr.getBytes(StandardCharsets.UTF_8))) { + if (reportNode == null) { + reportNode = ReportNode.NO_OP; + } + Network network = Network.read(fileNameStr, is, LocalComputationManager.getDefault(), ImportConfig.load(), parameters, new ImportersServiceLoader(), reportNode); + return ObjectHandles.getGlobal().create(network); + } catch (IOException e) { + throw new UncheckedIOException(e); } - Network network = Network.read(fileNameStr, is, LocalComputationManager.getDefault(), ImportConfig.load(), parameters, IMPORTERS_LOADER_SUPPLIER, reportNode); - return ObjectHandles.getGlobal().create(network); - } catch (IOException e) { - throw new UncheckedIOException(e); } }); } @@ -182,39 +208,42 @@ public static ObjectHandle loadNetworkFromString(IsolateThread thread, CCharPoin public static ObjectHandle loadNetworkFromBinaryBuffers(IsolateThread thread, CCharPointerPointer data, CIntPointer dataSizes, int bufferCount, CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - List bufferSizes = CTypeUtil.toIntegerList(dataSizes, bufferCount); - List dataSourceList = new ArrayList<>(); - for (int i = 0; i < bufferCount; ++i) { - ByteBuffer buffer = CTypeConversion.asByteBuffer(data.read(i), bufferSizes.get(i)); - Optional format = detectCompressionFormat(buffer); - if (format.isPresent() && CompressionFormat.ZIP.equals(format.get())) { - InMemoryZipFileDataSource ds = new InMemoryZipFileDataSource(binaryBufferToBytes(buffer)); - String commonBasename = null; - try { - for (String filename : ds.listNames(".*")) { - String basename = DataSourceUtil.getBaseName(filename); - commonBasename = commonBasename == null ? basename : StringUtils.getCommonPrefix(commonBasename, basename); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + List bufferSizes = CTypeUtil.toIntegerList(dataSizes, bufferCount); + List dataSourceList = new ArrayList<>(); + for (int i = 0; i < bufferCount; ++i) { + ByteBuffer buffer = CTypeConversion.asByteBuffer(data.read(i), bufferSizes.get(i)); + Optional format = detectCompressionFormat(buffer); + if (format.isPresent() && CompressionFormat.ZIP.equals(format.get())) { + InMemoryZipFileDataSource ds = new InMemoryZipFileDataSource(binaryBufferToBytes(buffer)); + String commonBasename = null; + try { + for (String filename : ds.listNames(".*")) { + String basename = DataSourceUtil.getBaseName(filename); + commonBasename = commonBasename == null ? basename : StringUtils.getCommonPrefix(commonBasename, basename); + } + } catch (IOException e) { + throw new PowsyblException("Unsupported network data format in zip buffer."); } - } catch (IOException e) { - throw new PowsyblException("Unsupported network data format in zip buffer."); - } - if (commonBasename != null) { - ds.setBaseName(commonBasename); + if (commonBasename != null) { + ds.setBaseName(commonBasename); + } + dataSourceList.add(ds); + } else { + throw new PowsyblException("Network loading from memory buffer only supported with zipped networks."); } - dataSourceList.add(ds); - } else { - throw new PowsyblException("Network loading from memory buffer only supported with zipped networks."); } + if (reportNode == null) { + reportNode = ReportNode.NO_OP; + } + MultipleReadOnlyDataSource dataSource = new MultipleReadOnlyDataSource(dataSourceList); + Network network = Network.read(dataSource, parameters, reportNode); + return ObjectHandles.getGlobal().create(network); } - if (reportNode == null) { - reportNode = ReportNode.NO_OP; - } - MultipleReadOnlyDataSource dataSource = new MultipleReadOnlyDataSource(dataSourceList); - Network network = Network.read(dataSource, parameters, reportNode); - return ObjectHandles.getGlobal().create(network); }); } @@ -223,16 +252,19 @@ public static void saveNetwork(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String fileStr = CTypeUtil.toString(file); - String formatStr = CTypeUtil.toString(format); - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - if (reportNode == null) { - reportNode = ReportNode.NO_OP; + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String fileStr = CTypeUtil.toString(file); + String formatStr = CTypeUtil.toString(format); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + if (reportNode == null) { + reportNode = ReportNode.NO_OP; + } + network.write(new ExportersServiceLoader(), formatStr, parameters, Paths.get(fileStr), reportNode); } - network.write(EXPORTERS_LOADER_SUPPLIER, formatStr, parameters, Paths.get(fileStr), reportNode); }); } @@ -241,29 +273,32 @@ public static CCharPointer saveNetworkToString(IsolateThread thread, ObjectHandl CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String formatStr = CTypeUtil.toString(format); - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - MemDataSource dataSource = new MemDataSource(); - var exporter = Exporter.find(formatStr); - if (exporter == null) { - throw new PowsyblException("No exporter found for '" + formatStr + "' to export as a string"); - } - ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); - exporter.export(network, parameters, dataSource, reportNode); - try { - var names = dataSource.listNames(".*?"); - if (names.size() != 1) { - throw new PowsyblException("Currently we only support string export for single file format(ex, 'XIIDM')."); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String formatStr = CTypeUtil.toString(format); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + MemDataSource dataSource = new MemDataSource(); + var exporter = Exporter.find(formatStr); + if (exporter == null) { + throw new PowsyblException("No exporter found for '" + formatStr + "' to export as a string"); } - try (InputStream is = new ByteArrayInputStream(dataSource.getData(Iterables.getOnlyElement(names))); - ByteArrayOutputStream os = new ByteArrayOutputStream()) { - IOUtils.copy(is, os); - return CTypeUtil.toCharPtr(os.toString()); + ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); + exporter.export(network, parameters, dataSource, reportNode); + try { + var names = dataSource.listNames(".*?"); + if (names.size() != 1) { + throw new PowsyblException("Currently we only support string export for single file format(ex, 'XIIDM')."); + } + try (InputStream is = new ByteArrayInputStream(dataSource.getData(Iterables.getOnlyElement(names))); + ByteArrayOutputStream os = new ByteArrayOutputStream()) { + IOUtils.copy(is, os); + return CTypeUtil.toCharPtr(os.toString()); + } + } catch (IOException e) { + throw new UncheckedIOException(e); } - } catch (IOException e) { - throw new UncheckedIOException(e); } }); } @@ -273,33 +308,41 @@ public static ArrayPointer saveNetworkToBinaryBuffer(IsolateThread CCharPointerPointer parameterNamesPtrPtr, int parameterNamesCount, CCharPointerPointer parameterValuesPtrPtr, int parameterValuesCount, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String formatStr = CTypeUtil.toString(format); - Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); - var exporter = Exporter.find(formatStr); - if (exporter == null) { - throw new PowsyblException("No exporter found for '" + formatStr + "' to export as a string"); - } - ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); - // to support all kind of export: simple file or multiple to an archive, - // best is to write to a zip file - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - try (ZipOutputStream zos = new ZipOutputStream(bos)) { - DataSource dataSource = new ZipMemDataSource("file", zos); - exporter.export(network, parameters, dataSource, reportNode); - } catch (IOException e) { - throw new UncheckedIOException(e); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String formatStr = CTypeUtil.toString(format); + Properties parameters = createParameters(parameterNamesPtrPtr, parameterNamesCount, parameterValuesPtrPtr, parameterValuesCount); + var exporter = Exporter.find(formatStr); + if (exporter == null) { + throw new PowsyblException("No exporter found for '" + formatStr + "' to export as a string"); + } + ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); + // to support all kind of export: simple file or multiple to an archive, + // best is to write to a zip file + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(bos)) { + DataSource dataSource = new ZipMemDataSource("file", zos); + exporter.export(network, parameters, dataSource, reportNode); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + byte[] bytes = bos.toByteArray(); + return Util.createByteArray(bytes); } - byte[] bytes = bos.toByteArray(); - return Util.createByteArray(bytes); }); } @CEntryPoint(name = "freeNetworkBinaryBuffer") public static void freeNetworkBinaryBuffer(IsolateThread thread, PyPowsyblApiHeader.ArrayPointer byteArrayPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> freeArrayPointer(byteArrayPtr)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeArrayPointer(byteArrayPtr); + } + }); } @CEntryPoint(name = "reduceNetwork") @@ -310,31 +353,34 @@ public static void reduceNetwork(IsolateThread thread, ObjectHandle networkHandl CIntPointer depthsPtr, int depthsCount, boolean withDanglingLines, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - ReductionOptions options = new ReductionOptions(); - options.withDanglingLlines(withDanglingLines); - List predicates = new ArrayList<>(); - if (vMax != Double.MAX_VALUE || vMin != 0) { - predicates.add(new NominalVoltageNetworkPredicate(vMin, vMax)); - } - if (idsCount != 0) { - List ids = toStringList(idsPtrPtr, idsCount); - predicates.add(new IdentifierNetworkPredicate(ids)); - } - if (depthsCount != 0) { - final List depths = CTypeUtil.toIntegerList(depthsPtr, depthsCount); - final List voltageLeveles = toStringList(vlsPtrPtr, vlsCount); - for (int i = 0; i < depths.size(); i++) { - predicates.add(new SubNetworkPredicate(network.getVoltageLevel(voltageLeveles.get(i)), depths.get(i))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + ReductionOptions options = new ReductionOptions(); + options.withDanglingLlines(withDanglingLines); + List predicates = new ArrayList<>(); + if (vMax != Double.MAX_VALUE || vMin != 0) { + predicates.add(new NominalVoltageNetworkPredicate(vMin, vMax)); + } + if (idsCount != 0) { + List ids = toStringList(idsPtrPtr, idsCount); + predicates.add(new IdentifierNetworkPredicate(ids)); + } + if (depthsCount != 0) { + final List depths = CTypeUtil.toIntegerList(depthsPtr, depthsCount); + final List voltageLeveles = toStringList(vlsPtrPtr, vlsCount); + for (int i = 0; i < depths.size(); i++) { + predicates.add(new SubNetworkPredicate(network.getVoltageLevel(voltageLeveles.get(i)), depths.get(i))); + } } + final OrNetworkPredicate orNetworkPredicate = new OrNetworkPredicate(predicates); + NetworkReducer.builder() + .withNetworkPredicate(orNetworkPredicate) + .withReductionOptions(options) + .build() + .reduce(network); } - final OrNetworkPredicate orNetworkPredicate = new OrNetworkPredicate(predicates); - NetworkReducer.builder() - .withNetworkPredicate(orNetworkPredicate) - .withReductionOptions(options) - .build() - .reduce(network); }); } @@ -354,44 +400,59 @@ public static ArrayPointer getNetworkElementsIds(IsolateThr CDoublePointer nominalVoltagePtr, int nominalVoltageCount, CCharPointerPointer countryPtr, int countryCount, boolean mainCc, boolean mainSc, boolean notConnectedToSameBusAtBothSides, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - Set nominalVoltages = new HashSet<>(CTypeUtil.toDoubleList(nominalVoltagePtr, nominalVoltageCount)); - Set countries = new HashSet<>(toStringList(countryPtr, countryCount)); - List elementsIds = NetworkUtil.getElementsIds(network, elementType, nominalVoltages, countries, mainCc, mainSc, notConnectedToSameBusAtBothSides); - return createCharPtrArray(elementsIds); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + Set nominalVoltages = new HashSet<>(CTypeUtil.toDoubleList(nominalVoltagePtr, nominalVoltageCount)); + Set countries = new HashSet<>(toStringList(countryPtr, countryCount)); + List elementsIds = NetworkUtil.getElementsIds(network, elementType, nominalVoltages, countries, mainCc, mainSc, notConnectedToSameBusAtBothSides); + return createCharPtrArray(elementsIds); + } }); } @CEntryPoint(name = "cloneVariant") public static void cloneVariant(IsolateThread thread, ObjectHandle networkHandle, CCharPointer src, CCharPointer variant, boolean mayOverwrite, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - network.getVariantManager().cloneVariant(CTypeUtil.toString(src), CTypeUtil.toString(variant), mayOverwrite); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + network.getVariantManager().cloneVariant(CTypeUtil.toString(src), CTypeUtil.toString(variant), mayOverwrite); + } }); } @CEntryPoint(name = "setWorkingVariant") public static void setWorkingVariant(IsolateThread thread, ObjectHandle networkHandle, CCharPointer variant, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - network.getVariantManager().setWorkingVariant(CTypeUtil.toString(variant)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + network.getVariantManager().setWorkingVariant(CTypeUtil.toString(variant)); + } }); } @CEntryPoint(name = "removeVariant") public static void removeVariant(IsolateThread thread, ObjectHandle networkHandle, CCharPointer variant, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - network.getVariantManager().removeVariant(CTypeUtil.toString(variant)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + network.getVariantManager().removeVariant(CTypeUtil.toString(variant)); + } }); } @CEntryPoint(name = "getVariantsIds") public static ArrayPointer getVariantsIds(IsolateThread thread, ObjectHandle networkHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - return createCharPtrArray(List.copyOf(network.getVariantManager().getVariantIds())); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + return createCharPtrArray(List.copyOf(network.getVariantManager().getVariantIds())); + } }); } @@ -417,11 +478,14 @@ public static ArrayPointer createNetworkElementsSeriesArray(Isola boolean perUnit, double nominalApparentPower, ExceptionHandlerPointer exceptionHandlerPtr) { - return Util.doCatch(exceptionHandlerPtr, () -> { - NetworkDataframeMapper mapper = NetworkDataframes.getDataframeMapper(convert(elementType)); - Network network = ObjectHandles.getGlobal().get(networkHandle); - DataframeFilter dataframeFilter = createDataframeFilter(filterAttributesType, attributesPtrPtr, attributesCount, selectedElementsDataframe); - return Dataframes.createCDataframe(mapper, network, dataframeFilter, new NetworkDataframeContext(perUnit, nominalApparentPower)); + return Util.doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + NetworkDataframeMapper mapper = NetworkDataframes.getDataframeMapper(convert(elementType)); + Network network = ObjectHandles.getGlobal().get(networkHandle); + DataframeFilter dataframeFilter = createDataframeFilter(filterAttributesType, attributesPtrPtr, attributesCount, selectedElementsDataframe); + return Dataframes.createCDataframe(mapper, network, dataframeFilter, new NetworkDataframeContext(perUnit, nominalApparentPower)); + } }); } @@ -433,25 +497,32 @@ public static ArrayPointer createNetworkElemen String name = CTypeUtil.toString(extensionName); String tempName = CTypeUtil.toString(cTableName); String tableName = tempName.isEmpty() ? null : tempName; - return doCatch(exceptionHandlerPtr, () -> { - NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); - if (mapper != null) { - Network network = ObjectHandles.getGlobal().get(networkHandle); - return Dataframes.createCDataframe(mapper, network, new DataframeFilter(), NetworkDataframeContext.DEFAULT); - } else { - throw new PowsyblException("extension " + name + " not found"); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); + if (mapper != null) { + Network network = ObjectHandles.getGlobal().get(networkHandle); + return Dataframes.createCDataframe(mapper, network, new DataframeFilter(), NetworkDataframeContext.DEFAULT); + } else { + throw new PowsyblException("extension " + name + " not found"); + } } }); } @CEntryPoint(name = "getExtensionsNames") public static ArrayPointer getExtensionsNames(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(List.copyOf(NetworkExtensions.getExtensionsNames()))); + return doCatch(exceptionHandlerPtr, () -> { + return createCharPtrArray(List.copyOf(NetworkExtensions.getExtensionsNames())); + }); } @CEntryPoint(name = "getExtensionsInformation") public static ArrayPointer getExtensionsInformation(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> NetworkExtensions.getExtensionInformation(NetworkDataframeContext.DEFAULT)); + return doCatch(exceptionHandlerPtr, () -> { + return NetworkExtensions.getExtensionInformation(NetworkDataframeContext.DEFAULT); + }); } @CEntryPoint(name = "createElement") @@ -459,14 +530,17 @@ public static void createElement(IsolateThread thread, ObjectHandle networkHandl ElementType elementType, DataframeArrayPointer cDataframes, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - DataframeElementType type = convert(elementType); - List dataframes = new ArrayList<>(); - for (int i = 0; i < cDataframes.getDataframesCount(); i++) { - dataframes.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + DataframeElementType type = convert(elementType); + List dataframes = new ArrayList<>(); + for (int i = 0; i < cDataframes.getDataframesCount(); i++) { + dataframes.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + } + NetworkElementAdders.addElements(type, network, dataframes); } - NetworkElementAdders.addElements(type, network, dataframes); }); } @@ -475,11 +549,14 @@ public static void updateNetworkElementsWithSeries(IsolateThread thread, ObjectH DataframePointer dataframe, boolean perUnit, double nominalApparentPower, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - UpdatingDataframe updatingDataframe = createDataframe(dataframe); - NetworkDataframes.getDataframeMapper(convert(elementType)) - .updateSeries(network, updatingDataframe, new NetworkDataframeContext(perUnit, nominalApparentPower)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + UpdatingDataframe updatingDataframe = createDataframe(dataframe); + NetworkDataframes.getDataframeMapper(convert(elementType)) + .updateSeries(network, updatingDataframe, new NetworkDataframeContext(perUnit, nominalApparentPower)); + } }); } @@ -487,46 +564,52 @@ public static void updateNetworkElementsWithSeries(IsolateThread thread, ObjectH public static void removeAliases(IsolateThread thread, ObjectHandle networkHandle, DataframePointer cDataframe, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - UpdatingDataframe dataframe = createDataframe(cDataframe); - AliasDataframeAdder.deleteElements(network, dataframe); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + UpdatingDataframe dataframe = createDataframe(cDataframe); + AliasDataframeAdder.deleteElements(network, dataframe); + } }); } @CEntryPoint(name = "removeNetworkElements") public static void removeNetworkElements(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer cElementIds, int elementCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - List elementIds = CTypeUtil.toStringList(cElementIds, elementCount); - elementIds.forEach(elementId -> { - Identifiable identifiable = network.getIdentifiable(elementId); - if (identifiable == null) { - throw new PowsyblException(String.format("identifiable with id : %s was not found", elementId)); - } - if (identifiable instanceof Connectable) { - ((Connectable) identifiable).remove(); - } else if (identifiable instanceof HvdcLine hvdcLine) { - hvdcLine.remove(); - } else if (identifiable instanceof VoltageLevel voltageLevel) { - voltageLevel.remove(); - } else if (identifiable instanceof Substation substation) { - substation.remove(); - } else if (identifiable instanceof Switch sw) { - VoltageLevel voltageLevel = sw.getVoltageLevel(); - switch (voltageLevel.getTopologyKind()) { - case NODE_BREAKER -> voltageLevel.getNodeBreakerView().removeSwitch(identifiable.getId()); - case BUS_BREAKER -> voltageLevel.getBusBreakerView().removeSwitch(identifiable.getId()); - default -> - throw new PowsyblException("this voltage level does not have a proper topology kind"); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + List elementIds = CTypeUtil.toStringList(cElementIds, elementCount); + elementIds.forEach(elementId -> { + Identifiable identifiable = network.getIdentifiable(elementId); + if (identifiable == null) { + throw new PowsyblException(String.format("identifiable with id : %s was not found", elementId)); } - } else if (identifiable instanceof TieLine tieLine) { - tieLine.remove(); - } else { - throw new PowsyblException(String.format("identifiable with id : %s can't be removed", identifiable.getId())); - } - }); + if (identifiable instanceof Connectable) { + ((Connectable) identifiable).remove(); + } else if (identifiable instanceof HvdcLine hvdcLine) { + hvdcLine.remove(); + } else if (identifiable instanceof VoltageLevel voltageLevel) { + voltageLevel.remove(); + } else if (identifiable instanceof Substation substation) { + substation.remove(); + } else if (identifiable instanceof Switch sw) { + VoltageLevel voltageLevel = sw.getVoltageLevel(); + switch (voltageLevel.getTopologyKind()) { + case NODE_BREAKER -> voltageLevel.getNodeBreakerView().removeSwitch(identifiable.getId()); + case BUS_BREAKER -> voltageLevel.getBusBreakerView().removeSwitch(identifiable.getId()); + default -> + throw new PowsyblException("this voltage level does not have a proper topology kind"); + } + } else if (identifiable instanceof TieLine tieLine) { + tieLine.remove(); + } else { + throw new PowsyblException(String.format("identifiable with id : %s can't be removed", identifiable.getId())); + } + }); + } }); } @@ -555,89 +638,116 @@ public static UpdatingDataframe createDataframe(DataframePointer dataframe) { @CEntryPoint(name = "getNodeBreakerViewSwitches") public static ArrayPointer getNodeBreakerViewSwitches(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); - return Dataframes.createCDataframe(Dataframes.nodeBreakerViewSwitches(), nodeBreakerView); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); + return Dataframes.createCDataframe(Dataframes.nodeBreakerViewSwitches(), nodeBreakerView); + } }); } @CEntryPoint(name = "getNodeBreakerViewNodes") public static ArrayPointer getNodeBreakerViewNodes(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); - return Dataframes.createCDataframe(Dataframes.nodeBreakerViewNodes(), nodeBreakerView); + return Dataframes.createCDataframe(Dataframes.nodeBreakerViewNodes(), nodeBreakerView); + } }); } @CEntryPoint(name = "getNodeBreakerViewInternalConnections") public static ArrayPointer getNodeBreakerViewInternalConnections(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); - return Dataframes.createCDataframe(Dataframes.nodeBreakerViewInternalConnection(), nodeBreakerView); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel.NodeBreakerView nodeBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getNodeBreakerView(); + return Dataframes.createCDataframe(Dataframes.nodeBreakerViewInternalConnection(), nodeBreakerView); + } }); } @CEntryPoint(name = "getBusBreakerViewSwitches") public static PyPowsyblApiHeader.ArrayPointer getBusBreakerViewSwitches(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel.BusBreakerView busBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getBusBreakerView(); - return Dataframes.createCDataframe(Dataframes.busBreakerViewSwitches(), busBreakerView); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel.BusBreakerView busBreakerView = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)).getBusBreakerView(); + return Dataframes.createCDataframe(Dataframes.busBreakerViewSwitches(), busBreakerView); + } }); } @CEntryPoint(name = "getBusBreakerViewBuses") public static PyPowsyblApiHeader.ArrayPointer getBusBreakerViewBuses(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel voltageLevel1 = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)); - return Dataframes.createCDataframe(Dataframes.busBreakerViewBuses(), voltageLevel1); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel voltageLevel1 = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)); + return Dataframes.createCDataframe(Dataframes.busBreakerViewBuses(), voltageLevel1); + } }); } @CEntryPoint(name = "getBusBreakerViewElements") public static PyPowsyblApiHeader.ArrayPointer getBusBreakerViewElements(IsolateThread thread, ObjectHandle networkHandle, CCharPointer voltageLevel, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel voltageLevel1 = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)); - return Dataframes.createCDataframe(Dataframes.busBreakerViewElements(), voltageLevel1); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + VoltageLevel voltageLevel1 = network.getVoltageLevel(CTypeUtil.toString(voltageLevel)); + return Dataframes.createCDataframe(Dataframes.busBreakerViewElements(), voltageLevel1); + } }); } @CEntryPoint(name = "merge") public static ObjectHandle merge(IsolateThread thread, VoidPointerPointer networkHandles, int networkCount, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network[] networks = new Network[networkCount]; - for (int i = 0; i < networkCount; ++i) { - ObjectHandle networkHandle = networkHandles.read(i); - Network network = ObjectHandles.getGlobal().get(networkHandle); - networks[i] = network; + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + Network[] networks = new Network[networkCount]; + for (int i = 0; i < networkCount; ++i) { + ObjectHandle networkHandle = networkHandles.read(i); + Network network = ObjectHandles.getGlobal().get(networkHandle); + networks[i] = network; + } + return ObjectHandles.getGlobal().create(Network.merge(networks)); } - return ObjectHandles.getGlobal().create(Network.merge(networks)); }); } @CEntryPoint(name = "getSeriesMetadata") public static DataframeMetadataPointer getSeriesMetadata(IsolateThread thread, ElementType elementType, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DataframeElementType type = convert(elementType); - List seriesMetadata = NetworkDataframes.getDataframeMapper(type).getSeriesMetadata(); - return CTypeUtil.createSeriesMetadata(seriesMetadata); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframeMetadataPointer get() { + DataframeElementType type = convert(elementType); + List seriesMetadata = NetworkDataframes.getDataframeMapper(type).getSeriesMetadata(); + return CTypeUtil.createSeriesMetadata(seriesMetadata); + } }); } @CEntryPoint(name = "freeDataframeMetadata") public static void freeDataframeMetadata(IsolateThread thread, DataframeMetadataPointer metadata, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - freeDataframeMetadataContent(metadata); - UnmanagedMemory.free(metadata); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeDataframeMetadataContent(metadata); + UnmanagedMemory.free(metadata); + } }); } @@ -645,56 +755,65 @@ public static void freeDataframeMetadata(IsolateThread thread, DataframeMetadata public static DataframesMetadataPointer getCreationMetadata(IsolateThread thread, ElementType elementType, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DataframeElementType type = convert(elementType); - List> metadata = NetworkElementAdders.getAdder(type).getMetadata(); - DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); - int i = 0; - for (List dataframeMetadata : metadata) { - CTypeUtil.createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); - i++; - } + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframesMetadataPointer get() { + DataframeElementType type = convert(elementType); + List> metadata = NetworkElementAdders.getAdder(type).getMetadata(); + DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); + int i = 0; + for (List dataframeMetadata : metadata) { + CTypeUtil.createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); + i++; + } - DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); - res.setDataframesMetadata(dataframeMetadataArray); - res.setDataframesCount(metadata.size()); - return res; + DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); + res.setDataframesMetadata(dataframeMetadataArray); + res.setDataframesCount(metadata.size()); + return res; + } }); } @CEntryPoint(name = "freeDataframesMetadata") public static void freeDataframesMetadata(IsolateThread thread, DataframesMetadataPointer cMetadata, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < cMetadata.getDataframesCount(); i++) { - DataframeMetadataPointer cDataframeMetadata = cMetadata.getDataframesMetadata().addressOf(i); - freeDataframeMetadataContent(cDataframeMetadata); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < cMetadata.getDataframesCount(); i++) { + DataframeMetadataPointer cDataframeMetadata = cMetadata.getDataframesMetadata().addressOf(i); + freeDataframeMetadataContent(cDataframeMetadata); + } + UnmanagedMemory.free(cMetadata.getDataframesMetadata()); + UnmanagedMemory.free(cMetadata); } - UnmanagedMemory.free(cMetadata.getDataframesMetadata()); - UnmanagedMemory.free(cMetadata); }); } @CEntryPoint(name = "addNetworkElementProperties") public static void addNetworkElementProperties(IsolateThread thread, ObjectHandle networkHandle, DataframePointer properties, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - UpdatingDataframe propertiesDataframe = createDataframe(properties); - Objects.requireNonNull(propertiesDataframe); - Network network = ObjectHandles.getGlobal().get(networkHandle); - StringSeries idSerie = propertiesDataframe.getStrings("id"); - if (idSerie == null) { - throw new PowsyblException("id is missing"); - } - for (SeriesMetadata column : propertiesDataframe.getSeriesMetadata()) { - if (!column.isIndex() && column.getType() == SeriesDataType.STRING) { - String seriesName = column.getName(); - StringSeries columnSerie = propertiesDataframe.getStrings(seriesName); - for (int i = 0; i < propertiesDataframe.getRowCount(); i++) { - String id = idSerie.get(i); - Identifiable identifiable = network.getIdentifiable(id); - if (identifiable != null) { - identifiable.setProperty(seriesName, columnSerie.get(i)); - } else { - throw new PowsyblException(String.format("identifiable with id : %s does not exist", id)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UpdatingDataframe propertiesDataframe = createDataframe(properties); + Objects.requireNonNull(propertiesDataframe); + Network network = ObjectHandles.getGlobal().get(networkHandle); + StringSeries idSerie = propertiesDataframe.getStrings("id"); + if (idSerie == null) { + throw new PowsyblException("id is missing"); + } + for (SeriesMetadata column : propertiesDataframe.getSeriesMetadata()) { + if (!column.isIndex() && column.getType() == SeriesDataType.STRING) { + String seriesName = column.getName(); + StringSeries columnSerie = propertiesDataframe.getStrings(seriesName); + for (int i = 0; i < propertiesDataframe.getRowCount(); i++) { + String id = idSerie.get(i); + Identifiable identifiable = network.getIdentifiable(id); + if (identifiable != null) { + identifiable.setProperty(seriesName, columnSerie.get(i)); + } else { + throw new PowsyblException(String.format("identifiable with id : %s does not exist", id)); + } } } } @@ -704,11 +823,14 @@ public static void addNetworkElementProperties(IsolateThread thread, ObjectHandl @CEntryPoint(name = "removeNetworkElementProperties") public static void removeNetworkElementProperties(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer idsPointer, int idsCount, CCharPointerPointer propertiesPointer, int propertiesCount, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - List ids = CTypeUtil.toStringList(idsPointer, idsCount); - List properties = CTypeUtil.toStringList(propertiesPointer, propertiesCount); - ids.forEach(id -> properties.forEach(property -> network.getIdentifiable(id).removeProperty(property))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + List ids = CTypeUtil.toStringList(idsPointer, idsCount); + List properties = CTypeUtil.toStringList(propertiesPointer, propertiesCount); + ids.forEach(id -> properties.forEach(property -> network.getIdentifiable(id).removeProperty(property))); + } }); } @@ -739,20 +861,23 @@ private static void createSeriesMetadata(List metadata, Datafram public static void updateNetworkElementsExtensionsWithSeries(IsolateThread thread, ObjectHandle networkHandle, CCharPointer namePtr, CCharPointer tableNamePtr, DataframePointer dataframe, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - String name = CTypeUtil.toString(namePtr); - String tmpName = CTypeUtil.toString(tableNamePtr); - String tableName = tmpName.isEmpty() ? null : tmpName; - NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); - if (mapper != null) { - Network network = ObjectHandles.getGlobal().get(networkHandle); - UpdatingDataframe updatingDataframe = createDataframe(dataframe); - mapper.updateSeries(network, updatingDataframe, NetworkDataframeContext.DEFAULT); - } else { - if (tableName != null) { - throw new PowsyblException("table " + tableName + " of extension " + name + " not found"); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + String name = CTypeUtil.toString(namePtr); + String tmpName = CTypeUtil.toString(tableNamePtr); + String tableName = tmpName.isEmpty() ? null : tmpName; + NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); + if (mapper != null) { + Network network = ObjectHandles.getGlobal().get(networkHandle); + UpdatingDataframe updatingDataframe = createDataframe(dataframe); + mapper.updateSeries(network, updatingDataframe, NetworkDataframeContext.DEFAULT); + } else { + if (tableName != null) { + throw new PowsyblException("table " + tableName + " of extension " + name + " not found"); + } + throw new PowsyblException("extension " + name + " not found"); } - throw new PowsyblException("extension " + name + " not found"); } }); } @@ -762,27 +887,33 @@ public static void removeExtensions(IsolateThread thread, ObjectHandle networkHa CCharPointer namePtr, CCharPointerPointer idsPtr, int idsCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String name = CTypeUtil.toString(namePtr); - List ids = CTypeUtil.toStringList(idsPtr, idsCount); - NetworkExtensions.removeExtensions(network, name, ids); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String name = CTypeUtil.toString(namePtr); + List ids = CTypeUtil.toStringList(idsPtr, idsCount); + NetworkExtensions.removeExtensions(network, name, ids); + } }); } @CEntryPoint(name = "getExtensionSeriesMetadata") public static DataframeMetadataPointer getExtensionSeriesMetadata(IsolateThread thread, CCharPointer namePtr, CCharPointer tableNamePtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String name = CTypeUtil.toString(namePtr); - String tmpName = CTypeUtil.toString(tableNamePtr); - String tableName = tmpName.equals("") ? null : tmpName; - NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); - if (mapper != null) { - List seriesMetadata = mapper.getSeriesMetadata(); - return CTypeUtil.createSeriesMetadata(seriesMetadata); - } else { - throw new PowsyblException("extension " + name + " not found"); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframeMetadataPointer get() { + String name = CTypeUtil.toString(namePtr); + String tmpName = CTypeUtil.toString(tableNamePtr); + String tableName = tmpName.equals("") ? null : tmpName; + NetworkDataframeMapper mapper = NetworkDataframes.getExtensionDataframeMapper(name, tableName); + if (mapper != null) { + List seriesMetadata = mapper.getSeriesMetadata(); + return CTypeUtil.createSeriesMetadata(seriesMetadata); + } else { + throw new PowsyblException("extension " + name + " not found"); + } } }); } @@ -792,14 +923,17 @@ public static void createExtensions(IsolateThread thread, ObjectHandle networkHa CCharPointer namePtr, DataframeArrayPointer cDataframes, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String name = CTypeUtil.toString(namePtr); - List dataframes = new ArrayList<>(); - for (int i = 0; i < cDataframes.getDataframesCount(); i++) { - dataframes.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String name = CTypeUtil.toString(namePtr); + List dataframes = new ArrayList<>(); + for (int i = 0; i < cDataframes.getDataframesCount(); i++) { + dataframes.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + } + NetworkElementAdders.addExtensions(name, network, dataframes); } - NetworkElementAdders.addExtensions(name, network, dataframes); }); } @@ -807,66 +941,81 @@ public static void createExtensions(IsolateThread thread, ObjectHandle networkHa public static DataframesMetadataPointer getExtensionsCreationMetadata(IsolateThread thread, CCharPointer namePtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String name = CTypeUtil.toString(namePtr); - List> metadata = NetworkElementAdders.getExtensionAdder(name).getMetadata(); - DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); - int i = 0; - for (List dataframeMetadata : metadata) { - CTypeUtil.createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); - i++; - } + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframesMetadataPointer get() { + String name = CTypeUtil.toString(namePtr); + List> metadata = NetworkElementAdders.getExtensionAdder(name).getMetadata(); + DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); + int i = 0; + for (List dataframeMetadata : metadata) { + CTypeUtil.createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); + i++; + } - DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); - res.setDataframesMetadata(dataframeMetadataArray); - res.setDataframesCount(metadata.size()); - return res; + DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); + res.setDataframesMetadata(dataframeMetadataArray); + res.setDataframesCount(metadata.size()); + return res; + } }); } @CEntryPoint(name = "createImporterParametersSeriesArray") static ArrayPointer createImporterParametersSeriesArray(IsolateThread thread, CCharPointer formatPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String format = CTypeUtil.toString(formatPtr); - Importer importer = Importer.find(format); - if (importer == null) { - throw new PowsyblException("Format '" + format + "' not supported"); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String format = CTypeUtil.toString(formatPtr); + Importer importer = Importer.find(format); + if (importer == null) { + throw new PowsyblException("Format '" + format + "' not supported"); + } + return Dataframes.createCDataframe(Dataframes.importerParametersMapper(), importer); } - return Dataframes.createCDataframe(Dataframes.importerParametersMapper(), importer); }); } @CEntryPoint(name = "createExporterParametersSeriesArray") static ArrayPointer createExporterParametersSeriesArray(IsolateThread thread, CCharPointer formatPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String format = CTypeUtil.toString(formatPtr); - var exporter = Exporter.find(format); - if (exporter == null) { - throw new PowsyblException("Format '" + format + "' not supported"); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String format = CTypeUtil.toString(formatPtr); + var exporter = Exporter.find(format); + if (exporter == null) { + throw new PowsyblException("Format '" + format + "' not supported"); + } + return Dataframes.createCDataframe(Dataframes.exporterParametersMapper(), exporter); } - return Dataframes.createCDataframe(Dataframes.exporterParametersMapper(), exporter); }); } @CEntryPoint(name = "updateSwitchPosition") public static boolean updateSwitchPosition(IsolateThread thread, ObjectHandle networkHandle, CCharPointer id, boolean open, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String idStr = CTypeUtil.toString(id); - return NetworkUtil.updateSwitchPosition(network, idStr, open); + return doCatch(exceptionHandlerPtr, new BooleanSupplier() { + @Override + public boolean getAsBoolean() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String idStr = CTypeUtil.toString(id); + return NetworkUtil.updateSwitchPosition(network, idStr, open); + } }); } @CEntryPoint(name = "updateConnectableStatus") public static boolean updateConnectableStatus(IsolateThread thread, ObjectHandle networkHandle, CCharPointer id, boolean connected, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String idStr = CTypeUtil.toString(id); - return NetworkUtil.updateConnectableStatus(network, idStr, connected); + return doCatch(exceptionHandlerPtr, new BooleanSupplier() { + @Override + public boolean getAsBoolean() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String idStr = CTypeUtil.toString(id); + return NetworkUtil.updateConnectableStatus(network, idStr, connected); + } }); } @@ -892,7 +1041,9 @@ public static SldParametersPointer convertToSldParametersPointer(SldParameters p @CEntryPoint(name = "createSldParameters") public static SldParametersPointer createSldParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToSldParametersPointer(SingleLineDiagramUtil.createSldParameters())); + return doCatch(exceptionHandlerPtr, () -> { + return convertToSldParametersPointer(SingleLineDiagramUtil.createSldParameters()); + }); } public static NadParametersPointer convertToNadParametersPointer(NadParameters parameters) { @@ -922,7 +1073,9 @@ public static void copyToCNadParameters(NadParameters parameters, NadParametersP @CEntryPoint(name = "createNadParameters") public static NadParametersPointer createNadParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToNadParametersPointer(NetworkAreaDiagramUtil.createNadParameters())); + return doCatch(exceptionHandlerPtr, () -> { + return convertToNadParametersPointer(NetworkAreaDiagramUtil.createNadParameters()); + }); } public static void freeSldParametersPointer(SldParametersPointer sldParametersPtr) { @@ -932,16 +1085,22 @@ public static void freeSldParametersPointer(SldParametersPointer sldParametersPt @CEntryPoint(name = "freeSldParameters") public static void freeSldParameters(IsolateThread thread, SldParametersPointer sldParametersPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - freeSldParametersPointer(sldParametersPtr); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + freeSldParametersPointer(sldParametersPtr); + } }); } @CEntryPoint(name = "freeNadParameters") public static void freeNadParameters(IsolateThread thread, NadParametersPointer nadParametersPointer, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - UnmanagedMemory.free(nadParametersPointer); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UnmanagedMemory.free(nadParametersPointer); + } }); } @@ -996,13 +1155,16 @@ public static NadParameters convertNadParameters(NadParametersPointer nadParamet public static void writeSingleLineDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointer containerId, CCharPointer svgFile, CCharPointer metadataFile, SldParametersPointer sldParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String containerIdStr = CTypeUtil.toString(containerId); - String svgFileStr = CTypeUtil.toString(svgFile); - String metadataFileStr = metadataFile.isNonNull() ? CTypeUtil.toString(metadataFile) : null; - SldParameters sldParameters = convertSldParameters(sldParametersPtr); - SingleLineDiagramUtil.writeSvg(network, containerIdStr, svgFileStr, metadataFileStr, sldParameters); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String containerIdStr = CTypeUtil.toString(containerId); + String svgFileStr = CTypeUtil.toString(svgFile); + String metadataFileStr = metadataFile.isNonNull() ? CTypeUtil.toString(metadataFile) : null; + SldParameters sldParameters = convertSldParameters(sldParametersPtr); + SingleLineDiagramUtil.writeSvg(network, containerIdStr, svgFileStr, metadataFileStr, sldParameters); + } }); } @@ -1011,37 +1173,46 @@ public static void writeMatrixMultiSubstationSingleLineDiagramSvg(IsolateThread int substationIdCount, int substationIdRowCount, CCharPointer svgFile, CCharPointer metadataFile, SldParametersPointer sldParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String[][] matrixIds = CTypeUtil.toString2DArray(substationIdsPointer, substationIdCount, substationIdRowCount); - String svgFileStr = CTypeUtil.toString(svgFile); - String metadataFileStr = metadataFile.isNonNull() ? CTypeUtil.toString(metadataFile) : null; - SldParameters sldParameters = convertSldParameters(sldParametersPtr); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String[][] matrixIds = CTypeUtil.toString2DArray(substationIdsPointer, substationIdCount, substationIdRowCount); + String svgFileStr = CTypeUtil.toString(svgFile); + String metadataFileStr = metadataFile.isNonNull() ? CTypeUtil.toString(metadataFile) : null; + SldParameters sldParameters = convertSldParameters(sldParametersPtr); - SingleLineDiagramUtil.writeMatrixMultiSubstationSvg(network, matrixIds, svgFileStr, metadataFileStr, sldParameters); + SingleLineDiagramUtil.writeMatrixMultiSubstationSvg(network, matrixIds, svgFileStr, metadataFileStr, sldParameters); + } }); } @CEntryPoint(name = "getSingleLineDiagramSvg") public static CCharPointer getSingleLineDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointer containerId, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String containerIdStr = CTypeUtil.toString(containerId); - String svg = SingleLineDiagramUtil.getSvg(network, containerIdStr); - return CTypeUtil.toCharPtr(svg); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String containerIdStr = CTypeUtil.toString(containerId); + String svg = SingleLineDiagramUtil.getSvg(network, containerIdStr); + return CTypeUtil.toCharPtr(svg); + } }); } @CEntryPoint(name = "getSingleLineDiagramSvgAndMetadata") public static ArrayPointer getSingleLineDiagramSvgAndMetadata(IsolateThread thread, ObjectHandle networkHandle, CCharPointer containerId, SldParametersPointer sldParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String containerIdStr = CTypeUtil.toString(containerId); - SldParameters sldParameters = convertSldParameters(sldParametersPtr); - List svgAndMeta = SingleLineDiagramUtil.getSvgAndMetadata(network, containerIdStr, sldParameters); - return createCharPtrArray(svgAndMeta); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String containerIdStr = CTypeUtil.toString(containerId); + SldParameters sldParameters = convertSldParameters(sldParametersPtr); + List svgAndMeta = SingleLineDiagramUtil.getSvgAndMetadata(network, containerIdStr, sldParameters); + return createCharPtrArray(svgAndMeta); + } }); } @@ -1049,18 +1220,23 @@ public static ArrayPointer getSingleLineDiagramSvgAndMetada public static ArrayPointer getMatrixMultiSubstationSvgAndMetadata(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer substationIdsPointer, int substationIdCount, int substationIdRowCount, SldParametersPointer sldParametersPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String[][] matrixIds = CTypeUtil.toString2DArray(substationIdsPointer, substationIdCount, substationIdRowCount); - SldParameters sldParameters = convertSldParameters(sldParametersPtr); - List svgAndMeta = SingleLineDiagramUtil.getMatrixMultiSubstationSvgAndMetadata(network, matrixIds, sldParameters); - return createCharPtrArray(svgAndMeta); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String[][] matrixIds = CTypeUtil.toString2DArray(substationIdsPointer, substationIdCount, substationIdRowCount); + SldParameters sldParameters = convertSldParameters(sldParametersPtr); + List svgAndMeta = SingleLineDiagramUtil.getMatrixMultiSubstationSvgAndMetadata(network, matrixIds, sldParameters); + return createCharPtrArray(svgAndMeta); + } }); } @CEntryPoint(name = "getSingleLineDiagramComponentLibraryNames") public static PyPowsyblApiHeader.ArrayPointer getSingleLineDiagramComponentLibraryNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(SingleLineDiagramUtil.getComponentLibraryNames())); + return doCatch(exceptionHandlerPtr, () -> { + return createCharPtrArray(SingleLineDiagramUtil.getComponentLibraryNames()); + }); } @CEntryPoint(name = "writeNetworkAreaDiagramSvg") @@ -1068,12 +1244,15 @@ public static void writeNetworkAreaDiagramSvg(IsolateThread thread, ObjectHandle CCharPointerPointer voltageLevelIdsPointer, int voltageLevelIdCount, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, NadParametersPointer nadParametersPointer, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String svgFileStr = CTypeUtil.toString(svgFile); - List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); - NadParameters nadParameters = convertNadParameters(nadParametersPointer, network); - NetworkAreaDiagramUtil.writeSvg(network, voltageLevelIds, depth, svgFileStr, highNominalVoltageBound, lowNominalVoltageBound, nadParameters); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String svgFileStr = CTypeUtil.toString(svgFile); + List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); + NadParameters nadParameters = convertNadParameters(nadParametersPointer, network); + NetworkAreaDiagramUtil.writeSvg(network, voltageLevelIds, depth, svgFileStr, highNominalVoltageBound, lowNominalVoltageBound, nadParameters); + } }); } @@ -1081,22 +1260,28 @@ public static void writeNetworkAreaDiagramSvg(IsolateThread thread, ObjectHandle public static CCharPointer getNetworkAreaDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer voltageLevelIdsPointer, int voltageLevelIdCount, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, NadParametersPointer nadParametersPointer, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); - NadParameters nadParameters = convertNadParameters(nadParametersPointer, network); - String svg = NetworkAreaDiagramUtil.getSvg(network, voltageLevelIds, depth, highNominalVoltageBound, lowNominalVoltageBound, nadParameters); - return CTypeUtil.toCharPtr(svg); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); + NadParameters nadParameters = convertNadParameters(nadParametersPointer, network); + String svg = NetworkAreaDiagramUtil.getSvg(network, voltageLevelIds, depth, highNominalVoltageBound, lowNominalVoltageBound, nadParameters); + return CTypeUtil.toCharPtr(svg); + } }); } @CEntryPoint(name = "getNetworkAreaDiagramDisplayedVoltageLevels") public static PyPowsyblApiHeader.ArrayPointer getNetworkAreaDiagramDisplayedVoltageLevels(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer voltageLevelIdsPointer, int voltageLevelIdCount, int depth, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); - return createCharPtrArray(NetworkAreaDiagramUtil.getDisplayedVoltageLevels(network, voltageLevelIds, depth)); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + List voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount); + return createCharPtrArray(NetworkAreaDiagramUtil.getDisplayedVoltageLevels(network, voltageLevelIds, depth)); + } }); } @@ -1128,9 +1313,12 @@ public static ValidationLevelType validate(IsolateThread thread, ObjectHandle ne public static void setMinValidationLevel(IsolateThread thread, ObjectHandle networkHandle, ValidationLevelType levelType, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - network.setMinimumAcceptableValidationLevel(Util.convert(levelType)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + network.setMinimumAcceptableValidationLevel(Util.convert(levelType)); + } }); } @@ -1139,42 +1327,51 @@ public static DataframesMetadataPointer getModificationMetadataWithElementType(I NetworkModificationType networkModificationType, ElementType elementType, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DataframeNetworkModificationType modificationType = convert(networkModificationType); - DataframeElementType type = convert(elementType); - List> metadata = NetworkModifications.getModification(modificationType).getMetadata(type); - DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); - int i = 0; - for (List dataframeMetadata : metadata) { - createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); - i++; + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframesMetadataPointer get() { + DataframeNetworkModificationType modificationType = convert(networkModificationType); + DataframeElementType type = convert(elementType); + List> metadata = NetworkModifications.getModification(modificationType).getMetadata(type); + DataframeMetadataPointer dataframeMetadataArray = UnmanagedMemory.calloc(metadata.size() * SizeOf.get(DataframeMetadataPointer.class)); + int i = 0; + for (List dataframeMetadata : metadata) { + createSeriesMetadata(dataframeMetadata, dataframeMetadataArray.addressOf(i)); + i++; + } + DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); + res.setDataframesMetadata(dataframeMetadataArray); + res.setDataframesCount(metadata.size()); + return res; } - DataframesMetadataPointer res = UnmanagedMemory.calloc(SizeOf.get(DataframesMetadataPointer.class)); - res.setDataframesMetadata(dataframeMetadataArray); - res.setDataframesCount(metadata.size()); - return res; }); } @CEntryPoint(name = "getSubNetwork") public static ObjectHandle getSubNetwork(IsolateThread thread, ObjectHandle networkHandle, CCharPointer subNetworkId, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String subNetworkIdStr = CTypeUtil.toString(subNetworkId); - Network subnetwork = network.getSubnetwork(subNetworkIdStr); - if (subnetwork == null) { - throw new PowsyblException("Sub network '" + subNetworkIdStr + "' not found"); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String subNetworkIdStr = CTypeUtil.toString(subNetworkId); + Network subnetwork = network.getSubnetwork(subNetworkIdStr); + if (subnetwork == null) { + throw new PowsyblException("Sub network '" + subNetworkIdStr + "' not found"); + } + return ObjectHandles.getGlobal().create(subnetwork); } - return ObjectHandles.getGlobal().create(subnetwork); }); } @CEntryPoint(name = "detachSubNetwork") public static ObjectHandle detachSubNetwork(IsolateThread thread, ObjectHandle subNetworkHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network subNetwork = ObjectHandles.getGlobal().get(subNetworkHandle); - Network detachNetwork = subNetwork.detach(); - return ObjectHandles.getGlobal().create(detachNetwork); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + Network subNetwork = ObjectHandles.getGlobal().get(subNetworkHandle); + Network detachNetwork = subNetwork.detach(); + return ObjectHandles.getGlobal().create(detachNetwork); + } }); } } diff --git a/java/src/main/java/com/powsybl/python/network/NetworkModificationsCFunctions.java b/java/src/main/java/com/powsybl/python/network/NetworkModificationsCFunctions.java index 953ae1284f..5431529ece 100644 --- a/java/src/main/java/com/powsybl/python/network/NetworkModificationsCFunctions.java +++ b/java/src/main/java/com/powsybl/python/network/NetworkModificationsCFunctions.java @@ -22,6 +22,9 @@ import com.powsybl.python.commons.CTypeUtil; import com.powsybl.python.commons.Directives; import com.powsybl.python.commons.PyPowsyblApiHeader; +import com.powsybl.python.commons.PyPowsyblApiHeader.ArrayPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.DataframeMetadataPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.SeriesPointer; import org.apache.commons.lang3.Range; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.ObjectHandle; @@ -32,6 +35,7 @@ import org.graalvm.nativeimage.c.type.CCharPointerPointer; import org.graalvm.nativeimage.c.type.CIntPointer; +import java.io.IOException; import java.util.*; import static com.powsybl.iidm.modification.topology.TopologyModificationUtils.*; @@ -44,6 +48,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class NetworkModificationsCFunctions { @@ -51,38 +56,44 @@ private NetworkModificationsCFunctions() { } @CEntryPoint(name = "getConnectablesOrderPositions") - public static PyPowsyblApiHeader.ArrayPointer getConnectablesOrderPositions(IsolateThread thread, ObjectHandle networkHandle, - CCharPointer voltageLevelId, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String voltageLevelIdStr = CTypeUtil.toString(voltageLevelId); - Network network = ObjectHandles.getGlobal().get(networkHandle); + public static ArrayPointer getConnectablesOrderPositions(IsolateThread thread, ObjectHandle networkHandle, + CCharPointer voltageLevelId, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() throws IOException { + String voltageLevelIdStr = CTypeUtil.toString(voltageLevelId); + Network network = ObjectHandles.getGlobal().get(networkHandle); - VoltageLevel voltageLevel = network.getVoltageLevel(voltageLevelIdStr); - Map> feederPositionsOrders = getFeedersByConnectable(voltageLevel); - return Dataframes.createCDataframe(Dataframes.feederMapMapper(), feederPositionsOrders); + VoltageLevel voltageLevel = network.getVoltageLevel(voltageLevelIdStr); + Map> feederPositionsOrders = getFeedersByConnectable(voltageLevel); + return Dataframes.createCDataframe(Dataframes.feederMapMapper(), feederPositionsOrders); + } }); } @CEntryPoint(name = "getUnusedConnectableOrderPositions") - public static PyPowsyblApiHeader.ArrayPointer getUnusedConnectableOrderPositions(IsolateThread thread, ObjectHandle networkHandle, + public static ArrayPointer getUnusedConnectableOrderPositions(IsolateThread thread, ObjectHandle networkHandle, CCharPointer busbarSectionId, CCharPointer beforeOrAfter, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - String busbarSectionIdStr = CTypeUtil.toString(busbarSectionId); - BusbarSection busbarSection = network.getBusbarSection(busbarSectionIdStr); - Optional> positionsOrders; - if (CTypeUtil.toString(beforeOrAfter).equals("BEFORE")) { - positionsOrders = getUnusedOrderPositionsBefore(busbarSection); - } else { - positionsOrders = getUnusedOrderPositionsAfter(busbarSection); - } - if (positionsOrders.isPresent()) { - int max = positionsOrders.get().getMaximum(); - int min = positionsOrders.get().getMinimum(); - return createIntegerArray(Arrays.asList(min, max)); - } else { - return createIntegerArray(Collections.emptyList()); + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() throws IOException { + Network network = ObjectHandles.getGlobal().get(networkHandle); + String busbarSectionIdStr = CTypeUtil.toString(busbarSectionId); + BusbarSection busbarSection = network.getBusbarSection(busbarSectionIdStr); + Optional> positionsOrders; + if (CTypeUtil.toString(beforeOrAfter).equals("BEFORE")) { + positionsOrders = getUnusedOrderPositionsBefore(busbarSection); + } else { + positionsOrders = getUnusedOrderPositionsAfter(busbarSection); + } + if (positionsOrders.isPresent()) { + int max = positionsOrders.get().getMaximum(); + int min = positionsOrders.get().getMinimum(); + return createIntegerArray(Arrays.asList(min, max)); + } else { + return createIntegerArray(Collections.emptyList()); + } } }); } @@ -93,26 +104,32 @@ public static void createNetworkModification(IsolateThread thread, ObjectHandle PyPowsyblApiHeader.NetworkModificationType networkModificationType, boolean throwException, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - List dfs = new ArrayList<>(); - for (int i = 0; i < cDataframes.getDataframesCount(); i++) { - dfs.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + List dfs = new ArrayList<>(); + for (int i = 0; i < cDataframes.getDataframesCount(); i++) { + dfs.add(createDataframe(cDataframes.getDataframes().addressOf(i))); + } + DataframeNetworkModificationType type = convert(networkModificationType); + NetworkModifications.applyModification(type, network, dfs, throwException, reportNode); } - DataframeNetworkModificationType type = convert(networkModificationType); - NetworkModifications.applyModification(type, network, dfs, throwException, reportNode); }); } @CEntryPoint(name = "getModificationMetadata") - public static PyPowsyblApiHeader.DataframeMetadataPointer getModificationMetadata(IsolateThread thread, + public static DataframeMetadataPointer getModificationMetadata(IsolateThread thread, PyPowsyblApiHeader.NetworkModificationType networkModificationType, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - DataframeNetworkModificationType type = convert(networkModificationType); - List metadata = NetworkModifications.getModification(type).getMetadata(); - return CTypeUtil.createSeriesMetadata(metadata); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframeMetadataPointer get() throws IOException { + DataframeNetworkModificationType type = convert(networkModificationType); + List metadata = NetworkModifications.getModification(type).getMetadata(); + return CTypeUtil.createSeriesMetadata(metadata); + } }); } @@ -123,27 +140,30 @@ public static void removeElementsModification(IsolateThread thread, ObjectHandle PyPowsyblApiHeader.RemoveModificationType removeModificationType, boolean throwException, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - List ids = toStringList(connectableIdsPtrPtr, connectableIdsCount); - Network network = ObjectHandles.getGlobal().get(networkHandle); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_FEEDER) { - ids.forEach(id -> new RemoveFeederBayBuilder().withConnectableId(id).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode)); - } else if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_VOLTAGE_LEVEL) { - ids.forEach(id -> new RemoveVoltageLevelBuilder().withVoltageLevelId(id).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode)); - } else if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_HVDC_LINE) { - UpdatingDataframe extraDataDf = createDataframe(extraDataDfPtr); - ids.forEach(hvdcId -> { - List shuntCompensatorList = Collections.emptyList(); - if (extraDataDf != null) { - Optional shuntCompensatorOptional = extraDataDf.getStringValue(hvdcId, 0); - String shuntCompensator = shuntCompensatorOptional.isEmpty() || shuntCompensatorOptional.get().isEmpty() ? "," : - shuntCompensatorOptional.get(); - shuntCompensatorList = Arrays.stream(shuntCompensator.split(",")).toList(); - } - new RemoveHvdcLineBuilder().withHvdcLineId(hvdcId).withShuntCompensatorIds(shuntCompensatorList).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + List ids = toStringList(connectableIdsPtrPtr, connectableIdsCount); + Network network = ObjectHandles.getGlobal().get(networkHandle); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_FEEDER) { + ids.forEach(id -> new RemoveFeederBayBuilder().withConnectableId(id).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode)); + } else if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_VOLTAGE_LEVEL) { + ids.forEach(id -> new RemoveVoltageLevelBuilder().withVoltageLevelId(id).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode)); + } else if (removeModificationType == PyPowsyblApiHeader.RemoveModificationType.REMOVE_HVDC_LINE) { + UpdatingDataframe extraDataDf = createDataframe(extraDataDfPtr); + ids.forEach(hvdcId -> { + List shuntCompensatorList = Collections.emptyList(); + if (extraDataDf != null) { + Optional shuntCompensatorOptional = extraDataDf.getStringValue(hvdcId, 0); + String shuntCompensator = shuntCompensatorOptional.isEmpty() || shuntCompensatorOptional.get().isEmpty() ? "," : + shuntCompensatorOptional.get(); + shuntCompensatorList = Arrays.stream(shuntCompensator.split(",")).toList(); + } + new RemoveHvdcLineBuilder().withHvdcLineId(hvdcId).withShuntCompensatorIds(shuntCompensatorList).build().apply(network, throwException, reportNode == null ? ReportNode.NO_OP : reportNode); - }); + }); + } } }); } diff --git a/java/src/main/java/com/powsybl/python/report/ReportCFunctions.java b/java/src/main/java/com/powsybl/python/report/ReportCFunctions.java index 2860e41861..d99325febd 100644 --- a/java/src/main/java/com/powsybl/python/report/ReportCFunctions.java +++ b/java/src/main/java/com/powsybl/python/report/ReportCFunctions.java @@ -13,6 +13,7 @@ import com.powsybl.python.commons.CTypeUtil; import com.powsybl.python.commons.Directives; import com.powsybl.python.commons.PyPowsyblApiHeader; +import com.powsybl.python.commons.Util.PointerProvider; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.ObjectHandle; import org.graalvm.nativeimage.ObjectHandles; @@ -29,6 +30,7 @@ /** * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class ReportCFunctions { @@ -37,38 +39,47 @@ private ReportCFunctions() { @CEntryPoint(name = "createReportNode") public static ObjectHandle createReportNode(IsolateThread thread, CCharPointer taskKeyPtr, CCharPointer defaultNamePtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String taskKey = CTypeUtil.toString(taskKeyPtr); - String defaultName = CTypeUtil.toString(defaultNamePtr); - ReportNode reportNode = ReportNode.newRootReportNode() - .withMessageTemplate(taskKey, defaultName) - .build(); - return ObjectHandles.getGlobal().create(reportNode); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + String taskKey = CTypeUtil.toString(taskKeyPtr); + String defaultName = CTypeUtil.toString(defaultNamePtr); + ReportNode reportNode = ReportNode.newRootReportNode() + .withMessageTemplate(taskKey, defaultName) + .build(); + return ObjectHandles.getGlobal().create(reportNode); + } }); } @CEntryPoint(name = "printReport") public static CCharPointer printReport(IsolateThread thread, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - StringWriter reportNodeOut = new StringWriter(); - reportNode.print(reportNodeOut); - return CTypeUtil.toCharPtr(reportNodeOut.toString()); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() throws IOException { + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + StringWriter reportNodeOut = new StringWriter(); + reportNode.print(reportNodeOut); + return CTypeUtil.toCharPtr(reportNodeOut.toString()); + } }); } @CEntryPoint(name = "jsonReport") public static CCharPointer jsonReport(IsolateThread thread, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - StringWriter reportNodeOut = new StringWriter(); - ObjectMapper objectMapper = new ObjectMapper().registerModule(new ReportNodeJsonModule()); - try { - objectMapper.writerWithDefaultPrettyPrinter().writeValue(reportNodeOut, reportNode); - } catch (IOException e) { - throw new UncheckedIOException(e); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + StringWriter reportNodeOut = new StringWriter(); + ObjectMapper objectMapper = new ObjectMapper().registerModule(new ReportNodeJsonModule()); + try { + objectMapper.writerWithDefaultPrettyPrinter().writeValue(reportNodeOut, reportNode); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return CTypeUtil.toCharPtr(reportNodeOut.toString()); } - return CTypeUtil.toCharPtr(reportNodeOut.toString()); }); } } diff --git a/java/src/main/java/com/powsybl/python/security/SecurityAnalysisCFunctions.java b/java/src/main/java/com/powsybl/python/security/SecurityAnalysisCFunctions.java index 87f150ded6..be3d047f33 100644 --- a/java/src/main/java/com/powsybl/python/security/SecurityAnalysisCFunctions.java +++ b/java/src/main/java/com/powsybl/python/security/SecurityAnalysisCFunctions.java @@ -13,12 +13,13 @@ import com.powsybl.contingency.ContingencyContext; import com.powsybl.iidm.network.Network; import com.powsybl.python.commons.*; -import com.powsybl.python.commons.PyPowsyblApiHeader.SecurityAnalysisParametersPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.*; import com.powsybl.python.contingency.ContingencyContainer; import com.powsybl.python.loadflow.LoadFlowCFunctions; import com.powsybl.python.loadflow.LoadFlowCUtils; import com.powsybl.python.network.Dataframes; import com.powsybl.security.*; +import com.powsybl.security.LimitViolationType; import com.powsybl.security.condition.*; import com.powsybl.security.monitor.StateMonitor; import com.powsybl.security.results.OperatorStrategyResult; @@ -53,6 +54,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class SecurityAnalysisCFunctions { @@ -64,20 +66,34 @@ private static Logger logger() { } @CEntryPoint(name = "getSecurityAnalysisProviderNames") - public static PyPowsyblApiHeader.ArrayPointer getSecurityAnalysisProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(SecurityAnalysisProvider.findAll() - .stream().map(SecurityAnalysisProvider::getName).toList())); + public static ArrayPointer getSecurityAnalysisProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(SecurityAnalysisProvider.findAll() + .stream().map(SecurityAnalysisProvider::getName).toList()); + } + }); } @CEntryPoint(name = "setDefaultSecurityAnalysisProvider") public static void setDefaultSecurityAnalysisProvider(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> - PyPowsyblConfiguration.setDefaultSecurityAnalysisProvider(CTypeUtil.toString(provider))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PyPowsyblConfiguration.setDefaultSecurityAnalysisProvider(CTypeUtil.toString(provider)); + } + }); } @CEntryPoint(name = "getDefaultSecurityAnalysisProvider") public static CCharPointer getDefaultSecurityAnalysisProvider(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultSecurityAnalysisProvider())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + return CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultSecurityAnalysisProvider()); + } + }); } @CEntryPoint(name = "addMonitoredElements") @@ -87,56 +103,80 @@ public static void addMonitoredElements(IsolateThread thread, ObjectHandle secur CCharPointerPointer threeWindingsTransformerIds, int threeWindingsTransformerIdsCount, CCharPointerPointer contingencyIds, int contingencyIdsCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - List contingencies = toStringList(contingencyIds, contingencyIdsCount); - contingencies.forEach(contingency -> analysisContext.addMonitor(new StateMonitor(new ContingencyContext(contingency.isEmpty() ? null : contingency, convert(contingencyContextType)), - Set.copyOf(toStringList(branchIds, branchIdsCount)), Set.copyOf(toStringList(voltageLevelIds, voltageLevelIdCount)), - Set.copyOf(toStringList(threeWindingsTransformerIds, threeWindingsTransformerIdsCount))))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + List contingencies = toStringList(contingencyIds, contingencyIdsCount); + Set branchIdsJava = Set.copyOf(toStringList(branchIds, branchIdsCount)); + Set voltageLevelIdsJava = Set.copyOf(toStringList(voltageLevelIds, voltageLevelIdCount)); + Set threeWindingsTransformerIdsJava = Set.copyOf(toStringList(threeWindingsTransformerIds, threeWindingsTransformerIdsCount)); + contingencies.forEach(contingency -> { + analysisContext.addMonitor(new StateMonitor(new ContingencyContext(contingency.isEmpty() ? null : contingency, convert(contingencyContextType)), + branchIdsJava, voltageLevelIdsJava, threeWindingsTransformerIdsJava)); + }); + } }); } @CEntryPoint(name = "getBranchResults") - public static PyPowsyblApiHeader.ArrayPointer getBranchResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); - return Dataframes.createCDataframe(Dataframes.branchResultsMapper(), result); + public static ArrayPointer getBranchResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); + return Dataframes.createCDataframe(Dataframes.branchResultsMapper(), result); + } }); } @CEntryPoint(name = "getBusResults") - public static PyPowsyblApiHeader.ArrayPointer getBusResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); - return Dataframes.createCDataframe(Dataframes.busResultsMapper(), result); + public static ArrayPointer getBusResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); + return Dataframes.createCDataframe(Dataframes.busResultsMapper(), result); + } }); } @CEntryPoint(name = "getThreeWindingsTransformerResults") - public static PyPowsyblApiHeader.ArrayPointer getThreeWindingsTransformerResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); - return Dataframes.createCDataframe(Dataframes.threeWindingsTransformerResultsMapper(), result); + public static ArrayPointer getThreeWindingsTransformerResults(IsolateThread thread, ObjectHandle securityAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResult); + return Dataframes.createCDataframe(Dataframes.threeWindingsTransformerResultsMapper(), result); + } }); } @CEntryPoint(name = "createSecurityAnalysis") public static ObjectHandle createSecurityAnalysis(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new SecurityAnalysisContext())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + return ObjectHandles.getGlobal().create(new SecurityAnalysisContext()); + } + }); } @CEntryPoint(name = "addContingency") public static void addContingency(IsolateThread thread, ObjectHandle contingencyContainerHandle, CCharPointer contingencyIdPtr, CCharPointerPointer elementIdPtrPtr, int elementCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - ContingencyContainer contingencyContainer = ObjectHandles.getGlobal().get(contingencyContainerHandle); - String contingencyId = CTypeUtil.toString(contingencyIdPtr); - List elementIds = toStringList(elementIdPtrPtr, elementCount); - contingencyContainer.addContingency(contingencyId, elementIds); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + ContingencyContainer contingencyContainer = ObjectHandles.getGlobal().get(contingencyContainerHandle); + String contingencyId = CTypeUtil.toString(contingencyIdPtr); + List elementIds = toStringList(elementIdPtrPtr, elementCount); + contingencyContainer.addContingency(contingencyId, elementIds); + } }); } - private static void setPostContingencyResultInSecurityAnalysisResultPointer(PyPowsyblApiHeader.PostContingencyResultPointer contingencyPtr, PostContingencyResult postContingencyResult) { + private static void setPostContingencyResultInSecurityAnalysisResultPointer(PostContingencyResultPointer contingencyPtr, PostContingencyResult postContingencyResult) { contingencyPtr.setContingencyId(CTypeUtil.toCharPtr(postContingencyResult.getContingency().getId())); contingencyPtr.setStatus(postContingencyResult.getStatus().ordinal()); List limitViolations = postContingencyResult.getLimitViolationsResult().getLimitViolations(); @@ -146,7 +186,7 @@ private static void setPostContingencyResultInSecurityAnalysisResultPointer(PyPo contingencyPtr.limitViolations().setPtr(limitViolationPtr); } - private static void setOperatorStrategyResultInSecurityAnalysisResultPointer(PyPowsyblApiHeader.OperatorStrategyResultPointer operatorStrategyPtr, OperatorStrategyResult result) { + private static void setOperatorStrategyResultInSecurityAnalysisResultPointer(OperatorStrategyResultPointer operatorStrategyPtr, OperatorStrategyResult result) { operatorStrategyPtr.setOperatorStrategyId(CTypeUtil.toCharPtr(result.getOperatorStrategy().getId())); operatorStrategyPtr.setStatus(result.getStatus().ordinal()); List limitViolations = result.getLimitViolationsResult().getLimitViolations(); @@ -156,7 +196,7 @@ private static void setOperatorStrategyResultInSecurityAnalysisResultPointer(PyP operatorStrategyPtr.limitViolations().setPtr(limitViolationPtr); } - private static void setPreContingencyResultInSecurityAnalysisResultPointer(PyPowsyblApiHeader.PreContingencyResultPointer contingencyPtr, PreContingencyResult preContingencyResult) { + private static void setPreContingencyResultInSecurityAnalysisResultPointer(PreContingencyResultPointer contingencyPtr, PreContingencyResult preContingencyResult) { contingencyPtr.setStatus(preContingencyResult.getStatus().ordinal()); List limitViolations = preContingencyResult.getLimitViolationsResult().getLimitViolations(); PyPowsyblApiHeader.LimitViolationPointer limitViolationPtr = UnmanagedMemory.calloc(limitViolations.size() * SizeOf.get(PyPowsyblApiHeader.LimitViolationPointer.class)); @@ -181,141 +221,162 @@ private static void createLimitViolationPtr(PyPowsyblApiHeader.LimitViolationPoi } } - private static PyPowsyblApiHeader.PreContingencyResultPointer createPreContingencyResultArrayPointer(SecurityAnalysisResult result) { - PyPowsyblApiHeader.PreContingencyResultPointer contingencyPtr = UnmanagedMemory.calloc(SizeOf.get(PyPowsyblApiHeader.PreContingencyResultPointer.class)); + private static PreContingencyResultPointer createPreContingencyResultArrayPointer(SecurityAnalysisResult result) { + PreContingencyResultPointer contingencyPtr = UnmanagedMemory.calloc(SizeOf.get(PreContingencyResultPointer.class)); setPreContingencyResultInSecurityAnalysisResultPointer(contingencyPtr, result.getPreContingencyResult()); return contingencyPtr; } - private static PyPowsyblApiHeader.ArrayPointer createPostContingencyResultArrayPointer(SecurityAnalysisResult result) { + private static ArrayPointer createPostContingencyResultArrayPointer(SecurityAnalysisResult result) { int resultCount = result.getPostContingencyResults().size(); // + 1 for pre-contingency result - PyPowsyblApiHeader.PostContingencyResultPointer contingencyPtr = UnmanagedMemory.calloc(resultCount * SizeOf.get(PyPowsyblApiHeader.PostContingencyResultPointer.class)); + PostContingencyResultPointer contingencyPtr = UnmanagedMemory.calloc(resultCount * SizeOf.get(PostContingencyResultPointer.class)); for (int i = 0; i < result.getPostContingencyResults().size(); i++) { PostContingencyResult postContingencyResult = result.getPostContingencyResults().get(i); - PyPowsyblApiHeader.PostContingencyResultPointer contingencyPtrPlus = contingencyPtr.addressOf(i); + PostContingencyResultPointer contingencyPtrPlus = contingencyPtr.addressOf(i); setPostContingencyResultInSecurityAnalysisResultPointer(contingencyPtrPlus, postContingencyResult); } return allocArrayPointer(contingencyPtr, resultCount); } - private static PyPowsyblApiHeader.ArrayPointer createOperatorStrategyResultsArrayPointer(SecurityAnalysisResult result) { + private static ArrayPointer createOperatorStrategyResultsArrayPointer(SecurityAnalysisResult result) { int resultCount = result.getOperatorStrategyResults().size(); - PyPowsyblApiHeader.OperatorStrategyResultPointer strategyPtr = UnmanagedMemory.calloc(resultCount * SizeOf.get(PyPowsyblApiHeader.OperatorStrategyResultPointer.class)); + OperatorStrategyResultPointer strategyPtr = UnmanagedMemory.calloc(resultCount * SizeOf.get(OperatorStrategyResultPointer.class)); for (int i = 0; i < result.getOperatorStrategyResults().size(); i++) { OperatorStrategyResult resultOp = result.getOperatorStrategyResults().get(i); - PyPowsyblApiHeader.OperatorStrategyResultPointer operatorStrategyPlus = strategyPtr.addressOf(i); + OperatorStrategyResultPointer operatorStrategyPlus = strategyPtr.addressOf(i); setOperatorStrategyResultInSecurityAnalysisResultPointer(operatorStrategyPlus, resultOp); } return allocArrayPointer(strategyPtr, resultCount); } - private static SecurityAnalysisProvider getProvider(String name) { - String actualName = name.isEmpty() ? PyPowsyblConfiguration.getDefaultSecurityAnalysisProvider() : name; - return SecurityAnalysisProvider.findAll().stream() - .filter(provider -> provider.getName().equals(actualName)) - .findFirst() - .orElseThrow(() -> new PowsyblException("No security analysis provider for name '" + actualName + "'")); - } - @CEntryPoint(name = "runSecurityAnalysis") public static ObjectHandle runSecurityAnalysis(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, ObjectHandle networkHandle, SecurityAnalysisParametersPointer securityAnalysisParametersPointer, CCharPointer providerName, boolean dc, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - SecurityAnalysisProvider provider = getProvider(CTypeUtil.toString(providerName)); - logger().info("Security analysis provider used for security analysis is : {}", provider.getName()); - SecurityAnalysisParameters securityAnalysisParameters = SecurityAnalysisCUtils.createSecurityAnalysisParameters(dc, securityAnalysisParametersPointer, provider); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - SecurityAnalysisResult result = analysisContext.run(network, securityAnalysisParameters, provider.getName(), reportNode); - return ObjectHandles.getGlobal().create(result); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + SecurityAnalysisProvider provider = SecurityAnalysisCUtils.getSecurityAnalysisProvider(CTypeUtil.toString(providerName)); + logger().info("Security analysis provider used for security analysis is : {}", provider.getName()); + SecurityAnalysisParameters securityAnalysisParameters = SecurityAnalysisCUtils.createSecurityAnalysisParameters(dc, securityAnalysisParametersPointer, provider); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + SecurityAnalysisResult result = analysisContext.run(network, securityAnalysisParameters, provider.getName(), reportNode); + return ObjectHandles.getGlobal().create(result); + } }); } @CEntryPoint(name = "getPostContingencyResults") - public static PyPowsyblApiHeader.ArrayPointer getPostContingencyResults(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); - return createPostContingencyResultArrayPointer(result); + public static ArrayPointer getPostContingencyResults(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); + return createPostContingencyResultArrayPointer(result); + } }); } @CEntryPoint(name = "getOperatorStrategyResults") - public static PyPowsyblApiHeader.ArrayPointer getOperatorStrategyResults(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); - return createOperatorStrategyResultsArrayPointer(result); + public static ArrayPointer getOperatorStrategyResults(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); + return createOperatorStrategyResultsArrayPointer(result); + } }); } @CEntryPoint(name = "getPreContingencyResult") - public static PyPowsyblApiHeader.PreContingencyResultPointer getPreContingencyResult(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); - return createPreContingencyResultArrayPointer(result); + public static PreContingencyResultPointer getPreContingencyResult(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public PreContingencyResultPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); + return createPreContingencyResultArrayPointer(result); + } }); } @CEntryPoint(name = "getLimitViolations") - public static PyPowsyblApiHeader.ArrayPointer getLimitViolations(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); - return Dataframes.createCDataframe(Dataframes.limitViolationsMapper(), result); + public static ArrayPointer getLimitViolations(IsolateThread thread, ObjectHandle securityAnalysisResultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + SecurityAnalysisResult result = ObjectHandles.getGlobal().get(securityAnalysisResultHandle); + return Dataframes.createCDataframe(Dataframes.limitViolationsMapper(), result); + } }); } @CEntryPoint(name = "freeContingencyResultArrayPointer") - public static void freeContingencyResultArrayPointer(IsolateThread thread, PyPowsyblApiHeader.ArrayPointer contingencyResultArrayPtr, + public static void freeContingencyResultArrayPointer(IsolateThread thread, ArrayPointer contingencyResultArrayPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < contingencyResultArrayPtr.getLength(); i++) { - PyPowsyblApiHeader.PostContingencyResultPointer contingencyResultPtrPlus = contingencyResultArrayPtr.getPtr().addressOf(i); - UnmanagedMemory.free(contingencyResultPtrPlus.getContingencyId()); - for (int l = 0; l < contingencyResultPtrPlus.limitViolations().getLength(); l++) { - PyPowsyblApiHeader.LimitViolationPointer violation = contingencyResultPtrPlus.limitViolations().getPtr().addressOf(l); - UnmanagedMemory.free(violation.getSubjectId()); - UnmanagedMemory.free(violation.getSubjectName()); - UnmanagedMemory.free(violation.getLimitName()); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < contingencyResultArrayPtr.getLength(); i++) { + PostContingencyResultPointer contingencyResultPtrPlus = contingencyResultArrayPtr.getPtr().addressOf(i); + UnmanagedMemory.free(contingencyResultPtrPlus.getContingencyId()); + for (int l = 0; l < contingencyResultPtrPlus.limitViolations().getLength(); l++) { + PyPowsyblApiHeader.LimitViolationPointer violation = contingencyResultPtrPlus.limitViolations().getPtr().addressOf(l); + UnmanagedMemory.free(violation.getSubjectId()); + UnmanagedMemory.free(violation.getSubjectName()); + UnmanagedMemory.free(violation.getLimitName()); + } + UnmanagedMemory.free(contingencyResultPtrPlus.limitViolations().getPtr()); } - UnmanagedMemory.free(contingencyResultPtrPlus.limitViolations().getPtr()); + freeArrayPointer(contingencyResultArrayPtr); } - freeArrayPointer(contingencyResultArrayPtr); }); } @CEntryPoint(name = "freeOperatorStrategyResultArrayPointer") - public static void freeOperatorStrategyResultArrayPointer(IsolateThread thread, PyPowsyblApiHeader.ArrayPointer operatorStrategyResultArrayPtr, + public static void freeOperatorStrategyResultArrayPointer(IsolateThread thread, ArrayPointer operatorStrategyResultArrayPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - for (int i = 0; i < operatorStrategyResultArrayPtr.getLength(); i++) { - PyPowsyblApiHeader.OperatorStrategyResultPointer strategyResultPtrPlus = operatorStrategyResultArrayPtr.getPtr().addressOf(i); - UnmanagedMemory.free(strategyResultPtrPlus.getOperatorStrategyId()); - for (int l = 0; l < strategyResultPtrPlus.limitViolations().getLength(); l++) { - PyPowsyblApiHeader.LimitViolationPointer violation = strategyResultPtrPlus.limitViolations().getPtr().addressOf(l); - UnmanagedMemory.free(violation.getSubjectId()); - UnmanagedMemory.free(violation.getSubjectName()); - UnmanagedMemory.free(violation.getLimitName()); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + for (int i = 0; i < operatorStrategyResultArrayPtr.getLength(); i++) { + OperatorStrategyResultPointer strategyResultPtrPlus = operatorStrategyResultArrayPtr.getPtr().addressOf(i); + UnmanagedMemory.free(strategyResultPtrPlus.getOperatorStrategyId()); + for (int l = 0; l < strategyResultPtrPlus.limitViolations().getLength(); l++) { + PyPowsyblApiHeader.LimitViolationPointer violation = strategyResultPtrPlus.limitViolations().getPtr().addressOf(l); + UnmanagedMemory.free(violation.getSubjectId()); + UnmanagedMemory.free(violation.getSubjectName()); + UnmanagedMemory.free(violation.getLimitName()); + } + UnmanagedMemory.free(strategyResultPtrPlus.limitViolations().getPtr()); } - UnmanagedMemory.free(strategyResultPtrPlus.limitViolations().getPtr()); + freeArrayPointer(operatorStrategyResultArrayPtr); } - freeArrayPointer(operatorStrategyResultArrayPtr); }); } @CEntryPoint(name = "freeSecurityAnalysisParameters") public static void freeSecurityAnalysisParameters(IsolateThread thread, SecurityAnalysisParametersPointer parameters, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - LoadFlowCUtils.freeLoadFlowParametersContent(parameters.getLoadFlowParameters()); - UnmanagedMemory.free(parameters); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + LoadFlowCUtils.freeLoadFlowParametersContent(parameters.getLoadFlowParameters()); + UnmanagedMemory.free(parameters); + } }); } @CEntryPoint(name = "createSecurityAnalysisParameters") public static SecurityAnalysisParametersPointer createSecurityAnalysisParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToSecurityAnalysisParametersPointer(SecurityAnalysisCUtils.createSecurityAnalysisParameters())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public SecurityAnalysisParametersPointer get() { + return convertToSecurityAnalysisParametersPointer(SecurityAnalysisCUtils.createSecurityAnalysisParameters()); + } + }); } private static SecurityAnalysisParametersPointer convertToSecurityAnalysisParametersPointer(SecurityAnalysisParameters parameters) { @@ -332,10 +393,13 @@ private static SecurityAnalysisParametersPointer convertToSecurityAnalysisParame } @CEntryPoint(name = "getSecurityAnalysisProviderParametersNames") - public static PyPowsyblApiHeader.ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String providerStr = CTypeUtil.toString(provider); - return Util.createCharPtrArray(SecurityAnalysisCUtils.getSecurityAnalysisProvider(providerStr).getSpecificParametersNames()); + public static ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String providerStr = CTypeUtil.toString(provider); + return Util.createCharPtrArray(SecurityAnalysisCUtils.getSecurityAnalysisProvider(providerStr).getSpecificParametersNames()); + } }); } @@ -344,16 +408,19 @@ public static void addLoadActivePowerAction(IsolateThread thread, ObjectHandle s CCharPointer actionId, CCharPointer loadId, boolean relativeValue, double activePowerValue, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String loadIdStr = CTypeUtil.toString(loadId); - LoadAction action = new LoadActionBuilder().withId(actionIdStr) - .withLoadId(loadIdStr) - .withRelativeValue(relativeValue) - .withActivePowerValue(activePowerValue) - .build(); - analysisContext.addAction(action); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String loadIdStr = CTypeUtil.toString(loadId); + LoadAction action = new LoadActionBuilder().withId(actionIdStr) + .withLoadId(loadIdStr) + .withRelativeValue(relativeValue) + .withActivePowerValue(activePowerValue) + .build(); + analysisContext.addAction(action); + } }); } @@ -362,16 +429,19 @@ public static void addLoadReactivePowerAction(IsolateThread thread, ObjectHandle CCharPointer actionId, CCharPointer loadId, boolean relativeValue, double reactivePowerValue, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String loadIdStr = CTypeUtil.toString(loadId); - LoadAction action = new LoadActionBuilder().withId(actionIdStr) - .withLoadId(loadIdStr) - .withRelativeValue(relativeValue) - .withReactivePowerValue(reactivePowerValue) - .build(); - analysisContext.addAction(action); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String loadIdStr = CTypeUtil.toString(loadId); + LoadAction action = new LoadActionBuilder().withId(actionIdStr) + .withLoadId(loadIdStr) + .withRelativeValue(relativeValue) + .withReactivePowerValue(reactivePowerValue) + .build(); + analysisContext.addAction(action); + } }); } @@ -379,15 +449,18 @@ public static void addLoadReactivePowerAction(IsolateThread thread, ObjectHandle public static void addGeneratorActivePowerAction(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, CCharPointer actionId, CCharPointer generatorId, boolean relativeValue, double activePower, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String generatorIdStr = CTypeUtil.toString(generatorId); - GeneratorActionBuilder builder = new GeneratorActionBuilder().withId(actionIdStr) - .withGeneratorId(generatorIdStr) - .withActivePowerRelativeValue(relativeValue) - .withActivePowerValue(activePower); - analysisContext.addAction(builder.build()); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String generatorIdStr = CTypeUtil.toString(generatorId); + GeneratorActionBuilder builder = new GeneratorActionBuilder().withId(actionIdStr) + .withGeneratorId(generatorIdStr) + .withActivePowerRelativeValue(relativeValue) + .withActivePowerValue(activePower); + analysisContext.addAction(builder.build()); + } }); } @@ -395,12 +468,15 @@ public static void addGeneratorActivePowerAction(IsolateThread thread, ObjectHan public static void addSwitchAction(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, CCharPointer actionId, CCharPointer switchId, boolean open, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String switchIdStr = CTypeUtil.toString(switchId); - SwitchAction action = new SwitchAction(actionIdStr, switchIdStr, open); - analysisContext.addAction(action); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String switchIdStr = CTypeUtil.toString(switchId); + SwitchAction action = new SwitchAction(actionIdStr, switchIdStr, open); + analysisContext.addAction(action); + } }); } @@ -408,12 +484,15 @@ public static void addSwitchAction(IsolateThread thread, ObjectHandle securityAn public static void addPhaseTapChangerPositionAction(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, CCharPointer actionId, CCharPointer transformerId, boolean isRelative, int tapPosition, PyPowsyblApiHeader.ThreeSideType side, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String transformerIdStr = CTypeUtil.toString(transformerId); - PhaseTapChangerTapPositionAction pstAction = new PhaseTapChangerTapPositionAction(actionIdStr, transformerIdStr, isRelative, tapPosition, Util.convert(side)); - analysisContext.addAction(pstAction); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String transformerIdStr = CTypeUtil.toString(transformerId); + PhaseTapChangerTapPositionAction pstAction = new PhaseTapChangerTapPositionAction(actionIdStr, transformerIdStr, isRelative, tapPosition, Util.convert(side)); + analysisContext.addAction(pstAction); + } }); } @@ -421,12 +500,15 @@ public static void addPhaseTapChangerPositionAction(IsolateThread thread, Object public static void addRatioTapChangerPositionAction(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, CCharPointer actionId, CCharPointer transformerId, boolean isRelative, int tapPosition, PyPowsyblApiHeader.ThreeSideType side, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String transformerIdStr = CTypeUtil.toString(transformerId); - RatioTapChangerTapPositionAction ratioTapChangerAction = new RatioTapChangerTapPositionAction(actionIdStr, transformerIdStr, isRelative, tapPosition, Util.convert(side)); - analysisContext.addAction(ratioTapChangerAction); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String transformerIdStr = CTypeUtil.toString(transformerId); + RatioTapChangerTapPositionAction ratioTapChangerAction = new RatioTapChangerTapPositionAction(actionIdStr, transformerIdStr, isRelative, tapPosition, Util.convert(side)); + analysisContext.addAction(ratioTapChangerAction); + } }); } @@ -434,16 +516,19 @@ public static void addRatioTapChangerPositionAction(IsolateThread thread, Object public static void addShuntCompensatorPositionAction(IsolateThread thread, ObjectHandle securityAnalysisContextHandle, CCharPointer actionId, CCharPointer shuntCompensatorId, int sectionCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String actionIdStr = CTypeUtil.toString(actionId); - String shuntCompensatorIdStr = CTypeUtil.toString(shuntCompensatorId); - ShuntCompensatorPositionActionBuilder builder = new ShuntCompensatorPositionActionBuilder(); - ShuntCompensatorPositionAction action = builder.withId(actionIdStr) - .withShuntCompensatorId(shuntCompensatorIdStr) - .withSectionCount(sectionCount) - .build(); - analysisContext.addAction(action); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String actionIdStr = CTypeUtil.toString(actionId); + String shuntCompensatorIdStr = CTypeUtil.toString(shuntCompensatorId); + ShuntCompensatorPositionActionBuilder builder = new ShuntCompensatorPositionActionBuilder(); + ShuntCompensatorPositionAction action = builder.withId(actionIdStr) + .withShuntCompensatorId(shuntCompensatorIdStr) + .withSectionCount(sectionCount) + .build(); + analysisContext.addAction(action); + } }); } @@ -455,17 +540,20 @@ public static void addOperatorStrategy(IsolateThread thread, ObjectHandle securi CCharPointerPointer subjectIds, int subjectIdsCount, CIntPointer violationTypes, int violationTypesCount, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); - String operationStrategyIdStr = CTypeUtil.toString(operationStrategyId); - String contingencyIdStr = CTypeUtil.toString(contingencyId); - List actionsStrList = CTypeUtil.toStringList(actions, actionCount); - - Condition condition = buildCondition(conditionType, subjectIds, subjectIdsCount, violationTypes, violationTypesCount); - - OperatorStrategy op = new OperatorStrategy(operationStrategyIdStr, - ContingencyContext.specificContingency(contingencyIdStr), condition, actionsStrList); - analysisContext.addOperatorStrategy(op); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SecurityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(securityAnalysisContextHandle); + String operationStrategyIdStr = CTypeUtil.toString(operationStrategyId); + String contingencyIdStr = CTypeUtil.toString(contingencyId); + List actionsStrList = CTypeUtil.toStringList(actions, actionCount); + + Condition condition = buildCondition(conditionType, subjectIds, subjectIdsCount, violationTypes, violationTypesCount); + + OperatorStrategy op = new OperatorStrategy(operationStrategyIdStr, + ContingencyContext.specificContingency(contingencyIdStr), condition, actionsStrList); + analysisContext.addOperatorStrategy(op); + } }); } diff --git a/java/src/main/java/com/powsybl/python/sensitivity/SensitivityAnalysisCFunctions.java b/java/src/main/java/com/powsybl/python/sensitivity/SensitivityAnalysisCFunctions.java index 9b436c8511..53068249ec 100644 --- a/java/src/main/java/com/powsybl/python/sensitivity/SensitivityAnalysisCFunctions.java +++ b/java/src/main/java/com/powsybl/python/sensitivity/SensitivityAnalysisCFunctions.java @@ -7,12 +7,13 @@ */ package com.powsybl.python.sensitivity; -import com.powsybl.commons.PowsyblException; import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.Network; import com.powsybl.python.commons.*; +import com.powsybl.python.commons.PyPowsyblApiHeader.ArrayPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.ExceptionHandlerPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.SensitivityAnalysisParametersPointer; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.loadflow.LoadFlowCFunctions; import com.powsybl.python.loadflow.LoadFlowCUtils; import com.powsybl.python.report.ReportCUtils; @@ -45,6 +46,7 @@ * * @author Sylvain Leclerc */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class SensitivityAnalysisCFunctions { @@ -56,47 +58,68 @@ private static Logger logger() { } @CEntryPoint(name = "getSensitivityAnalysisProviderNames") - public static PyPowsyblApiHeader.ArrayPointer getSensitivityAnalysisProviderNames(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(SensitivityAnalysisProvider.findAll() - .stream().map(SensitivityAnalysisProvider::getName).collect(Collectors.toList()))); + public static ArrayPointer getSensitivityAnalysisProviderNames(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(SensitivityAnalysisProvider.findAll() + .stream().map(SensitivityAnalysisProvider::getName).collect(Collectors.toList())); + } + }); } @CEntryPoint(name = "setDefaultSensitivityAnalysisProvider") public static void setDefaultSensitivityAnalysisProvider(IsolateThread thread, CCharPointer provider, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - PyPowsyblConfiguration.setDefaultSensitivityAnalysisProvider(CTypeUtil.toString(provider)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PyPowsyblConfiguration.setDefaultSensitivityAnalysisProvider(CTypeUtil.toString(provider)); + } }); } @CEntryPoint(name = "getDefaultSensitivityAnalysisProvider") public static CCharPointer getDefaultSensitivityAnalysisProvider(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultSensitivityAnalysisProvider())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + return CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultSensitivityAnalysisProvider()); + } + }); } @CEntryPoint(name = "createSensitivityAnalysis") public static ObjectHandle createSensitivityAnalysis(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new SensitivityAnalysisContext())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + return ObjectHandles.getGlobal().create(new SensitivityAnalysisContext()); + } + }); } @CEntryPoint(name = "setZones") public static void setZones(IsolateThread thread, ObjectHandle sensitivityAnalysisContextHandle, PyPowsyblApiHeader.ZonePointerPointer zonePtrPtr, int zoneCount, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); - List variableSets = new ArrayList<>(zoneCount); - for (int zoneIndex = 0; zoneIndex < zoneCount; zoneIndex++) { - PyPowsyblApiHeader.ZonePointer zonePtrI = zonePtrPtr.read(zoneIndex); - String zoneId = CTypeUtil.toString(zonePtrI.getId()); - List injectionsIds = toStringList(zonePtrI.getInjectionsIds(), zonePtrI.getLength()); - List injectionsShiftKeys = CTypeUtil.toDoubleList(zonePtrI.getinjectionsShiftKeys(), zonePtrI.getLength()); - List variables = new ArrayList<>(injectionsIds.size()); - for (int injectionIndex = 0; injectionIndex < injectionsIds.size(); injectionIndex++) { - variables.add(new WeightedSensitivityVariable(injectionsIds.get(injectionIndex), injectionsShiftKeys.get(injectionIndex))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); + List variableSets = new ArrayList<>(zoneCount); + for (int zoneIndex = 0; zoneIndex < zoneCount; zoneIndex++) { + PyPowsyblApiHeader.ZonePointer zonePtrI = zonePtrPtr.read(zoneIndex); + String zoneId = CTypeUtil.toString(zonePtrI.getId()); + List injectionsIds = toStringList(zonePtrI.getInjectionsIds(), zonePtrI.getLength()); + List injectionsShiftKeys = CTypeUtil.toDoubleList(zonePtrI.getinjectionsShiftKeys(), zonePtrI.getLength()); + List variables = new ArrayList<>(injectionsIds.size()); + for (int injectionIndex = 0; injectionIndex < injectionsIds.size(); injectionIndex++) { + variables.add(new WeightedSensitivityVariable(injectionsIds.get(injectionIndex), injectionsShiftKeys.get(injectionIndex))); + } + variableSets.add(new SensitivityVariableSet(zoneId, variables)); } - variableSets.add(new SensitivityVariableSet(zoneId, variables)); + analysisContext.setVariableSets(variableSets); } - analysisContext.setVariableSets(variableSets); }); } @@ -110,14 +133,17 @@ public static void addFactorMatrix(IsolateThread thread, ObjectHandle sensitivit PyPowsyblApiHeader.SensitivityFunctionType sensitivityFunctionType, PyPowsyblApiHeader.SensitivityVariableType sensitivityVariableType, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); - List branchesIds = toStringList(branchIdPtrPtr, branchIdCount); - List variablesIds = toStringList(variableIdPtrPtr, variableIdCount); - String matrixId = CTypeUtil.toString(matrixIdPtr); - List contingencies = toStringList(contingenciesIdPtrPtr, contingenciesIdCount); - analysisContext.addFactorMatrix(matrixId, branchesIds, variablesIds, contingencies, Util.convert(contingencyContextType), Util.convert(sensitivityFunctionType), - Util.convert(sensitivityVariableType)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); + List branchesIds = toStringList(branchIdPtrPtr, branchIdCount); + List variablesIds = toStringList(variableIdPtrPtr, variableIdCount); + String matrixId = CTypeUtil.toString(matrixIdPtr); + List contingencies = toStringList(contingenciesIdPtrPtr, contingenciesIdCount); + analysisContext.addFactorMatrix(matrixId, branchesIds, variablesIds, contingencies, Util.convert(contingencyContextType), Util.convert(sensitivityFunctionType), + Util.convert(sensitivityVariableType)); + } }); } @@ -126,15 +152,18 @@ public static ObjectHandle runSensitivityAnalysis(IsolateThread thread, ObjectHa ObjectHandle networkHandle, boolean dc, SensitivityAnalysisParametersPointer sensitivityAnalysisParametersPtr, CCharPointer providerName, ObjectHandle reportNodeHandle, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - SensitivityAnalysisProvider provider = getProvider(CTypeUtil.toString(providerName)); - logger().info("Sensitivity analysis provider used for sensitivity analysis is : {}", provider.getName()); - SensitivityAnalysisParameters sensitivityAnalysisParameters = SensitivityAnalysisCUtils.createSensitivityAnalysisParameters(dc, sensitivityAnalysisParametersPtr, provider); - ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); - SensitivityAnalysisResultContext resultContext = analysisContext.run(network, sensitivityAnalysisParameters, provider.getName(), reportNode); - return ObjectHandles.getGlobal().create(resultContext); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + SensitivityAnalysisContext analysisContext = ObjectHandles.getGlobal().get(sensitivityAnalysisContextHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + SensitivityAnalysisProvider provider = SensitivityAnalysisCUtils.getSensitivityAnalysisProvider(CTypeUtil.toString(providerName)); + logger().info("Sensitivity analysis provider used for sensitivity analysis is : {}", provider.getName()); + SensitivityAnalysisParameters sensitivityAnalysisParameters = SensitivityAnalysisCUtils.createSensitivityAnalysisParameters(dc, sensitivityAnalysisParametersPtr, provider); + ReportNode reportNode = ReportCUtils.getReportNode(reportNodeHandle); + SensitivityAnalysisResultContext resultContext = analysisContext.run(network, sensitivityAnalysisParameters, provider.getName(), reportNode); + return ObjectHandles.getGlobal().create(resultContext); + } }); } @@ -142,11 +171,14 @@ public static ObjectHandle runSensitivityAnalysis(IsolateThread thread, ObjectHa public static PyPowsyblApiHeader.MatrixPointer getSensitivityMatrix(IsolateThread thread, ObjectHandle sensitivityAnalysisResultContextHandle, CCharPointer matrixIdPtr, CCharPointer contingencyIdPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SensitivityAnalysisResultContext resultContext = ObjectHandles.getGlobal().get(sensitivityAnalysisResultContextHandle); - String contingencyId = CTypeUtil.toString(contingencyIdPtr); - String matrixId = CTypeUtil.toString(matrixIdPtr); - return resultContext.createSensitivityMatrix(matrixId, contingencyId); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public PyPowsyblApiHeader.MatrixPointer get() { + SensitivityAnalysisResultContext resultContext = ObjectHandles.getGlobal().get(sensitivityAnalysisResultContextHandle); + String contingencyId = CTypeUtil.toString(contingencyIdPtr); + String matrixId = CTypeUtil.toString(matrixIdPtr); + return resultContext.createSensitivityMatrix(matrixId, contingencyId); + } }); } @@ -154,34 +186,37 @@ public static PyPowsyblApiHeader.MatrixPointer getSensitivityMatrix(IsolateThrea public static PyPowsyblApiHeader.MatrixPointer getReferenceMatrix(IsolateThread thread, ObjectHandle sensitivityAnalysisResultContextHandle, CCharPointer matrixIdPtr, CCharPointer contingencyIdPtr, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - SensitivityAnalysisResultContext resultContext = ObjectHandles.getGlobal().get(sensitivityAnalysisResultContextHandle); - String contingencyId = CTypeUtil.toString(contingencyIdPtr); - String matrixId = CTypeUtil.toString(matrixIdPtr); - return resultContext.createReferenceMatrix(matrixId, contingencyId); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public PyPowsyblApiHeader.MatrixPointer get() { + SensitivityAnalysisResultContext resultContext = ObjectHandles.getGlobal().get(sensitivityAnalysisResultContextHandle); + String contingencyId = CTypeUtil.toString(contingencyIdPtr); + String matrixId = CTypeUtil.toString(matrixIdPtr); + return resultContext.createReferenceMatrix(matrixId, contingencyId); + } }); } - private static SensitivityAnalysisProvider getProvider(String name) { - String actualName = name.isEmpty() ? PyPowsyblConfiguration.getDefaultSensitivityAnalysisProvider() : name; - return SensitivityAnalysisProvider.findAll().stream() - .filter(provider -> provider.getName().equals(actualName)) - .findFirst() - .orElseThrow(() -> new PowsyblException("No sensitivity analysis provider for name '" + actualName + "'")); - } - @CEntryPoint(name = "freeSensitivityAnalysisParameters") public static void freeSensitivityAnalysisParameters(IsolateThread thread, SensitivityAnalysisParametersPointer parameters, ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - LoadFlowCUtils.freeLoadFlowParametersContent(parameters.getLoadFlowParameters()); - UnmanagedMemory.free(parameters); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + LoadFlowCUtils.freeLoadFlowParametersContent(parameters.getLoadFlowParameters()); + UnmanagedMemory.free(parameters); + } }); } @CEntryPoint(name = "createSensitivityAnalysisParameters") public static SensitivityAnalysisParametersPointer createSensitivityAnalysisParameters(IsolateThread thread, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToSensitivityAnalysisParametersPointer(SensitivityAnalysisCUtils.createSensitivityAnalysisParameters())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public SensitivityAnalysisParametersPointer get() { + return convertToSensitivityAnalysisParametersPointer(SensitivityAnalysisCUtils.createSensitivityAnalysisParameters()); + } + }); } private static SensitivityAnalysisParametersPointer convertToSensitivityAnalysisParametersPointer(SensitivityAnalysisParameters parameters) { @@ -193,10 +228,13 @@ private static SensitivityAnalysisParametersPointer convertToSensitivityAnalysis } @CEntryPoint(name = "getSensitivityAnalysisProviderParametersNames") - public static PyPowsyblApiHeader.ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String providerStr = CTypeUtil.toString(provider); - return Util.createCharPtrArray(SensitivityAnalysisCUtils.getSensitivityAnalysisProvider(providerStr).getSpecificParametersNames()); + public static ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String providerStr = CTypeUtil.toString(provider); + return Util.createCharPtrArray(SensitivityAnalysisCUtils.getSensitivityAnalysisProvider(providerStr).getSpecificParametersNames()); + } }); } } diff --git a/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCFunctions.java b/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCFunctions.java index 1d3087b7ff..37dbfff2a5 100644 --- a/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCFunctions.java +++ b/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCFunctions.java @@ -7,14 +7,16 @@ */ package com.powsybl.python.shortcircuit; -import com.powsybl.commons.PowsyblException; import com.powsybl.commons.report.ReportNode; import com.powsybl.dataframe.shortcircuit.adders.FaultDataframeAdder; import com.powsybl.dataframe.update.UpdatingDataframe; import com.powsybl.iidm.network.Network; import com.powsybl.python.commons.*; +import com.powsybl.python.commons.PyPowsyblApiHeader.ArrayPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.DataframeMetadataPointer; +import com.powsybl.python.commons.PyPowsyblApiHeader.SeriesPointer; import com.powsybl.python.commons.PyPowsyblApiHeader.ShortCircuitAnalysisParametersPointer; +import com.powsybl.python.commons.Util.PointerProvider; import com.powsybl.python.network.Dataframes; import com.powsybl.python.network.NetworkCFunctions; import com.powsybl.shortcircuit.ShortCircuitAnalysisProvider; @@ -44,6 +46,7 @@ * * @author Christian Biasuzzi */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class ShortCircuitAnalysisCFunctions { @@ -55,34 +58,44 @@ private static Logger logger() { } @CEntryPoint(name = "getShortCircuitAnalysisProviderNames") - public static PyPowsyblApiHeader.ArrayPointer getShortCircuitAnalysisProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> createCharPtrArray(ShortCircuitAnalysisProvider.findAll() - .stream().map(ShortCircuitAnalysisProvider::getName).collect(Collectors.toList()))); + public static ArrayPointer getShortCircuitAnalysisProviderNames(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + return createCharPtrArray(ShortCircuitAnalysisProvider.findAll() + .stream().map(ShortCircuitAnalysisProvider::getName).collect(Collectors.toList())); + } + }); } @CEntryPoint(name = "setDefaultShortCircuitAnalysisProvider") public static void setDefaultShortCircuitAnalysisProvider(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - PyPowsyblConfiguration.setDefaultShortCircuitAnalysisProvider(CTypeUtil.toString(provider)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + PyPowsyblConfiguration.setDefaultShortCircuitAnalysisProvider(CTypeUtil.toString(provider)); + } }); } @CEntryPoint(name = "getDefaultShortCircuitAnalysisProvider") public static CCharPointer getDefaultShortCircuitAnalysisProvider(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultShortCircuitAnalysisProvider())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public CCharPointer get() { + return CTypeUtil.toCharPtr(PyPowsyblConfiguration.getDefaultShortCircuitAnalysisProvider()); + } + }); } @CEntryPoint(name = "createShortCircuitAnalysis") public static ObjectHandle createShortCircuitAnalysis(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new ShortCircuitAnalysisContext())); - } - - private static ShortCircuitAnalysisProvider getProvider(String name) { - String actualName = name.isEmpty() ? PyPowsyblConfiguration.getDefaultShortCircuitAnalysisProvider() : name; - return ShortCircuitAnalysisProvider.findAll().stream() - .filter(provider -> provider.getName().equals(actualName)) - .findFirst() - .orElseThrow(() -> new PowsyblException("No short-circuit analysis provider for name '" + actualName + "'")); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + return ObjectHandles.getGlobal().create(new ShortCircuitAnalysisContext()); + } + }); } @CEntryPoint(name = "runShortCircuitAnalysis") @@ -90,30 +103,43 @@ public static ObjectHandle runShortCircuitAnalysis(IsolateThread thread, ObjectH ObjectHandle networkHandle, ShortCircuitAnalysisParametersPointer shortCircuitAnalysisParametersPointer, CCharPointer providerName, ObjectHandle reportNodeHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisContext analysisContext = ObjectHandles.getGlobal().get(shortCircuitAnalysisContextHandle); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + ShortCircuitAnalysisContext analysisContext = ObjectHandles.getGlobal().get(shortCircuitAnalysisContextHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); - ShortCircuitAnalysisProvider provider = getProvider(CTypeUtil.toString(providerName)); - logger().info("Short-circuit analysis provider used for short-circuit analysis is : {}", provider.getName()); - ShortCircuitParameters shortCircuitAnalysisParameters = ShortCircuitAnalysisCUtils.createShortCircuitAnalysisParameters(shortCircuitAnalysisParametersPointer, provider); + ShortCircuitAnalysisProvider provider = ShortCircuitAnalysisCUtils.getShortCircuitAnalysisProvider(CTypeUtil.toString(providerName)); + logger().info("Short-circuit analysis provider used for short-circuit analysis is : {}", provider.getName()); + ShortCircuitParameters shortCircuitAnalysisParameters = ShortCircuitAnalysisCUtils.createShortCircuitAnalysisParameters(shortCircuitAnalysisParametersPointer, provider); - ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); - ShortCircuitAnalysisResult results = analysisContext.run(network, shortCircuitAnalysisParameters, provider.getName(), reportNode); - return ObjectHandles.getGlobal().create(results); + ReportNode reportNode = ObjectHandles.getGlobal().get(reportNodeHandle); + ShortCircuitAnalysisResult results = analysisContext.run(network, shortCircuitAnalysisParameters, provider.getName(), reportNode); + return ObjectHandles.getGlobal().create(results); + } }); } @CEntryPoint(name = "freeShortCircuitAnalysisParameters") public static void freeShortCircuitAnalysisParameters(IsolateThread thread, ShortCircuitAnalysisParametersPointer parameters, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> UnmanagedMemory.free(parameters)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + UnmanagedMemory.free(parameters); + } + }); } @CEntryPoint(name = "createShortCircuitAnalysisParameters") public static ShortCircuitAnalysisParametersPointer createShortCircuitAnalysisParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> convertToShortCircuitAnalysisParametersPointer(ShortCircuitAnalysisCUtils.createShortCircuitAnalysisParameters())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ShortCircuitAnalysisParametersPointer get() { + return convertToShortCircuitAnalysisParametersPointer(ShortCircuitAnalysisCUtils.createShortCircuitAnalysisParameters()); + } + }); } private static ShortCircuitAnalysisParametersPointer convertToShortCircuitAnalysisParametersPointer(ShortCircuitParameters parameters) { @@ -137,68 +163,91 @@ static List getSpecificParametersNames(ShortCircuitAnalysisProvider prov } @CEntryPoint(name = "getShortCircuitAnalysisProviderParametersNames") - public static PyPowsyblApiHeader.ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - String providerStr = CTypeUtil.toString(provider); - return Util.createCharPtrArray(getSpecificParametersNames(ShortCircuitAnalysisCUtils.getShortCircuitAnalysisProvider(providerStr))); + public static ArrayPointer getProviderParametersNames(IsolateThread thread, CCharPointer provider, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + String providerStr = CTypeUtil.toString(provider); + return Util.createCharPtrArray(getSpecificParametersNames(ShortCircuitAnalysisCUtils.getShortCircuitAnalysisProvider(providerStr))); + } }); } @CEntryPoint(name = "getFaultsDataframeMetaData") public static DataframeMetadataPointer getFaultsDataframeMetaData(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.createSeriesMetadata(new FaultDataframeAdder().getMetadata())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public DataframeMetadataPointer get() { + return CTypeUtil.createSeriesMetadata(new FaultDataframeAdder().getMetadata()); + } + }); } @CEntryPoint(name = "setFaults") public static void setFaults(IsolateThread thread, ObjectHandle contextHandle, PyPowsyblApiHeader.DataframePointer cDataframe, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisContext context = ObjectHandles.getGlobal().get(contextHandle); - UpdatingDataframe faultDataframe = NetworkCFunctions.createDataframe(cDataframe); - new FaultDataframeAdder().addElements(context, faultDataframe); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + ShortCircuitAnalysisContext context = ObjectHandles.getGlobal().get(contextHandle); + UpdatingDataframe faultDataframe = NetworkCFunctions.createDataframe(cDataframe); + new FaultDataframeAdder().addElements(context, faultDataframe); + } }); } @CEntryPoint(name = "getShortCircuitAnalysisFaultResults") - public static PyPowsyblApiHeader.ArrayPointer getShortCircuitAnalysisFaultResults(IsolateThread thread, - ObjectHandle shortCircuitAnalysisResult, - boolean withFortescueResult, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); - return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisFaultResultsMapper(withFortescueResult), result); + public static ArrayPointer getShortCircuitAnalysisFaultResults(IsolateThread thread, + ObjectHandle shortCircuitAnalysisResult, + boolean withFortescueResult, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); + return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisFaultResultsMapper(withFortescueResult), result); + } }); } @CEntryPoint(name = "getShortCircuitAnalysisFeederResults") - public static PyPowsyblApiHeader.ArrayPointer getShortCircuitAnalysisFeederResults(IsolateThread thread, - ObjectHandle shortCircuitAnalysisResult, - boolean withFortescueResult, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); - return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisMagnitudeFeederResultsMapper(withFortescueResult), result); + public static ArrayPointer getShortCircuitAnalysisFeederResults(IsolateThread thread, + ObjectHandle shortCircuitAnalysisResult, + boolean withFortescueResult, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); + return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisMagnitudeFeederResultsMapper(withFortescueResult), result); + } }); } @CEntryPoint(name = "getShortCircuitAnalysisLimitViolationsResults") - public static PyPowsyblApiHeader.ArrayPointer getShortCircuitAnalysisLimitViolationsResults(IsolateThread thread, ObjectHandle shortCircuitAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); - return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisLimitViolationsResultsMapper(), result); + public static ArrayPointer getShortCircuitAnalysisLimitViolationsResults(IsolateThread thread, ObjectHandle shortCircuitAnalysisResult, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); + return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisLimitViolationsResultsMapper(), result); + } }); } @CEntryPoint(name = "getShortCircuitAnalysisBusResults") - public static PyPowsyblApiHeader.ArrayPointer getShortCircuitAnalysisBusResults(IsolateThread thread, - ObjectHandle shortCircuitAnalysisResult, - boolean withFortescueResult, - PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> { - ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); - return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisMagnitudeBusResultsMapper(withFortescueResult), result); + public static ArrayPointer getShortCircuitAnalysisBusResults(IsolateThread thread, + ObjectHandle shortCircuitAnalysisResult, + boolean withFortescueResult, + PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { + return doCatch(exceptionHandlerPtr, new PointerProvider>() { + @Override + public ArrayPointer get() { + ShortCircuitAnalysisResult result = ObjectHandles.getGlobal().get(shortCircuitAnalysisResult); + return Dataframes.createCDataframe(Dataframes.shortCircuitAnalysisMagnitudeBusResultsMapper(withFortescueResult), result); + } }); } } diff --git a/java/src/main/java/com/powsybl/python/voltageinit/VoltageInitializerCFunctions.java b/java/src/main/java/com/powsybl/python/voltageinit/VoltageInitializerCFunctions.java index 889687177e..e263aaa794 100644 --- a/java/src/main/java/com/powsybl/python/voltageinit/VoltageInitializerCFunctions.java +++ b/java/src/main/java/com/powsybl/python/voltageinit/VoltageInitializerCFunctions.java @@ -10,7 +10,9 @@ import static com.powsybl.python.commons.Util.doCatch; import java.util.List; +import java.util.function.Supplier; +import com.powsybl.python.commons.Util.PointerProvider; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.nativeimage.ObjectHandle; import org.graalvm.nativeimage.ObjectHandles; @@ -41,6 +43,7 @@ /** * @author Nicolas Pierre */ +@SuppressWarnings({"java:S1602", "java:S1604"}) @CContext(Directives.class) public final class VoltageInitializerCFunctions { private VoltageInitializerCFunctions() { @@ -53,253 +56,409 @@ private static Logger logger() { @CEntryPoint(name = "createVoltageInitializerParams") public static ObjectHandle createVoltageInitializerParams(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new OpenReacParameters())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + return ObjectHandles.getGlobal().create(new OpenReacParameters()); + } + }); } @CEntryPoint(name = "voltageInitializerAddSpecificLowVoltageLimits") public static void addSpecificLowVoltageLimits(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, boolean isRelative, double limit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String voltageLevelId = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params - .addSpecificVoltageLimits(List.of( - new VoltageLimitOverride(voltageLevelId, - VoltageLimitOverride.VoltageLimitType.LOW_VOLTAGE_LIMIT, - isRelative, - limit) - ))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String voltageLevelId = CTypeUtil.toString(idPtr); + params.addSpecificVoltageLimits(List.of( + new VoltageLimitOverride(voltageLevelId, + VoltageLimitOverride.VoltageLimitType.LOW_VOLTAGE_LIMIT, + isRelative, + limit) + )); + } + }); } @CEntryPoint(name = "voltageInitializerAddSpecificHighVoltageLimits") public static void addSpecificHighVoltageLimits(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, boolean isRelative, double limit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String voltageLevelId = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params - .addSpecificVoltageLimits(List.of( - new VoltageLimitOverride(voltageLevelId, - VoltageLimitOverride.VoltageLimitType.HIGH_VOLTAGE_LIMIT, - isRelative, - limit) - ))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String voltageLevelId = CTypeUtil.toString(idPtr); + params.addSpecificVoltageLimits(List.of( + new VoltageLimitOverride(voltageLevelId, + VoltageLimitOverride.VoltageLimitType.HIGH_VOLTAGE_LIMIT, + isRelative, + limit) + )); + } + }); } @CEntryPoint(name = "voltageInitializerAddVariableShuntCompensators") public static void addVariableShuntCompensators(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String id = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params.addVariableShuntCompensators(List.of(id))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String id = CTypeUtil.toString(idPtr); + params.addVariableShuntCompensators(List.of(id)); + } + }); } @CEntryPoint(name = "voltageInitializerAddConstantQGenerators") public static void addConstantQGenerators(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String id = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params.addConstantQGenerators(List.of(id))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String id = CTypeUtil.toString(idPtr); + params.addConstantQGenerators(List.of(id)); + } + }); } @CEntryPoint(name = "voltageInitializerAddVariableTwoWindingsTransformers") public static void addVariableTwoWindingsTransformers(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String id = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params.addVariableTwoWindingsTransformers(List.of(id))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String id = CTypeUtil.toString(idPtr); + params.addVariableTwoWindingsTransformers(List.of(id)); + } + }); } @CEntryPoint(name = "voltageInitializerAddConfiguredReactiveSlackBuses") public static void addConfiguredReactiveSlackBuses(IsolateThread thread, ObjectHandle paramsHandle, CCharPointer idPtr, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - String id = CTypeUtil.toString(idPtr); - doCatch(exceptionHandlerPtr, () -> params.addConfiguredReactiveSlackBuses(List.of(id))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + String id = CTypeUtil.toString(idPtr); + params.addConfiguredReactiveSlackBuses(List.of(id)); + } + }); } @CEntryPoint(name = "voltageInitializerSetObjective") public static void setObjective(IsolateThread thread, ObjectHandle paramsHandle, VoltageInitializerObjective cObjective, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setObjective(Util.convert(cObjective))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setObjective(Util.convert(cObjective)); + } + }); } @CEntryPoint(name = "voltageInitializerSetObjectiveDistance") public static void setObjectiveDistance(IsolateThread thread, ObjectHandle paramsHandle, double dist, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setObjectiveDistance(dist)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setObjectiveDistance(dist); + } + }); } @CEntryPoint(name = "voltageInitializerSetLogLevelAmpl") public static void setLogLevelAmpl(IsolateThread thread, ObjectHandle paramsHandle, VoltageInitializerLogLevelAmpl logLevelAmpl, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setLogLevelAmpl(Util.convert(logLevelAmpl))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setLogLevelAmpl(Util.convert(logLevelAmpl)); + } + }); } @CEntryPoint(name = "voltageInitializerSetLogLevelSolver") public static void setLogLevelSolver(IsolateThread thread, ObjectHandle paramsHandle, VoltageInitializerLogLevelSolver logLevelSolver, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setLogLevelSolver(Util.convert(logLevelSolver))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setLogLevelSolver(Util.convert(logLevelSolver)); + } + }); } @CEntryPoint(name = "voltageInitializerSetReactiveSlackBusesMode") public static void setReactiveSlackBusesMode(IsolateThread thread, ObjectHandle paramsHandle, VoltageInitializerReactiveSlackBusesMode reactiveSlackBusesMode, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setReactiveSlackBusesMode(Util.convert(reactiveSlackBusesMode))); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setReactiveSlackBusesMode(Util.convert(reactiveSlackBusesMode)); + } + }); } @CEntryPoint(name = "voltageInitializerSetMinPlausibleLowVoltageLimit") public static void voltageInitializerSetMinPlausibleLowVoltageLimit(IsolateThread thread, ObjectHandle paramsHandle, double minPlausibleLowVoltageLimit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setMinPlausibleLowVoltageLimit(minPlausibleLowVoltageLimit)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setMinPlausibleLowVoltageLimit(minPlausibleLowVoltageLimit); + } + }); } @CEntryPoint(name = "voltageInitializerSetMaxPlausibleHighVoltageLimit") public static void voltageInitializerSetMaxPlausibleHighVoltageLimit(IsolateThread thread, ObjectHandle paramsHandle, double maxPlausibleHighVoltageLimit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setMaxPlausibleHighVoltageLimit(maxPlausibleHighVoltageLimit)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setMaxPlausibleHighVoltageLimit(maxPlausibleHighVoltageLimit); + } + }); } @CEntryPoint(name = "voltageInitializerSetActivePowerVariationRate") public static void voltageInitializerSetActivePowerVariationRate(IsolateThread thread, ObjectHandle paramsHandle, double activePowerVariationRate, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setActivePowerVariationRate(activePowerVariationRate)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setActivePowerVariationRate(activePowerVariationRate); + } + }); } @CEntryPoint(name = "voltageInitializerSetMinPlausibleActivePowerThreshold") public static void voltageInitializerSetMinPlausibleActivePowerThreshold(IsolateThread thread, ObjectHandle paramsHandle, double minPlausibleActivePowerThreshold, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setMinPlausibleActivePowerThreshold(minPlausibleActivePowerThreshold)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setMinPlausibleActivePowerThreshold(minPlausibleActivePowerThreshold); + } + }); } @CEntryPoint(name = "voltageInitializerSetLowImpedanceThreshold") public static void voltageInitializerSetLowImpedanceThreshold(IsolateThread thread, ObjectHandle paramsHandle, double lowImpedanceThreshold, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setLowImpedanceThreshold(lowImpedanceThreshold)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setLowImpedanceThreshold(lowImpedanceThreshold); + } + }); } @CEntryPoint(name = "voltageInitializerSetMinNominalVoltageIgnoredBus") public static void voltageInitializerSetMinNominalVoltageIgnoredBus(IsolateThread thread, ObjectHandle paramsHandle, double minNominalVoltageIgnoredBus, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setMinNominalVoltageIgnoredBus(minNominalVoltageIgnoredBus)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setMinNominalVoltageIgnoredBus(minNominalVoltageIgnoredBus); + } + }); } @CEntryPoint(name = "voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds") public static void voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds(IsolateThread thread, ObjectHandle paramsHandle, double minNominalVoltageIgnoredVoltageBounds, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setMinNominalVoltageIgnoredVoltageBounds(minNominalVoltageIgnoredVoltageBounds)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setMinNominalVoltageIgnoredVoltageBounds(minNominalVoltageIgnoredVoltageBounds); + } + }); } @CEntryPoint(name = "voltageInitializerSetMaxPlausiblePowerLimit") public static void voltageInitializerSetMaxPlausiblePowerLimit(IsolateThread thread, ObjectHandle paramsHandle, double maxPlausiblePowerLimit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setPQMax(maxPlausiblePowerLimit)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setPQMax(maxPlausiblePowerLimit); + } + }); } @CEntryPoint(name = "voltageInitializerSetDefaultMinimalQPRange") public static void voltageInitializerSetDefaultMinimalQPRange(IsolateThread thread, ObjectHandle paramsHandle, double defaultMinimalQPRange, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setDefaultMinimalQPRange(defaultMinimalQPRange)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setDefaultMinimalQPRange(defaultMinimalQPRange); + } + }); } @CEntryPoint(name = "voltageInitializerSetHighActivePowerDefaultLimit") public static void voltageInitializerSetHighActivePowerDefaultLimit(IsolateThread thread, ObjectHandle paramsHandle, double highActivePowerDefaultLimit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setHighActivePowerDefaultLimit(highActivePowerDefaultLimit)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setHighActivePowerDefaultLimit(highActivePowerDefaultLimit); + } + }); } @CEntryPoint(name = "voltageInitializerSetLowActivePowerDefaultLimit") public static void voltageInitializerSetLowActivePowerDefaultLimit(IsolateThread thread, ObjectHandle paramsHandle, double lowActivePowerDefaultLimit, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setLowActivePowerDefaultLimit(lowActivePowerDefaultLimit)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setLowActivePowerDefaultLimit(lowActivePowerDefaultLimit); + } + }); } @CEntryPoint(name = "voltageInitializerSetDefaultQmaxPmaxRatio") public static void voltageInitializerSetDefaultQmaxPmaxRatio(IsolateThread thread, ObjectHandle paramsHandle, double defaultQmaxPmaxRatio, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setDefaultQmaxPmaxRatio(defaultQmaxPmaxRatio)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setDefaultQmaxPmaxRatio(defaultQmaxPmaxRatio); + } + }); } @CEntryPoint(name = "voltageInitializerSetDefaultVariableScalingFactor") public static void setDefaultVariableScalingFactor(IsolateThread thread, ObjectHandle paramsHandle, double defaultVariableScalingFactor, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setDefaultVariableScalingFactor(defaultVariableScalingFactor)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setDefaultVariableScalingFactor(defaultVariableScalingFactor); + } + }); } @CEntryPoint(name = "voltageInitializerSetDefaultConstraintScalingFactor") public static void setDefaultConstraintScalingFactor(IsolateThread thread, ObjectHandle paramsHandle, double defaultConstraintScalingFactor, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setDefaultConstraintScalingFactor(defaultConstraintScalingFactor)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setDefaultConstraintScalingFactor(defaultConstraintScalingFactor); + } + }); } @CEntryPoint(name = "voltageInitializerSetReactiveSlackVariableScalingFactor") public static void setReactiveSlackVariableScalingFactor(IsolateThread thread, ObjectHandle paramsHandle, double reactiveSlackVariableScalingFactor, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setReactiveSlackVariableScalingFactor(reactiveSlackVariableScalingFactor)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setReactiveSlackVariableScalingFactor(reactiveSlackVariableScalingFactor); + } + }); } @CEntryPoint(name = "voltageInitializerSetTwoWindingTransformerRatioVariableScalingFactor") public static void setTwoWindingTransformerRatioVariableScalingFactor(IsolateThread thread, ObjectHandle paramsHandle, double twoWindingTransformerRatioVariableScalingFactor, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - doCatch(exceptionHandlerPtr, () -> params.setTwoWindingTransformerRatioVariableScalingFactor(twoWindingTransformerRatioVariableScalingFactor)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + params.setTwoWindingTransformerRatioVariableScalingFactor(twoWindingTransformerRatioVariableScalingFactor); + } + }); } @CEntryPoint(name = "voltageInitializerApplyAllModifications") public static void applyAllModifications(IsolateThread thread, ObjectHandle resultHandle, ObjectHandle networkHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); - Network network = ObjectHandles.getGlobal().get(networkHandle); - doCatch(exceptionHandlerPtr, () -> result.applyAllModifications(network)); + doCatch(exceptionHandlerPtr, new Runnable() { + @Override + public void run() { + OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); + Network network = ObjectHandles.getGlobal().get(networkHandle); + result.applyAllModifications(network); + } + }); } @CEntryPoint(name = "voltageInitializerGetStatus") public static VoltageInitializerStatus getStatus(IsolateThread thread, ObjectHandle resultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); - return doCatch(exceptionHandlerPtr, () -> Util.convert(result.getStatus())); + return doCatch(exceptionHandlerPtr, new Supplier() { + @Override + public VoltageInitializerStatus get() { + OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); + return Util.convert(result.getStatus()); + } + }); } @CEntryPoint(name = "voltageInitializerGetIndicators") public static StringMap getIndicators(IsolateThread thread, ObjectHandle resultHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); - return doCatch(exceptionHandlerPtr, () -> CTypeUtil.fromStringMap(result.getIndicators())); + return doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public StringMap get() { + OpenReacResult result = ObjectHandles.getGlobal().get(resultHandle); + return CTypeUtil.fromStringMap(result.getIndicators()); + } + }); } @CEntryPoint(name = "runVoltageInitializer") public static ObjectHandle runVoltageInitializer(IsolateThread thread, boolean debug, ObjectHandle networkHandle, ObjectHandle paramsHandle, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) { - return Util.doCatch(exceptionHandlerPtr, () -> { - Network network = ObjectHandles.getGlobal().get(networkHandle); - OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); - - logger().info("Running voltage initializer"); - OpenReacResult result = OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), params, - new OpenReacConfig(debug), LocalComputationManager.getDefault()); - logger().info("Voltage initializer run done"); - - return ObjectHandles.getGlobal().create(result); + return Util.doCatch(exceptionHandlerPtr, new PointerProvider() { + @Override + public ObjectHandle get() { + Network network = ObjectHandles.getGlobal().get(networkHandle); + OpenReacParameters params = ObjectHandles.getGlobal().get(paramsHandle); + + logger().info("Running voltage initializer"); + OpenReacResult result = OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), params, + new OpenReacConfig(debug), LocalComputationManager.getDefault()); + logger().info("Voltage initializer run done"); + + return ObjectHandles.getGlobal().create(result); + } }); } diff --git a/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-api/resource-config.json b/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-api/resource-config.json index 2fb37a1b41..8c96a4cda0 100644 --- a/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-api/resource-config.json +++ b/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-api/resource-config.json @@ -2,6 +2,7 @@ "resources":{ "includes":[ {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.network.NetworkFactoryService\\E"}, - {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.network.Importer\\E"} + {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.network.Importer\\E"}, + {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.network.Exporter\\E"} ]} } diff --git a/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-converter-api/resource-config.json b/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-converter-api/resource-config.json deleted file mode 100644 index bec778e919..0000000000 --- a/java/src/main/resources/META-INF/native-image/com.powsybl/powsybl-iidm-converter-api/resource-config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "resources":{ - "includes":[ - {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.export.Exporter\\E"}, - {"pattern":"\\QMETA-INF/services/com.powsybl.iidm.import_.Importer\\E"} - ]} -} diff --git a/setup.py b/setup.py index a979c1f700..ddc4c34fec 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,6 @@ def __init__(self): class PyPowsyblBuild(build_ext): def run(self): - os.environ["USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM"] = 'false' try: out = subprocess.check_output(['cmake', '--version']) except OSError: