Skip to content

Commit 086650c

Browse files
authored
Merge branch 'main' into fix/order_constraint
2 parents c86cb90 + 916a432 commit 086650c

175 files changed

Lines changed: 3811 additions & 4677 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

data/crac/crac-api/src/main/java/com/powsybl/openrao/data/crac/api/RaUsageLimits.java

Lines changed: 65 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,27 @@
77

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

10+
import com.fasterxml.jackson.core.JsonParser;
1011
import com.powsybl.openrao.commons.OpenRaoException;
12+
import org.apache.commons.lang3.tuple.Pair;
1113

12-
import java.util.HashMap;
13-
import java.util.HashSet;
14-
import java.util.Map;
15-
import java.util.Objects;
16-
import java.util.Set;
14+
import java.io.IOException;
15+
import java.util.*;
1716

1817
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.BUSINESS_WARNS;
18+
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.TECHNICAL_LOGS;
19+
import static com.powsybl.openrao.data.crac.api.parameters.JsonCracCreationParametersConstants.*;
1920

2021
/**
2122
* @author Martin Belthle {@literal <martin.belthle at rte-france.com>}
2223
*/
2324
public class RaUsageLimits {
2425
private static final int DEFAULT_MAX_RA = Integer.MAX_VALUE;
25-
private static final int DEFAULT_MAX_TSO = Integer.MAX_VALUE;
2626
private static final Map<String, Integer> DEFAULT_MAX_TOPO_PER_TSO = new HashMap<>();
2727
private static final Map<String, Integer> DEFAULT_MAX_PST_PER_TSO = new HashMap<>();
2828
private static final Map<String, Integer> DEFAULT_MAX_RA_PER_TSO = new HashMap<>();
2929
private static final Map<String, Integer> DEFAULT_MAX_ELEMENTARY_ACTIONS_PER_TSO = new HashMap<>();
3030
private int maxRa = DEFAULT_MAX_RA;
31-
private int maxTso = DEFAULT_MAX_TSO;
32-
private final Set<String> maxTsoExclusion = new HashSet<>();
3331
private Map<String, Integer> maxTopoPerTso = DEFAULT_MAX_TOPO_PER_TSO;
3432
private Map<String, Integer> maxPstPerTso = DEFAULT_MAX_PST_PER_TSO;
3533
private Map<String, Integer> maxRaPerTso = DEFAULT_MAX_RA_PER_TSO;
@@ -44,15 +42,6 @@ public void setMaxRa(int maxRa) {
4442
}
4543
}
4644

47-
public void setMaxTso(int maxTso) {
48-
if (maxTso < 0) {
49-
BUSINESS_WARNS.warn("The value {} provided for max number of TSOs is smaller than 0. It will be set to 0 instead.", maxTso);
50-
this.maxTso = 0;
51-
} else {
52-
this.maxTso = maxTso;
53-
}
54-
}
55-
5645
public void setMaxTopoPerTso(Map<String, Integer> maxTopoPerTso) {
5746
if (Objects.isNull(maxTopoPerTso)) {
5847
this.maxTopoPerTso = new HashMap<>();
@@ -91,10 +80,6 @@ public int getMaxRa() {
9180
return maxRa;
9281
}
9382

94-
public int getMaxTso() {
95-
return maxTso;
96-
}
97-
9883
public Map<String, Integer> getMaxTopoPerTso() {
9984
return maxTopoPerTso;
10085
}
@@ -111,10 +96,6 @@ public Map<String, Integer> getMaxElementaryActionsPerTso() {
11196
return maxElementaryActionsPerTso;
11297
}
11398

114-
public Set<String> getMaxTsoExclusion() {
115-
return maxTsoExclusion;
116-
}
117-
11899
private Map<String, Integer> replaceNegativeValues(Map<String, Integer> limitsPerTso) {
119100
limitsPerTso.forEach((tso, limit) -> {
120101
if (limit < 0) {
@@ -142,10 +123,6 @@ private static void crossCheckMaxCraPerTsoParameters(Map<String, Integer> maxRaP
142123
});
143124
}
144125

145-
public void addTsoToExclude(String tso) {
146-
maxTsoExclusion.add(tso);
147-
}
148-
149126
@Override
150127
public boolean equals(Object o) {
151128
if (this == o) {
@@ -156,7 +133,6 @@ public boolean equals(Object o) {
156133
}
157134
RaUsageLimits raUsageLimits = (RaUsageLimits) o;
158135
return raUsageLimits.maxRa == this.maxRa
159-
&& raUsageLimits.maxTso == this.maxTso
160136
&& raUsageLimits.maxRaPerTso.equals(this.maxRaPerTso)
161137
&& raUsageLimits.maxPstPerTso.equals(this.maxPstPerTso)
162138
&& raUsageLimits.maxTopoPerTso.equals(this.maxTopoPerTso);
@@ -166,4 +142,63 @@ public boolean equals(Object o) {
166142
public int hashCode() {
167143
return super.hashCode();
168144
}
145+
146+
// The deserializer is used in crac deserialization as well as crac creation parameters deserialization
147+
public static Pair<String, RaUsageLimits> deserializeRaUsageLimits(JsonParser jsonParser) throws IOException {
148+
RaUsageLimits raUsageLimits = new RaUsageLimits();
149+
String instant = null;
150+
while (!jsonParser.nextToken().isStructEnd()) {
151+
switch (jsonParser.currentName()) {
152+
case INSTANT:
153+
jsonParser.nextToken();
154+
instant = jsonParser.getValueAsString();
155+
break;
156+
case MAX_RA:
157+
jsonParser.nextToken();
158+
raUsageLimits.setMaxRa(jsonParser.getIntValue());
159+
break;
160+
case MAX_TSO:
161+
jsonParser.nextToken();
162+
TECHNICAL_LOGS.warn("A max-tso limit can no longer be defined and will be ignored.");
163+
break;
164+
case MAX_TOPO_PER_TSO:
165+
jsonParser.nextToken();
166+
raUsageLimits.setMaxTopoPerTso(readStringToPositiveIntMap(jsonParser));
167+
break;
168+
case MAX_PST_PER_TSO:
169+
jsonParser.nextToken();
170+
raUsageLimits.setMaxPstPerTso(readStringToPositiveIntMap(jsonParser));
171+
break;
172+
case MAX_RA_PER_TSO:
173+
jsonParser.nextToken();
174+
raUsageLimits.setMaxRaPerTso(readStringToPositiveIntMap(jsonParser));
175+
break;
176+
case MAX_ELEMENTARY_ACTIONS_PER_TSO:
177+
jsonParser.nextToken();
178+
raUsageLimits.setMaxElementaryActionsPerTso(readStringToPositiveIntMap(jsonParser));
179+
break;
180+
default:
181+
throw new OpenRaoException(String.format(
182+
"Cannot deserialize ra-usage-limits-per-instant parameters: unexpected field in %s (%s)",
183+
RA_USAGE_LIMITS_PER_INSTANT,
184+
jsonParser.currentName()
185+
));
186+
}
187+
}
188+
return Pair.of(instant, raUsageLimits);
189+
}
190+
191+
private static Map<String, Integer> readStringToPositiveIntMap(JsonParser jsonParser) throws IOException {
192+
HashMap<String, Integer> map = jsonParser.readValueAs(HashMap.class);
193+
// Check types
194+
map.forEach((Object o, Object o2) -> {
195+
if (!(o instanceof String) || !(o2 instanceof Integer)) {
196+
throw new OpenRaoException("Unexpected key or value type in a Map<String, Integer> parameter!");
197+
}
198+
if ((int) o2 < 0) {
199+
throw new OpenRaoException("Unexpected negative integer!");
200+
}
201+
});
202+
return map;
203+
}
169204
}

data/crac/crac-api/src/main/java/com/powsybl/openrao/data/crac/api/RaUsageLimitsAdder.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public interface RaUsageLimitsAdder {
1616

1717
RaUsageLimitsAdder withMaxRa(int maxRa);
1818

19-
RaUsageLimitsAdder withMaxTso(int maxTso);
20-
2119
RaUsageLimitsAdder withMaxTopoPerTso(Map<String, Integer> maxTopoPerTso);
2220

2321
RaUsageLimitsAdder withMaxPstPerTso(Map<String, Integer> maxPstPerTso);

data/crac/crac-api/src/main/java/com/powsybl/openrao/data/crac/api/parameters/JsonCracCreationParametersConstants.java

Lines changed: 2 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
import org.apache.commons.lang3.tuple.Pair;
1616

1717
import java.io.IOException;
18-
import java.util.HashMap;
1918
import java.util.Map;
2019
import java.util.TreeMap;
2120

21+
import static com.powsybl.openrao.data.crac.api.RaUsageLimits.deserializeRaUsageLimits;
22+
2223
/**
2324
* @author Peter Mitri {@literal <peter.mitri at rte-france.com>}
2425
*/
@@ -79,7 +80,6 @@ public static void serializeRaUsageLimitForOneInstant(JsonGenerator jsonGenerato
7980
jsonGenerator.writeStartObject();
8081
jsonGenerator.writeStringField(INSTANT, entry.getKey());
8182
jsonGenerator.writeNumberField(MAX_RA, raUsageLimits.getMaxRa());
82-
jsonGenerator.writeNumberField(MAX_TSO, raUsageLimits.getMaxTso());
8383
jsonGenerator.writeObjectField(MAX_TOPO_PER_TSO, new TreeMap<>(raUsageLimits.getMaxTopoPerTso()));
8484
jsonGenerator.writeObjectField(MAX_PST_PER_TSO, new TreeMap<>(raUsageLimits.getMaxPstPerTso()));
8585
jsonGenerator.writeObjectField(MAX_RA_PER_TSO, new TreeMap<>(raUsageLimits.getMaxRaPerTso()));
@@ -94,61 +94,4 @@ static void deserializeRaUsageLimitsAndUpdateParameters(JsonParser jsonParser, C
9494
}
9595
}
9696

97-
private static Map<String, Integer> readStringToPositiveIntMap(JsonParser jsonParser) throws IOException {
98-
HashMap<String, Integer> map = jsonParser.readValueAs(HashMap.class);
99-
// Check types
100-
map.forEach((Object o, Object o2) -> {
101-
if (!(o instanceof String) || !(o2 instanceof Integer)) {
102-
throw new OpenRaoException("Unexpected key or value type in a Map<String, Integer> parameter!");
103-
}
104-
if ((int) o2 < 0) {
105-
throw new OpenRaoException("Unexpected negative integer!");
106-
}
107-
});
108-
return map;
109-
}
110-
111-
public static Pair<String, RaUsageLimits> deserializeRaUsageLimits(JsonParser jsonParser) throws IOException {
112-
RaUsageLimits raUsageLimits = new RaUsageLimits();
113-
String instant = null;
114-
while (!jsonParser.nextToken().isStructEnd()) {
115-
switch (jsonParser.currentName()) {
116-
case INSTANT:
117-
jsonParser.nextToken();
118-
instant = jsonParser.getValueAsString();
119-
break;
120-
case MAX_RA:
121-
jsonParser.nextToken();
122-
raUsageLimits.setMaxRa(jsonParser.getIntValue());
123-
break;
124-
case MAX_TSO:
125-
jsonParser.nextToken();
126-
raUsageLimits.setMaxTso(jsonParser.getIntValue());
127-
break;
128-
case MAX_TOPO_PER_TSO:
129-
jsonParser.nextToken();
130-
raUsageLimits.setMaxTopoPerTso(readStringToPositiveIntMap(jsonParser));
131-
break;
132-
case MAX_PST_PER_TSO:
133-
jsonParser.nextToken();
134-
raUsageLimits.setMaxPstPerTso(readStringToPositiveIntMap(jsonParser));
135-
break;
136-
case MAX_RA_PER_TSO:
137-
jsonParser.nextToken();
138-
raUsageLimits.setMaxRaPerTso(readStringToPositiveIntMap(jsonParser));
139-
break;
140-
case MAX_ELEMENTARY_ACTIONS_PER_TSO:
141-
jsonParser.nextToken();
142-
raUsageLimits.setMaxElementaryActionsPerTso(readStringToPositiveIntMap(jsonParser));
143-
break;
144-
default:
145-
throw new OpenRaoException(String.format(
146-
"Cannot deserialize ra-usage-limits-per-instant parameters: unexpected field in %s (%s)",
147-
RA_USAGE_LIMITS_PER_INSTANT,
148-
jsonParser.currentName()
149-
));
150-
}
151-
}
152-
return Pair.of(instant, raUsageLimits);
153-
}
15497
}

data/crac/crac-api/src/test/java/com/powsybl/openrao/data/crac/api/RaUsageLimitsTest.java

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@
1010
import ch.qos.logback.classic.Logger;
1111
import ch.qos.logback.classic.spi.ILoggingEvent;
1212
import ch.qos.logback.core.read.ListAppender;
13+
import com.fasterxml.jackson.core.JsonParser;
14+
import com.fasterxml.jackson.databind.ObjectMapper;
1315
import com.powsybl.openrao.commons.OpenRaoException;
1416
import com.powsybl.openrao.commons.logs.RaoBusinessWarns;
17+
import com.powsybl.openrao.commons.logs.TechnicalLogs;
1518
import org.junit.jupiter.api.Test;
1619
import org.slf4j.LoggerFactory;
1720

21+
import java.io.IOException;
22+
import java.util.Comparator;
1823
import java.util.HashMap;
1924
import java.util.List;
2025
import java.util.Map;
@@ -34,16 +39,13 @@ class RaUsageLimitsTest {
3439
void testNominalBehavior() {
3540
// check default values
3641
assertEquals(Integer.MAX_VALUE, raUsageLimits.getMaxRa());
37-
assertEquals(Integer.MAX_VALUE, raUsageLimits.getMaxTso());
3842
assertTrue(raUsageLimits.getMaxRaPerTso().isEmpty());
3943
assertTrue(raUsageLimits.getMaxPstPerTso().isEmpty());
4044
assertTrue(raUsageLimits.getMaxTopoPerTso().isEmpty());
4145
assertTrue(raUsageLimits.getMaxElementaryActionsPerTso().isEmpty());
4246
// set regular values
4347
raUsageLimits.setMaxRa(4);
4448
assertEquals(4, raUsageLimits.getMaxRa());
45-
raUsageLimits.setMaxTso(4);
46-
assertEquals(4, raUsageLimits.getMaxTso());
4749
Map<String, Integer> pstMap = Map.of("FR", 4, "DE", 5);
4850
raUsageLimits.setMaxPstPerTso(pstMap);
4951
assertEquals(pstMap, raUsageLimits.getMaxPstPerTso());
@@ -66,15 +68,13 @@ void testEquality() {
6668
assertEquals(raUsageLimits1, raUsageLimits2);
6769
// modifies one object
6870
raUsageLimits1.setMaxRa(3);
69-
raUsageLimits1.setMaxTso(5);
7071
raUsageLimits1.setMaxRaPerTso(Map.of("FR", 4));
7172
raUsageLimits1.setMaxTopoPerTso(Map.of("FR", 2));
7273
raUsageLimits1.setMaxPstPerTso(Map.of("FR", 3));
7374
raUsageLimits1.setMaxElementaryActionsPerTso(Map.of("FR", 3));
7475
assertNotEquals(raUsageLimits1, raUsageLimits2);
7576
// applies the same modification to the second object
7677
raUsageLimits2.setMaxRa(3);
77-
raUsageLimits2.setMaxTso(5);
7878
raUsageLimits2.setMaxRaPerTso(Map.of("FR", 4));
7979
raUsageLimits2.setMaxTopoPerTso(Map.of("FR", 2));
8080
raUsageLimits2.setMaxPstPerTso(Map.of("FR", 3));
@@ -95,8 +95,6 @@ void testIllegalValues() {
9595
ListAppender<ILoggingEvent> listAppender = getLogs(RaoBusinessWarns.class);
9696
List<ILoggingEvent> logsList = listAppender.list;
9797
// negative values
98-
raUsageLimits.setMaxTso(-3);
99-
assertEquals(0, raUsageLimits.getMaxTso());
10098
raUsageLimits.setMaxRa(-2);
10199
assertEquals(0, raUsageLimits.getMaxRa());
102100
raUsageLimits.setMaxTopoPerTso(new HashMap<>(Map.of("FR", -4)));
@@ -121,9 +119,32 @@ void testIllegalValues() {
121119
raUsageLimits.setMaxElementaryActionsPerTso(null);
122120
assertTrue(raUsageLimits.getMaxElementaryActionsPerTso().isEmpty());
123121
// check logs
124-
assertEquals(3, logsList.size());
125-
assertEquals("The value -3 provided for max number of TSOs is smaller than 0. It will be set to 0 instead.", logsList.get(0).getFormattedMessage());
126-
assertEquals("The value -2 provided for max number of RAs is smaller than 0. It will be set to 0 instead.", logsList.get(1).getFormattedMessage());
127-
assertEquals("The value -4 provided for max number of RAs for TSO FR is smaller than 0. It will be set to 0 instead.", logsList.get(2).getFormattedMessage());
122+
assertEquals(2, logsList.size());
123+
assertEquals("The value -2 provided for max number of RAs is smaller than 0. It will be set to 0 instead.", logsList.get(0).getFormattedMessage());
124+
assertEquals("The value -4 provided for max number of RAs for TSO FR is smaller than 0. It will be set to 0 instead.", logsList.get(1).getFormattedMessage());
125+
}
126+
127+
private static JsonParser createJsonParser(String json) throws IOException {
128+
JsonParser jsonParser = new ObjectMapper().createParser(json);
129+
jsonParser.nextToken();
130+
return jsonParser;
131+
}
132+
133+
@Test
134+
void testDeserializeRaUsageLimits() throws IOException {
135+
String json = """
136+
{
137+
"instant" : "curative",
138+
"max-tso" : 3
139+
}
140+
""";
141+
ListAppender<ILoggingEvent> listAppender = getLogs(TechnicalLogs.class);
142+
List<ILoggingEvent> logsList = listAppender.list;
143+
RaUsageLimits.deserializeRaUsageLimits(createJsonParser(json));
144+
145+
logsList.sort(Comparator.comparing(ILoggingEvent::getMessage));
146+
assertEquals(1, logsList.size());
147+
assertEquals("A max-tso limit can no longer be defined and will be ignored.",
148+
logsList.get(0).getFormattedMessage());
128149
}
129150
}

data/crac/crac-api/src/test/java/com/powsybl/openrao/data/crac/api/parameters/CracCreationParametersJsonTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,12 @@ void importFromFileWithRaLimits() {
5959
RaUsageLimits raUsageLimitsCurative = raUsageLimitsFromFile.get("curative");
6060
RaUsageLimits expectedLimitsPreventive = new RaUsageLimits();
6161
expectedLimitsPreventive.setMaxRa(3);
62-
expectedLimitsPreventive.setMaxTso(5);
6362
expectedLimitsPreventive.setMaxRaPerTso(Map.of("FR", 4));
6463
expectedLimitsPreventive.setMaxTopoPerTso(Map.of("FR", 2));
6564
expectedLimitsPreventive.setMaxPstPerTso(Map.of("FR", 3));
6665
expectedLimitsPreventive.setMaxElementaryActionsPerTso(Map.of("FR", 10));
6766
RaUsageLimits expectedLimitsCurative = new RaUsageLimits();
6867
expectedLimitsCurative.setMaxRa(7);
69-
expectedLimitsCurative.setMaxTso(2);
7068
expectedLimitsCurative.setMaxRaPerTso(Map.of("FR", 7));
7169
expectedLimitsCurative.setMaxTopoPerTso(Map.of("FR", 1));
7270
expectedLimitsCurative.setMaxPstPerTso(Map.of("FR", 5));

data/crac/crac-api/src/test/resources/parameters/crac-creator-parameters-with-ra-limits.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"ra-usage-limits-per-instant": [ {
44
"instant" : "preventive",
55
"max-ra" : 3,
6-
"max-tso" : 5,
76
"max-topo-per-tso" : {
87
"FR" : 2
98
},
@@ -16,7 +15,6 @@
1615
}, {
1716
"instant" : "curative",
1817
"max-ra" : 7,
19-
"max-tso" : 2,
2018
"max-topo-per-tso" : {
2119
"FR" : 1
2220
},

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ public RaUsageLimitsAdder withMaxRa(int maxRa) {
4040
return this;
4141
}
4242

43-
@Override
44-
public RaUsageLimitsAdder withMaxTso(int maxTso) {
45-
raUsageLimits.setMaxTso(maxTso);
46-
return this;
47-
}
48-
4943
@Override
5044
public RaUsageLimitsAdder withMaxTopoPerTso(Map<String, Integer> maxTopoPerTso) {
5145
raUsageLimits.setMaxTopoPerTso(maxTopoPerTso);

0 commit comments

Comments
 (0)