Skip to content

Commit 9c98c64

Browse files
committed
Monitoring and rao parameters
Monitoring run wrapping. Signed-off-by: Bertrand Rix <[email protected]> Map ObjectiveFunctionParameters. Signed-off-by: Bertrand Rix <[email protected]> Fully map RaoParameters. Signed-off-by: Bertrand Rix <[email protected]> Update test. Signed-off-by: Bertrand Rix <[email protected]> Clean. Signed-off-by: Bertrand Rix <[email protected]> Clean. Signed-off-by: Bertrand Rix <[email protected]> Finish mapping angle monitoring. Signed-off-by: Bertrand Rix <[email protected]> Unsigned char instead of bool. Signed-off-by: Bertrand Rix <[email protected]> Try some explcit parameter setting. Signed-off-by: Bertrand Rix <[email protected]> more parameters Signed-off-by: Bertrand Rix <[email protected]> Introduce parameter base. Signed-off-by: Bertrand Rix <[email protected]>
1 parent b713a69 commit 9c98c64

32 files changed

+1958
-217
lines changed

cpp/powsybl-cpp/powsybl-cpp.cpp

+184-32
Large diffs are not rendered by default.

cpp/powsybl-cpp/powsybl-cpp.h

+113
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,116 @@ class ShortCircuitAnalysisParameters {
469469
std::vector<std::string> provider_parameters_values;
470470
};
471471

472+
// RAO
473+
enum PreventiveStopCriterion {
474+
P_MIN_OBJECTIVE = 0,
475+
P_SECURE,
476+
};
477+
478+
enum CurativeStopCriterion {
479+
C_MIN_OBJECTIVE = 0,
480+
C_SECURE,
481+
C_PREVENTIVE_OBJECTIVE,
482+
C_PREVENTIVE_OBJECTIVE_AND_SECURE,
483+
};
484+
485+
enum ObjectiveFunctionType {
486+
MAX_MIN_MARGIN_IN_MEGAWATT = 0,
487+
MAX_MIN_MARGIN_IN_AMPERE,
488+
MAX_MIN_RELATIVE_MARGIN_IN_MEGAWATT,
489+
MAX_MIN_RELATIVE_MARGIN_IN_AMPERE,
490+
MIN_COST_IN_MEGAWATT,
491+
MIN_COST_IN_AMPERE,
492+
};
493+
494+
enum Solver {
495+
CBC,
496+
SCIP,
497+
XPRESS
498+
};
499+
500+
enum PstModel {
501+
CONTINUOUS,
502+
APPROXIMATED_INTEGERS
503+
};
504+
505+
enum class RaRangeShrinking {
506+
DISABLED,
507+
ENABLED,
508+
ENABLED_IN_FIRST_PRAO_AND_CRAO
509+
};
510+
511+
enum class ExecutionCondition {
512+
DISABLED,
513+
POSSIBLE_CURATIVE_IMPROVEMENT,
514+
COST_INCREASE
515+
};
516+
517+
class RaoParameters {
518+
public:
519+
RaoParameters(rao_parameters* src);
520+
std::shared_ptr<rao_parameters> to_c_struct() const;
521+
void load_to_c_struct(rao_parameters& params) const;
522+
523+
// Objective function parameters
524+
ObjectiveFunctionType objective_function_type;
525+
PreventiveStopCriterion preventive_stop_criterion;
526+
CurativeStopCriterion curative_stop_criterion;
527+
double curative_min_obj_improvement;
528+
bool forbid_cost_increase;
529+
bool optimize_curative_if_preventive_unsecure;
530+
531+
// range action solver
532+
Solver solver;
533+
double relative_mip_gap;
534+
std::string solver_specific_parameters;
535+
536+
// range action optimization parameters
537+
int max_mip_iterations;
538+
double pst_penalty_cost;
539+
double pst_sensitivity_threshold;
540+
PstModel pst_model;
541+
double hvdc_penalty_cost;
542+
double hvdc_sensitivity_threshold;
543+
double injection_ra_penalty_cost;
544+
double injection_ra_sensitivity_threshold;
545+
RaRangeShrinking ra_range_shrinking;
546+
547+
// topo optimization parameters
548+
int max_preventive_search_tree_depth;
549+
int max_auto_search_tree_depth;
550+
int max_curative_search_tree_depth;
551+
// Missing predefinedCombinations (list of list of string..)
552+
double relative_min_impact_threshold;
553+
double absolute_min_impact_threshold;
554+
bool skip_actions_far_from_most_limiting_element;
555+
int max_number_of_boundaries_for_skipping_actions;
556+
557+
// Multithreading parameters
558+
int contingency_scenarios_in_parallel;
559+
int preventive_leaves_in_parallel;
560+
int auto_leaves_in_parallel;
561+
int curative_leaves_in_parallel;
562+
563+
// Second preventive rao parameters
564+
ExecutionCondition execution_condition;
565+
bool re_optimize_curative_range_actions;
566+
bool hint_from_first_preventive_rao;
567+
568+
// Not optimized cnec parameters
569+
bool do_not_optimize_curative_cnecs_for_tsos_without_cras;
570+
571+
// Load flow and sensitivity parameters
572+
std::string load_flow_provider;
573+
std::string sensitivity_provider;
574+
double sensitivity_failure_overcost;
575+
576+
std::vector<std::string> provider_parameters_keys;
577+
std::vector<std::string> provider_parameters_values;
578+
};
579+
580+
RaoParameters* createRaoParameters();
581+
472582
char* copyStringToCharPtr(const std::string& str);
473583
char** copyVectorStringToCharPtrPtr(const std::vector<std::string>& strings);
474584
int* copyVectorInt(const std::vector<int>& ints);
@@ -854,6 +964,9 @@ JavaHandle getCrac(const JavaHandle& raoContext);
854964
JavaHandle getRaoResult(const JavaHandle& raoContext);
855965
RaoComputationStatus getRaoResultStatus(const JavaHandle& raoResult);
856966
JavaHandle createDefaultRaoParameters();
967+
void runRaoWithParameters(const JavaHandle& networkHandle, const JavaHandle& raoHandle, const RaoParameters& parameters);
968+
void runVoltageMonitoring(const JavaHandle& networkHandle, const JavaHandle& raoHandle, const LoadFlowParameters& parameters, const std::string& provider);
969+
void runAngleMonitoring(const JavaHandle& networkHandle, const JavaHandle& raoHandle, const LoadFlowParameters& parameters, const std::string& provider);
857970

858971
JavaHandle createGrid2opBackend(const JavaHandle& networkHandle, bool considerOpenBranchReactiveFlow, int busesPerVoltageLevel, bool connectAllElementsToFirstBus);
859972
void freeGrid2opBackend(const JavaHandle& backendHandle);

cpp/pypowsybl-cpp/bindings.cpp

+89-14
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@ py::bytes saveNetworkToBinaryBufferPython(const pypowsybl::JavaHandle& network,
2828

2929
void setCracSource(const pypowsybl::JavaHandle& networkHandle, const pypowsybl::JavaHandle& raoHandle, const py::buffer& crac);
3030
void setGlskSource(const pypowsybl::JavaHandle& networkHandle, const pypowsybl::JavaHandle& raoHandle, const py::buffer& glsk);
31-
void runRaoWithParameters(const pypowsybl::JavaHandle& networkHandle, const pypowsybl::JavaHandle& raoHandle, const pypowsybl::JavaHandle& parametersHandle);
32-
pypowsybl::JavaHandle loadRaoParametersFromBuffer(const py::buffer& parameters);
31+
pypowsybl::RaoParameters* loadRaoParametersFromBuffer(const py::buffer& parameters);
3332

34-
py::bytes saveRaoParametersToBinaryBuffer(const pypowsybl::JavaHandle& rao_parameters);
33+
py::bytes saveRaoParametersToBinaryBuffer(const pypowsybl::RaoParameters& rao_parameters);
3534
py::bytes saveRaoResultsToBinaryBuffer(const pypowsybl::JavaHandle& raoContext, const pypowsybl::JavaHandle& crac);
3635

3736
template<typename T>
@@ -764,6 +763,84 @@ PYBIND11_MODULE(_pypowsybl, m) {
764763
.value("DEFAULT", RaoComputationStatus::DEFAULT)
765764
.value("FAILURE", RaoComputationStatus::FAILURE);
766765

766+
py::enum_<pypowsybl::PreventiveStopCriterion>(m, "PreventiveStopCriterion", "")
767+
.value("MIN_OBJECTIVE", pypowsybl::PreventiveStopCriterion::P_MIN_OBJECTIVE, "")
768+
.value("SECURE", pypowsybl::PreventiveStopCriterion::P_SECURE, "");
769+
770+
py::enum_<pypowsybl::CurativeStopCriterion>(m, "CurativeStopCriterion", "")
771+
.value("MIN_OBJECTIVE", pypowsybl::CurativeStopCriterion::C_MIN_OBJECTIVE, "")
772+
.value("SECURE", pypowsybl::CurativeStopCriterion::C_SECURE, "")
773+
.value("PREVENTIVE_OBJECTIVE", pypowsybl::CurativeStopCriterion::C_PREVENTIVE_OBJECTIVE, "")
774+
.value("PREVENTIVE_OBJECTIVE_AND_SECURE", pypowsybl::CurativeStopCriterion::C_PREVENTIVE_OBJECTIVE_AND_SECURE, "");
775+
776+
py::enum_<pypowsybl::ObjectiveFunctionType>(m, "ObjectiveFunctionType", "")
777+
.value("MAX_MIN_MARGIN_IN_MEGAWATT", pypowsybl::ObjectiveFunctionType::MAX_MIN_MARGIN_IN_MEGAWATT, "")
778+
.value("MAX_MIN_MARGIN_IN_AMPERE", pypowsybl::ObjectiveFunctionType::MAX_MIN_MARGIN_IN_AMPERE, "")
779+
.value("MAX_MIN_RELATIVE_MARGIN_IN_MEGAWATT", pypowsybl::ObjectiveFunctionType::MAX_MIN_RELATIVE_MARGIN_IN_MEGAWATT, "")
780+
.value("MAX_MIN_RELATIVE_MARGIN_IN_AMPERE", pypowsybl::ObjectiveFunctionType::MAX_MIN_RELATIVE_MARGIN_IN_AMPERE, "")
781+
.value("MIN_COST_IN_MEGAWATT", pypowsybl::ObjectiveFunctionType::MIN_COST_IN_MEGAWATT, "")
782+
.value("MIN_COST_IN_AMPERE", pypowsybl::ObjectiveFunctionType::MIN_COST_IN_AMPERE, "");
783+
784+
py::enum_<pypowsybl::Solver>(m, "Solver")
785+
.value("CBC", pypowsybl::Solver::CBC)
786+
.value("SCIP", pypowsybl::Solver::SCIP)
787+
.value("XPRESS", pypowsybl::Solver::XPRESS);
788+
789+
py::enum_<pypowsybl::PstModel>(m, "PstModel")
790+
.value("CONTINUOUS", pypowsybl::PstModel::CONTINUOUS)
791+
.value("APPROXIMATED_INTEGERS", pypowsybl::PstModel::APPROXIMATED_INTEGERS);
792+
793+
py::enum_<pypowsybl::RaRangeShrinking>(m, "RaRangeShrinking")
794+
.value("DISABLED", pypowsybl::RaRangeShrinking::DISABLED)
795+
.value("ENABLED", pypowsybl::RaRangeShrinking::ENABLED)
796+
.value("ENABLED_IN_FIRST_PRAO_AND_CRAO", pypowsybl::RaRangeShrinking::ENABLED_IN_FIRST_PRAO_AND_CRAO);
797+
798+
py::enum_<pypowsybl::ExecutionCondition>(m, "ExecutionCondition")
799+
.value("DISABLED", pypowsybl::ExecutionCondition::DISABLED)
800+
.value("POSSIBLE_CURATIVE_IMPROVEMENT", pypowsybl::ExecutionCondition::POSSIBLE_CURATIVE_IMPROVEMENT)
801+
.value("COST_INCREASE", pypowsybl::ExecutionCondition::COST_INCREASE);
802+
803+
py::class_<pypowsybl::RaoParameters>(m, "RaoParameters")
804+
.def(py::init(&pypowsybl::createRaoParameters))
805+
.def_readwrite("objective_function_type", &pypowsybl::RaoParameters::objective_function_type)
806+
.def_readwrite("preventive_stop_criterion", &pypowsybl::RaoParameters::preventive_stop_criterion)
807+
.def_readwrite("curative_stop_criterion", &pypowsybl::RaoParameters::curative_stop_criterion)
808+
.def_readwrite("curative_min_obj_improvement", &pypowsybl::RaoParameters::curative_min_obj_improvement)
809+
.def_readwrite("forbid_cost_increase", &pypowsybl::RaoParameters::forbid_cost_increase)
810+
.def_readwrite("optimize_curative_if_preventive_unsecure", &pypowsybl::RaoParameters::optimize_curative_if_preventive_unsecure)
811+
.def_readwrite("solver", &pypowsybl::RaoParameters::solver)
812+
.def_readwrite("relative_mip_gap", &pypowsybl::RaoParameters::relative_mip_gap)
813+
.def_readwrite("solver_specific_parameters", &pypowsybl::RaoParameters::solver_specific_parameters)
814+
.def_readwrite("max_mip_iterations", &pypowsybl::RaoParameters::max_mip_iterations)
815+
.def_readwrite("pst_penalty_cost", &pypowsybl::RaoParameters::pst_penalty_cost)
816+
.def_readwrite("pst_sensitivity_threshold", &pypowsybl::RaoParameters::pst_sensitivity_threshold)
817+
.def_readwrite("pst_model", &pypowsybl::RaoParameters::pst_model)
818+
.def_readwrite("hvdc_penalty_cost", &pypowsybl::RaoParameters::hvdc_penalty_cost)
819+
.def_readwrite("hvdc_sensitivity_threshold", &pypowsybl::RaoParameters::hvdc_sensitivity_threshold)
820+
.def_readwrite("injection_ra_penalty_cost", &pypowsybl::RaoParameters::injection_ra_penalty_cost)
821+
.def_readwrite("injection_ra_sensitivity_threshold", &pypowsybl::RaoParameters::injection_ra_sensitivity_threshold)
822+
.def_readwrite("ra_range_shrinking", &pypowsybl::RaoParameters::ra_range_shrinking)
823+
.def_readwrite("max_preventive_search_tree_depth", &pypowsybl::RaoParameters::max_preventive_search_tree_depth)
824+
.def_readwrite("max_auto_search_tree_depth", &pypowsybl::RaoParameters::max_auto_search_tree_depth)
825+
.def_readwrite("max_curative_search_tree_depth", &pypowsybl::RaoParameters::max_curative_search_tree_depth)
826+
.def_readwrite("relative_min_impact_threshold", &pypowsybl::RaoParameters::relative_min_impact_threshold)
827+
.def_readwrite("absolute_min_impact_threshold", &pypowsybl::RaoParameters::absolute_min_impact_threshold)
828+
.def_readwrite("skip_actions_far_from_most_limiting_element", &pypowsybl::RaoParameters::skip_actions_far_from_most_limiting_element)
829+
.def_readwrite("max_number_of_boundaries_for_skipping_actions", &pypowsybl::RaoParameters::max_number_of_boundaries_for_skipping_actions)
830+
.def_readwrite("contingency_scenarios_in_parallel", &pypowsybl::RaoParameters::contingency_scenarios_in_parallel)
831+
.def_readwrite("preventive_leaves_in_parallel", &pypowsybl::RaoParameters::preventive_leaves_in_parallel)
832+
.def_readwrite("auto_leaves_in_parallel", &pypowsybl::RaoParameters::auto_leaves_in_parallel)
833+
.def_readwrite("curative_leaves_in_parallel", &pypowsybl::RaoParameters::curative_leaves_in_parallel)
834+
.def_readwrite("execution_condition", &pypowsybl::RaoParameters::execution_condition)
835+
.def_readwrite("re_optimize_curative_range_actions", &pypowsybl::RaoParameters::re_optimize_curative_range_actions)
836+
.def_readwrite("hint_from_first_preventive_rao", &pypowsybl::RaoParameters::hint_from_first_preventive_rao)
837+
.def_readwrite("do_not_optimize_curative_cnecs_for_tsos_without_cras", &pypowsybl::RaoParameters::do_not_optimize_curative_cnecs_for_tsos_without_cras)
838+
.def_readwrite("load_flow_provider", &pypowsybl::RaoParameters::load_flow_provider)
839+
.def_readwrite("sensitivity_provider", &pypowsybl::RaoParameters::sensitivity_provider)
840+
.def_readwrite("sensitivity_failure_overcost", &pypowsybl::RaoParameters::sensitivity_failure_overcost)
841+
.def_readwrite("provider_parameters_keys", &pypowsybl::RaoParameters::provider_parameters_keys)
842+
.def_readwrite("provider_parameters_values", &pypowsybl::RaoParameters::provider_parameters_values);
843+
767844
py::class_<network_metadata, std::shared_ptr<network_metadata>>(m, "NetworkMetadata")
768845
.def_property_readonly("id", [](const network_metadata& att) {
769846
return att.id;
@@ -1145,7 +1222,7 @@ PYBIND11_MODULE(_pypowsybl, m) {
11451222
m.def("get_short_circuit_bus_results", &pypowsybl::getShortCircuitBusResults, "gets the bus results of a short-circuit analysis", py::arg("result"), py::arg("with_fortescue_result"));
11461223

11471224
m.def("create_rao", &pypowsybl::createRao, "Create rao context");
1148-
m.def("run_rao", ::runRaoWithParameters, py::call_guard<py::gil_scoped_release>(), "Run a rao from buffered inputs",
1225+
m.def("run_rao", &pypowsybl::runRaoWithParameters, py::call_guard<py::gil_scoped_release>(), "Run a rao from buffered inputs",
11491226
py::arg("network"), py::arg("rao_context"), py::arg("parameters"));
11501227
m.def("set_crac_source", ::setCracSource, py::call_guard<py::gil_scoped_release>(), "Set crac source",
11511228
py::arg("network"), py::arg("rao_context"), py::arg("crac_source"));
@@ -1158,6 +1235,8 @@ PYBIND11_MODULE(_pypowsybl, m) {
11581235
m.def("serialize_rao_parameters", ::saveRaoParametersToBinaryBuffer, "Serialize rao parameters to a buffer", py::arg("rao_parameters"));
11591236
m.def("serialize_rao_results_to_buffer", ::saveRaoResultsToBinaryBuffer, "Run a rao", py::arg("rao_result"), py::arg("crac"));
11601237
m.def("get_rao_result_status", &pypowsybl::getRaoResultStatus, "Get the status of a rao result", py::arg("rao_result"));
1238+
m.def("run_voltage_monitoring", &pypowsybl::runVoltageMonitoring, "Run voltage monitoring", py::arg("network"), py::arg("rao_context"), py::arg("load_flow_parameters"), py::arg("provider"));
1239+
m.def("run_angle_monitoring", &pypowsybl::runAngleMonitoring, "Run angle monitoring", py::arg("network"), py::arg("rao_context"), py::arg("load_flow_parameters"), py::arg("provider"));
11611240

11621241
py::enum_<Grid2opStringValueType>(m, "Grid2opStringValueType")
11631242
.value("VOLTAGE_LEVEL_NAME", Grid2opStringValueType::VOLTAGE_LEVEL_NAME)
@@ -1290,11 +1369,6 @@ void setGlskSource(const pypowsybl::JavaHandle& networkHandle, const pypowsybl::
12901369
static_cast<char*>(glskInfo.ptr), glskInfo.size);
12911370
}
12921371

1293-
void runRaoWithParameters(const pypowsybl::JavaHandle& networkHandle, const pypowsybl::JavaHandle& raoHandle, const pypowsybl::JavaHandle& parametersHandle) {
1294-
pypowsybl::PowsyblCaller::get()->callJava<>(::runRao,
1295-
networkHandle, raoHandle, parametersHandle);
1296-
}
1297-
12981372
py::bytes saveRaoResultsToBinaryBuffer(const pypowsybl::JavaHandle& raoResult, const pypowsybl::JavaHandle& crac) {
12991373
array* byteArray = pypowsybl::PowsyblCaller::get()->callJava<array*>(::serializeRaoResultsToBuffer, raoResult, crac);
13001374
py::gil_scoped_acquire acquire;
@@ -1303,14 +1377,15 @@ py::bytes saveRaoResultsToBinaryBuffer(const pypowsybl::JavaHandle& raoResult, c
13031377
return bytes;
13041378
}
13051379

1306-
pypowsybl::JavaHandle loadRaoParametersFromBuffer(const py::buffer& parameters) {
1380+
pypowsybl::RaoParameters* loadRaoParametersFromBuffer(const py::buffer& parameters) {
13071381
py::buffer_info parametersInfo = parameters.request();
1308-
return pypowsybl::PowsyblCaller::get()->callJava<pypowsybl::JavaHandle>(::loadRaoParameters,
1309-
static_cast<char*>(parametersInfo.ptr), parametersInfo.size);
1382+
rao_parameters* c_parameters = pypowsybl::PowsyblCaller::get()->callJava<rao_parameters*>(::loadRaoParameters, static_cast<char*>(parametersInfo.ptr), parametersInfo.size);
1383+
return new pypowsybl::RaoParameters(c_parameters);
13101384
}
13111385

1312-
py::bytes saveRaoParametersToBinaryBuffer(const pypowsybl::JavaHandle& rao_parameters) {
1313-
array* byteArray = pypowsybl::PowsyblCaller::get()->callJava<array*>(::serializeRaoParameters, rao_parameters);
1386+
py::bytes saveRaoParametersToBinaryBuffer(const pypowsybl::RaoParameters& rao_parameters) {
1387+
auto c_parameters = rao_parameters.to_c_struct();
1388+
array* byteArray = pypowsybl::PowsyblCaller::get()->callJava<array*>(::serializeRaoParameters, c_parameters.get());
13141389
py::gil_scoped_acquire acquire;
13151390
py::bytes bytes((char*) byteArray->ptr, byteArray->length);
13161391
pypowsybl::PowsyblCaller::get()->callJava<>(::freeBinaryBuffer, byteArray);

0 commit comments

Comments
 (0)