Skip to content

Commit

Permalink
Merge branch 'main' into add_readmes
Browse files Browse the repository at this point in the history
  • Loading branch information
pet-mit committed May 6, 2024
2 parents e61acee + fb92e9c commit c8429b7
Show file tree
Hide file tree
Showing 139 changed files with 2,173 additions and 182 deletions.
Expand Up @@ -11,6 +11,7 @@
import com.powsybl.openrao.data.cracapi.*;
import com.powsybl.openrao.data.cracapi.cnec.AngleCnec;
import com.powsybl.openrao.data.cracapi.cnec.FlowCnec;
import com.powsybl.openrao.data.cracapi.usagerule.OnFlowConstraintInCountryAdder;
import com.powsybl.openrao.data.cracapi.usagerule.UsageMethod;
import com.powsybl.openrao.data.craccreation.creator.api.ImportStatus;
import com.powsybl.openrao.data.craccreation.creator.cim.craccreator.CimCracCreationContext;
Expand Down Expand Up @@ -98,7 +99,7 @@ public void createAndAddRemedialActionSeries() {
// Read and store Monitored Series
this.flowCnecs = getFlowCnecsFromMonitoredAndContingencySeries(cimSerie);
// Read and create / modify RA creators
boolean shouldReadSharedDomain = cimSerie.getContingencySeries().isEmpty() && cimSerie.getMonitoredSeries().isEmpty();
boolean shouldReadSharedDomain = cimSerie.getMonitoredSeries().isEmpty();
for (RemedialActionSeries remedialActionSeries : cimSerie.getRemedialActionSeries()) {
readRemedialAction(remedialActionSeries, shouldReadSharedDomain);
}
Expand Down Expand Up @@ -406,7 +407,7 @@ private static void addUsageRulesAtInstant(RemedialActionAdder<?> remedialAction
}
UsageMethod usageMethod = instant.isAuto() ? UsageMethod.FORCED : UsageMethod.AVAILABLE;
if (!Objects.isNull(sharedDomain)) {
remedialActionAdder.newOnFlowConstraintInCountryUsageRule().withInstant(instant.getId()).withCountry(sharedDomain).withUsageMethod(usageMethod).add();
addOnFlowConstraintInCountryUsageRule(remedialActionAdder, contingencies, sharedDomain, instant, usageMethod);
return;
}

Expand Down Expand Up @@ -485,6 +486,20 @@ private static void addOnAngleConstraintUsageRule(RemedialActionAdder<?> adder,
.add();
}

private static void addOnFlowConstraintInCountryUsageRule(RemedialActionAdder<?> remedialActionAdder, List<Contingency> contingencies, Country sharedDomain, Instant instant, UsageMethod usageMethod) {
OnFlowConstraintInCountryAdder<?> onFlowConstraintInCountryAdder = remedialActionAdder
.newOnFlowConstraintInCountryUsageRule()
.withInstant(instant.getId())
.withCountry(sharedDomain)
.withUsageMethod(usageMethod);
if (!Objects.isNull(contingencies) && !contingencies.isEmpty()) {
contingencies.forEach(
contingency -> onFlowConstraintInCountryAdder.withContingency(contingency.getId()).add());
} else {
onFlowConstraintInCountryAdder.add();
}
}

/*-------------- SERIES CHECKS ------------------------------*/
private boolean checkRemedialActionSeries(Series cimSerie) {
// --- Check optimizationStatus
Expand Down
Expand Up @@ -703,6 +703,68 @@ void testImportRasAvailableForSpecificCountry() {
.map(InjectionSetpoint.class::cast)
.anyMatch(is -> is.getNetworkElement().getId().equals("_1dc9afba-23b5-41a0-8540-b479ed8baf4b") && is.getSetpoint() == 480)
);

// RA_4
assertNetworkActionImported("RA_4", Set.of("_b94318f6-6d24-4f56-96b9-df2531ad6543", "_1dc9afba-23b5-41a0-8540-b479ed8baf4b"), false);
NetworkAction ra4 = importedCrac.getNetworkAction("RA_4");
assertEquals(2, ra4.getUsageRules().size());
assertTrue(
ra4.getUsageRules().stream()
.filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.anyMatch(ur -> ur.getInstant().isPreventive() && ur.getContingency().isEmpty() && ur.getCountry().equals(Country.FR))
);
assertTrue(
ra4.getUsageRules().stream()
.filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.anyMatch(ur -> ur.getInstant().isCurative() && ur.getContingency().orElseThrow().getId().equals("CO_1") && ur.getCountry().equals(Country.FR))
);
assertEquals(2, ra4.getElementaryActions().size());
assertTrue(ra4.getElementaryActions().stream()
.filter(PstSetpoint.class::isInstance)
.map(PstSetpoint.class::cast)
.anyMatch(ps -> ps.getNetworkElement().getId().equals("_b94318f6-6d24-4f56-96b9-df2531ad6543") && ps.getSetpoint() == 0)
);
assertTrue(ra4.getElementaryActions().stream()
.filter(InjectionSetpoint.class::isInstance)
.map(InjectionSetpoint.class::cast)
.anyMatch(is -> is.getNetworkElement().getId().equals("_1dc9afba-23b5-41a0-8540-b479ed8baf4b") && is.getSetpoint() == 480)
);

// RA_5
assertNetworkActionImported("RA_4", Set.of("_b94318f6-6d24-4f56-96b9-df2531ad6543", "_1dc9afba-23b5-41a0-8540-b479ed8baf4b"), false);
NetworkAction ra5 = importedCrac.getNetworkAction("RA_5");
assertEquals(3, ra5.getUsageRules().size());
assertTrue(
ra5.getUsageRules().stream()
.filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.anyMatch(ur -> ur.getInstant().isPreventive() && ur.getContingency().isEmpty() && ur.getCountry().equals(Country.FR))
);
assertTrue(
ra5.getUsageRules().stream()
.filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.anyMatch(ur -> ur.getInstant().isCurative() && ur.getContingency().orElseThrow().getId().equals("CO_1") && ur.getCountry().equals(Country.FR))
);
assertTrue(
ra5.getUsageRules().stream()
.filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.anyMatch(ur -> ur.getInstant().isCurative() && ur.getContingency().orElseThrow().getId().equals("CO_2") && ur.getCountry().equals(Country.FR))
);
assertEquals(2, ra5.getElementaryActions().size());
assertTrue(ra5.getElementaryActions().stream()
.filter(PstSetpoint.class::isInstance)
.map(PstSetpoint.class::cast)
.anyMatch(ps -> ps.getNetworkElement().getId().equals("_b94318f6-6d24-4f56-96b9-df2531ad6543") && ps.getSetpoint() == 0)
);
assertTrue(ra5.getElementaryActions().stream()
.filter(InjectionSetpoint.class::isInstance)
.map(InjectionSetpoint.class::cast)
.anyMatch(is -> is.getNetworkElement().getId().equals("_1dc9afba-23b5-41a0-8540-b479ed8baf4b") && is.getSetpoint() == 480)
);
}

@Test
Expand Down
Expand Up @@ -297,6 +297,105 @@
<resourceCapacity.defaultCapacity>480</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
</RemedialAction_Series>
</Series>
<Series>
<mRID>RA-Series-4</mRID>
<businessType>B56</businessType>
<name>RA_SERIES-4</name>
<optimization_MarketObjectStatus.status>A52</optimization_MarketObjectStatus.status>
<Contingency_Series>
<mRID>CO_1</mRID>
<name>GHDOV-UENEDI-1 400 kV</name>
<RegisteredResource>
<mRID codingScheme="A02">_ffbabc27-1ccd-4fdc-b037-e341706c8d29</mRID>
<name>VJRKVJ_EIFOC_1_400</name>
<in_Domain.mRID codingScheme="A01">10YES-REE------0</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YES-REE------0</out_Domain.mRID>
</RegisteredResource>
</Contingency_Series>
<RemedialAction_Series>
<mRID>RA_4</mRID>
<name>Mixed RA with country</name>
<businessType>B59</businessType>
<applicationMode_MarketObjectStatus.status>A27</applicationMode_MarketObjectStatus.status>
<availability_MarketObjectStatus.status>A39</availability_MarketObjectStatus.status>
<RegisteredResource>
<mRID codingScheme="A02">_b94318f6-6d24-4f56-96b9-df2531ad6543</mRID>
<name>ZFDOVBHLGTZ 1 VJDEOC</name>
<pSRType.psrType>A06</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">10YPT-REN------W</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YPT-REN------W</out_Domain.mRID>
<marketObjectStatus.status>A25</marketObjectStatus.status>
<resourceCapacity.defaultCapacity>-10</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>C62</resourceCapacity.unitSymbol>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">_1dc9afba-23b5-41a0-8540-b479ed8baf4b</mRID>
<name>BHEKG3</name>
<pSRType.psrType>A04</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">10YPT-REN------W</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YPT-REN------W</out_Domain.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.defaultCapacity>480</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
<Shared_Domain>
<mRID codingScheme="A01">10YFR-RTE------C</mRID>
</Shared_Domain>
</RemedialAction_Series>
</Series>
<Series>
<mRID>RA-Series-5</mRID>
<businessType>B56</businessType>
<name>RA_SERIES-5</name>
<optimization_MarketObjectStatus.status>A52</optimization_MarketObjectStatus.status>
<Contingency_Series>
<mRID>CO_1</mRID>
<name>GHDOV-UENEDI-1 400 kV</name>
<RegisteredResource>
<mRID codingScheme="A02">_ffbabc27-1ccd-4fdc-b037-e341706c8d29</mRID>
<name>VJRKVJ_EIFOC_1_400</name>
<in_Domain.mRID codingScheme="A01">10YES-REE------0</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YES-REE------0</out_Domain.mRID>
</RegisteredResource>
</Contingency_Series>
<Contingency_Series>
<mRID>CO_2</mRID>
<name>GHDOV-ZEGU-1 400 kV</name>
<RegisteredResource>
<mRID codingScheme="A02">_b58bf21a-096a-4dae-9a01-3f03b60c24c7</mRID>
<name>VJRKVJ_ZEGU_1_400</name>
<in_Domain.mRID codingScheme="A01">10YES-REE------0</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YES-REE------0</out_Domain.mRID>
</RegisteredResource>
</Contingency_Series>
<RemedialAction_Series>
<mRID>RA_5</mRID>
<name>Mixed RA with country with multiple contingencies</name>
<businessType>B59</businessType>
<applicationMode_MarketObjectStatus.status>A27</applicationMode_MarketObjectStatus.status>
<availability_MarketObjectStatus.status>A39</availability_MarketObjectStatus.status>
<RegisteredResource>
<mRID codingScheme="A02">_b94318f6-6d24-4f56-96b9-df2531ad6543</mRID>
<name>ZFDOVBHLGTZ 1 VJDEOC</name>
<pSRType.psrType>A06</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">10YPT-REN------W</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YPT-REN------W</out_Domain.mRID>
<marketObjectStatus.status>A25</marketObjectStatus.status>
<resourceCapacity.defaultCapacity>-10</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>C62</resourceCapacity.unitSymbol>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">_1dc9afba-23b5-41a0-8540-b479ed8baf4b</mRID>
<name>BHEKG3</name>
<pSRType.psrType>A04</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">10YPT-REN------W</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YPT-REN------W</out_Domain.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.defaultCapacity>480</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
<Shared_Domain>
<mRID codingScheme="A01">10YFR-RTE------C</mRID>
</Shared_Domain>
Expand Down
Expand Up @@ -31,7 +31,7 @@ public final class JsonSerializationConstants {
private JsonSerializationConstants() {
}

public static final String CRAC_IO_VERSION = "2.1";
public static final String CRAC_IO_VERSION = "2.2";
/*
v1.1: addition of switchPairs
v1.2: addition of injectionRangeAction
Expand All @@ -43,6 +43,7 @@ private JsonSerializationConstants() {
v1.9: addition of counterTradeRangeAction
v2.0: addition of instants and change in usage method logic
v2.1: addition of ra-usage-limits
v2.2: addition of contingency id in on-flow-constraint-in-country
*/

// headers
Expand Down
Expand Up @@ -39,6 +39,9 @@ public static void deserialize(JsonParser jsonParser, RemedialActionAdder<?> own
adder.withUsageMethod(deseralizeInstantKind(instantId).equals(InstantKind.AUTO) ? UsageMethod.FORCED : UsageMethod.AVAILABLE);
}
break;
case CONTINGENCY_ID:
adder.withContingency(jsonParser.nextTextValue());
break;
case USAGE_METHOD:
adder.withUsageMethod(deserializeUsageMethod(jsonParser.nextTextValue()));
break;
Expand Down
Expand Up @@ -24,6 +24,9 @@ public void serialize(OnFlowConstraintInCountry value, JsonGenerator gen, Serial
gen.writeStartObject();
gen.writeStringField(INSTANT, value.getInstant().getId());
gen.writeStringField(COUNTRY, value.getCountry().toString());
if (value.getContingency().isPresent()) {
gen.writeStringField(CONTINGENCY_ID, value.getContingency().get().getId());
}
gen.writeStringField(USAGE_METHOD, serializeUsageMethod(value.getUsageMethod()));
gen.writeEndObject();
}
Expand Down
Expand Up @@ -388,6 +388,8 @@ void roundTripTest() {
ur = (OnFlowConstraintInCountry) usageRules.stream().filter(OnFlowConstraintInCountry.class::isInstance).findAny().orElseThrow();
assertEquals(curativeInstant, ur.getInstant());
assertEquals(Country.ES, ur.getCountry());
assertTrue(ur.getContingency().isPresent());
assertEquals("contingency2Id", ur.getContingency().get().getId());

// ---------------------------------
// --- test CounterTradeRangeAction ---
Expand Down
Expand Up @@ -31,6 +31,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import static com.powsybl.openrao.data.cracapi.usagerule.UsageMethod.AVAILABLE;
import static com.powsybl.openrao.data.cracapi.usagerule.UsageMethod.FORCED;
Expand Down Expand Up @@ -260,20 +261,20 @@ void importV2Point0Test() {
InputStream cracFile = getClass().getResourceAsStream("/retrocompatibility/v2/crac-v2.0.json");

Crac crac = new JsonImport().importCrac(cracFile, network);

assertEquals(2, crac.getContingencies().size());
assertEquals(7, crac.getFlowCnecs().size());
assertEquals(1, crac.getAngleCnecs().size());
assertEquals(1, crac.getVoltageCnecs().size());
assertEquals(4, crac.getNetworkActions().size());
assertEquals(4, crac.getPstRangeActions().size());
assertEquals(2, crac.getHvdcRangeActions().size());
assertEquals(1, crac.getInjectionRangeActions().size());
assertEquals(1, crac.getCounterTradeRangeActions().size());
assertEquals(5, crac.getSortedInstants().size());
testContentOfV2Point0Crac(crac);
}

@Test
void importV2Point2Test() {
// Add support for contingency in OnFlowConstraintInCountry
InputStream cracFile = getClass().getResourceAsStream("/retrocompatibility/v2/crac-v2.2.json");

Crac crac = new JsonImport().importCrac(cracFile, network);
assertEquals(6, crac.getNetworkActions().size());
testContentOfV2Point2Crac(crac);
}

private void testContentOfV1Point0Crac(Crac crac) {
Instant preventiveInstant = crac.getInstant("preventive");
Instant autoInstant = crac.getInstant("auto");
Expand Down Expand Up @@ -635,6 +636,15 @@ void testContentOfV1Point9Crac(Crac crac) {
}

private void testContentOfV2Point0Crac(Crac crac) {
assertEquals(2, crac.getContingencies().size());
assertEquals(7, crac.getFlowCnecs().size());
assertEquals(1, crac.getAngleCnecs().size());
assertEquals(1, crac.getVoltageCnecs().size());
assertEquals(4, crac.getPstRangeActions().size());
assertEquals(2, crac.getHvdcRangeActions().size());
assertEquals(1, crac.getInjectionRangeActions().size());
assertEquals(1, crac.getCounterTradeRangeActions().size());
assertEquals(5, crac.getSortedInstants().size());
testContentOfV1Point9Crac(crac);
// test instants are well-defined
List<Instant> instants = crac.getSortedInstants();
Expand All @@ -654,4 +664,29 @@ private void testContentOfV2Point0Crac(Crac crac) {
assertEquals(InstantKind.CURATIVE, instants.get(4).getKind());
assertEquals(4, instants.get(4).getOrder());
}

private void testContentOfV2Point2Crac(Crac crac) {
Set<OnFlowConstraintInCountry> urs = crac.getRemedialAction("injectionSetpointRa2Id").getUsageRules()
.stream().filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.collect(Collectors.toSet());
assertEquals(1, urs.size());
OnFlowConstraintInCountry ur = urs.iterator().next();
assertEquals(crac.getInstant("curative"), ur.getInstant());
assertTrue(ur.getContingency().isPresent());
assertEquals("contingency2Id", ur.getContingency().get().getId());
assertEquals(Country.FR, ur.getCountry());
testContentOfV2Point0Crac(crac);

urs = crac.getRemedialAction("injectionSetpointRa3Id").getUsageRules()
.stream().filter(OnFlowConstraintInCountry.class::isInstance)
.map(OnFlowConstraintInCountry.class::cast)
.collect(Collectors.toSet());
assertEquals(1, urs.size());
ur = urs.iterator().next();
assertEquals(crac.getInstant("curative"), ur.getInstant());
assertTrue(ur.getContingency().isEmpty());
assertEquals(Country.FR, ur.getCountry());
testContentOfV2Point0Crac(crac);
}
}

0 comments on commit c8429b7

Please sign in to comment.