Skip to content

Commit bebc611

Browse files
marifunfrolnico
andauthored
Write ptdf and lodf matrix (#200)
* [IMG-623] ptdf and lodf matrix Signed-off-by: marifunf <[email protected]> * [IMG-623] MetrixRunParameters too many arguments Signed-off-by: marifunf <[email protected]> * [IMG-623] MetrixChunk string format correction Signed-off-by: marifunf <[email protected]> * [IMG-623] command parameters cleaning Signed-off-by: marifunf <[email protected]> * [IMG-623] generateMetrixInputData refactoring Signed-off-by: marifunf <[email protected]> * [IMG-623] MetrixRunParameters tests Signed-off-by: marifunf <[email protected]> * [IMG-623] MetrixChunkParamTest Signed-off-by: marifunf <[email protected]> * [IMG-623] MetrixInputDataGeneratorTest args Signed-off-by: marifunf <[email protected]> * [IMG-623] fix ci Signed-off-by: marifunf <[email protected]> * Revert "[IMG-623] fix ci" This reverts commit 3aec024. Signed-off-by: marifunf <[email protected]> * [IMG-623] fix ci Signed-off-by: marifunf <[email protected]> * fix issue Signed-off-by: Nicolas Rol <[email protected]> --------- Signed-off-by: marifunf <[email protected]> Signed-off-by: Nicolas Rol <[email protected]> Co-authored-by: Nicolas Rol <[email protected]>
1 parent eab5edc commit bebc611

File tree

10 files changed

+380
-62
lines changed

10 files changed

+380
-62
lines changed

metrix-integration/src/main/java/com/powsybl/metrix/integration/MetrixChunk.java

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package com.powsybl.metrix.integration;
99

1010
import com.powsybl.computation.*;
11-
import com.powsybl.contingency.ContingenciesProvider;
1211
import com.powsybl.iidm.network.Network;
1312
import com.powsybl.metrix.integration.dataGenerator.MetrixInputDataGenerator;
1413
import com.powsybl.metrix.integration.dataGenerator.MetrixOutputData;
@@ -27,6 +26,9 @@
2726
import java.util.regex.Pattern;
2827
import java.util.stream.Stream;
2928

29+
import static com.powsybl.metrix.integration.dataGenerator.MetrixInputDataGenerator.LODF_MATRIX_FILE_NAME;
30+
import static com.powsybl.metrix.integration.dataGenerator.MetrixInputDataGenerator.LOGS_FILE_NAME;
31+
import static com.powsybl.metrix.integration.dataGenerator.MetrixInputDataGenerator.PTDF_MATRIX_FILE_NAME;
3032
import static com.powsybl.metrix.integration.timeseries.InitOptimizedTimeSeriesWriter.INPUT_OPTIMIZED_FILE_NAME;
3133

3234
/**
@@ -37,7 +39,6 @@ public class MetrixChunk {
3739
private static final Logger LOGGER = LoggerFactory.getLogger(MetrixChunk.class);
3840

3941
private static final String WORKING_DIR_PREFIX = "metrix_chunk_";
40-
private static final String LOGS_FILE_NAME = "logs.txt";
4142
private static final String LOGS_FILE_DETAIL_PREFIX = "metrix";
4243
private static final String LOGS_FILE_DETAIL_SUFFIX = ".log";
4344

@@ -47,33 +48,21 @@ public class MetrixChunk {
4748

4849
private final MetrixConfig config;
4950

50-
private final Path remedialActionFile;
51-
52-
private final Path logFile;
53-
54-
private final Path logFileDetail;
55-
56-
private final Path networkPointFile;
57-
5851
private final MetrixChunkLogger metrixChunkLogger;
5952

60-
private final ContingenciesProvider contingenciesProvider;
53+
private final MetrixChunkParam metrixChunkParam;
6154

6255
public MetrixChunk(Network network, ComputationManager computationManager, MetrixChunkParam metrixChunkParam, MetrixConfig config, MetrixChunkLogger metrixChunkLogger) {
6356
this.network = Objects.requireNonNull(network);
6457
this.computationManager = Objects.requireNonNull(computationManager);
6558
this.config = Objects.requireNonNull(config);
66-
this.logFile = metrixChunkParam.logFile;
67-
this.logFileDetail = metrixChunkParam.logFileDetail;
68-
this.networkPointFile = metrixChunkParam.networkPointFile;
69-
this.remedialActionFile = metrixChunkParam.remedialActionsFile;
70-
this.contingenciesProvider = metrixChunkParam.contingenciesProvider;
7159
this.metrixChunkLogger = metrixChunkLogger;
60+
this.metrixChunkParam = metrixChunkParam;
7261
}
7362

7463
public CompletableFuture<List<TimeSeries>> run(MetrixParameters parameters, MetrixDslData metrixDslData, MetrixVariantProvider variantProvider) {
7564
Objects.requireNonNull(parameters);
76-
Objects.requireNonNull(contingenciesProvider);
65+
Objects.requireNonNull(metrixChunkParam.contingenciesProvider);
7766

7867
Optional<MetrixChunkLogger> optionalLogger = metrixChunkLogger != null ? Optional.of(metrixChunkLogger) : Optional.empty();
7968
Map<String, String> variables = Map.of("PATH", config.getHomeDir().resolve("bin").toString());
@@ -83,10 +72,10 @@ public CompletableFuture<List<TimeSeries>> run(MetrixParameters parameters, Metr
8372

8473
@Override
8574
public List<CommandExecution> before(Path workingDir) throws IOException {
86-
List<CommandExecution> commandes = new MetrixInputDataGenerator(config, workingDir, metrixChunkLogger).generateMetrixInputData(
87-
remedialActionFile, variantProvider, network, contingenciesProvider, parameters, metrixDslData);
75+
List<CommandExecution> commands = new MetrixInputDataGenerator(config, workingDir, metrixChunkLogger).generateMetrixInputData(
76+
variantProvider, network, parameters, metrixDslData, metrixChunkParam);
8877
optionalLogger.ifPresent(MetrixChunkLogger::beforeMetrixExecution);
89-
return commandes;
78+
return commands;
9079

9180
}
9281

@@ -106,14 +95,18 @@ public List<TimeSeries> after(Path workingDir, ExecutionReport report) throws IO
10695
// Retrieve log file
10796
retrieveLogFile(workingDir);
10897

98+
// Retrieve PTDF and LODF matrix files
99+
retrieveFile(workingDir, PTDF_MATRIX_FILE_NAME);
100+
retrieveFile(workingDir, LODF_MATRIX_FILE_NAME);
101+
109102
// Retrieve network point file
110103
copyNetworkPointFile(workingDir);
111104

112-
if (logFileDetail != null) {
105+
if (metrixChunkParam.logFileDetail != null) {
113106
int i = 0;
114107
Path sourcePath;
115108
while (Files.exists(sourcePath = workingDir.resolve(LOGS_FILE_DETAIL_PREFIX + String.format("%03d", i) + LOGS_FILE_DETAIL_SUFFIX))) {
116-
Files.copy(sourcePath, Paths.get(String.format(logFileDetail.toString(), i)));
109+
Files.copy(sourcePath, Paths.get(String.format(metrixChunkParam.logFileDetail.toString(), i)));
117110
i++;
118111
}
119112
}
@@ -124,29 +117,37 @@ public List<TimeSeries> after(Path workingDir, ExecutionReport report) throws IO
124117
}
125118

126119
private void copyNetworkPointFile(Path workingDir) throws IOException {
127-
if (networkPointFile != null) {
120+
if (metrixChunkParam.networkPointFile != null) {
128121
try (Stream<Path> paths = Files.list(workingDir)) {
129122
List<Path> files = paths.filter(path -> path.getFileName().toString().matches(Pattern.quote(network.getId()) + "(.*)\\.xiidm")).toList();
130123
if (files.size() != 1) {
131124
LOGGER.error("More than one network point files '{}'", files.size());
132125
throw new MetrixException("More than one network point files " + files.size());
133126
} else {
134-
Files.copy(workingDir.resolve(files.get(0)), networkPointFile);
127+
Files.copy(workingDir.resolve(files.get(0)), metrixChunkParam.networkPointFile);
135128
}
136129
}
137130
}
138131
}
139132

140133
private void retrieveLogFile(Path workingDir) throws IOException {
141-
if (logFile != null) {
134+
if (metrixChunkParam.logFile != null) {
142135
if (Files.exists(workingDir.resolve(LOGS_FILE_NAME))) {
143-
Files.copy(workingDir.resolve(LOGS_FILE_NAME), logFile);
136+
Files.copy(workingDir.resolve(LOGS_FILE_NAME), metrixChunkParam.logFile);
144137
} else {
145138
LOGGER.warn("Failed to retrieve metrix main log file !");
146139
}
147140
}
148141
}
149142

143+
private void retrieveFile(Path workingDir, String fileName) throws IOException {
144+
if (Files.exists(workingDir.resolve(fileName + ".gz"))) {
145+
Files.copy(workingDir.resolve(fileName), Path.of(fileName));
146+
} else {
147+
LOGGER.warn("Failed to retrieve metrix '{}' file !", fileName);
148+
}
149+
}
150+
150151
private int parseResults(Path workingDir, List<TimeSeries> results, MetrixVariantProvider variantProvider) {
151152
int variantCount;
152153
if (variantProvider != null) {

metrix-integration/src/main/java/com/powsybl/metrix/integration/MetrixRunParameters.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.metrix.integration;
99

10+
import com.powsybl.metrix.mapping.ComputationRange;
11+
1012
import java.util.Collections;
1113
import java.util.SortedSet;
1214
import java.util.TreeSet;
@@ -30,15 +32,22 @@ public class MetrixRunParameters {
3032

3133
private final boolean isNetworkComputation;
3234

33-
public MetrixRunParameters(int firstVariant, int variantCount, SortedSet<Integer> versions, int chunkSize,
34-
boolean ignoreLimits, boolean ignoreEmptyFilter, boolean isNetworkComputation) {
35-
this.firstVariant = firstVariant;
36-
this.variantCount = variantCount;
37-
this.versions = new TreeSet<>(versions);
35+
private final boolean writePtdfMatrix;
36+
37+
private final boolean writeLodfMatrix;
38+
39+
public MetrixRunParameters(ComputationRange computationRange, int chunkSize,
40+
boolean ignoreLimits, boolean ignoreEmptyFilter, boolean isNetworkComputation,
41+
boolean writePtdfMatrix, boolean writeLodfMatrix) {
42+
this.firstVariant = computationRange.getFirstVariant();
43+
this.variantCount = computationRange.getVariantCount();
44+
this.versions = new TreeSet<>(computationRange.getVersions());
3845
this.chunkSize = chunkSize;
3946
this.ignoreLimits = ignoreLimits;
4047
this.ignoreEmptyFilter = ignoreEmptyFilter;
4148
this.isNetworkComputation = isNetworkComputation;
49+
this.writePtdfMatrix = writePtdfMatrix;
50+
this.writeLodfMatrix = writeLodfMatrix;
4251
}
4352

4453
public int getFirstVariant() {
@@ -68,4 +77,12 @@ public boolean isIgnoreEmptyFilter() {
6877
public boolean isNetworkComputation() {
6978
return isNetworkComputation;
7079
}
80+
81+
public boolean writePtdfMatrix() {
82+
return writePtdfMatrix;
83+
}
84+
85+
public boolean writeLodfMatrix() {
86+
return writeLodfMatrix;
87+
}
7188
}

metrix-integration/src/main/java/com/powsybl/metrix/integration/dataGenerator/MetrixInputDataGenerator.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.powsybl.contingency.ContingenciesProvider;
1313
import com.powsybl.iidm.network.Network;
1414
import com.powsybl.metrix.integration.*;
15+
import com.powsybl.metrix.integration.metrix.MetrixChunkParam;
1516
import org.slf4j.Logger;
1617
import org.slf4j.LoggerFactory;
1718

@@ -34,11 +35,15 @@ public class MetrixInputDataGenerator {
3435

3536
private static final List<InputFile> FORT_FILE_NAME = Collections.singletonList(new InputFile("fort.json"));
3637
private static final String VARIANTES_FILE_NAME = "variantes.csv";
37-
private static final String LOGS_FILE_NAME = "logs.txt";
3838
private static final String METRIX_COMMAND_ID = "metrix";
3939
private static final String METRIX_LOG_LEVEL_ARG = "--log-level=";
40+
private static final String METRIX_PTDF_ARG = "--write-PTDF";
41+
private static final String METRIX_LODF_ARG = "--write-LODF";
4042

43+
public static final String LOGS_FILE_NAME = "logs.txt";
4144
public static final String REMEDIAL_ACTION_FILE_NAME = "parades.csv";
45+
public static final String PTDF_MATRIX_FILE_NAME = "PTDF_matrix.csv";
46+
public static final String LODF_MATRIX_FILE_NAME = "LODF_matrix.csv";
4247

4348
private final MetrixConfig config;
4449
private final Path workingDir;
@@ -71,32 +76,43 @@ public void generateInputFileZip(Path remedialActionFile,
7176
defineVariantValue(variantProvider));
7277
}
7378

74-
public List<CommandExecution> generateMetrixInputData(Path remedialActionFile,
75-
MetrixVariantProvider variantProvider, Network network,
76-
ContingenciesProvider contingenciesProvider,
79+
public List<CommandExecution> generateMetrixInputData(MetrixVariantProvider variantProvider,
80+
Network network,
7781
MetrixParameters parameters,
78-
MetrixDslData metrixDslData) throws IOException {
82+
MetrixDslData metrixDslData,
83+
MetrixChunkParam metrixChunkParam) throws IOException {
7984
MetrixVariantProvider.Variants variants = defineVariantValue(variantProvider);
80-
List<InputFile> inputFiles = inputFiles(remedialActionFile, variantProvider, network, contingenciesProvider, parameters, metrixDslData, this::copyToInputFiles, variants);
81-
List<OutputFile> outputFiles = outputFiles(variants);
82-
return commandExecutionFrom(command(config, variants, inputFiles, outputFiles));
85+
List<InputFile> inputFiles = inputFiles(metrixChunkParam.remedialActionsFile, variantProvider, network, metrixChunkParam.contingenciesProvider, parameters, metrixDslData, this::copyToInputFiles, variants);
86+
List<OutputFile> outputFiles = outputFiles(variants, metrixChunkParam.writePtdfMatrix, metrixChunkParam.writeLodfMatrix);
87+
return commandExecutionFrom(command(variants, metrixChunkParam.writePtdfMatrix, metrixChunkParam.writeLodfMatrix, inputFiles, outputFiles));
8388
}
8489

8590
private List<CommandExecution> commandExecutionFrom(Command command) {
8691
return Collections.singletonList(new CommandExecution(command, 1, 0, null));
8792
}
8893

89-
private Command command(MetrixConfig config, MetrixVariantProvider.Variants variants, List<InputFile> inputFiles, List<OutputFile> outputFiles) {
94+
private List<String> getArgs(MetrixVariantProvider.Variants variants, boolean writePtdf, boolean writeLodf) {
95+
List<String> args = new ArrayList<>();
96+
args.add(LOGS_FILE_NAME);
97+
args.add(VARIANTES_FILE_NAME);
98+
args.add(MetrixOutputData.FILE_NAME_PREFIX);
99+
args.add(Integer.toString(variants.firstVariant()));
100+
args.add(Integer.toString(variants.variantCount()));
101+
args.add(logArg(config.logLevel()));
102+
if (writePtdf) {
103+
args.add(METRIX_PTDF_ARG);
104+
}
105+
if (writeLodf) {
106+
args.add(METRIX_LODF_ARG);
107+
}
108+
return args;
109+
}
110+
111+
private Command command(MetrixVariantProvider.Variants variants, boolean writePtdf, boolean writeLodf, List<InputFile> inputFiles, List<OutputFile> outputFiles) {
90112
return new SimpleCommandBuilder()
91113
.id(METRIX_COMMAND_ID)
92114
.program(config.getCommand())
93-
.args(LOGS_FILE_NAME,
94-
VARIANTES_FILE_NAME,
95-
MetrixOutputData.FILE_NAME_PREFIX,
96-
Integer.toString(variants.firstVariant()),
97-
Integer.toString(variants.variantCount()),
98-
logArg(config.logLevel())
99-
)
115+
.args(getArgs(variants, writePtdf, writeLodf))
100116
.inputFiles(inputFiles)
101117
.outputFiles(outputFiles)
102118
.build();
@@ -130,12 +146,18 @@ private void copyToInputFiles(Path remedialActionFile, List<InputFile> inputFile
130146
copyInputFile(remedialActionFile, REMEDIAL_ACTION_FILE_NAME, inputFiles); // copy parades.csv
131147
}
132148

133-
private List<OutputFile> outputFiles(MetrixVariantProvider.Variants variants) {
149+
private List<OutputFile> outputFiles(MetrixVariantProvider.Variants variants, boolean writePtdf, boolean writeLodf) {
134150
List<OutputFile> outputFiles = new ArrayList<>(1 + variants.count());
135151
for (int variantNum = variants.firstVariant(); variantNum <= variants.lastVariant(); variantNum++) {
136152
outputFiles.add(new OutputFile(MetrixOutputData.getFileName(variantNum)));
137153
}
138154
outputFiles.add(new OutputFile(LOGS_FILE_NAME));
155+
if (writePtdf) {
156+
outputFiles.add(new OutputFile(PTDF_MATRIX_FILE_NAME, FilePostProcessor.FILE_GZIP));
157+
}
158+
if (writeLodf) {
159+
outputFiles.add(new OutputFile(LODF_MATRIX_FILE_NAME, FilePostProcessor.FILE_GZIP));
160+
}
139161
return outputFiles;
140162
}
141163

metrix-integration/src/main/java/com/powsybl/metrix/integration/metrix/MetrixChunkParam.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ public class MetrixChunkParam {
4747
public final int version;
4848
public final boolean ignoreLimits;
4949
public final boolean ignoreEmptyFilter;
50+
public final boolean writePtdfMatrix;
51+
public final boolean writeLodfMatrix;
5052
public final ContingenciesProvider contingenciesProvider;
5153

5254
MetrixChunkParam(Path caseFile, Path mappingFile, Path mappingConfigFile, Path mappingParametersFile, Path inputTimeSeriesJsonFile,
5355
Path remedialActionsFile, Path metrixDslDataFile, Path metrixDslFile, Path metrixParametersFile, Path logFile,
5456
Path logFileDetail, Path networkPointFile, Path outputTimeSeriesJsonFilePath, int firstVariant, int variantCount,
55-
int version, boolean ignoreLimits, boolean ignoreEmptyFilter, ContingenciesProvider contingenciesProvider) {
57+
int version, boolean ignoreLimits, boolean ignoreEmptyFilter, boolean writePtdfMatrix, boolean writeLodfMatrix, ContingenciesProvider contingenciesProvider) {
5658
this.caseFile = caseFile;
5759
this.mappingFile = mappingFile;
5860
this.mappingConfigFile = mappingConfigFile;
@@ -71,6 +73,8 @@ public class MetrixChunkParam {
7173
this.version = version;
7274
this.ignoreLimits = ignoreLimits;
7375
this.ignoreEmptyFilter = ignoreEmptyFilter;
76+
this.writePtdfMatrix = writePtdfMatrix;
77+
this.writeLodfMatrix = writeLodfMatrix;
7478
this.contingenciesProvider = contingenciesProvider;
7579
}
7680

@@ -93,6 +97,8 @@ public static class MetrixChunkParamBuilder {
9397
private int version;
9498
private boolean ignoreLimits;
9599
private boolean ignoreEmptyFilter;
100+
private boolean writePtdfMatrix;
101+
private boolean writeLodfMatrix;
96102
private ContingenciesProvider contingenciesProvider;
97103

98104
public MetrixChunkParamBuilder simpleInit(int version, boolean ignoreLimits, boolean ignoreEmptyFilter,
@@ -128,6 +134,8 @@ public MetrixChunkParamBuilder readCommandLine(CommandLine line, ToolRunningCont
128134
this.inputTimeSeriesJsonFile = context.getFileSystem().getPath(line.getOptionValue("input-time-series-json-file"));
129135
this.ignoreLimits = line.hasOption("ignore-limits");
130136
this.ignoreEmptyFilter = line.hasOption("ignore-empty-filter");
137+
this.writePtdfMatrix = line.hasOption("write-ptdf");
138+
this.writeLodfMatrix = line.hasOption("write-lodf");
131139
initializeContingenciesProvider(line, context);
132140
return this;
133141
}
@@ -152,7 +160,7 @@ private void initializeContingenciesProvider(CommandLine line, ToolRunningContex
152160
public MetrixChunkParam build() {
153161
return new MetrixChunkParam(caseFile, mappingFile, mappingConfigFile, mappingParametersFile, inputTimeSeriesJsonFile, remedialActionsFile,
154162
metrixDslDataFile, metrixDslFile, metrixParametersFile, logFile, logFileDetail, networkPointFile, outputTimeSeriesJsonFilePath,
155-
firstVariant, variantCount, version, ignoreLimits, ignoreEmptyFilter, contingenciesProvider);
163+
firstVariant, variantCount, version, ignoreLimits, ignoreEmptyFilter, writePtdfMatrix, writeLodfMatrix, contingenciesProvider);
156164
}
157165
}
158166
}

0 commit comments

Comments
 (0)