SweConstraintSeriesCreator.java
/*
* Copyright (c) 2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.powsybl.openrao.data.raoresult.io.cne.swe;
import com.powsybl.openrao.data.raoresult.io.cne.commons.CneUtil;
import com.powsybl.contingency.Contingency;
import com.powsybl.openrao.data.crac.io.cim.craccreator.CimCracCreationContext;
import com.powsybl.openrao.data.raoresult.io.cne.swe.xsd.*;
import java.util.*;
import static com.powsybl.openrao.data.raoresult.io.cne.commons.CneConstants.*;
/**
* Structures the chaining of RASeriesCreator and MonitoredSeriesCreator for SWE CNE format
*
* @author Philippe Edwards {@literal <philippe.edwards at rte-france.com>}
*/
public final class SweConstraintSeriesCreator {
private final SweCneHelper sweCneHelper;
private final SweMonitoredSeriesCreator monitoredSeriesCreator;
private final SweRemedialActionSeriesCreator remedialActionSeriesCreator;
private final SweAdditionalConstraintSeriesCreator additionalConstraintSeriesCreator;
public SweConstraintSeriesCreator(SweCneHelper sweCneHelper, CimCracCreationContext cracCreationContext) {
this.sweCneHelper = sweCneHelper;
this.monitoredSeriesCreator = new SweMonitoredSeriesCreator(sweCneHelper, cracCreationContext);
this.remedialActionSeriesCreator = new SweRemedialActionSeriesCreator(sweCneHelper, cracCreationContext);
this.additionalConstraintSeriesCreator = new SweAdditionalConstraintSeriesCreator(sweCneHelper, cracCreationContext);
}
public List<ConstraintSeries> generate() {
List<ConstraintSeries> allConstraintSeries = new ArrayList<>();
allConstraintSeries.addAll(generateB56());
allConstraintSeries.addAll(generateB57());
return allConstraintSeries;
}
private List<ConstraintSeries> generateB56() {
List<ConstraintSeries> constraintSeries = new ArrayList<>();
constraintSeries.add(generateBasecaseB56());
sweCneHelper.getCrac().getContingencies().stream().sorted(Comparator.comparing(Contingency::getId)).forEach(contingency ->
constraintSeries.add(generateContingencyB56(contingency))
);
return constraintSeries;
}
private ConstraintSeries generateBasecaseB56() {
ConstraintSeries constraintSeries = new ConstraintSeries();
constraintSeries.setMRID(CneUtil.generateUUID());
constraintSeries.setBusinessType(B56_BUSINESS_TYPE);
constraintSeries.getRemedialActionSeries().addAll(remedialActionSeriesCreator.generateRaSeries(null));
return constraintSeries;
}
private ConstraintSeries generateContingencyB56(Contingency contingency) {
ConstraintSeries constraintSeries = new ConstraintSeries();
constraintSeries.setMRID(CneUtil.generateUUID());
constraintSeries.setBusinessType(B56_BUSINESS_TYPE);
constraintSeries.getContingencySeries().add(generateContingencySeries(contingency));
if (sweCneHelper.isContingencyDivergent(contingency)) {
addDivergenceReasonCode(constraintSeries);
} else {
constraintSeries.getRemedialActionSeries().addAll(remedialActionSeriesCreator.generateRaSeries(contingency));
}
return constraintSeries;
}
private static void addDivergenceReasonCode(ConstraintSeries constraintSeries) {
Reason reason = new Reason();
reason.setCode(DIVERGENCE_CODE);
reason.setText(DIVERGENCE_TEXT);
constraintSeries.getReason().add(reason);
}
private List<ConstraintSeries> generateB57() {
List<ConstraintSeries> constraintSeries = new ArrayList<>();
constraintSeries.add(generateBasecaseB57());
sweCneHelper.getCrac().getContingencies().stream().sorted(Comparator.comparing(Contingency::getId)).forEach(contingency ->
constraintSeries.add(generateContingencyB57(contingency))
);
return constraintSeries;
}
private ConstraintSeries generateBasecaseB57() {
ConstraintSeries constraintSeries = new ConstraintSeries();
constraintSeries.setMRID(CneUtil.generateUUID());
constraintSeries.setBusinessType(B57_BUSINESS_TYPE);
constraintSeries.getAdditionalConstraintSeries().addAll(additionalConstraintSeriesCreator.generateAdditionalConstraintSeries(null));
constraintSeries.getMonitoredSeries().addAll(monitoredSeriesCreator.generateMonitoredSeries(null));
constraintSeries.getRemedialActionSeries().addAll(remedialActionSeriesCreator.generateRaSeriesReference(null));
return constraintSeries;
}
private ConstraintSeries generateContingencyB57(Contingency contingency) {
ConstraintSeries constraintSeries = new ConstraintSeries();
constraintSeries.setMRID(CneUtil.generateUUID());
constraintSeries.setBusinessType(B57_BUSINESS_TYPE);
constraintSeries.getAdditionalConstraintSeries().addAll(additionalConstraintSeriesCreator.generateAdditionalConstraintSeries(contingency));
constraintSeries.getContingencySeries().add(generateContingencySeries(contingency));
if (sweCneHelper.isContingencyDivergent(contingency)) {
constraintSeries.getMonitoredSeries().addAll(monitoredSeriesCreator.generateMonitoredSeries(contingency));
addDivergenceReasonCode(constraintSeries);
} else {
constraintSeries.getMonitoredSeries().addAll(monitoredSeriesCreator.generateMonitoredSeries(contingency));
constraintSeries.getRemedialActionSeries().addAll(remedialActionSeriesCreator.generateRaSeriesReference(contingency));
}
return constraintSeries;
}
private ContingencySeries generateContingencySeries(Contingency contingency) {
ContingencySeries contingencySeries = new ContingencySeries();
contingencySeries.setMRID(contingency.getId());
contingencySeries.setName(contingency.getName().orElse(contingency.getId()));
return contingencySeries;
}
}