Skip to content

Commit d5941e7

Browse files
author
Pauline Jean-Marie
committed
Remove curative stop criterion and 'optimize curative if preventive unsecure' and partially replace them by 'enforce curative security'
NB. Curative min objective does no longer exist and is replaced by Curative have the same objective than the Preventive results
1 parent 00713a3 commit d5941e7

File tree

131 files changed

+263
-369
lines changed

Some content is hidden

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

131 files changed

+263
-369
lines changed

python-util/rao_parameter_modification.py

+95-19
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,111 @@
66

77
import os
88
import json
9+
from json import JSONDecodeError
10+
import yaml
911

10-
root_directory = os.path.join(os.getcwd(), "..")
12+
current_directory = os.getcwd()
1113

1214

15+
tag_by_file_type = {"json": "objective-function", "yaml": "rao-objective-function"}
16+
1317
def rao_parameters_file(file_path):
1418
correct_version = False
15-
obj_fun = False
16-
if file_path.endswith(".json") or file_path.endswith(".yml"):
19+
score = 0
20+
if "target" not in file_path and (file_path.endswith(".json") or file_path.endswith(".yml")):
21+
ftype = "json" if file_path.endswith(".json") else "yaml"
1722
with open(os.path.join(dirpath, filename), 'r') as file:
1823
for line in file:
19-
if "objective-function" in line:
20-
obj_fun = True
2124
if '"version" : "2.4"' in line or '"version" : "2.5"' in line:
2225
correct_version = True
23-
if correct_version and obj_fun:
26+
if tag_by_file_type[ftype] in line:
27+
score += 1
28+
if "MAX_MIN_MARGIN_IN" in line or "MAX_MIN_RELATIVE_MARGIN_IN" in line:
29+
score += 1
30+
if correct_version and score >= 2:
2431
return True
2532
return False
2633

34+
def read_data(file_path) -> tuple[dict, str]:
35+
if file_path.endswith(".json"):
36+
with open(file_path, 'r') as file:
37+
try:
38+
return json.load(file), "json"
39+
except JSONDecodeError as je:
40+
print("in file " + file_path)
41+
raise je
42+
if file_path.endswith(".yml"):
43+
with open(file_path, 'r') as file:
44+
return yaml.safe_load(file), "yaml" # ["rao-parameters"]
45+
46+
def extract_leading_whitespace(line):
47+
leading_whitespace = ""
48+
for char in line:
49+
if char.isspace():
50+
leading_whitespace += char
51+
else:
52+
break
53+
return leading_whitespace
54+
55+
def write_data(new_data, file_path, file_type):
56+
with open(file_path, 'r') as file:
57+
lines = file.readlines()
58+
lines_to_write = []
59+
inside_obj_fun_to_replace = False
60+
for line in lines:
61+
if tag_by_file_type[file_type] in line and tag_by_file_type[file_type] in new_data:
62+
leading_whitespace = extract_leading_whitespace(line)
63+
inside_obj_fun_to_replace = True
64+
if inside_obj_fun_to_replace and ((file_type == "json" and "}" in line) or (file_type == "yaml" and line == "\n")):
65+
obj_fun_str = f'"{tag_by_file_type[file_type]}" : ' + obj_function_as_str_lines(new_data, file_type)
66+
for new_line in obj_fun_str.splitlines(True):
67+
lines_to_write.append(leading_whitespace + new_line)
68+
inside_obj_fun_to_replace = False
69+
elif not inside_obj_fun_to_replace:
70+
lines_to_write.append(line)
71+
with open(file_path, 'w') as file:
72+
file.writelines(lines_to_write)
73+
74+
75+
def obj_function_as_str_lines(new_data, file_type):
76+
if file_type == "json":
77+
return json.dumps(new_data[tag_by_file_type[file_type]], indent=2, separators=(',', ' : ')) + ',\n'
78+
else:
79+
return yaml.dump(new_data[tag_by_file_type[file_type]], default_flow_style=False) + '\n'
80+
81+
82+
83+
def new_rao_param(data: dict, file_path: str, file_type: str) -> dict:
84+
try:
85+
old_obj_fun = data[tag_by_file_type[file_type]]
86+
new_obj_fun = {}
87+
for key in old_obj_fun:
88+
if key not in ("curative-stop-criterion", "optimize-curative-if-preventive-unsecure"):
89+
new_obj_fun[key] = old_obj_fun[key]
90+
prev_secure = "preventive-stop-criterion" not in old_obj_fun or old_obj_fun["preventive-stop-criterion"] == "SECURE"
91+
if prev_secure:
92+
if "optimize-curative-if-preventive-unsecure" in old_obj_fun:
93+
new_obj_fun["enforce-curative-security"] = old_obj_fun["optimize-curative-if-preventive-unsecure"]
94+
else:
95+
cur_secure = "curative-stop-criterion" in old_obj_fun and old_obj_fun["curative-stop-criterion"] in ("SECURE", "PREVENTIVE_OBJECTIVE_AND_SECURE", "MIN_OBJECTIVE")
96+
if cur_secure:
97+
new_obj_fun["enforce-curative-security"] = True
98+
else:
99+
new_obj_fun["enforce-curative-security"] = False
100+
except KeyError as ke:
101+
raise KeyError("in file " + file_path) from ke
102+
data[tag_by_file_type[file_type]] = new_obj_fun
103+
return data
104+
105+
27106

28-
for dirpath, dirnames, filenames in os.walk(root_directory):
29-
for filename in filenames:
30-
file_path = os.path.join(dirpath, filename)
31-
if rao_parameters_file(file_path):
32-
print("file to change : " + file_path)
33-
lines = None
34-
if file_path.endswith(".json"):
35-
with open(file_path, 'r') as file:
36-
lines = file.readlines()
37-
lines = [line.replace('"version" : "2.4"', '"version" : "2.5"') for line in lines if "forbid-cost-increase" not in line]
38-
if lines is not None:
39-
with open(file_path, 'w') as file:
40-
file.writelines(lines)
107+
if __name__ == "__main__":
108+
base_dir = os.path.join(current_directory, "..")
109+
print(base_dir)
110+
for dirpath, dirnames, filenames in os.walk(base_dir):
111+
for filename in filenames:
112+
file_path = os.path.join(dirpath, filename)
113+
if rao_parameters_file(file_path):
114+
data, file_type = read_data(file_path)
115+
new_rao_params = new_rao_param(data, file_path, file_type)
116+
write_data(new_rao_params, file_path, file_type)

ra-optimisation/rao-api/src/main/java/com/powsybl/openrao/raoapi/RaoParametersCommons.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ private RaoParametersCommons() {
2727
public static final String TYPE = "type";
2828
public static final String CURATIVE_MIN_OBJ_IMPROVEMENT = "curative-min-obj-improvement";
2929
public static final String PREVENTIVE_STOP_CRITERION = "preventive-stop-criterion";
30-
public static final String CURATIVE_STOP_CRITERION = "curative-stop-criterion";
31-
public static final String OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE = "optimize-curative-if-preventive-unsecure";
30+
public static final String ENFORCE_CURATIVE_SECURITY = "enforce-curative-security";
3231

3332
// range actions optimization parameters
3433
public static final String RANGE_ACTIONS_OPTIMIZATION = "range-actions-optimization";

ra-optimisation/rao-api/src/main/java/com/powsybl/openrao/raoapi/json/JsonObjectiveFunctionParameters.java

+3-15
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ static void serialize(RaoParameters parameters, JsonGenerator jsonGenerator) thr
2828
jsonGenerator.writeObjectFieldStart(OBJECTIVE_FUNCTION);
2929
jsonGenerator.writeObjectField(TYPE, parameters.getObjectiveFunctionParameters().getType());
3030
jsonGenerator.writeObjectField(PREVENTIVE_STOP_CRITERION, parameters.getObjectiveFunctionParameters().getPreventiveStopCriterion());
31-
jsonGenerator.writeObjectField(CURATIVE_STOP_CRITERION, parameters.getObjectiveFunctionParameters().getCurativeStopCriterion());
3231
jsonGenerator.writeNumberField(CURATIVE_MIN_OBJ_IMPROVEMENT, parameters.getObjectiveFunctionParameters().getCurativeMinObjImprovement());
33-
jsonGenerator.writeBooleanField(OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE, parameters.getObjectiveFunctionParameters().getOptimizeCurativeIfPreventiveUnsecure());
32+
jsonGenerator.writeBooleanField(ENFORCE_CURATIVE_SECURITY, parameters.getObjectiveFunctionParameters().getEnforceCurativeSecurity());
3433
jsonGenerator.writeEndObject();
3534
}
3635

@@ -43,16 +42,13 @@ static void deserialize(JsonParser jsonParser, RaoParameters raoParameters) thro
4342
case PREVENTIVE_STOP_CRITERION:
4443
raoParameters.getObjectiveFunctionParameters().setPreventiveStopCriterion(stringToPreventiveStopCriterion(jsonParser.nextTextValue()));
4544
break;
46-
case CURATIVE_STOP_CRITERION:
47-
raoParameters.getObjectiveFunctionParameters().setCurativeStopCriterion(stringToCurativeStopCriterion(jsonParser.nextTextValue()));
48-
break;
4945
case CURATIVE_MIN_OBJ_IMPROVEMENT:
5046
jsonParser.nextToken();
5147
raoParameters.getObjectiveFunctionParameters().setCurativeMinObjImprovement(jsonParser.getValueAsDouble());
5248
break;
53-
case OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE:
49+
case ENFORCE_CURATIVE_SECURITY:
5450
jsonParser.nextToken();
55-
raoParameters.getObjectiveFunctionParameters().setOptimizeCurativeIfPreventiveUnsecure(jsonParser.getBooleanValue());
51+
raoParameters.getObjectiveFunctionParameters().setEnforceCurativeSecurity(jsonParser.getBooleanValue());
5652
break;
5753
default:
5854
throw new OpenRaoException(String.format("Cannot deserialize objective function parameters: unexpected field in %s (%s)", OBJECTIVE_FUNCTION, jsonParser.getCurrentName()));
@@ -76,12 +72,4 @@ private static ObjectiveFunctionParameters.PreventiveStopCriterion stringToPreve
7672
}
7773
}
7874

79-
private static ObjectiveFunctionParameters.CurativeStopCriterion stringToCurativeStopCriterion(String string) {
80-
try {
81-
return ObjectiveFunctionParameters.CurativeStopCriterion.valueOf(string);
82-
} catch (IllegalArgumentException e) {
83-
throw new OpenRaoException(String.format("Unknown curative stop criterion: %s", string));
84-
}
85-
}
86-
8775
}

ra-optimisation/rao-api/src/main/java/com/powsybl/openrao/raoapi/parameters/ObjectiveFunctionParameters.java

+7-26
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@ public class ObjectiveFunctionParameters {
2424
private static final ObjectiveFunctionType DEFAULT_OBJECTIVE_FUNCTION = ObjectiveFunctionType.MAX_MIN_MARGIN_IN_MEGAWATT;
2525
private static final double DEFAULT_CURATIVE_MIN_OBJ_IMPROVEMENT = 0;
2626
private static final PreventiveStopCriterion DEFAULT_PREVENTIVE_STOP_CRITERION = PreventiveStopCriterion.SECURE;
27-
private static final CurativeStopCriterion DEFAULT_CURATIVE_STOP_CRITERION = CurativeStopCriterion.MIN_OBJECTIVE;
28-
private static final boolean DEFAULT_OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE = false;
27+
private static final boolean DEFAULT_ENFORCE_CURATIVE_SECURITY = false;
2928
// Attributes
3029
private ObjectiveFunctionType type = DEFAULT_OBJECTIVE_FUNCTION;
3130
private double curativeMinObjImprovement = DEFAULT_CURATIVE_MIN_OBJ_IMPROVEMENT;
3231
private PreventiveStopCriterion preventiveStopCriterion = DEFAULT_PREVENTIVE_STOP_CRITERION;
33-
private CurativeStopCriterion curativeStopCriterion = DEFAULT_CURATIVE_STOP_CRITERION;
34-
private boolean optimizeCurativeIfPreventiveUnsecure = DEFAULT_OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE;
32+
private boolean enforceCurativeSecurity = DEFAULT_ENFORCE_CURATIVE_SECURITY;
3533

3634
// Enum
3735
public enum ObjectiveFunctionType {
@@ -60,13 +58,6 @@ public enum PreventiveStopCriterion {
6058
SECURE
6159
}
6260

63-
public enum CurativeStopCriterion {
64-
MIN_OBJECTIVE, // only stop after minimizing objective
65-
SECURE, //stop when objective is strictly negative
66-
PREVENTIVE_OBJECTIVE, // stop when preventive objective is reached, or bested by curativeRaoMinObjImprovement
67-
PREVENTIVE_OBJECTIVE_AND_SECURE // stop when preventive objective is reached or bested by curativeRaoMinObjImprovement, and the situation is secure
68-
}
69-
7061
// Getters and setters
7162
public ObjectiveFunctionType getType() {
7263
return type;
@@ -88,20 +79,12 @@ public PreventiveStopCriterion getPreventiveStopCriterion() {
8879
return preventiveStopCriterion;
8980
}
9081

91-
public CurativeStopCriterion getCurativeStopCriterion() {
92-
return curativeStopCriterion;
93-
}
94-
95-
public void setCurativeStopCriterion(CurativeStopCriterion curativeStopCriterion) {
96-
this.curativeStopCriterion = curativeStopCriterion;
97-
}
98-
99-
public boolean getOptimizeCurativeIfPreventiveUnsecure() {
100-
return optimizeCurativeIfPreventiveUnsecure;
82+
public boolean getEnforceCurativeSecurity() {
83+
return enforceCurativeSecurity;
10184
}
10285

103-
public void setOptimizeCurativeIfPreventiveUnsecure(boolean optimizeCurativeIfPreventiveUnsecure) {
104-
this.optimizeCurativeIfPreventiveUnsecure = optimizeCurativeIfPreventiveUnsecure;
86+
public void setEnforceCurativeSecurity(boolean enforceCurativeSecurity) {
87+
this.enforceCurativeSecurity = enforceCurativeSecurity;
10588
}
10689

10790
public static ObjectiveFunctionParameters load(PlatformConfig platformConfig) {
@@ -114,9 +97,7 @@ public static ObjectiveFunctionParameters load(PlatformConfig platformConfig) {
11497
parameters.setCurativeMinObjImprovement(config.getDoubleProperty(CURATIVE_MIN_OBJ_IMPROVEMENT, DEFAULT_CURATIVE_MIN_OBJ_IMPROVEMENT));
11598
parameters.setPreventiveStopCriterion(config.getEnumProperty(PREVENTIVE_STOP_CRITERION, PreventiveStopCriterion.class,
11699
DEFAULT_PREVENTIVE_STOP_CRITERION));
117-
parameters.setCurativeStopCriterion(config.getEnumProperty(CURATIVE_STOP_CRITERION, CurativeStopCriterion.class,
118-
DEFAULT_CURATIVE_STOP_CRITERION));
119-
parameters.setOptimizeCurativeIfPreventiveUnsecure(config.getBooleanProperty(OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE, DEFAULT_OPTIMIZE_CURATIVE_IF_PREVENTIVE_UNSECURE));
100+
parameters.setEnforceCurativeSecurity(config.getBooleanProperty(ENFORCE_CURATIVE_SECURITY, DEFAULT_ENFORCE_CURATIVE_SECURITY));
120101
});
121102
return parameters;
122103
}

ra-optimisation/rao-api/src/test/java/com/powsybl/openrao/raoapi/json/JsonRaoParametersTest.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ void roundTrip() throws IOException {
5454
// Objective Function parameters
5555
parameters.getObjectiveFunctionParameters().setType(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_MARGIN_IN_AMPERE);
5656
parameters.getObjectiveFunctionParameters().setPreventiveStopCriterion(ObjectiveFunctionParameters.PreventiveStopCriterion.MIN_OBJECTIVE);
57-
parameters.getObjectiveFunctionParameters().setCurativeStopCriterion(ObjectiveFunctionParameters.CurativeStopCriterion.PREVENTIVE_OBJECTIVE_AND_SECURE);
5857
parameters.getObjectiveFunctionParameters().setCurativeMinObjImprovement(983);
59-
parameters.getObjectiveFunctionParameters().setOptimizeCurativeIfPreventiveUnsecure(true);
58+
parameters.getObjectiveFunctionParameters().setEnforceCurativeSecurity(true);
6059
// RangeActionsOptimization parameters
6160
parameters.getRangeActionsOptimizationParameters().setMaxMipIterations(30);
6261
parameters.getRangeActionsOptimizationParameters().setPstPenaltyCost(10);
@@ -176,7 +175,7 @@ void testFailOnOldVersion() {
176175
}
177176

178177
@ParameterizedTest
179-
@ValueSource(strings = {"LoopFlowError", "PrevStopCriterionError", "CurStopCriterionError", "WrongField"})
178+
@ValueSource(strings = {"LoopFlowError", "PrevStopCriterionError", "WrongField"})
180179
void importNokTest(String source) {
181180
InputStream inputStream = getClass().getResourceAsStream("/RaoParametersWith" + source + "_v2.json");
182181
assertThrows(OpenRaoException.class, () -> JsonRaoParameters.read(inputStream));

ra-optimisation/rao-api/src/test/java/com/powsybl/openrao/raoapi/parameters/RaoParametersConfigTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
/**
2626
* @author Godelaine de Montmorillon {@literal <godelaine.demontmorillon at rte-france.com>}
2727
*/
28+
2829
class RaoParametersConfigTest {
2930
private PlatformConfig mockedPlatformConfig;
3031
private InMemoryPlatformConfig platformCfg;
@@ -52,8 +53,7 @@ void checkObjectiveFunctionConfig() {
5253
assertEquals(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_RELATIVE_MARGIN_IN_AMPERE, objectiveFunctionParameters.getType());
5354
assertEquals(123, objectiveFunctionParameters.getCurativeMinObjImprovement(), DOUBLE_TOLERANCE);
5455
assertEquals(ObjectiveFunctionParameters.PreventiveStopCriterion.MIN_OBJECTIVE, objectiveFunctionParameters.getPreventiveStopCriterion());
55-
assertEquals(ObjectiveFunctionParameters.CurativeStopCriterion.PREVENTIVE_OBJECTIVE, objectiveFunctionParameters.getCurativeStopCriterion());
56-
assertTrue(objectiveFunctionParameters.getOptimizeCurativeIfPreventiveUnsecure());
56+
assertFalse(objectiveFunctionParameters.getEnforceCurativeSecurity());
5757
}
5858

5959
@Test

ra-optimisation/rao-api/src/test/java/com/powsybl/openrao/raoapi/parameters/RaoParametersYamlConfigTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
/**
2828
* @author Godelaine de Montmorillon {@literal <godelaine.demontmorillon at rte-france.com>}
2929
*/
30+
3031
class RaoParametersYamlConfigTest extends AbstractSerDeTest {
3132
static final double DOUBLE_TOLERANCE = 1e-6;
3233

@@ -45,7 +46,7 @@ void testConfigWithExtensions() throws IOException {
4546
assertEquals(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_MARGIN_IN_AMPERE, objectiveFunctionParameters.getType());
4647
assertEquals(3, objectiveFunctionParameters.getCurativeMinObjImprovement(), DOUBLE_TOLERANCE);
4748
assertEquals(ObjectiveFunctionParameters.PreventiveStopCriterion.MIN_OBJECTIVE, objectiveFunctionParameters.getPreventiveStopCriterion());
48-
assertEquals(ObjectiveFunctionParameters.CurativeStopCriterion.PREVENTIVE_OBJECTIVE, objectiveFunctionParameters.getCurativeStopCriterion());
49+
assertFalse(objectiveFunctionParameters.getEnforceCurativeSecurity());
4950

5051
RangeActionsOptimizationParameters rangeActionsOptimizationParameters = parameters.getRangeActionsOptimizationParameters();
5152
assertEquals(2, rangeActionsOptimizationParameters.getMaxMipIterations(), DOUBLE_TOLERANCE);
@@ -127,8 +128,7 @@ void testConfigWithoutExtensions() throws IOException {
127128
assertEquals(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_MARGIN_IN_AMPERE, objectiveFunctionParameters.getType());
128129
assertEquals(3, objectiveFunctionParameters.getCurativeMinObjImprovement(), DOUBLE_TOLERANCE);
129130
assertEquals(ObjectiveFunctionParameters.PreventiveStopCriterion.MIN_OBJECTIVE, objectiveFunctionParameters.getPreventiveStopCriterion());
130-
assertEquals(ObjectiveFunctionParameters.CurativeStopCriterion.PREVENTIVE_OBJECTIVE, objectiveFunctionParameters.getCurativeStopCriterion());
131-
assertTrue(objectiveFunctionParameters.getOptimizeCurativeIfPreventiveUnsecure());
131+
assertFalse(objectiveFunctionParameters.getEnforceCurativeSecurity());
132132

133133
RangeActionsOptimizationParameters rangeActionsOptimizationParameters = parameters.getRangeActionsOptimizationParameters();
134134
assertEquals(2, rangeActionsOptimizationParameters.getMaxMipIterations(), DOUBLE_TOLERANCE);
@@ -197,7 +197,7 @@ void testConfigWithPartialExtensions() throws IOException {
197197
assertEquals(ObjectiveFunctionParameters.ObjectiveFunctionType.MAX_MIN_MARGIN_IN_MEGAWATT, objectiveFunctionParameters.getType());
198198
assertEquals(3, objectiveFunctionParameters.getCurativeMinObjImprovement(), DOUBLE_TOLERANCE);
199199
assertEquals(ObjectiveFunctionParameters.PreventiveStopCriterion.MIN_OBJECTIVE, objectiveFunctionParameters.getPreventiveStopCriterion());
200-
assertEquals(ObjectiveFunctionParameters.CurativeStopCriterion.PREVENTIVE_OBJECTIVE, objectiveFunctionParameters.getCurativeStopCriterion());
200+
assertFalse(objectiveFunctionParameters.getEnforceCurativeSecurity());
201201

202202
RangeActionsOptimizationParameters rangeActionsOptimizationParameters = parameters.getRangeActionsOptimizationParameters();
203203
assertEquals(10, rangeActionsOptimizationParameters.getMaxMipIterations(), DOUBLE_TOLERANCE);

ra-optimisation/rao-api/src/test/resources/RaoParametersSet_v2.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
"objective-function" : {
44
"type" : "MAX_MIN_MARGIN_IN_AMPERE",
55
"preventive-stop-criterion" : "MIN_OBJECTIVE",
6-
"curative-stop-criterion" : "PREVENTIVE_OBJECTIVE_AND_SECURE",
76
"curative-min-obj-improvement" : 983.0,
8-
"optimize-curative-if-preventive-unsecure" : true
7+
"enforce-curative-security" : true
98
},
109
"range-actions-optimization" : {
1110
"max-mip-iterations" : 30,

0 commit comments

Comments
 (0)