Skip to content

Commit eab5edc

Browse files
rolnicomarifunf
andauthored
Create DataTableGroovyScriptExtension + update powsybl-core dependency (#201)
* create DataTableGroovyScriptExtension and use it Signed-off-by: Nicolas Rol <[email protected]> * add dataTableStore and scriptLogBufferedWriter in contextObjects map to use in Groovy Scripts Signed-off-by: Nicolas Rol <[email protected]> * Little revert on toList() Signed-off-by: marifunf <[email protected]> * update powsybl-core Signed-off-by: Nicolas Rol <[email protected]> * fix issue Signed-off-by: Nicolas Rol <[email protected]> --------- Signed-off-by: Nicolas Rol <[email protected]> Signed-off-by: marifunf <[email protected]> Co-authored-by: marifunf <[email protected]>
1 parent 527091b commit eab5edc

20 files changed

+213
-113
lines changed

Diff for: metrix-integration/src/main/groovy/com/powsybl/metrix/integration/MetrixDslDataLoader.groovy

+36-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ package com.powsybl.metrix.integration
99

1010

1111
import com.powsybl.iidm.network.Network
12+
import com.powsybl.metrix.mapping.DataTableStore
1213
import com.powsybl.metrix.mapping.LogDslLoader
1314
import com.powsybl.metrix.mapping.TimeSeriesMappingConfig
1415
import com.powsybl.metrix.mapping.TimeSeriesMappingConfigLoader
16+
import com.powsybl.scripting.groovy.GroovyScriptExtension
17+
import com.powsybl.scripting.groovy.GroovyScripts
1518
import com.powsybl.timeseries.ReadOnlyTimeSeriesStore
1619
import com.powsybl.timeseries.TimeSeriesFilter
1720
import com.powsybl.timeseries.dsl.CalculatedTimeSeriesGroovyDslLoader
@@ -31,10 +34,10 @@ import static GeneratorsBindingData.generatorsBindingData
3134
import static HvdcData.hvdcData
3235
import static LoadData.loadData
3336
import static LoadsBindingData.loadsBindingData
37+
import static LossesData.lossesData
3438
import static ParametersData.parametersData
3539
import static PhaseShifterData.phaseShifterData
3640
import static SectionMonitoringData.sectionMonitoringData
37-
import static LossesData.lossesData
3841

3942
/**
4043
* @author Paul Bui-Quang {@literal <paul.buiquang at rte-france.com>}
@@ -121,8 +124,18 @@ class MetrixDslDataLoader {
121124
shell.evaluate(dslSrc)
122125
}
123126

124-
static void bind(Binding binding, Network network, ReadOnlyTimeSeriesStore store, MetrixParameters parameters, TimeSeriesMappingConfig mappingConfig, MetrixDslData data, LogDslLoader logDslLoader) {
127+
static void bind(Binding binding, Network network, ReadOnlyTimeSeriesStore store, DataTableStore dataTableStore, MetrixParameters parameters, TimeSeriesMappingConfig mappingConfig, MetrixDslData data, LogDslLoader logDslLoader) {
128+
// External bindings
125129
CalculatedTimeSeriesGroovyDslLoader.bind(binding, store, mappingConfig.getTimeSeriesNodes())
130+
131+
// Context objects
132+
Map<Class<?>, Object> contextObjects = new HashMap<>()
133+
contextObjects.put(DataTableStore.class, dataTableStore)
134+
135+
// Bindings through extensions
136+
Iterable<GroovyScriptExtension> extensions = ServiceLoader.load(GroovyScriptExtension.class, GroovyScripts.class.getClassLoader())
137+
extensions.forEach { it.load(binding, contextObjects) }
138+
126139
TimeSeriesMappingConfigLoader loader = new TimeSeriesMappingConfigLoader(mappingConfig, store.getTimeSeriesNames(new TimeSeriesFilter()))
127140

128141
// map the base case to network variable
@@ -186,15 +199,25 @@ class MetrixDslDataLoader {
186199

187200
static MetrixDslData load(Reader reader, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
188201
TimeSeriesMappingConfig mappingConfig, Writer out) {
202+
load(reader, network, parameters, store, new DataTableStore(), mappingConfig, out)
203+
}
204+
205+
static MetrixDslData load(Reader reader, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
206+
DataTableStore dataTableStore, TimeSeriesMappingConfig mappingConfig, Writer out) {
189207
MetrixDslDataLoader dslLoader = new MetrixDslDataLoader(reader, "metrixDsl.groovy")
190-
dslLoader.load(network, parameters, store, mappingConfig, out)
208+
dslLoader.load(network, parameters, store, dataTableStore, mappingConfig, out)
191209
}
192210

193211
static MetrixDslData load(Path metrixDslFile, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
194212
TimeSeriesMappingConfig mappingConfig) {
195213
load(metrixDslFile, network, parameters, store, mappingConfig, null)
196214
}
197215

216+
static MetrixDslData load(Path metrixDslFile, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
217+
DataTableStore dataTableStore, TimeSeriesMappingConfig mappingConfig) {
218+
load(metrixDslFile, network, parameters, store, dataTableStore, mappingConfig, null)
219+
}
220+
198221
static MetrixDslData load(Path metrixDslFile, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
199222
TimeSeriesMappingConfig mappingConfig, Writer out) {
200223

@@ -203,13 +226,21 @@ class MetrixDslDataLoader {
203226
}
204227
}
205228

229+
static MetrixDslData load(Path metrixDslFile, Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
230+
DataTableStore dataTableStore, TimeSeriesMappingConfig mappingConfig, Writer out) {
231+
232+
Files.newBufferedReader(metrixDslFile, StandardCharsets.UTF_8).withReader { Reader reader ->
233+
load(reader, network, parameters, store, dataTableStore, mappingConfig, out)
234+
}
235+
}
236+
206237
MetrixDslData load(Network network, MetrixParameters parameters, ReadOnlyTimeSeriesStore store,
207-
TimeSeriesMappingConfig mappingConfig, Writer out) {
238+
DataTableStore dataTableStore, TimeSeriesMappingConfig mappingConfig, Writer out) {
208239

209240
MetrixDslData data = new MetrixDslData()
210241
Binding binding = new Binding()
211242
LogDslLoader logDslLoader = LogDslLoader.create(binding, out, METRIX_SCRIPT_SECTION)
212-
bind(binding, network, store, parameters, mappingConfig, data, logDslLoader)
243+
bind(binding, network, store, dataTableStore, parameters, mappingConfig, data, logDslLoader)
213244

214245
evaluate(dslSrc, binding)
215246

Diff for: metrix-integration/src/main/java/com/powsybl/metrix/integration/metrix/MetrixAnalysis.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public MetrixAnalysisResult runAnalysis(String id) {
119119
metrixDslData = loadMetrixDslData(metrixDslReader, network, metrixParameters, mappingConfig, scriptLogBufferedWriter, id);
120120
timeSeriesNodesAfterMetrix = new HashMap<>(mappingConfig.getTimeSeriesNodes());
121121
}
122-
MetrixInputAnalysisResult inputs = new MetrixInputAnalysis(remedialActionsReader, contingenciesProvider, network, metrixDslData, inputLogBufferedWriter).runAnalysis();
122+
MetrixInputAnalysisResult inputs = new MetrixInputAnalysis(remedialActionsReader, contingenciesProvider, network, metrixDslData, dataTableStore, inputLogBufferedWriter, scriptLogBufferedWriter).runAnalysis();
123123
MetrixConfigResult metrixConfigResult = new MetrixConfigResult(timeSeriesNodesAfterMapping, timeSeriesNodesAfterMetrix);
124124
return new MetrixAnalysisResult(metrixDslData, mappingConfig, network, metrixParameters, mappingParameters, metrixConfigResult, inputs.getContingencies(), inputs.getRemedials());
125125
} catch (IOException e) {
@@ -159,7 +159,7 @@ private MetrixDslData loadMetrixDslData(Reader metrixDslReader, Network network,
159159
boolean inError = false;
160160
try {
161161
CompletableFuture<MetrixDslData> metrixFuture = new LocalThreadExecutor<MetrixDslData>("Script_M_" + id)
162-
.supplyAsync(() -> MetrixDslDataLoader.load(metrixDslReader, network, metrixParameters, store, mappingConfig, writer));
162+
.supplyAsync(() -> MetrixDslDataLoader.load(metrixDslReader, network, metrixParameters, store, dataTableStore, mappingConfig, writer));
163163
updateTask.accept(metrixFuture);
164164
MetrixDslData metrixDslData = metrixFuture.get();
165165
metrixDslData.setComputationType(metrixParameters.getComputationType());

Diff for: metrix-integration/src/main/java/com/powsybl/metrix/integration/metrix/MetrixInputAnalysis.java

+45-6
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,32 @@
1111
import com.powsybl.contingency.Contingency;
1212
import com.powsybl.contingency.ContingencyElement;
1313
import com.powsybl.contingency.ContingencyElementType;
14-
import com.powsybl.iidm.network.*;
14+
import com.powsybl.iidm.network.Branch;
15+
import com.powsybl.iidm.network.Identifiable;
16+
import com.powsybl.iidm.network.IdentifiableType;
17+
import com.powsybl.iidm.network.Network;
18+
import com.powsybl.iidm.network.Switch;
1519
import com.powsybl.metrix.integration.MetrixDslData;
1620
import com.powsybl.metrix.integration.exceptions.ContingenciesScriptLoadingException;
1721
import com.powsybl.metrix.integration.remedials.Remedial;
1822
import com.powsybl.metrix.integration.remedials.RemedialReader;
19-
20-
import java.io.*;
21-
import java.util.*;
23+
import com.powsybl.metrix.mapping.DataTableStore;
24+
25+
import java.io.BufferedReader;
26+
import java.io.BufferedWriter;
27+
import java.io.IOException;
28+
import java.io.Reader;
29+
import java.io.StringReader;
30+
import java.io.UncheckedIOException;
31+
import java.io.Writer;
32+
import java.util.ArrayList;
33+
import java.util.Collections;
34+
import java.util.HashMap;
35+
import java.util.List;
36+
import java.util.Map;
37+
import java.util.Objects;
38+
import java.util.ResourceBundle;
39+
import java.util.Set;
2240
import java.util.stream.Collectors;
2341

2442
import static com.powsybl.metrix.integration.remedials.RemedialReader.rTrim;
@@ -52,16 +70,26 @@ enum LogType {
5270
private final ContingenciesProvider contingenciesProvider;
5371
private final Network network;
5472
private final MetrixDslData metrixDslData;
73+
private final DataTableStore dataTableStore;
5574
private final BufferedWriter writer;
75+
private final BufferedWriter scriptLogBufferedWriter;
76+
77+
public MetrixInputAnalysis(Reader remedialActionsReader, ContingenciesProvider contingenciesProvider, Network network,
78+
MetrixDslData metrixDslData, DataTableStore dataTableStore, BufferedWriter writer) {
79+
this(remedialActionsReader, contingenciesProvider, network, metrixDslData, dataTableStore, writer, null);
80+
}
5681

57-
public MetrixInputAnalysis(Reader remedialActionsReader, ContingenciesProvider contingenciesProvider, Network network, MetrixDslData metrixDslData, BufferedWriter writer) {
82+
public MetrixInputAnalysis(Reader remedialActionsReader, ContingenciesProvider contingenciesProvider, Network network,
83+
MetrixDslData metrixDslData, DataTableStore dataTableStore, BufferedWriter writer, BufferedWriter scriptLogBufferedWriter) {
5884
Objects.requireNonNull(contingenciesProvider);
5985
Objects.requireNonNull(network);
6086
this.remedialActionsReader = remedialActionsReader;
6187
this.contingenciesProvider = contingenciesProvider;
6288
this.network = network;
6389
this.metrixDslData = metrixDslData;
90+
this.dataTableStore = dataTableStore;
6491
this.writer = writer;
92+
this.scriptLogBufferedWriter = scriptLogBufferedWriter;
6593
}
6694

6795
public MetrixInputAnalysisResult runAnalysis() throws IOException {
@@ -130,7 +158,7 @@ private void writeRemedialFileLog(int line, String messageReason) {
130158
private List<Contingency> loadContingencies() {
131159
List<Contingency> allContingencies;
132160
try {
133-
allContingencies = contingenciesProvider.getContingencies(network);
161+
allContingencies = contingenciesProvider.getContingencies(network, getContextObjects());
134162
} catch (RuntimeException e) {
135163
throw new ContingenciesScriptLoadingException(e);
136164
}
@@ -143,6 +171,17 @@ private List<Contingency> loadContingencies() {
143171
return contingencies;
144172
}
145173

174+
private Map<Class<?>, Object> getContextObjects() {
175+
Map<Class<?>, Object> contextObjects = new HashMap<>();
176+
if (dataTableStore != null) {
177+
contextObjects.put(DataTableStore.class, dataTableStore);
178+
}
179+
if (scriptLogBufferedWriter != null) {
180+
contextObjects.put(Writer.class, scriptLogBufferedWriter);
181+
}
182+
return contextObjects;
183+
}
184+
146185
private static boolean isValidContingencyType(ContingencyElementType elementType) {
147186
return elementType == ContingencyElementType.LINE ||
148187
elementType == ContingencyElementType.TWO_WINDINGS_TRANSFORMER ||

Diff for: metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixBranchPostProcessingTimeSeriesTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void postProcessingTimeSeriesTest() {
248248
TimeSeriesDslLoader timeSeriesDslLoader = new TimeSeriesDslLoader(mappingScript);
249249
TimeSeriesMappingConfig mappingConfig = timeSeriesDslLoader.load(network, mappingParameters, store, new DataTableStore(), null);
250250
MetrixDslDataLoader metrixDslDataLoader = new MetrixDslDataLoader(metrixConfigurationScript);
251-
MetrixDslData dslData = metrixDslDataLoader.load(network, parameters, store, mappingConfig, null);
251+
MetrixDslData dslData = metrixDslDataLoader.load(network, parameters, store, new DataTableStore(), mappingConfig, null);
252252

253253
MetrixBranchPostProcessingTimeSeries branchProcessing = new MetrixBranchPostProcessingTimeSeries(dslData, mappingConfig, metrixResultTimeSeries.getTimeSeriesNames(null), null);
254254
postProcessingTimeSeries = branchProcessing.createPostProcessingTimeSeries();

Diff for: metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixContingencyAnalysisTest.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@
88
package com.powsybl.metrix.integration;
99

1010
import com.google.common.collect.ImmutableList;
11-
import com.powsybl.contingency.*;
11+
import com.powsybl.contingency.BranchContingency;
12+
import com.powsybl.contingency.BusbarSectionContingency;
13+
import com.powsybl.contingency.ContingenciesProvider;
14+
import com.powsybl.contingency.Contingency;
15+
import com.powsybl.contingency.ContingencyElement;
16+
import com.powsybl.contingency.EmptyContingencyListProvider;
1217
import com.powsybl.iidm.network.Network;
1318
import com.powsybl.iidm.serde.NetworkSerDe;
1419
import com.powsybl.metrix.integration.metrix.MetrixInputAnalysis;
@@ -28,14 +33,14 @@
2833
/**
2934
* @author Marianne Funfrock {@literal <marianne.funfrock at rte-france.com>}
3035
*/
31-
public class MetrixContingencyAnalysisTest {
36+
class MetrixContingencyAnalysisTest {
3237

3338
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("lang.MetrixAnalysis");
3439

3540
private Network network;
3641

3742
@BeforeEach
38-
public void setUp() {
43+
void setUp() {
3944
network = NetworkSerDe.read(getClass().getResourceAsStream("/simpleNetwork.xml"));
4045
}
4146

@@ -63,7 +68,7 @@ private String getWarningInvalidMetrixDslDataContingency(String section, String
6368
private void metrixDslDataContingencyAnalysisTest(MetrixDslData metrixDslData, String expected) throws IOException {
6469
StringWriter writer = new StringWriter();
6570
try (BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
66-
MetrixInputAnalysis metrixInputAnalysis = new MetrixInputAnalysis(new StringReader(""), new EmptyContingencyListProvider(), network, metrixDslData, bufferedWriter);
71+
MetrixInputAnalysis metrixInputAnalysis = new MetrixInputAnalysis(new StringReader(""), new EmptyContingencyListProvider(), network, metrixDslData, null, bufferedWriter);
6772
metrixInputAnalysis.runAnalysis();
6873
bufferedWriter.flush();
6974
String actual = writer.toString();
@@ -78,7 +83,7 @@ private void loadContingencyTest(Contingency contingency, String expected) throw
7883

7984
StringWriter writer = new StringWriter();
8085
try (BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
81-
MetrixInputAnalysis metrixInputAnalysis = new MetrixInputAnalysis(new StringReader(""), provider, network, new MetrixDslData(), bufferedWriter);
86+
MetrixInputAnalysis metrixInputAnalysis = new MetrixInputAnalysis(new StringReader(""), provider, network, new MetrixDslData(), null, bufferedWriter);
8287
metrixInputAnalysis.runAnalysis();
8388
bufferedWriter.flush();
8489
String actual = writer.toString();
@@ -166,7 +171,7 @@ void metrixRemedialContingencyAnalysisTest() throws IOException {
166171
String.join(System.lineSeparator(),
167172
"NB;1;",
168173
"ctyId;1;FP.AND1 FVERGE1 1;")
169-
), new EmptyContingencyListProvider(), network, new MetrixDslData(), bufferedWriter);
174+
), new EmptyContingencyListProvider(), network, new MetrixDslData(), null, bufferedWriter);
170175
metrixInputAnalysis.runAnalysis();
171176
bufferedWriter.flush();
172177
String actual = writer.toString();

Diff for: metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixDslDataLoaderDoctrineCostTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void testLoadShedding() throws IOException {
9696

9797
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
9898
TimeSeriesMappingConfig mappingConfig = new TimeSeriesDslLoader(mappingFile).load(network, mappingParameters, store, new DataTableStore(), null);
99-
MetrixDslDataLoader.load(dslFile, network, parameters, store, mappingConfig);
99+
MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), mappingConfig);
100100

101101
assertEquals("12000", mappingConfig.getEquipmentToTimeSeries().get(new MappingKey(MetrixVariable.PREVENTIVE_DOCTRINE_COST_DOWN, "FSSV.O11_L")));
102102
assertEquals("ts1", mappingConfig.getEquipmentToTimeSeries().get(new MappingKey(MetrixVariable.PREVENTIVE_DOCTRINE_COST_DOWN, "FVALDI11_L2")));
@@ -132,7 +132,7 @@ void testGeneratorRedispatching() throws IOException {
132132

133133
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
134134
TimeSeriesMappingConfig mappingConfig = new TimeSeriesDslLoader(mappingFile).load(network, mappingParameters, store, new DataTableStore(), null);
135-
MetrixDslDataLoader.load(dslFile, network, parameters, store, mappingConfig);
135+
MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), mappingConfig);
136136

137137
assertEquals("50", mappingConfig.getEquipmentToTimeSeries().get(new MappingKey(MetrixVariable.ON_GRID_DOCTRINE_COST_UP, "FSSV.O11_G")));
138138
assertEquals("200", mappingConfig.getEquipmentToTimeSeries().get(new MappingKey(MetrixVariable.ON_GRID_DOCTRINE_COST_DOWN, "FSSV.O11_G")));
@@ -157,7 +157,7 @@ void testLosses() throws IOException {
157157

158158
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
159159
TimeSeriesMappingConfig mappingConfig = new TimeSeriesDslLoader(mappingFile).load(network, mappingParameters, store, new DataTableStore(), null);
160-
MetrixDslDataLoader.load(dslFile, network, parameters, store, mappingConfig);
160+
MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), mappingConfig);
161161

162162
assertEquals("ts1", mappingConfig.getEquipmentToTimeSeries().get(new MappingKey(MetrixVariable.LOSSES_DOCTRINE_COST, "SimpleNetworkWithReducedThresholds")));
163163
assertEquals(Set.of(new MappingKey(MetrixVariable.LOSSES_DOCTRINE_COST, "SimpleNetworkWithReducedThresholds")), mappingConfig.getTimeSeriesToEquipment().get("ts1"));
@@ -196,7 +196,7 @@ void testDoctrineCostIsMissing() throws IOException {
196196
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
197197
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
198198
try (Writer out = new BufferedWriter(new OutputStreamWriter(outputStream))) {
199-
MetrixDslDataLoader.load(dslFile, network, parameters, store, new TimeSeriesMappingConfig(), out);
199+
MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), new TimeSeriesMappingConfig(), out);
200200
}
201201

202202
String output = outputStream.toString();

Diff for: metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixDslDataLoaderInterruptionTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ void testCancelMetrixDslDataLoaderShort(boolean isDelayed) throws Exception {
8888
}
8989
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
9090
TimeSeriesMappingConfig tsConfig = new TimeSeriesDslLoader(mappingFile).load(network, mappingParameters, store, new DataTableStore(), null);
91-
testCancelShortTask(isDelayed, () -> MetrixDslDataLoader.load(dslFile, network, parameters, store, tsConfig));
91+
testCancelShortTask(isDelayed, () -> MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), tsConfig));
9292
}
9393

9494
@ParameterizedTest
@@ -120,6 +120,6 @@ void testCancelMetrixDslDataLoaderLong(boolean isDelayed) throws IOException, In
120120
}
121121
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
122122
TimeSeriesMappingConfig tsConfig = new TimeSeriesDslLoader(mappingFile).load(network, mappingParameters, store, new DataTableStore(), null);
123-
testCancelLongTask(isDelayed, () -> MetrixDslDataLoader.load(dslFile, network, parameters, store, tsConfig));
123+
testCancelLongTask(isDelayed, () -> MetrixDslDataLoader.load(dslFile, network, parameters, store, new DataTableStore(), tsConfig));
124124
}
125125
}

0 commit comments

Comments
 (0)