Skip to content

Commit dc96ff0

Browse files
bqth29Godelaine
andauthored
feature(Time-Coupled): add LazyNetwork implementation (#1644)
* add lazy network implementation Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> * fix all tests but cucumbers Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> * fix cucumbers Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> * merge main Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> * use core snapshot version Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> * use lazy networks in ics importer tests Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> --------- Signed-off-by: Thomas Bouquet <thomas.bouquet@rte-france.com> Signed-off-by: Godelaine <godelaine.demontmorillon@rte-france.com> Co-authored-by: Godelaine <godelaine.demontmorillon@rte-france.com>
1 parent 44da057 commit dc96ff0

13 files changed

Lines changed: 1733 additions & 363 deletions

File tree

data/crac/crac-util/src/main/java/com/powsybl/openrao/data/crac/util/IcsImporter.java

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010
import com.powsybl.iidm.network.Bus;
1111
import com.powsybl.iidm.network.LoadType;
1212
import com.powsybl.iidm.network.Network;
13+
import com.powsybl.iidm.serde.NetworkSerDe;
1314
import com.powsybl.openrao.commons.OpenRaoException;
1415
import com.powsybl.openrao.commons.TemporalData;
1516
import com.powsybl.openrao.commons.TemporalDataImpl;
1617
import com.powsybl.openrao.data.crac.api.Crac;
1718
import com.powsybl.openrao.data.crac.api.rangeaction.InjectionRangeActionAdder;
1819
import com.powsybl.openrao.data.crac.api.rangeaction.VariationDirection;
1920
import com.powsybl.openrao.data.timecoupledconstraints.GeneratorConstraints;
20-
import com.powsybl.openrao.raoapi.RaoInputWithNetworkPaths;
21-
import com.powsybl.openrao.raoapi.TimeCoupledRaoInputWithNetworkPaths;
21+
import com.powsybl.openrao.raoapi.LazyNetwork;
22+
import com.powsybl.openrao.raoapi.RaoInput;
23+
import com.powsybl.openrao.raoapi.TimeCoupledRaoInput;
2224
import org.apache.commons.csv.CSVFormat;
2325
import org.apache.commons.csv.CSVRecord;
2426

@@ -27,7 +29,13 @@
2729
import java.io.InputStreamReader;
2830
import java.nio.file.Path;
2931
import java.time.OffsetDateTime;
30-
import java.util.*;
32+
import java.time.format.DateTimeFormatter;
33+
import java.util.HashMap;
34+
import java.util.Iterator;
35+
import java.util.List;
36+
import java.util.Map;
37+
import java.util.Optional;
38+
import java.util.Properties;
3139

3240
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.BUSINESS_WARNS;
3341

@@ -80,20 +88,20 @@ private IcsImporter() {
8088
//should only be used statically
8189
}
8290

83-
public static void populateInputWithICS(TimeCoupledRaoInputWithNetworkPaths timeCoupledRaoInput,
84-
InputStream staticInputStream,
85-
InputStream seriesInputStream,
86-
InputStream gskInputStream,
87-
double icsCostUp,
88-
double icsCostDown) throws IOException {
91+
public static TimeCoupledRaoInput populateInputWithICS(TimeCoupledRaoInput timeCoupledRaoInput,
92+
InputStream staticInputStream, InputStream seriesInputStream,
93+
InputStream gskInputStream,
94+
double icsCostUp,
95+
double icsCostDown,
96+
String exportDirectory) throws IOException {
8997
costUp = icsCostUp;
9098
costDown = icsCostDown;
9199

92100
TemporalData<Network> initialNetworks = new TemporalDataImpl<>();
93101
timeCoupledRaoInput.getRaoInputs().getDataPerTimestamp().forEach((dateTime, raoInput) -> {
94-
Network network = Network.read(raoInput.getInitialNetworkPath());
102+
Network network = raoInput.getNetwork();
95103
preProcessNetwork(network);
96-
initialNetworks.put(dateTime, network);
104+
initialNetworks.put(dateTime, NetworkSerDe.copy(network)); // use a copy not to modify initial network
97105
});
98106
CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
99107
.setDelimiter(";")
@@ -137,8 +145,15 @@ public static void populateInputWithICS(TimeCoupledRaoInputWithNetworkPaths time
137145
}
138146
});
139147

140-
initialNetworks.getDataPerTimestamp().forEach((dateTime, initialNetwork) ->
141-
initialNetwork.write("JIIDM", new Properties(), Path.of(timeCoupledRaoInput.getRaoInputs().getData(dateTime).orElseThrow().getPostIcsImportNetworkPath())));
148+
TemporalData<RaoInput> postIcsRaoInputs = new TemporalDataImpl<>();
149+
150+
initialNetworks.getDataPerTimestamp().forEach((dateTime, initialNetwork) -> {
151+
String exportedNetworkPath = exportDirectory + dateTime.format(DateTimeFormatter.ISO_DATE_TIME) + ".jiidm";
152+
initialNetwork.write("JIIDM", new Properties(), Path.of(exportedNetworkPath));
153+
postIcsRaoInputs.put(dateTime, RaoInput.build(new LazyNetwork(exportedNetworkPath), timeCoupledRaoInput.getRaoInputs().getData(dateTime).orElseThrow().getCrac()).build());
154+
});
155+
156+
return new TimeCoupledRaoInput(postIcsRaoInputs, timeCoupledRaoInput.getTimestampsToRun(), timeCoupledRaoInput.getTimeCoupledConstraints());
142157
}
143158

144159
private static void preProcessNetwork(Network network) {
@@ -156,7 +171,7 @@ private static boolean safeDoubleEquals(double a, double b) {
156171
return Math.abs(a - b) < 1e-3;
157172
}
158173

159-
private static void importGskRedispatchingAction(TimeCoupledRaoInputWithNetworkPaths timeCoupledRaoInput,
174+
private static void importGskRedispatchingAction(TimeCoupledRaoInput timeCoupledRaoInput,
160175
CSVRecord staticRecord,
161176
TemporalData<Network> initialNetworks,
162177
Map<String, CSVRecord> seriesPerType,
@@ -214,12 +229,12 @@ private static void importGskRedispatchingAction(TimeCoupledRaoInputWithNetworkP
214229
}
215230

216231
private static void importGskRedispatchActionForOneTimestamp(CSVRecord staticRecord,
217-
Map<String, CSVRecord> seriesPerType,
218-
String raId,
219-
Map<String, Double> weightPerNode,
220-
OffsetDateTime dateTime,
221-
RaoInputWithNetworkPaths raoInput,
222-
Map<String, String> networkElementPerGskElement) {
232+
Map<String, CSVRecord> seriesPerType,
233+
String raId,
234+
Map<String, Double> weightPerNode,
235+
OffsetDateTime dateTime,
236+
RaoInput raoInput,
237+
Map<String, String> networkElementPerGskElement) {
223238
Crac crac = raoInput.getCrac();
224239
double p0 = parseDoubleWithPossibleCommas(seriesPerType.get(P0).get(dateTime.getHour() + OFFSET));
225240
InjectionRangeActionAdder injectionRangeActionAdder = crac.newInjectionRangeAction()
@@ -252,7 +267,7 @@ private static void importGskRedispatchActionForOneTimestamp(CSVRecord staticRec
252267
injectionRangeActionAdder.add();
253268
}
254269

255-
private static void importNodeRedispatchingAction(TimeCoupledRaoInputWithNetworkPaths timeCoupledRaoInput,
270+
private static void importNodeRedispatchingAction(TimeCoupledRaoInput timeCoupledRaoInput,
256271
CSVRecord staticRecord,
257272
TemporalData<Network> initialNetworks,
258273
Map<String, CSVRecord> seriesPerType,
@@ -298,11 +313,11 @@ private static void importNodeRedispatchingAction(TimeCoupledRaoInputWithNetwork
298313
}
299314

300315
private static void importNodeRedispatchingActionForOneTimestamp(CSVRecord staticRecord,
301-
Map<String, CSVRecord> seriesPerType,
302-
String raId,
303-
OffsetDateTime dateTime,
304-
RaoInputWithNetworkPaths raoInput,
305-
String networkElementId) {
316+
Map<String, CSVRecord> seriesPerType,
317+
String raId,
318+
OffsetDateTime dateTime,
319+
RaoInput raoInput,
320+
String networkElementId) {
306321
Crac crac = raoInput.getCrac();
307322
double p0 = parseDoubleWithPossibleCommas(seriesPerType.get(P0).get(dateTime.getHour() + OFFSET));
308323
InjectionRangeActionAdder injectionRangeActionAdder = crac.newInjectionRangeAction()
@@ -331,7 +346,8 @@ private static void importNodeRedispatchingActionForOneTimestamp(CSVRecord stati
331346
injectionRangeActionAdder.add();
332347
}
333348

334-
private static String processNetworks(String nodeId, TemporalData<Network> initialNetworks, Map<String, CSVRecord> seriesPerType, double shiftKey) {
349+
private static String processNetworks(String
350+
nodeId, TemporalData<Network> initialNetworks, Map<String, CSVRecord> seriesPerType, double shiftKey) {
335351
String generatorId = seriesPerType.get(P0).get(RA_RD_ID) + "_" + nodeId + GENERATOR_SUFFIX;
336352
for (Map.Entry<OffsetDateTime, Network> entry : initialNetworks.getDataPerTimestamp().entrySet()) {
337353
Bus bus = findBus(nodeId, entry.getValue());
@@ -346,7 +362,8 @@ private static String processNetworks(String nodeId, TemporalData<Network> initi
346362
return generatorId;
347363
}
348364

349-
private static Optional<Double> parseValue(Map<String, CSVRecord> seriesPerType, String key, OffsetDateTime timestamp, double shiftKey) {
365+
private static Optional<Double> parseValue(Map<String, CSVRecord> seriesPerType, String key, OffsetDateTime
366+
timestamp, double shiftKey) {
350367
if (seriesPerType.containsKey(key)) {
351368
CSVRecord series = seriesPerType.get(key);
352369
String value = series.get(timestamp.getHour() + OFFSET);
@@ -398,12 +415,14 @@ private static void processBus(Bus bus, String generatorId, Double p0, double pM
398415
.add();
399416
}
400417

401-
private static boolean shouldBeImported(CSVRecord staticRecord, Map<String, Map<String, Double>> weightPerNodePerGsk) {
418+
private static boolean shouldBeImported(CSVRecord
419+
staticRecord, Map<String, Map<String, Double>> weightPerNodePerGsk) {
402420
return (staticRecord.get(RD_DESCRIPTION_MODE).equalsIgnoreCase(NODE) || weightPerNodePerGsk.containsKey(staticRecord.get(UCT_NODE_OR_GSK_ID))) &&
403421
(staticRecord.get(PREVENTIVE).equalsIgnoreCase(TRUE) /*|| staticRecord.get(CURATIVE).equalsIgnoreCase(TRUE)*/);
404422
}
405423

406-
private static boolean p0RespectsGradients(CSVRecord staticRecord, CSVRecord p0record, List<OffsetDateTime> dateTimes) {
424+
private static boolean p0RespectsGradients(CSVRecord staticRecord, CSVRecord
425+
p0record, List<OffsetDateTime> dateTimes) {
407426
double maxGradient = staticRecord.get(MAXIMUM_POSITIVE_POWER_GRADIENT).isEmpty() ?
408427
MAX_GRADIENT : parseDoubleWithPossibleCommas(staticRecord.get(MAXIMUM_POSITIVE_POWER_GRADIENT));
409428
double minGradient = staticRecord.get(MAXIMUM_NEGATIVE_POWER_GRADIENT).isEmpty() ?

0 commit comments

Comments
 (0)