Skip to content

Commit

Permalink
ReportNode implementation in CIM CRAC importer
Browse files Browse the repository at this point in the history
Signed-off-by: Sébastien Murgey <sebastien.murgey@rte-france.com>
  • Loading branch information
murgeyseb committed May 7, 2024
1 parent b4dc448 commit ba01dfa
Show file tree
Hide file tree
Showing 13 changed files with 177 additions and 114 deletions.
@@ -0,0 +1,33 @@
package com.powsybl.openrao.data.craccreation.creator.cim;

import com.powsybl.commons.report.ReportNode;
import com.powsybl.commons.report.TypedValue;

import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.BUSINESS_LOGS;
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.TECHNICAL_LOGS;

public final class Reports {
private Reports() {
}

public static ReportNode reportValidCimCrac(ReportNode reportNode, String filename) {
ReportNode addedNode = reportNode.newReportNode()
.withMessageTemplate("validCimCrac", "'${filename}' is a valid CIM CRAC document")
.withUntypedValue("filename", filename)
.withSeverity(TypedValue.INFO_SEVERITY)
.add();
BUSINESS_LOGS.info("CIM CRAC document is valid");
return addedNode;
}

public static ReportNode reportInvalidCimCrac(ReportNode reportNode, String filename, String reason) {
ReportNode addedNode = reportNode.newReportNode()
.withMessageTemplate("invalidCimCrac", "'${filename}' is NOT a valid CIM CRAC document. Reason: ${reason}")
.withUntypedValue("filename", filename)
.withUntypedValue("reason", reason)
.withSeverity(TypedValue.TRACE_SEVERITY)
.add();
TECHNICAL_LOGS.debug("CIM CRAC document is NOT valid. Reason: {}", reason);
return addedNode;
}
}
Expand Up @@ -17,10 +17,7 @@
import com.powsybl.openrao.data.craccreation.creator.cim.craccreator.remedialaction.RemedialActionSeriesCreationContext;

import java.time.OffsetDateTime;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

/**
Expand All @@ -42,19 +39,19 @@ public class CimCracCreationContext implements CracCreationContext {
this.crac = crac;
creationReport = new CracCreationReport();
this.timeStamp = timeStamp;
this.angleCnecCreationContexts = new HashSet<>();
this.voltageCnecCreationContexts = new HashSet<>();
this.angleCnecCreationContexts = new LinkedHashSet<>();
this.voltageCnecCreationContexts = new LinkedHashSet<>();
this.networkName = networkName;
}

protected CimCracCreationContext(CimCracCreationContext toCopy) {
this.crac = toCopy.crac;
this.isCreationSuccessful = toCopy.isCreationSuccessful;
this.contingencyCreationContexts = new HashSet<>(toCopy.contingencyCreationContexts);
this.contingencyCreationContexts = new LinkedHashSet<>(toCopy.contingencyCreationContexts);
this.monitoredSeriesCreationContexts = toCopy.monitoredSeriesCreationContexts;
this.angleCnecCreationContexts = new HashSet<>(toCopy.angleCnecCreationContexts);
this.voltageCnecCreationContexts = new HashSet<>(toCopy.voltageCnecCreationContexts);
this.remedialActionSeriesCreationContexts = new HashSet<>(toCopy.remedialActionSeriesCreationContexts);
this.angleCnecCreationContexts = new LinkedHashSet<>(toCopy.angleCnecCreationContexts);
this.voltageCnecCreationContexts = new LinkedHashSet<>(toCopy.voltageCnecCreationContexts);
this.remedialActionSeriesCreationContexts = new LinkedHashSet<>(toCopy.remedialActionSeriesCreationContexts);
this.creationReport = toCopy.creationReport;
this.timeStamp = toCopy.timeStamp;
this.networkName = toCopy.networkName;
Expand All @@ -71,60 +68,60 @@ public Crac getCrac() {
}

// Only contains contingency creation context report for the moment
public void buildCreationReport() {
addToReport(contingencyCreationContexts, "Contingency_Series");
addToReport(angleCnecCreationContexts, "AdditionalConstraint_Series");
addToReport(monitoredSeriesCreationContexts);
addToReport(remedialActionSeriesCreationContexts, "RemedialAction_Series");
addToReport(voltageCnecCreationContexts);
public void buildCreationReport(ReportNode reportNode) {
addToReport(contingencyCreationContexts, "Contingency_Series", reportNode);
addToReport(angleCnecCreationContexts, "AdditionalConstraint_Series", reportNode);
addToReport(monitoredSeriesCreationContexts, reportNode);
addToReport(remedialActionSeriesCreationContexts, "RemedialAction_Series", reportNode);
addToReport(voltageCnecCreationContexts, reportNode);
}

private void addToReport(Collection<? extends ElementaryCreationContext> contexts, String nativeTypeIdentifier) {
private void addToReport(Collection<? extends ElementaryCreationContext> contexts, String nativeTypeIdentifier, ReportNode reportNode) {
contexts.stream().filter(ElementaryCreationContext::isAltered).forEach(context ->
creationReport.altered(String.format("%s \"%s\" was modified: %s. ", nativeTypeIdentifier, context.getNativeId(), context.getImportStatusDetail()), ReportNode.NO_OP)
creationReport.altered(String.format("%s \"%s\" was modified: %s. ", nativeTypeIdentifier, context.getNativeId(), context.getImportStatusDetail()), reportNode)
);
contexts.stream().filter(context -> !context.isImported()).forEach(context ->
creationReport.removed(String.format("%s \"%s\" was not imported: %s. %s.", nativeTypeIdentifier, context.getNativeId(), context.getImportStatus(), context.getImportStatusDetail()), ReportNode.NO_OP)
creationReport.removed(String.format("%s \"%s\" was not imported: %s. %s.", nativeTypeIdentifier, context.getNativeId(), context.getImportStatus(), context.getImportStatusDetail()), reportNode)
);
}

private void addToReport(Map<String, MonitoredSeriesCreationContext> monitoredSeriesCreationContexts) {
private void addToReport(Map<String, MonitoredSeriesCreationContext> monitoredSeriesCreationContexts, ReportNode reportNode) {
for (MonitoredSeriesCreationContext monitoredSeriesCreationContext : monitoredSeriesCreationContexts.values()) {
if (!monitoredSeriesCreationContext.isImported()) {
creationReport.removed(String.format("Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesCreationContext.getNativeId(),
monitoredSeriesCreationContext.getImportStatus(), monitoredSeriesCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
monitoredSeriesCreationContext.getImportStatus(), monitoredSeriesCreationContext.getImportStatusDetail()), reportNode);
} else {
if (monitoredSeriesCreationContext.isAltered()) {
creationReport.altered(String.format("Monitored_Series \"%s\" was altered : %s.", monitoredSeriesCreationContext.getNativeId(),
monitoredSeriesCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
monitoredSeriesCreationContext.getImportStatusDetail()), reportNode);
}
addToReport(monitoredSeriesCreationContext.getMeasurementCreationContexts(), monitoredSeriesCreationContext.getNativeId());
addToReport(monitoredSeriesCreationContext.getMeasurementCreationContexts(), monitoredSeriesCreationContext.getNativeId(), reportNode);
}
}
}

private void addToReport(Set<MeasurementCreationContext> measurementCreationContexts, String monitoredSeriesNativeId) {
private void addToReport(Set<MeasurementCreationContext> measurementCreationContexts, String monitoredSeriesNativeId, ReportNode reportNode) {
for (MeasurementCreationContext measurementCreationContext : measurementCreationContexts) {
if (!measurementCreationContext.isImported()) {
creationReport.removed(String.format("A Measurement in Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesNativeId,
measurementCreationContext.getImportStatus(), measurementCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
measurementCreationContext.getImportStatus(), measurementCreationContext.getImportStatusDetail()), reportNode);
} else {
for (CnecCreationContext cnecCreationContext : measurementCreationContext.getCnecCreationContexts().values()) {
if (!cnecCreationContext.isImported()) {
creationReport.removed(String.format("A Cnec in Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesNativeId,
cnecCreationContext.getImportStatus(), cnecCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
cnecCreationContext.getImportStatus(), cnecCreationContext.getImportStatusDetail()), reportNode);
}
}
}
}
}

private void addToReport(Set<VoltageCnecCreationContext> voltageCnecCreationContexts) {
private void addToReport(Set<VoltageCnecCreationContext> voltageCnecCreationContexts, ReportNode reportNode) {
voltageCnecCreationContexts.stream().filter(context -> !context.isImported()).forEach(context -> {
String neId = context.getNativeNetworkElementId() != null ? context.getNativeNetworkElementId() : "all";
String instant = context.getInstantId() != null ? context.getInstantId().toLowerCase() : "all";
String coName = context.getNativeContingencyName() != null ? context.getNativeContingencyName() : "all";
creationReport.removed(String.format("VoltageCnec with network element \"%s\", instant \"%s\" and contingency \"%s\" was not imported: %s. %s.", neId, instant, coName, context.getImportStatus(), context.getImportStatusDetail()), ReportNode.NO_OP);
creationReport.removed(String.format("VoltageCnec with network element \"%s\", instant \"%s\" and contingency \"%s\" was not imported: %s. %s.", neId, instant, coName, context.getImportStatus(), context.getImportStatusDetail()), reportNode);
}
);
}
Expand All @@ -149,7 +146,7 @@ public void addAngleCnecCreationContext(AngleCnecCreationContext angleCnecCreati
}

public Set<AngleCnecCreationContext> getAngleCnecCreationContexts() {
return new HashSet<>(angleCnecCreationContexts);
return new LinkedHashSet<>(angleCnecCreationContexts);
}

public AngleCnecCreationContext getAngleCnecCreationContext(String seriesId) {
Expand All @@ -161,7 +158,7 @@ public void addVoltageCnecCreationContext(VoltageCnecCreationContext voltageCnec
}

public Set<VoltageCnecCreationContext> getVoltageCnecCreationContexts() {
return new HashSet<>(voltageCnecCreationContexts);
return new LinkedHashSet<>(voltageCnecCreationContexts);
}

public VoltageCnecCreationContext getVoltageCnecCreationContext(String nativeNetworkElementId, String instantId, String nativeContingencyName) {
Expand All @@ -181,11 +178,11 @@ public Set<VoltageCnecCreationContext> getVoltageCnecCreationContextsForContinge
}

public void setContingencyCreationContexts(Set<CimContingencyCreationContext> contingencyCreationContexts) {
this.contingencyCreationContexts = new HashSet<>(contingencyCreationContexts);
this.contingencyCreationContexts = new LinkedHashSet<>(contingencyCreationContexts);
}

public Set<CimContingencyCreationContext> getContingencyCreationContexts() {
return new HashSet<>(contingencyCreationContexts);
return new LinkedHashSet<>(contingencyCreationContexts);
}

public MonitoredSeriesCreationContext getMonitoredSeriesCreationContext(String seriesId) {
Expand All @@ -201,7 +198,7 @@ public void setMonitoredSeriesCreationContexts(Map<String, MonitoredSeriesCreati
}

public void setRemedialActionSeriesCreationContexts(Set<RemedialActionSeriesCreationContext> remedialActionCreationContexts) {
this.remedialActionSeriesCreationContexts = new HashSet<>(remedialActionCreationContexts);
this.remedialActionSeriesCreationContexts = new LinkedHashSet<>(remedialActionCreationContexts);
}

public Set<RemedialActionSeriesCreationContext> getRemedialActionSeriesCreationContexts() {
Expand Down
Expand Up @@ -68,23 +68,23 @@ public CimCracCreationContext createCrac(CimCrac cimCrac, Network network, Offse
}

if (offsetDateTime == null) {
creationContext.getCreationReport().error("Timestamp is null for cim crac creator.", ReportNode.NO_OP);
creationContext.getCreationReport().error("Timestamp is null for cim crac creator.", reportNode);
return creationContext.creationFailure();
} else {
String cracTimePeriodStart = cimCrac.getCracDocument().getTimePeriodTimeInterval().getStart();
String cracTimePeriodEnd = cimCrac.getCracDocument().getTimePeriodTimeInterval().getEnd();
if (!isInTimeInterval(offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd)) {
creationContext.getCreationReport().error(String.format("Timestamp %s is not in time interval [%s %s].", offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd), ReportNode.NO_OP);
creationContext.getCreationReport().error(String.format("Timestamp %s is not in time interval [%s %s].", offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd), reportNode);
return creationContext.creationFailure();
}
}

createContingencies();
createCnecs(parameters.getDefaultMonitoredSides());
createRemedialActions(cimCracCreationParameters);
createCnecs(parameters.getDefaultMonitoredSides(), reportNode);
createRemedialActions(cimCracCreationParameters, reportNode);
createVoltageCnecs(cimCracCreationParameters);
creationContext.buildCreationReport();
CracValidator.validateCrac(crac, network).forEach(addedReason -> creationContext.getCreationReport().added(addedReason, ReportNode.NO_OP));
creationContext.buildCreationReport(reportNode);
CracValidator.validateCrac(crac, network).forEach(addedReason -> creationContext.getCreationReport().added(addedReason, reportNode));
return creationContext.creationSuccess(crac);
}

Expand All @@ -99,12 +99,12 @@ private void createContingencies() {
new CimContingencyCreator(cimTimeSeries, crac, network, creationContext).createAndAddContingencies();
}

private void createCnecs(Set<Side> defaultMonitoredSides) {
new MonitoredSeriesCreator(cimTimeSeries, network, creationContext, defaultMonitoredSides).createAndAddMonitoredSeries();
private void createCnecs(Set<Side> defaultMonitoredSides, ReportNode reportNode) {
new MonitoredSeriesCreator(cimTimeSeries, network, creationContext, defaultMonitoredSides).createAndAddMonitoredSeries(reportNode);
}

private void createRemedialActions(CimCracCreationParameters cimCracCreationParameters) {
new RemedialActionSeriesCreator(cimTimeSeries, crac, network, creationContext, cimCracCreationParameters).createAndAddRemedialActionSeries();
private void createRemedialActions(CimCracCreationParameters cimCracCreationParameters, ReportNode reportNode) {
new RemedialActionSeriesCreator(cimTimeSeries, crac, network, creationContext, cimCracCreationParameters).createAndAddRemedialActionSeries(reportNode);
}

private void createVoltageCnecs(CimCracCreationParameters cimCracCreationParameters) {
Expand Down
Expand Up @@ -45,7 +45,7 @@ public static Contingency getContingencyFromCrac(ContingencySeries cimContingenc
public static Set<FlowCnec> getFlowCnecsFromCrac(MonitoredSeries monitoredSeries, CimCracCreationContext cracCreationContext) {
MonitoredSeriesCreationContext mscc = cracCreationContext.getMonitoredSeriesCreationContext(monitoredSeries.getMRID());
if (mscc == null) {
return new HashSet<>();
return new LinkedHashSet<>();
}
return mscc.getCreatedCnecIds().stream().map(cnecId -> cracCreationContext.getCrac().getFlowCnec(cnecId)).collect(Collectors.toSet());
}
Expand Down

0 comments on commit ba01dfa

Please sign in to comment.