Skip to content

Commit 3d34f10

Browse files
authored
Fix contingency equality (#1637)
Signed-off-by: Peter Mitri <peter.mitri@rte-france.com>
1 parent 6bb597a commit 3d34f10

3 files changed

Lines changed: 55 additions & 9 deletions

File tree

data/crac/crac-impl/src/main/java/com/powsybl/openrao/data/crac/impl/PostContingencyState.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
package com.powsybl.openrao.data.crac.impl;
99

10-
import com.powsybl.openrao.commons.OpenRaoException;
1110
import com.powsybl.contingency.Contingency;
11+
import com.powsybl.contingency.ContingencyElement;
12+
import com.powsybl.openrao.commons.OpenRaoException;
1213
import com.powsybl.openrao.data.crac.api.Instant;
1314
import com.powsybl.openrao.data.crac.api.State;
1415

1516
import java.time.OffsetDateTime;
1617
import java.util.Optional;
18+
import java.util.stream.Collectors;
1719

1820
/**
1921
* Business object for a state (instant and contingency) in the CRAC file.
@@ -56,8 +58,8 @@ public Optional<OffsetDateTime> getTimestamp() {
5658
}
5759

5860
/**
59-
* Check if states are equals. States are considered equals when instant and contingency are equals if
60-
* contingency is present. Otherwise they are considered equals when instant are equals.
61+
* Check if states are equal. States are considered equal when instant and contingency are equal if
62+
* contingency is present. Otherwise, they are considered equal when instants are equal.
6163
*
6264
* @param o If it's null or another object than State it will return false.
6365
* @return A boolean true if objects are equals, otherwise false.
@@ -72,8 +74,11 @@ public boolean equals(Object o) {
7274
}
7375
State state = (State) o;
7476
Optional<Contingency> oContingency = state.getContingency();
77+
// Check for contingency ID & elements IDs equality, because two same contingencies can have
78+
// different implementations (e.g. LineContingency & BranchContingency)
7579
return state.getInstant().equals(instant)
76-
&& oContingency.map(value -> value.equals(contingency)).orElseGet(() -> contingency == null)
80+
&& oContingency.isPresent() && oContingency.get().getId().equals(contingency.getId())
81+
&& oContingency.get().getElements().stream().map(ContingencyElement::getId).collect(Collectors.toSet()).equals(contingency.getElements().stream().map(ContingencyElement::getId).collect(Collectors.toSet()))
7782
&& state.getTimestamp().equals(Optional.ofNullable(timestamp));
7883
}
7984

data/crac/crac-impl/src/test/java/com/powsybl/openrao/data/crac/impl/PostContingencyStateTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,43 @@ void testEquals() {
6161
assertEquals(state1, state2);
6262
}
6363

64+
@Test
65+
void testEqualsDifferentContingencyImplementations() {
66+
// using different Crac instances, different contingency implementations (BRANCH instead of LINE)
67+
// but with the same content, states must be equal
68+
Crac crac2 = new CracImplFactory().create("cracId")
69+
.newInstant("preventive", InstantKind.PREVENTIVE)
70+
.newInstant("outage", InstantKind.OUTAGE)
71+
.newInstant("curative", InstantKind.CURATIVE);
72+
Contingency contingency1Clone = crac2.newContingency()
73+
.withId("contingency1")
74+
.withContingencyElement("anyNetworkElement", ContingencyElementType.BRANCH)
75+
.add();
76+
77+
PostContingencyState state1 = new PostContingencyState(contingency1, outageInstant, null);
78+
PostContingencyState state2 = new PostContingencyState(contingency1Clone, outageInstant, null);
79+
80+
assertEquals(state1, state2);
81+
}
82+
83+
@Test
84+
void testNotEqualsDifferentContingencyImplementations() {
85+
// the same as the previous test but with different contingency elements
86+
Crac crac2 = new CracImplFactory().create("cracId")
87+
.newInstant("preventive", InstantKind.PREVENTIVE)
88+
.newInstant("outage", InstantKind.OUTAGE)
89+
.newInstant("curative", InstantKind.CURATIVE);
90+
Contingency contingency1Clone = crac2.newContingency()
91+
.withId("contingency1")
92+
.withContingencyElement("anotherNetworkElement", ContingencyElementType.BRANCH)
93+
.add();
94+
95+
PostContingencyState state1 = new PostContingencyState(contingency1, outageInstant, null);
96+
PostContingencyState state2 = new PostContingencyState(contingency1Clone, outageInstant, null);
97+
98+
assertNotEquals(state1, state2);
99+
}
100+
64101
@Test
65102
void testNotEqualsByInstant() {
66103
PostContingencyState state1 = new PostContingencyState(contingency1, outageInstant, null);

data/crac/crac-io/crac-io-network/src/main/java/com/powsybl/openrao/data/crac/io/network/NetworkCracCreator.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,20 @@
77

88
package com.powsybl.openrao.data.crac.io.network;
99

10-
import com.powsybl.contingency.ContingencyElementType;
11-
import com.powsybl.iidm.network.*;
10+
import com.powsybl.contingency.ContingencyElementFactory;
11+
import com.powsybl.iidm.network.Network;
1212
import com.powsybl.openrao.commons.OpenRaoException;
1313
import com.powsybl.openrao.data.crac.api.Crac;
1414
import com.powsybl.openrao.data.crac.api.InstantKind;
1515
import com.powsybl.openrao.data.crac.api.parameters.CracCreationParameters;
1616
import com.powsybl.openrao.data.crac.api.parameters.RangeActionGroup;
17-
import com.powsybl.openrao.data.crac.io.network.parameters.*;
17+
import com.powsybl.openrao.data.crac.io.network.parameters.Contingencies;
18+
import com.powsybl.openrao.data.crac.io.network.parameters.NetworkCracCreationParameters;
1819

19-
import java.util.*;
20+
import java.util.HashMap;
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.SortedMap;
2024

2125
/**
2226
* Creates a CRAC from a network.
@@ -73,7 +77,7 @@ private static void addContingencies(Crac crac, Network network, Contingencies p
7377
.forEach(
7478
branch -> crac.newContingency()
7579
.withId("CO_" + branch.getNameOrId())
76-
.withContingencyElement(branch.getId(), ContingencyElementType.BRANCH)
80+
.withContingencyElement(branch.getId(), ContingencyElementFactory.create(branch).getType())
7781
.add());
7882
}
7983
}

0 commit comments

Comments
 (0)