1010import com .powsybl .iidm .network .Bus ;
1111import com .powsybl .iidm .network .LoadType ;
1212import com .powsybl .iidm .network .Network ;
13+ import com .powsybl .iidm .serde .NetworkSerDe ;
1314import com .powsybl .openrao .commons .OpenRaoException ;
1415import com .powsybl .openrao .commons .TemporalData ;
1516import com .powsybl .openrao .commons .TemporalDataImpl ;
1617import com .powsybl .openrao .data .crac .api .Crac ;
1718import com .powsybl .openrao .data .crac .api .rangeaction .InjectionRangeActionAdder ;
1819import com .powsybl .openrao .data .crac .api .rangeaction .VariationDirection ;
1920import 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 ;
2224import org .apache .commons .csv .CSVFormat ;
2325import org .apache .commons .csv .CSVRecord ;
2426
2729import java .io .InputStreamReader ;
2830import java .nio .file .Path ;
2931import 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
3240import 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