import json
import math
import pathlib
import sys
import pypowsybl as pp
import pypowsybl.loadflow as lf
ROOT = pathlib.Path(__file__).resolve().parents[2]
FIXTURES = ROOT / "tests" / "data" / "iidm"
OPENRAO = ROOT / "tests" / "data" / "benchmark-grids" / "powsybl-open-rao"
def listed(extension):
found = []
for line in (ROOT / "tests" / "data" / "openrao-fixtures.txt").read_text().splitlines():
if not line.strip() or line.startswith("#"):
continue
name, relative = line.split()[:2]
if name.endswith("." + extension):
found.append((name, OPENRAO / relative))
return sorted(found)
def clean(x):
if x is None or (isinstance(x, float) and not math.isfinite(x)):
return None
return float(x)
def reference(path):
network = pp.network.load(str(path))
parameters = lf.Parameters(
distributed_slack=False,
use_reactive_limits=False,
transformer_voltage_control_on=False,
phase_shifter_regulation_on=False,
voltage_init_mode=pp.loadflow.VoltageInitMode.UNIFORM_VALUES,
provider_parameters={"voltageRemoteControl": "false"},
)
status = str(lf.run_ac(network, parameters=parameters)[0].status)
levels = network.get_voltage_levels()
buses = {}
for bus_id, row in network.get_bus_breaker_view_buses().iterrows():
nominal = levels.loc[row["voltage_level_id"], "nominal_v"]
buses[bus_id.strip()] = {
"v_pu": clean(row["v_mag"] / nominal),
"angle_deg": clean(row["v_angle"]),
}
branches = {}
for frame in (network.get_lines(), network.get_2_windings_transformers()):
for element_id, row in frame.iterrows():
branches[element_id] = {
"p1": clean(row["p1"]),
"q1": clean(row["q1"]),
"p2": clean(row["p2"]),
"q2": clean(row["q2"]),
}
return {"status": status, "buses": buses, "branches": branches}
def main():
cases = listed("xiidm")
if not cases:
sys.exit("no .xiidm fixtures listed in tests/data/openrao-fixtures.txt")
for name, case in cases:
try:
document = reference(case)
except Exception as error:
print(f" skip {name}: {error}")
continue
out = FIXTURES / pathlib.Path(name).with_suffix(".pypowsybl.json")
out.write_text(json.dumps(document, indent=1) + "\n")
print(
f" {name}: {document['status']}, "
f"{len(document['buses'])} buses, {len(document['branches'])} branches"
)
if __name__ == "__main__":
main()