From 6879ec24fec72de49b3b03c63c8d0860d8d58052 Mon Sep 17 00:00:00 2001 From: Yunn1633 <165199018+Yunn1633@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:48:20 +0800 Subject: [PATCH] feat: add security-constrained dispatch benchmark --- benchmarks/PowerSystems/README.md | 5 + benchmarks/PowerSystems/README_zh-CN.md | 5 + .../SecurityConstrainedDispatch/README.md | 92 ++ .../README_zh-CN.md | 75 + .../SecurityConstrainedDispatch/Task.md | 152 ++ .../SecurityConstrainedDispatch/Task_zh-CN.md | 131 ++ .../baseline/result_log.txt | 19 + .../baseline/solution.py | 13 + .../frontier_eval/agent_files.txt | 7 + .../frontier_eval/artifact_files.txt | 2 + .../frontier_eval/candidate_destination.txt | 1 + .../frontier_eval/constraints.txt | 8 + .../frontier_eval/copy_files.txt | 1 + .../frontier_eval/eval_command.txt | 1 + .../frontier_eval/eval_cwd.txt | 1 + .../frontier_eval/initial_program.txt | 1 + .../frontier_eval/readonly_files.txt | 17 + .../frontier_eval/run_eval.sh | 9 + .../references/PROVENANCE.md | 25 + .../references/build_scenarios.py | 245 ++++ .../references/pglib/LICENSE | 31 + .../pglib/pglib_opf_case24_ieee_rts.m | 297 ++++ .../references/pglib/pglib_opf_case57_ieee.m | 539 +++++++ .../pglib/pglib_opf_case73_ieee_rts.m | 755 ++++++++++ .../references/scenarios.json | 1280 +++++++++++++++++ .../scripts/init.py | 20 + .../verification/__init__.py | 1 + .../verification/candidate_worker.py | 105 ++ .../verification/evaluator.py | 274 ++++ .../verification/grid_utils.py | 239 +++ .../verification/requirements.txt | 7 + .../verification/test_candidate_isolation.py | 112 ++ ...026-07-13-scd-restricted-process-design.md | 109 ++ 33 files changed, 4579 insertions(+) create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/README.md create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/README_zh-CN.md create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/Task.md create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/Task_zh-CN.md create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/result_log.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/solution.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/agent_files.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/artifact_files.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/candidate_destination.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/constraints.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/copy_files.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_command.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_cwd.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/initial_program.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/readonly_files.txt create mode 100755 benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/run_eval.sh create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/PROVENANCE.md create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/build_scenarios.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/LICENSE create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case24_ieee_rts.m create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case57_ieee.m create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case73_ieee_rts.m create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/references/scenarios.json create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/scripts/init.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/__init__.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/candidate_worker.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/evaluator.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/grid_utils.py create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt create mode 100644 benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/test_candidate_isolation.py create mode 100644 docs/superpowers/specs/2026-07-13-scd-restricted-process-design.md diff --git a/benchmarks/PowerSystems/README.md b/benchmarks/PowerSystems/README.md index 6a3f9d2e..bda943c7 100644 --- a/benchmarks/PowerSystems/README.md +++ b/benchmarks/PowerSystems/README.md @@ -9,3 +9,8 @@ Current tasks emphasize realistic operational constraints, economic objectives, - Unified benchmark: `task=unified task.benchmark=PowerSystems/EV2GymSmartCharging` - Quick run: `python -m frontier_eval task=unified task.benchmark=PowerSystems/EV2GymSmartCharging task.runtime.env_name=frontier-eval-driver algorithm.iterations=0` - Description: upstream-aligned EV smart charging with transformer constraints in the real `EV2Gym` simulator + +- `SecurityConstrainedDispatch` + - Unified benchmark: `task=unified task.benchmark=PowerSystems/SecurityConstrainedDispatch` + - Runtime: install the pinned packages in `verification/requirements.txt` and set `task.runtime.python_path` to that environment + - Description: cost-and-security dispatch across normal and N-1 PGLib operating scenarios with frozen AC power-flow verification diff --git a/benchmarks/PowerSystems/README_zh-CN.md b/benchmarks/PowerSystems/README_zh-CN.md index 30fcfd26..b86ce81a 100644 --- a/benchmarks/PowerSystems/README_zh-CN.md +++ b/benchmarks/PowerSystems/README_zh-CN.md @@ -9,3 +9,8 @@ - `frontier_eval` 任务:`task=unified task.benchmark=PowerSystems/EV2GymSmartCharging` - 快速运行:`python -m frontier_eval task=unified task.benchmark=PowerSystems/EV2GymSmartCharging task.runtime.env_name=frontier-eval-driver algorithm.iterations=0` - 简介:在真实上游 `EV2Gym` 模拟器中进行、与上游数据对齐的 EV 智能充电与变压器约束优化 + +- `SecurityConstrainedDispatch` + - `frontier_eval` 任务:`task=unified task.benchmark=PowerSystems/SecurityConstrainedDispatch` + - 运行环境:安装 `verification/requirements.txt` 中的固定依赖,并通过 `task.runtime.python_path` 指定解释器 + - 简介:在正常与 N-1 PGLib 场景中优化成本和安全裕度,并由冻结交流潮流验证器评分 diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/README.md b/benchmarks/PowerSystems/SecurityConstrainedDispatch/README.md new file mode 100644 index 00000000..a8e02a67 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/README.md @@ -0,0 +1,92 @@ +# Security-Constrained Dispatch + +This benchmark asks an agent to improve generator active-power and voltage +setpoints across normal and N-1 operating scenarios derived from PGLib-OPF. +Every candidate is checked by an independent AC power-flow verifier. + +## Benchmark ID + +```text +PowerSystems/SecurityConstrainedDispatch +``` + +## Data provenance + +The bundled MATPOWER cases come from PGLib-OPF release `v23.07`, commit +`dc6be4b2f85ca0e776952ec22cbd4c22396ea5a3`: + +- `pglib_opf_case24_ieee_rts.m` +- `pglib_opf_case57_ieee.m` +- `pglib_opf_case73_ieee_rts.m` + +PGLib-OPF is maintained by the IEEE PES Task Force on Benchmarks for Validation +of Emerging Power System Algorithms. See `references/pglib/LICENSE` and +`references/PROVENANCE.md`. + +## Environment + +Use Python 3.12 on Linux. Install the pinned dependencies: + +```bash +python3.12 -m venv .venvs/frontier-pglib-scd +.venvs/frontier-pglib-scd/bin/python -m pip install \ + -r benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt +``` + +The evaluator is CPU-only and requires Linux seccomp support. Candidate code is +run in a restricted worker process; Docker and Linux namespaces are not used. +The worker blocks file access, process creation, and networking from `solve()`. +Because namespace isolation is unavailable on the target runtime, this is not +claimed to be container-equivalent isolation. Evaluation fails closed if the +seccomp filter cannot be installed. + +A typical baseline evaluation of all 12 scenarios uses less than 2 GB RAM and +should complete within seconds on a modern CPU. Candidate import has a separate +10-second infrastructure timeout. Each `solve()` call retains its full +contract-defined two-second budget. + +## Direct evaluation + +From the benchmark directory: + +```bash +../../../.venvs/frontier-pglib-scd/bin/python \ + verification/evaluator.py scripts/init.py \ + --metrics-out metrics.json \ + --artifacts-out artifacts.json +``` + +## Frontier Eval + +From the repository root, use the repository-owned task runtime: + +```bash +python -m frontier_eval \ + task=unified \ + task.benchmark=PowerSystems/SecurityConstrainedDispatch \ + task.runtime.python_path=uv-env:frontier-pglib-scd \ + algorithm=openevolve \ + algorithm.iterations=0 +``` + +Baseline-only validation does not require a model API key. + +## Isolation tests + +From the benchmark directory: + +```bash +../../../.venvs/frontier-pglib-scd/bin/python -m pytest -q \ + verification/test_candidate_isolation.py +``` + +## Layout + +- `scripts/init.py`: editable dispatch policy. +- `verification/`: frozen AC power-flow evaluator. +- `references/pglib/`: version-pinned PGLib source cases and license. +- `references/scenarios.json`: deterministic scenario baselines and reference costs. +- `references/build_scenarios.py`: reproducible scenario-generation script. +- `frontier_eval/`: unified-task metadata. + +See `Task.md` for the complete contract and scoring definition. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/README_zh-CN.md b/benchmarks/PowerSystems/SecurityConstrainedDispatch/README_zh-CN.md new file mode 100644 index 00000000..7eb118d1 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/README_zh-CN.md @@ -0,0 +1,75 @@ +# 安全约束电力调度 + +本任务要求 Agent 改进发电机有功功率和电压设定值,在由 PGLib-OPF +构建的正常及 N-1 故障场景中降低发电成本。冻结验证器使用独立交流潮流 +检查每个候选方案。 + +## Benchmark ID + +```text +PowerSystems/SecurityConstrainedDispatch +``` + +## 数据来源 + +任务内置的 MATPOWER 案例来自 PGLib-OPF `v23.07`,提交: +`dc6be4b2f85ca0e776952ec22cbd4c22396ea5a3`。 + +- `pglib_opf_case24_ieee_rts.m` +- `pglib_opf_case57_ieee.m` +- `pglib_opf_case73_ieee_rts.m` + +许可证和文件哈希见 `references/pglib/LICENSE` 与 +`references/PROVENANCE.md`。 + +## 环境 + +推荐 Linux 与 Python 3.12。本任务仅使用 CPU: + +```bash +python -m venv .venv-pglib-scd +source .venv-pglib-scd/bin/activate +python -m pip install -r benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt +``` + +评测器仅使用 CPU,并要求 Linux seccomp 支持。候选程序在受限 worker +进程中运行,不使用 Docker 或 Linux namespace。worker 会禁止 `solve()` +读取或写入文件、创建进程和访问网络;如果 seccomp 过滤器无法安装,评测将 +直接失败,不会降级为无保护执行。由于运行环境不提供 namespace 隔离,本方案 +不宣称具备与容器完全等价的安全边界。 + +候选模块加载使用独立的 10 秒基础设施超时;每次 `solve()` 仍拥有任务合同 +规定的完整 2 秒预算,模块加载时间不会占用该预算。 + +完整12个场景的 baseline 评测通常只需数秒,内存低于2 GB。 + +## 直接评测 + +在任务目录执行: + +```bash +python verification/evaluator.py scripts/init.py \ + --metrics-out metrics.json \ + --artifacts-out artifacts.json +``` + +## Frontier Eval + +在仓库根目录执行,并传入任务环境的 Python: + +```bash +python -m frontier_eval \ + task=unified \ + task.benchmark=PowerSystems/SecurityConstrainedDispatch \ + task.runtime.python_path=/absolute/path/to/.venv-pglib-scd/bin/python \ + algorithm=openevolve \ + algorithm.iterations=0 +``` + +若环境位于 `.venvs/frontier-pglib-scd`,可以改用: + +```text +task.runtime.python_path=uv-env:frontier-pglib-scd +``` + +完整任务契约和评分方法见 `Task_zh-CN.md`。 diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task.md b/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task.md new file mode 100644 index 00000000..5377bb1b --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task.md @@ -0,0 +1,152 @@ +# Task: Security-Constrained Dispatch + +## Background + +Power-system operators must dispatch generators economically while respecting +network physics and remaining feasible after credible component outages. A +dispatch that is cheap in the intact network may overload a transmission line, +violate voltage limits, or become infeasible after a line outage. + +This benchmark uses three PGLib-OPF systems and twelve deterministic operating +scenarios. Scenarios combine normal operation, load variation, and selected N-1 +line outages that were verified to admit AC-OPF solutions. + +## Editable program + +Edit only the logic between `EVOLVE-BLOCK-START` and `EVOLVE-BLOCK-END` in +`scripts/init.py`. Preserve: + +```python +def solve(case: dict) -> dict: + ... +``` + +The function is called once per scenario. It must return: + +```python +{ + "pg_mw": [generator active-power setpoints], + "vg_pu": [generator voltage-magnitude setpoints], +} +``` + +Both lists must contain exactly one finite value per generator, in the order +given by `case["generators"]`. All online generators at the same bus must use +the same voltage setpoint. + +## Input + +The `case` dictionary has the following exact top-level fields: + +- `case_id: str`: PGLib system identifier. +- `scenario_id: str`: deterministic operating-scenario identifier. +- `base_mva: float`: system power base in MVA. +- `load_scale: float`: demand multiplier applied to the source case. +- `outage_branch: int | None`: zero-based source-case branch index removed in + this scenario, or `None` for an intact network. +- `total_active_load_mw: float`: sum of active bus demand after scaling. +- `buses: list[dict]`: buses in MATPOWER row order. +- `generators: list[dict]`: generators in MATPOWER row order. Output arrays + must use this same order. +- `branches: list[dict]`: branches in MATPOWER row order after applying the + scenario outage. + +Each entry in `case["buses"]` contains: + +- `bus_id: int`, `type: int`; +- `pd_mw: float`, `qd_mvar: float`; +- `base_kv: float`; +- `vmin_pu: float`, `vmax_pu: float`. + +Each entry in `case["generators"]` contains: + +- `index: int`, `bus_id: int`, `online: bool`; +- `pmin_mw: float`, `pmax_mw: float`; +- `qmin_mvar: float`, `qmax_mvar: float`; +- `baseline_pg_mw: float`, `baseline_vg_pu: float`; +- `cost_model: list[float]`: the unmodified MATPOWER `gencost` row. + +`cost_model` uses one of the MATPOWER encodings below. Polynomial rows are +`[2, startup, shutdown, n, c_(n-1), ..., c_0]`, representing coefficients in +descending power order. Piecewise-linear rows are +`[1, startup, shutdown, n, x_1, y_1, ..., x_n, y_n]`. + +Each entry in `case["branches"]` contains: + +- `index: int`, `from_bus: int`, `to_bus: int`; +- `resistance_pu: float`, `reactance_pu: float`, `charging_pu: float`; +- `rate_a_mva: float` (`0` means no active `RATE_A` limit); +- `tap_ratio: float`, `phase_shift_deg: float`; +- `in_service: bool`; +- `angle_min_deg: float`, `angle_max_deg: float`. + +The baseline setpoints are feasible but deliberately non-optimal. They are a +starting point, not reference answers. + +## Hard constraints + +A candidate is valid only if every scenario satisfies all of the following: + +1. AC Newton power flow converges. +2. Generator active and reactive powers remain within limits. +3. Bus voltage magnitudes remain within PGLib limits. +4. Apparent power at both ends of every rated in-service branch stays within + `RATE_A`. +5. Branch angle differences remain within `ANGMIN` and `ANGMAX`. +6. Output is finite, has the exact required shape, and returns within two seconds + per scenario. + +Any hard violation makes the overall candidate invalid and sets +`combined_score` to zero. + +## Scenarios + +The benchmark evaluates three systems: + +- IEEE RTS 24-bus; +- IEEE 57-bus; +- IEEE RTS 73-bus. + +Each system has four scenarios: + +- 98% load, intact network; +- 100% load, intact network; +- 100% load, selected line outage A; +- 102% load, selected line outage B. + +The selected outages and fixed reference values are stored in the readonly +scenario manifest. + +## Score + +For each feasible scenario, three normalized components are computed: + +```text +cost_efficiency = min(1.05, reference_AC_OPF_cost / candidate_cost) +thermal_margin = clip((100 - max_branch_loading_percent) / 20, 0, 1) +voltage_margin = 10th percentile normalized distance from voltage limits + +scenario_score = 70 * cost_efficiency + + 20 * thermal_margin + + 10 * voltage_margin +``` + +The aggregate score emphasizes both average and worst-case behavior: + +```text +combined_score = 0.75 * mean(scenario_score) + + 0.25 * min(scenario_score) +``` + +Higher is better. The cost term rewards proximity to the frozen AC-OPF +references; the two margin terms reward dispatches that do not merely sit on +thermal or voltage limits. The cost component is capped to limit sensitivity to +numerical solver differences. + +## Prohibited behavior + +- Do not modify the evaluator, PGLib cases, scenario manifest, or metadata. +- Do not read or write files, launch subprocesses, access the network, or use + wall-clock-dependent behavior from `solve`. +- Do not hard-code evaluator outputs or bypass AC power flow. +- Keep the policy deterministic. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task_zh-CN.md b/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task_zh-CN.md new file mode 100644 index 00000000..e71473d8 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/Task_zh-CN.md @@ -0,0 +1,131 @@ +# 任务:安全约束电力调度 + +## 背景 + +电力系统调度需要在降低发电成本的同时满足交流网络物理约束,并保证线路 +故障后仍然可行。只针对完整电网设计的低成本方案,可能在 N-1 故障后造成 +线路过载、电压越界或潮流不收敛。 + +本任务使用三个 PGLib-OPF 电网和12个确定性场景,覆盖正常运行、负荷变化 +以及经过 AC-OPF 验证的单线路故障。 + +## 可编辑程序 + +只允许修改 `scripts/init.py` 中 `EVOLVE-BLOCK-START` 与 +`EVOLVE-BLOCK-END` 之间的逻辑,并保持接口: + +```python +def solve(case: dict) -> dict: + ... +``` + +每个场景调用一次,返回: + +```python +{ + "pg_mw": [每台发电机的有功设定值], + "vg_pu": [每台发电机的电压幅值设定值], +} +``` + +两个列表必须与 `case["generators"]` 等长且全部为有限数值。同一母线上的 +在线机组必须采用相同电压设定值。 + +## 输入 + +`case` ?????????????? + +- `case_id: str`?PGLib ????? +- `scenario_id: str`??????????? +- `base_mva: float`?????????? MVA? +- `load_scale: float`????????????? +- `outage_branch: int | None`??????????????????? + ????? `None`? +- `total_active_load_mw: float`???????????????? +- `buses: list[dict]`?? MATPOWER ????????? +- `generators: list[dict]`?? MATPOWER ?????????????? + ????????? +- `branches: list[dict]`????????? MATPOWER ????????? + +`case["buses"]` ????????? + +- `bus_id: int`?`type: int`? +- `pd_mw: float`?`qd_mvar: float`? +- `base_kv: float`? +- `vmin_pu: float`?`vmax_pu: float`? + +`case["generators"]` ????????? + +- `index: int`?`bus_id: int`?`online: bool`? +- `pmin_mw: float`?`pmax_mw: float`? +- `qmin_mvar: float`?`qmax_mvar: float`? +- `baseline_pg_mw: float`?`baseline_vg_pu: float`? +- `cost_model: list[float]`?????? MATPOWER `gencost` ?? + +`cost_model` ?????? MATPOWER ?????????? +`[2, startup, shutdown, n, c_(n-1), ..., c_0]`????????????? +???????? +`[1, startup, shutdown, n, x_1, y_1, ..., x_n, y_n]`? + +`case["branches"]` ????????? + +- `index: int`?`from_bus: int`?`to_bus: int`? +- `resistance_pu: float`?`reactance_pu: float`?`charging_pu: float`? +- `rate_a_mva: float`?`0` ?????? `RATE_A` ???? +- `tap_ratio: float`?`phase_shift_deg: float`? +- `in_service: bool`? +- `angle_min_deg: float`?`angle_max_deg: float`? + +Baseline 是可行但刻意次优的起点,不是参考最优答案。 + +## 硬约束 + +候选方案必须在全部场景中满足: + +1. 牛顿交流潮流收敛; +2. 发电机有功、无功不越界; +3. 母线电压幅值不越界; +4. 每条有额定容量的在线支路两端视在功率不超过 `RATE_A`; +5. 支路相角差满足 `ANGMIN` 与 `ANGMAX`; +6. 输出形状正确且为有限值,每个场景两秒内返回。 + +任一硬约束失败都会令总体 `valid=0`、`combined_score=0`。 + +## 场景 + +使用 IEEE RTS 24母线、IEEE 57母线和 IEEE RTS 73母线系统。每个系统包含: + +- 98%负荷、完整电网; +- 100%负荷、完整电网; +- 100%负荷、线路故障A; +- 102%负荷、线路故障B。 + +## 评分 + +每个可行场景计算三个归一化分量: + +```text +cost_efficiency = min(1.05, 参考AC-OPF成本 / 候选成本) +thermal_margin = clip((100 - 最大支路负载率) / 20, 0, 1) +voltage_margin = 母线电压到上下限归一化距离的第10百分位 + +scenario_score = 70 * cost_efficiency + + 20 * thermal_margin + + 10 * voltage_margin +``` + +总分: + +```text +combined_score = 0.75 * 场景平均分 + 0.25 * 场景最低分 +``` + +分数越高越好。成本项奖励接近冻结 AC-OPF 参考成本,另外两项奖励不贴近 +热容量或电压边界的安全调度。 + +## 禁止行为 + +- 不得修改验证器、PGLib案例、场景清单或元数据; +- `solve` 不得读写文件、启动子进程、访问网络或依赖当前时间; +- 不得硬编码验证器输出或绕过交流潮流; +- 策略必须确定性执行。 diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/result_log.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/result_log.txt new file mode 100644 index 00000000..c53e3c8e --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/result_log.txt @@ -0,0 +1,19 @@ +SecurityConstrainedDispatch released baseline + +PGLib release: v23.07 +Cases: case24_ieee_rts, case57_ieee, case73_ieee_rts +Scenarios: 12 +Runtime: Python 3.12.3, NumPy 1.26.4, SciPy 1.12.0, PYPOWER 5.1.19 + +valid: 1.0 +combined_score: 71.27192438899405 +mean_scenario_score: 74.1901194445309 +worst_scenario_score: 62.5173392223835 +feasible_fraction: 1.0 +scenarios_feasible: 12.0 +scenarios_total: 12.0 +observed_runtime_s: 0.2758505344390869 + +For comparison, the frozen per-scenario AC-OPF dispatches evaluated under the +same composite cost-and-security score achieved 78.00215115798889. This is a +diagnostic upper reference, not a claimed global optimum of the composite score. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/solution.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/solution.py new file mode 100644 index 00000000..e99fb1e6 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/baseline/solution.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from typing import Any + + +def solve(case: dict[str, Any]) -> dict[str, list[float]]: + """Released feasible, deliberately non-optimal baseline.""" + + generators = case["generators"] + return { + "pg_mw": [float(generator["baseline_pg_mw"]) for generator in generators], + "vg_pu": [float(generator["baseline_vg_pu"]) for generator in generators], + } diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/agent_files.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/agent_files.txt new file mode 100644 index 00000000..3773e1b7 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/agent_files.txt @@ -0,0 +1,7 @@ +README.md +README_zh-CN.md +Task.md +Task_zh-CN.md +scripts/init.py +frontier_eval/constraints.txt +references/PROVENANCE.md diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/artifact_files.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/artifact_files.txt new file mode 100644 index 00000000..76dc893a --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/artifact_files.txt @@ -0,0 +1,2 @@ +metrics.json +artifacts.json diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/candidate_destination.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/candidate_destination.txt new file mode 100644 index 00000000..b9411b3d --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/candidate_destination.txt @@ -0,0 +1 @@ +scripts/init.py diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/constraints.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/constraints.txt new file mode 100644 index 00000000..41294d6d --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/constraints.txt @@ -0,0 +1,8 @@ +SecurityConstrainedDispatch unified constraints: +1) Only modify optimization logic inside `scripts/init.py` between `EVOLVE-BLOCK-START` and `EVOLVE-BLOCK-END`. +2) Keep the public function signature `solve(case)` and return `pg_mw` plus `vg_pu`, each with one finite value per generator. +3) Respect generator P/Q limits, bus voltage limits, branch RATE_A limits, and branch angle-difference limits in all normal and N-1 scenarios. +4) Generators connected to the same bus must use the same voltage setpoint. +5) Keep the policy deterministic and return within two seconds per scenario. +6) Do not read or write files, launch subprocesses, access the network, or inspect verifier/reference internals from `solve`. +7) Do not modify files under `verification/`, `references/`, or `frontier_eval/`. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/copy_files.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/copy_files.txt new file mode 100644 index 00000000..9c558e35 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/copy_files.txt @@ -0,0 +1 @@ +. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_command.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_command.txt new file mode 100644 index 00000000..edd26896 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_command.txt @@ -0,0 +1 @@ +bash frontier_eval/run_eval.sh {python} {candidate} diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_cwd.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_cwd.txt new file mode 100644 index 00000000..9c558e35 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/eval_cwd.txt @@ -0,0 +1 @@ +. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/initial_program.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/initial_program.txt new file mode 100644 index 00000000..b9411b3d --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/initial_program.txt @@ -0,0 +1 @@ +scripts/init.py diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/readonly_files.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/readonly_files.txt new file mode 100644 index 00000000..6db58eba --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/readonly_files.txt @@ -0,0 +1,17 @@ +README.md +README_zh-CN.md +Task.md +Task_zh-CN.md +references/ +verification/ +verification/evaluator.py +frontier_eval/run_eval.sh +frontier_eval/constraints.txt +frontier_eval/eval_command.txt +frontier_eval/eval_cwd.txt +frontier_eval/initial_program.txt +frontier_eval/candidate_destination.txt +frontier_eval/agent_files.txt +frontier_eval/copy_files.txt +frontier_eval/readonly_files.txt +frontier_eval/artifact_files.txt diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/run_eval.sh b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/run_eval.sh new file mode 100755 index 00000000..ae895c26 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/frontier_eval/run_eval.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +python_bin="${1:?usage: run_eval.sh PYTHON CANDIDATE}" +candidate="${2:?usage: run_eval.sh PYTHON CANDIDATE}" + +exec "$python_bin" verification/evaluator.py "$candidate" \ + --metrics-out metrics.json \ + --artifacts-out artifacts.json diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/PROVENANCE.md b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/PROVENANCE.md new file mode 100644 index 00000000..bab8a12d --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/PROVENANCE.md @@ -0,0 +1,25 @@ +# Data provenance + +The MATPOWER case files in `references/pglib/` are copied without modification +from: + +```text +repository: https://github.com/power-grid-lib/pglib-opf +release: v23.07 +commit: dc6be4b2f85ca0e776952ec22cbd4c22396ea5a3 +``` + +PGLib-OPF is curated by the IEEE PES Task Force on Benchmarks for Validation of +Emerging Power System Algorithms. The upstream license is included as +`references/pglib/LICENSE`. + +`references/scenarios.json` is generated deterministically by: + +```bash +python references/build_scenarios.py +``` + +The manifest records SHA-256 hashes for every copied case. It contains selected +line contingencies, reference AC-OPF costs, and feasible non-optimal baseline +setpoints. Regenerate it only when deliberately updating the pinned cases or +solver versions. diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/build_scenarios.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/build_scenarios.py new file mode 100644 index 00000000..c2dbd0be --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/build_scenarios.py @@ -0,0 +1,245 @@ +from __future__ import annotations + +import argparse +import copy +import hashlib +import json +from pathlib import Path + +import numpy as np +from pypower.idx_bus import BUS_TYPE, REF +from pypower.idx_gen import GEN_BUS, GEN_STATUS, PG, PMAX, PMIN, VG + + +TASK_ROOT = Path(__file__).resolve().parents[1] +import sys + +sys.path.insert(0, str(TASK_ROOT)) + +from verification.grid_utils import ( # noqa: E402 + apply_scenario, + assess_result, + generation_cost, + load_case, + run_candidate_pf, + run_reference_opf, +) + + +CASE_SPECS = { + "case24_ieee_rts": { + "file": "pglib_opf_case24_ieee_rts.m", + "outages": [6, 14], + }, + "case57_ieee": { + "file": "pglib_opf_case57_ieee.m", + "outages": [5, 6], + }, + "case73_ieee_rts": { + "file": "pglib_opf_case73_ieee_rts.m", + "outages": [6, 85], + }, +} + + +def sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def marginal_cost(cost_row: np.ndarray, pg_mw: float) -> float: + model = int(cost_row[0]) + count = int(cost_row[3]) + if model != 2 or count < 1: + return 0.0 + coefficients = cost_row[4 : 4 + count] + derivative = np.polyder(coefficients) + return float(np.polyval(derivative, pg_mw)) if len(derivative) else 0.0 + + +def make_baseline( + scenario_case: dict, + reference: dict, + *, + seed: int, +) -> tuple[np.ndarray, np.ndarray, float]: + reference_pg = np.asarray(reference["gen"][:, PG], dtype=float) + reference_vg = np.asarray(reference["gen"][:, VG], dtype=float) + reference_cost = generation_cost(reference) + gen = scenario_case["gen"] + bus_type = {int(row[0]): int(row[BUS_TYPE]) for row in scenario_case["bus"]} + controllable = [ + index + for index, row in enumerate(gen) + if row[GEN_STATUS] > 0 + and row[PMAX] - row[PMIN] > 1e-6 + and bus_type[int(row[GEN_BUS])] != REF + ] + rng = np.random.default_rng(seed) + best_pg = reference_pg.copy() + best_vg = reference_vg.copy() + best_cost = reference_cost + + # Solve an auxiliary linear-cost OPF that deliberately favors generators + # with high original marginal cost. Its solution is physically feasible but + # economically poor under the original objective. Interpolating toward it + # creates a reproducible baseline with meaningful optimization headroom. + adversarial_case = copy.deepcopy(scenario_case) + for index in range(len(adversarial_case["gen"])): + slope = marginal_cost(scenario_case["gencost"][index], reference_pg[index]) + adversarial_case["gencost"][index, :] = 0.0 + adversarial_case["gencost"][index, 0] = 2.0 + adversarial_case["gencost"][index, 3] = 2.0 + adversarial_case["gencost"][index, 4] = -slope + adversarial = run_reference_opf(adversarial_case) + if bool(adversarial.get("success", False)): + adversarial_pg = np.asarray(adversarial["gen"][:, PG], dtype=float) + adversarial_vg = np.asarray(adversarial["gen"][:, VG], dtype=float) + for alpha in np.linspace(0.95, 0.05, 19): + proposal = reference_pg + alpha * (adversarial_pg - reference_pg) + proposal_vg = reference_vg + alpha * (adversarial_vg - reference_vg) + result = run_candidate_pf(scenario_case, proposal, proposal_vg) + valid, _ = assess_result(result) + if not valid: + continue + cost = generation_cost(result) + ratio = cost / max(reference_cost, 1e-9) + if cost > best_cost and ratio <= 1.20: + best_pg = proposal + best_vg = proposal_vg + best_cost = cost + + # First search the line segment between the AC-OPF point and the original + # PGLib dispatch. This usually provides a realistic, costlier operating + # point while retaining much of the reference solution's feasibility. + original_pg = np.clip(gen[:, PG], gen[:, PMIN], gen[:, PMAX]) + original_vg = gen[:, VG].copy() + for alpha in np.linspace(0.95, 0.05, 19): + proposal = np.clip( + reference_pg + alpha * (original_pg - reference_pg), + gen[:, PMIN], + gen[:, PMAX], + ) + proposal_vg = reference_vg + alpha * (original_vg - reference_vg) + result = run_candidate_pf(scenario_case, proposal, proposal_vg) + valid, _ = assess_result(result) + if not valid: + continue + cost = generation_cost(result) + ratio = cost / max(reference_cost, 1e-9) + if cost > best_cost and ratio <= 1.20: + best_pg = proposal + best_vg = proposal_vg + best_cost = cost + + for _ in range(500): + if len(controllable) < 2: + break + sampled = rng.choice(controllable, size=min(len(controllable), 8), replace=False) + derivatives = { + int(index): marginal_cost(scenario_case["gencost"][index], reference_pg[index]) + for index in sampled + } + cheap = min(sampled, key=lambda index: derivatives[int(index)]) + expensive = max(sampled, key=lambda index: derivatives[int(index)]) + if cheap == expensive: + continue + maximum_shift = min( + reference_pg[cheap] - gen[cheap, PMIN], + gen[expensive, PMAX] - reference_pg[expensive], + ) + if maximum_shift <= 1e-6: + continue + shift = maximum_shift * float(rng.uniform(0.15, 0.8)) + proposal = reference_pg.copy() + proposal[cheap] -= shift + proposal[expensive] += shift + result = run_candidate_pf(scenario_case, proposal, reference_vg) + valid, _ = assess_result(result) + if not valid: + continue + cost = generation_cost(result) + ratio = cost / max(reference_cost, 1e-9) + if cost > best_cost and ratio <= 1.20: + best_pg = proposal + best_vg = reference_vg + best_cost = cost + + return best_pg, best_vg, best_cost + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--output", type=Path, default=TASK_ROOT / "references" / "scenarios.json") + args = parser.parse_args() + + pglib_dir = TASK_ROOT / "references" / "pglib" + scenario_templates = ( + ("low_load", 0.98, None), + ("nominal", 1.00, None), + ("contingency_a", 1.00, "a"), + ("contingency_b_high", 1.02, "b"), + ) + records = [] + + for case_number, (case_id, spec) in enumerate(CASE_SPECS.items()): + source_path = pglib_dir / spec["file"] + source = load_case(source_path) + for scenario_number, (name, scale, outage_key) in enumerate(scenario_templates): + outage = None + if outage_key == "a": + outage = spec["outages"][0] + elif outage_key == "b": + outage = spec["outages"][1] + scenario_case = apply_scenario(source, load_scale=scale, outage_branch=outage) + reference = run_reference_opf(scenario_case) + valid_reference, reference_checks = assess_result(reference) + if not valid_reference: + raise RuntimeError(f"reference OPF is invalid for {case_id}/{name}: {reference_checks}") + baseline_pg, baseline_vg, baseline_cost = make_baseline( + scenario_case, + reference, + seed=20260713 + case_number * 100 + scenario_number, + ) + baseline_result = run_candidate_pf(scenario_case, baseline_pg, baseline_vg) + valid_baseline, baseline_checks = assess_result(baseline_result) + if not valid_baseline: + raise RuntimeError(f"baseline is invalid for {case_id}/{name}: {baseline_checks}") + reference_cost = generation_cost(reference) + records.append( + { + "case_id": case_id, + "source_file": spec["file"], + "scenario_id": name, + "load_scale": scale, + "outage_branch": outage, + "reference_cost": reference_cost, + "baseline_cost": baseline_cost, + "baseline_pg_mw": [float(value) for value in baseline_pg], + "baseline_vg_pu": [float(value) for value in baseline_vg], + } + ) + + payload = { + "schema_version": 1, + "pglib_release": "v23.07", + "pglib_commit": "dc6be4b2f85ca0e776952ec22cbd4c22396ea5a3", + "case_sha256": { + spec["file"]: sha256(pglib_dir / spec["file"]) + for spec in CASE_SPECS.values() + }, + "scenarios": records, + } + args.output.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print(f"wrote {len(records)} scenarios to {args.output}") + for record in records: + ratio = 100.0 * record["reference_cost"] / record["baseline_cost"] + print(f"{record['case_id']}/{record['scenario_id']}: baseline score {ratio:.4f}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/LICENSE b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/LICENSE new file mode 100644 index 00000000..dee2b03d --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/LICENSE @@ -0,0 +1,31 @@ +Data License: + +Creative Commons Attribution 4.0 International license +http://creativecommons.org/licenses/by/4.0/ + +See data files for specific copyright holders and attribution details. + + +Software License: + +MIT License +Copyright (c) 2017 A Library of IEEE PES Power Grid Benchmarks + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case24_ieee_rts.m b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case24_ieee_rts.m new file mode 100644 index 00000000..00b024c2 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case24_ieee_rts.m @@ -0,0 +1,297 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% %%%%% +%%%% IEEE PES Power Grid Library - Optimal Power Flow - v23.07 %%%%% +%%%% (https://github.com/power-grid-lib/pglib-opf) %%%%% +%%%% Benchmark Group - Typical Operations %%%%% +%%%% 23 - July - 2023 %%%%% +%%%% %%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Power flow data for the IEEE RELIABILITY TEST SYSTEM 1979. +% +% IEEE Reliability Test System Task Force of the Applications of +% Probability Methods Subcommittee, "IEEE reliability test system," +% IEEE Transactions on Power Apparatus and Systems, Vol. 98, No. 6, +% Nov./Dec. 1979, pp. 2047-2054. +% +% Cost data is from Web site run by Georgia Tech Power Systems Control +% and Automation Laboratory: +% http://pscal.ece.gatech.edu/testsys/index.html +% +% Matpower case file data provided by Bruce Wollenberg. +% +% Copyright (c) 1979 The Institute of Electrical and Electronics Engineers (IEEE) +% Licensed under the Creative Commons Attribution 4.0 +% International license, http://creativecommons.org/licenses/by/4.0/ +% +% Contact M.E. Brennan (me.brennan@ieee.org) for inquries on further reuse of +% this dataset. +% +function mpc = pglib_opf_case24_ieee_rts +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% area data +% area refbus +mpc.areas = [ + 1 1; + 2 3; + 3 8; + 4 6; +]; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 2 108.0 22.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 2 2 97.0 20.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 3 1 180.0 37.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 4 1 74.0 15.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 5 1 71.0 14.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 6 1 136.0 28.0 0.0 -100.0 2 1.00000 0.00000 138.0 1 1.05000 0.95000; + 7 2 125.0 25.0 0.0 0.0 2 1.00000 0.00000 138.0 1 1.05000 0.95000; + 8 1 171.0 35.0 0.0 0.0 2 1.00000 0.00000 138.0 1 1.05000 0.95000; + 9 1 175.0 36.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 10 1 195.0 40.0 0.0 0.0 2 1.00000 0.00000 138.0 1 1.05000 0.95000; + 11 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 12 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 13 3 265.0 54.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 14 2 194.0 39.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 15 2 317.0 64.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 16 2 100.0 20.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 17 1 0.0 0.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 18 2 333.0 68.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 19 1 181.0 37.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 20 1 128.0 26.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 21 2 0.0 0.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 22 2 0.0 0.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; + 23 2 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 1 1.05000 0.95000; + 24 1 0.0 0.0 0.0 0.0 4 1.00000 0.00000 230.0 1 1.05000 0.95000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin +mpc.gen = [ + 1 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 1 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 1 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 1 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 2 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 2 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 2 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 2 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 7 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 7 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 7 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 13 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 13 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 13 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 14 0.0 75.0 200.0 -50.0 1.0 100.0 1 0.0 0.0; + 15 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 15 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 15 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 15 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 15 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 15 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 16 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 18 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 21 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 22 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 23 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 23 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 23 245.0 62.5 150.0 -25.0 1.0 100.0 1 350.0 140.0; +]; + +%% generator cost data +% 2 startup shutdown n c(n-1) ... c0 +mpc.gencost = [ + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.000000 0.000000 0.000000; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.004895 11.849500 665.109400; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax +mpc.branch = [ + 1 2 0.0026 0.0139 0.4611 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 1 3 0.0546 0.2112 0.0572 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 1 5 0.0218 0.0845 0.0229 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 2 4 0.0328 0.1267 0.0343 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 2 6 0.0497 0.192 0.052 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 3 9 0.0308 0.119 0.0322 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 3 24 0.0023 0.0839 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 4 9 0.0268 0.1037 0.0281 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 5 10 0.0228 0.0883 0.0239 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 6 10 0.0139 0.0605 2.459 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 7 8 0.0159 0.0614 0.0166 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 8 9 0.0427 0.1651 0.0447 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 8 10 0.0427 0.1651 0.0447 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 9 11 0.0023 0.0839 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 9 12 0.0023 0.0839 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 10 11 0.0023 0.0839 0.0 400.0 510.0 600.0 1.02 0.0 1 -30.0 30.0; + 10 12 0.0023 0.0839 0.0 400.0 510.0 600.0 1.02 0.0 1 -30.0 30.0; + 11 13 0.0061 0.0476 0.0999 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 11 14 0.0054 0.0418 0.0879 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 12 13 0.0061 0.0476 0.0999 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 12 23 0.0124 0.0966 0.203 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 13 23 0.0111 0.0865 0.1818 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 14 16 0.005 0.0389 0.0818 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 15 16 0.0022 0.0173 0.0364 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 15 21 0.0063 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 15 21 0.0063 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 15 24 0.0067 0.0519 0.1091 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 16 17 0.0033 0.0259 0.0545 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 16 19 0.003 0.0231 0.0485 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 17 18 0.0018 0.0144 0.0303 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 17 22 0.0135 0.1053 0.2212 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 18 21 0.0033 0.0259 0.0545 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 18 21 0.0033 0.0259 0.0545 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 19 20 0.0051 0.0396 0.0833 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 19 20 0.0051 0.0396 0.0833 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 20 23 0.0028 0.0216 0.0455 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 20 23 0.0028 0.0216 0.0455 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 21 22 0.0087 0.0678 0.1424 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; +]; + +% INFO : === Translation Options === +% INFO : Phase Angle Bound: 30.0 (deg.) +% INFO : Setting Flat Start +% INFO : +% INFO : === Generator Bounds Update Notes === +% INFO : +% INFO : === Base KV Replacement Notes === +% INFO : +% INFO : === Transformer Setting Replacement Notes === +% INFO : +% INFO : === Line Capacity Monotonicity Notes === +% INFO : +% INFO : === Voltage Setpoint Replacement Notes === +% INFO : Bus 1 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 2 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 3 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 4 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 5 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 6 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 7 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 8 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 9 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 10 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 11 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 12 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 13 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 14 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 15 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 16 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 17 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 18 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 19 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 20 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 21 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 22 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 23 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 24 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : +% INFO : === Generator Setpoint Replacement Notes === +% INFO : Gen at bus 1 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 1 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 1 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 1 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 1 : Pg=76.0, Qg=0.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 1 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 1 : Pg=76.0, Qg=0.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 1 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 2 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 2 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 2 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 2 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 2 : Pg=76.0, Qg=0.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 2 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 2 : Pg=76.0, Qg=0.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 2 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 7 : Pg=80.0, Qg=0.0 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 7 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 7 : Pg=80.0, Qg=0.0 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 7 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 7 : Pg=80.0, Qg=0.0 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 7 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 13 : Pg=95.1, Qg=0.0 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 13 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 13 : Pg=95.1, Qg=0.0 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 13 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 13 : Pg=95.1, Qg=0.0 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 13 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 14 : Pg=0.0, Qg=35.3 -> Pg=0.0, Qg=75.0 +% INFO : Gen at bus 14 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 15 : Pg=155.0, Qg=0.0 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 15 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 16 : Pg=155.0, Qg=0.0 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 16 : Vg=1.017 -> Vg=1.0 +% INFO : Gen at bus 18 : Pg=400.0, Qg=0.0 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 18 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 21 : Pg=400.0, Qg=0.0 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 21 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 22 : Pg=50.0, Qg=0.0 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 22 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 23 : Pg=155.0, Qg=0.0 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 23 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 23 : Pg=155.0, Qg=0.0 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 23 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 23 : Pg=350.0, Qg=0.0 -> Pg=245.0, Qg=62.5 +% INFO : Gen at bus 23 : Vg=1.05 -> Vg=1.0 +% INFO : +% INFO : === Writing Matpower Case File Notes === diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case57_ieee.m b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case57_ieee.m new file mode 100644 index 00000000..d8b0c9e8 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case57_ieee.m @@ -0,0 +1,539 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% %%%%% +%%%% IEEE PES Power Grid Library - Optimal Power Flow - v23.07 %%%%% +%%%% (https://github.com/power-grid-lib/pglib-opf) %%%%% +%%%% Benchmark Group - Typical Operations %%%%% +%%%% 23 - July - 2023 %%%%% +%%%% %%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Power flow data for IEEE 57 bus test case. +% This data was converted from IEEE Common Data Format +% (ieee57cdf.txt) on 20-Sep-2004 by cdf2matp, rev. 1.11 +% +% Converted from IEEE CDF file from: +% http://www.ee.washington.edu/research/pstca/ +% +% Manually modified Qmax, Qmin on generator 1 to 200, -140, respectively. +% +% Copyright (c) 1999 by Richard D. Christie, University of Washington +% Electrical Engineering Licensed under the Creative Commons Attribution 4.0 +% International license, http://creativecommons.org/licenses/by/4.0/ +% +% CDF Header: +% 08/25/93 UW ARCHIVE 100.0 1961 W IEEE 57 Bus Test Case +% +function mpc = pglib_opf_case57_ieee +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 3 55.0 17.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 2 2 3.0 88.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 3 2 41.0 21.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 4 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 5 1 13.0 4.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 6 2 75.0 2.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 7 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 8 2 150.0 22.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 9 2 121.0 26.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 10 1 5.0 2.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 11 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 12 2 377.0 24.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 13 1 18.0 2.3 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 14 1 10.5 5.3 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 15 1 22.0 5.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 16 1 43.0 3.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 17 1 42.0 8.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 18 1 27.2 9.8 0.0 10.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 19 1 3.3 0.6 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 20 1 2.3 1.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 21 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 22 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 23 1 6.3 2.1 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 24 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 25 1 6.3 3.2 0.0 5.9 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 26 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 27 1 9.3 0.5 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 28 1 4.6 2.3 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 29 1 17.0 2.6 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 30 1 3.6 1.8 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 31 1 5.8 2.9 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 32 1 1.6 0.8 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 33 1 3.8 1.9 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 34 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 35 1 6.0 3.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 36 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 37 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 38 1 14.0 7.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 39 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 40 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 41 1 6.3 3.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 42 1 7.1 4.4 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 43 1 2.0 1.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 44 1 12.0 1.8 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 45 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 46 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 47 1 29.7 11.6 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 48 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 49 1 18.0 8.5 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 50 1 21.0 10.5 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 51 1 18.0 5.3 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 52 1 4.9 2.2 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 53 1 20.0 10.0 0.0 6.3 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 54 1 4.1 1.4 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 55 1 6.8 3.4 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 56 1 7.6 2.2 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; + 57 1 6.7 2.0 0.0 0.0 1 1.00000 0.00000 1.0 1 1.06000 0.94000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin +mpc.gen = [ + 1 122.5 0.0 123.0 -123.0 1.0 100.0 1 245 0.0; % COW + 2 0.0 16.5 50.0 -17.0 1.0 100.0 1 0 0.0; % SYNC + 3 30.0 10.0 30.0 -10.0 1.0 100.0 1 60 0.0; % NG + 6 0.0 8.5 25.0 -8.0 1.0 100.0 1 0 0.0; % SYNC + 8 579.5 30.0 200.0 -140.0 1.0 100.0 1 1159 0.0; % COW + 9 0.0 3.0 9.0 -3.0 1.0 100.0 1 0 0.0; % SYNC + 12 259.5 2.5 155.0 -150.0 1.0 100.0 1 519 0.0; % NG +]; + +%% generator cost data +% 2 startup shutdown n c(n-1) ... c0 +mpc.gencost = [ + 2 0.0 0.0 3 0.000000 16.960624 0.000000; % COW + 2 0.0 0.0 3 0.000000 0.000000 0.000000; % SYNC + 2 0.0 0.0 3 0.000000 34.075557 0.000000; % NG + 2 0.0 0.0 3 0.000000 0.000000 0.000000; % SYNC + 2 0.0 0.0 3 0.000000 30.441037 0.000000; % COW + 2 0.0 0.0 3 0.000000 0.000000 0.000000; % SYNC + 2 0.0 0.0 3 0.000000 37.188979 0.000000; % NG +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax +mpc.branch = [ + 1 2 0.0083 0.028 0.129 1005 1005 1005 0.0 0.0 1 -30.0 30.0; + 2 3 0.0298 0.085 0.0818 326 326 326 0.0 0.0 1 -30.0 30.0; + 3 4 0.0112 0.0366 0.038 767 767 767 0.0 0.0 1 -30.0 30.0; + 4 5 0.0625 0.132 0.0258 201 201 201 0.0 0.0 1 -30.0 30.0; + 4 6 0.043 0.148 0.0348 191 191 191 0.0 0.0 1 -30.0 30.0; + 6 7 0.02 0.102 0.0276 283 283 283 0.0 0.0 1 -30.0 30.0; + 6 8 0.0339 0.173 0.047 167 167 167 0.0 0.0 1 -30.0 30.0; + 8 9 0.0099 0.0505 0.0548 570 570 570 0.0 0.0 1 -30.0 30.0; + 9 10 0.0369 0.1679 0.044 171 171 171 0.0 0.0 1 -30.0 30.0; + 9 11 0.0258 0.0848 0.0218 331 331 331 0.0 0.0 1 -30.0 30.0; + 9 12 0.0648 0.295 0.0772 98 98 98 0.0 0.0 1 -30.0 30.0; + 9 13 0.0481 0.158 0.0406 178 178 178 0.0 0.0 1 -30.0 30.0; + 13 14 0.0132 0.0434 0.011 647 647 647 0.0 0.0 1 -30.0 30.0; + 13 15 0.0269 0.0869 0.023 323 323 323 0.0 0.0 1 -30.0 30.0; + 1 15 0.0178 0.091 0.0988 317 317 317 0.0 0.0 1 -30.0 30.0; + 1 16 0.0454 0.206 0.0546 140 140 140 0.0 0.0 1 -30.0 30.0; + 1 17 0.0238 0.108 0.0286 266 266 266 0.0 0.0 1 -30.0 30.0; + 3 15 0.0162 0.053 0.0544 530 530 530 0.0 0.0 1 -30.0 30.0; + 4 18 0.0 0.555 0.0 53 53 53 0.97 0.0 1 -30.0 30.0; + 4 18 0.0 0.43 0.0 69 69 69 0.978 0.0 1 -30.0 30.0; + 5 6 0.0302 0.0641 0.0124 414 414 414 0.0 0.0 1 -30.0 30.0; + 7 8 0.0139 0.0712 0.0194 405 405 405 0.0 0.0 1 -30.0 30.0; + 10 12 0.0277 0.1262 0.0328 228 228 228 0.0 0.0 1 -30.0 30.0; + 11 13 0.0223 0.0732 0.0188 384 384 384 0.0 0.0 1 -30.0 30.0; + 12 13 0.0178 0.058 0.0604 484 484 484 0.0 0.0 1 -30.0 30.0; + 12 16 0.018 0.0813 0.0216 353 353 353 0.0 0.0 1 -30.0 30.0; + 12 17 0.0397 0.179 0.0476 160 160 160 0.0 0.0 1 -30.0 30.0; + 14 15 0.0171 0.0547 0.0148 512 512 512 0.0 0.0 1 -30.0 30.0; + 18 19 0.461 0.685 0.0 36 36 36 0.0 0.0 1 -30.0 30.0; + 19 20 0.283 0.434 0.0 57 57 57 0.0 0.0 1 -30.0 30.0; + 21 20 0.0 0.7767 0.0 38 38 38 1.043 0.0 1 -30.0 30.0; + 21 22 0.0736 0.117 0.0 213 213 213 0.0 0.0 1 -30.0 30.0; + 22 23 0.0099 0.0152 0.0 1617 1617 1617 0.0 0.0 1 -30.0 30.0; + 23 24 0.166 0.256 0.0084 97 97 97 0.0 0.0 1 -30.0 30.0; + 24 25 0.0 1.182 0.0 25 25 25 1.0 0.0 1 -30.0 30.0; + 24 25 0.0 1.23 0.0 24 24 24 1.0 0.0 1 -30.0 30.0; + 24 26 0.0 0.0473 0.0 621 621 621 1.043 0.0 1 -30.0 30.0; + 26 27 0.165 0.254 0.0 97 97 97 0.0 0.0 1 -30.0 30.0; + 27 28 0.0618 0.0954 0.0 259 259 259 0.0 0.0 1 -30.0 30.0; + 28 29 0.0418 0.0587 0.0 408 408 408 0.0 0.0 1 -30.0 30.0; + 7 29 0.0 0.0648 0.0 453 453 453 0.967 0.0 1 -30.0 30.0; + 25 30 0.135 0.202 0.0 121 121 121 0.0 0.0 1 -30.0 30.0; + 30 31 0.326 0.497 0.0 50 50 50 0.0 0.0 1 -30.0 30.0; + 31 32 0.507 0.755 0.0 33 33 33 0.0 0.0 1 -30.0 30.0; + 32 33 0.0392 0.036 0.0 552 552 552 0.0 0.0 1 -30.0 30.0; + 34 32 0.0 0.953 0.0 31 31 31 0.975 0.0 1 -30.0 30.0; + 34 35 0.052 0.078 0.0032 313 313 313 0.0 0.0 1 -30.0 30.0; + 35 36 0.043 0.0537 0.0016 427 427 427 0.0 0.0 1 -30.0 30.0; + 36 37 0.029 0.0366 0.0 629 629 629 0.0 0.0 1 -30.0 30.0; + 37 38 0.0651 0.1009 0.002 245 245 245 0.0 0.0 1 -30.0 30.0; + 37 39 0.0239 0.0379 0.0 655 655 655 0.0 0.0 1 -30.0 30.0; + 36 40 0.03 0.0466 0.0 530 530 530 0.0 0.0 1 -30.0 30.0; + 22 38 0.0192 0.0295 0.0 834 834 834 0.0 0.0 1 -30.0 30.0; + 11 41 0.0 0.749 0.0 40 40 40 0.955 0.0 1 -30.0 30.0; + 41 42 0.207 0.352 0.0 72 72 72 0.0 0.0 1 -30.0 30.0; + 41 43 0.0 0.412 0.0 72 72 72 0.0 0.0 1 -30.0 30.0; + 38 44 0.0289 0.0585 0.002 450 450 450 0.0 0.0 1 -30.0 30.0; + 15 45 0.0 0.1042 0.0 282 282 282 0.955 0.0 1 -30.0 30.0; + 14 46 0.0 0.0735 0.0 400 400 400 0.9 0.0 1 -30.0 30.0; + 46 47 0.023 0.068 0.0032 409 409 409 0.0 0.0 1 -30.0 30.0; + 47 48 0.0182 0.0233 0.0 993 993 993 0.0 0.0 1 -30.0 30.0; + 48 49 0.0834 0.129 0.0048 191 191 191 0.0 0.0 1 -30.0 30.0; + 49 50 0.0801 0.128 0.0 195 195 195 0.0 0.0 1 -30.0 30.0; + 50 51 0.1386 0.22 0.0 113 113 113 0.0 0.0 1 -30.0 30.0; + 10 51 0.0 0.0712 0.0 412 412 412 0.93 0.0 1 -30.0 30.0; + 13 49 0.0 0.191 0.0 154 154 154 0.895 0.0 1 -30.0 30.0; + 29 52 0.1442 0.187 0.0 125 125 125 0.0 0.0 1 -30.0 30.0; + 52 53 0.0762 0.0984 0.0 236 236 236 0.0 0.0 1 -30.0 30.0; + 53 54 0.1878 0.232 0.0 99 99 99 0.0 0.0 1 -30.0 30.0; + 54 55 0.1732 0.2265 0.0 103 103 103 0.0 0.0 1 -30.0 30.0; + 11 43 0.0 0.153 0.0 192 192 192 0.958 0.0 1 -30.0 30.0; + 44 45 0.0624 0.1242 0.004 212 212 212 0.0 0.0 1 -30.0 30.0; + 40 56 0.0 1.195 0.0 25 25 25 0.958 0.0 1 -30.0 30.0; + 56 41 0.553 0.549 0.0 38 38 38 0.0 0.0 1 -30.0 30.0; + 56 42 0.2125 0.354 0.0 72 72 72 0.0 0.0 1 -30.0 30.0; + 39 57 0.0 1.355 0.0 22 22 22 0.98 0.0 1 -30.0 30.0; + 57 56 0.174 0.26 0.0 94 94 94 0.0 0.0 1 -30.0 30.0; + 38 49 0.115 0.177 0.003 139 139 139 0.0 0.0 1 -30.0 30.0; + 38 48 0.0312 0.0482 0.0 511 511 511 0.0 0.0 1 -30.0 30.0; + 9 55 0.0 0.1205 0.0 244 244 244 0.94 0.0 1 -30.0 30.0; +]; + +% INFO : === Translation Options === +% INFO : Phase Angle Bound: 30.0 (deg.) +% INFO : Line Capacity Model: stat +% INFO : Gen Active Capacity Model: stat +% INFO : Gen Reactive Capacity Model: am50ag +% INFO : Gen Active Cost Model: stat +% INFO : Setting Flat Start +% INFO : Line Capacity PAB: 15.0 (deg.) +% INFO : +% INFO : === Generator Classification Notes === +% INFO : SYNC 3 - 0.00 +% INFO : COW 2 - 62.32 +% INFO : NG 2 - 37.68 +% INFO : +% INFO : === Generator Active Capacity Stat Model Notes === +% INFO : Gen at bus 1 - COW : Pg=128.9, Pmax=575.88 -> Pmax=245 samples: 1 +% INFO : Gen at bus 2 - SYNC : Pg=0.0, Pmax=100.0 -> Pmax=0 samples: 0 +% INFO : Gen at bus 3 - NG : Pg=40.0, Pmax=140.0 -> Pmax=60 samples: 1 +% INFO : Gen at bus 6 - SYNC : Pg=0.0, Pmax=100.0 -> Pmax=0 samples: 0 +% INFO : Gen at bus 8 - COW : Pg=450.0, Pmax=550.0 -> Pmax=1159 samples: 4 +% INFO : Gen at bus 9 - SYNC : Pg=0.0, Pmax=100.0 -> Pmax=0 samples: 0 +% INFO : Gen at bus 12 - NG : Pg=310.0, Pmax=410.0 -> Pmax=519 samples: 3 +% INFO : +% INFO : === Generator Reactive Capacity Atmost Max 50 Percent Active Model Notes === +% INFO : Gen at bus 1 - COW : Pmax 245.0, Qmin -140.0, Qmax 200.0 -> Qmin -123.0, Qmax 123.0 +% INFO : Gen at bus 3 - NG : Pmax 60.0, Qmin -10.0, Qmax 60.0 -> Qmin -10.0, Qmax 30.0 +% INFO : +% INFO : === Generator Active Cost Stat Model Notes === +% INFO : Updated Generator Cost: COW - 0.0 20.0 0.0775795 -> 0 16.9606236621 0 +% INFO : Updated Generator Cost: SYNC - 0.0 40.0 0.01 -> 0 0.0 0 +% INFO : Updated Generator Cost: NG - 0.0 20.0 0.25 -> 0 34.0755570884 0 +% INFO : Updated Generator Cost: SYNC - 0.0 40.0 0.01 -> 0 0.0 0 +% INFO : Updated Generator Cost: COW - 0.0 20.0 0.0222222 -> 0 30.4410370704 0 +% INFO : Updated Generator Cost: SYNC - 0.0 40.0 0.01 -> 0 0.0 0 +% INFO : Updated Generator Cost: NG - 0.0 20.0 0.0322581 -> 0 37.1889785807 0 +% INFO : +% INFO : === Generator Bounds Update Notes === +% INFO : +% INFO : === Base KV Replacement Notes === +% WARNING : Bus 1 : basekv changed 0.0 => 1.0 +% WARNING : Bus 2 : basekv changed 0.0 => 1.0 +% WARNING : Bus 3 : basekv changed 0.0 => 1.0 +% WARNING : Bus 4 : basekv changed 0.0 => 1.0 +% WARNING : Bus 5 : basekv changed 0.0 => 1.0 +% WARNING : Bus 6 : basekv changed 0.0 => 1.0 +% WARNING : Bus 7 : basekv changed 0.0 => 1.0 +% WARNING : Bus 8 : basekv changed 0.0 => 1.0 +% WARNING : Bus 9 : basekv changed 0.0 => 1.0 +% WARNING : Bus 10 : basekv changed 0.0 => 1.0 +% WARNING : Bus 11 : basekv changed 0.0 => 1.0 +% WARNING : Bus 12 : basekv changed 0.0 => 1.0 +% WARNING : Bus 13 : basekv changed 0.0 => 1.0 +% WARNING : Bus 14 : basekv changed 0.0 => 1.0 +% WARNING : Bus 15 : basekv changed 0.0 => 1.0 +% WARNING : Bus 16 : basekv changed 0.0 => 1.0 +% WARNING : Bus 17 : basekv changed 0.0 => 1.0 +% WARNING : Bus 18 : basekv changed 0.0 => 1.0 +% WARNING : Bus 19 : basekv changed 0.0 => 1.0 +% WARNING : Bus 20 : basekv changed 0.0 => 1.0 +% WARNING : Bus 21 : basekv changed 0.0 => 1.0 +% WARNING : Bus 22 : basekv changed 0.0 => 1.0 +% WARNING : Bus 23 : basekv changed 0.0 => 1.0 +% WARNING : Bus 24 : basekv changed 0.0 => 1.0 +% WARNING : Bus 25 : basekv changed 0.0 => 1.0 +% WARNING : Bus 26 : basekv changed 0.0 => 1.0 +% WARNING : Bus 27 : basekv changed 0.0 => 1.0 +% WARNING : Bus 28 : basekv changed 0.0 => 1.0 +% WARNING : Bus 29 : basekv changed 0.0 => 1.0 +% WARNING : Bus 30 : basekv changed 0.0 => 1.0 +% WARNING : Bus 31 : basekv changed 0.0 => 1.0 +% WARNING : Bus 32 : basekv changed 0.0 => 1.0 +% WARNING : Bus 33 : basekv changed 0.0 => 1.0 +% WARNING : Bus 34 : basekv changed 0.0 => 1.0 +% WARNING : Bus 35 : basekv changed 0.0 => 1.0 +% WARNING : Bus 36 : basekv changed 0.0 => 1.0 +% WARNING : Bus 37 : basekv changed 0.0 => 1.0 +% WARNING : Bus 38 : basekv changed 0.0 => 1.0 +% WARNING : Bus 39 : basekv changed 0.0 => 1.0 +% WARNING : Bus 40 : basekv changed 0.0 => 1.0 +% WARNING : Bus 41 : basekv changed 0.0 => 1.0 +% WARNING : Bus 42 : basekv changed 0.0 => 1.0 +% WARNING : Bus 43 : basekv changed 0.0 => 1.0 +% WARNING : Bus 44 : basekv changed 0.0 => 1.0 +% WARNING : Bus 45 : basekv changed 0.0 => 1.0 +% WARNING : Bus 46 : basekv changed 0.0 => 1.0 +% WARNING : Bus 47 : basekv changed 0.0 => 1.0 +% WARNING : Bus 48 : basekv changed 0.0 => 1.0 +% WARNING : Bus 49 : basekv changed 0.0 => 1.0 +% WARNING : Bus 50 : basekv changed 0.0 => 1.0 +% WARNING : Bus 51 : basekv changed 0.0 => 1.0 +% WARNING : Bus 52 : basekv changed 0.0 => 1.0 +% WARNING : Bus 53 : basekv changed 0.0 => 1.0 +% WARNING : Bus 54 : basekv changed 0.0 => 1.0 +% WARNING : Bus 55 : basekv changed 0.0 => 1.0 +% WARNING : Bus 56 : basekv changed 0.0 => 1.0 +% WARNING : Bus 57 : basekv changed 0.0 => 1.0 +% INFO : +% INFO : === Transformer Setting Replacement Notes === +% INFO : +% INFO : === Line Capacity Stat Model Notes === +% WARNING : Missing data for branch flow stat model on line 1-2 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0083 x=0.028 +% INFO : Updated Thermal Rating: on line 1-2 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 1005 +% WARNING : Missing data for branch flow stat model on line 2-3 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0298 x=0.085 +% INFO : Updated Thermal Rating: on line 2-3 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 326 +% WARNING : Missing data for branch flow stat model on line 3-4 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0112 x=0.0366 +% INFO : Updated Thermal Rating: on line 3-4 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 767 +% WARNING : Missing data for branch flow stat model on line 4-5 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0625 x=0.132 +% INFO : Updated Thermal Rating: on line 4-5 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 201 +% WARNING : Missing data for branch flow stat model on line 4-6 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.043 x=0.148 +% INFO : Updated Thermal Rating: on line 4-6 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 191 +% WARNING : Missing data for branch flow stat model on line 6-7 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.02 x=0.102 +% INFO : Updated Thermal Rating: on line 6-7 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 283 +% WARNING : Missing data for branch flow stat model on line 6-8 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0339 x=0.173 +% INFO : Updated Thermal Rating: on line 6-8 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 167 +% WARNING : Missing data for branch flow stat model on line 8-9 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0099 x=0.0505 +% INFO : Updated Thermal Rating: on line 8-9 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 570 +% WARNING : Missing data for branch flow stat model on line 9-10 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0369 x=0.1679 +% INFO : Updated Thermal Rating: on line 9-10 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 171 +% WARNING : Missing data for branch flow stat model on line 9-11 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0258 x=0.0848 +% INFO : Updated Thermal Rating: on line 9-11 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 331 +% WARNING : Missing data for branch flow stat model on line 9-12 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0648 x=0.295 +% INFO : Updated Thermal Rating: on line 9-12 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 98 +% WARNING : Missing data for branch flow stat model on line 9-13 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0481 x=0.158 +% INFO : Updated Thermal Rating: on line 9-13 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 178 +% WARNING : Missing data for branch flow stat model on line 13-14 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0132 x=0.0434 +% INFO : Updated Thermal Rating: on line 13-14 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 647 +% WARNING : Missing data for branch flow stat model on line 13-15 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0269 x=0.0869 +% INFO : Updated Thermal Rating: on line 13-15 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 323 +% WARNING : Missing data for branch flow stat model on line 1-15 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0178 x=0.091 +% INFO : Updated Thermal Rating: on line 1-15 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 317 +% WARNING : Missing data for branch flow stat model on line 1-16 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0454 x=0.206 +% INFO : Updated Thermal Rating: on line 1-16 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 140 +% WARNING : Missing data for branch flow stat model on line 1-17 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0238 x=0.108 +% INFO : Updated Thermal Rating: on line 1-17 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 266 +% WARNING : Missing data for branch flow stat model on line 3-15 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0162 x=0.053 +% INFO : Updated Thermal Rating: on line 3-15 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 530 +% WARNING : Missing data for branch flow stat model on line 4-18 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.555 +% INFO : Updated Thermal Rating: on transformer 4-18 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 53 +% WARNING : Missing data for branch flow stat model on line 4-18 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.43 +% INFO : Updated Thermal Rating: on transformer 4-18 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 69 +% WARNING : Missing data for branch flow stat model on line 5-6 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0302 x=0.0641 +% INFO : Updated Thermal Rating: on line 5-6 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 414 +% WARNING : Missing data for branch flow stat model on line 7-8 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0139 x=0.0712 +% INFO : Updated Thermal Rating: on line 7-8 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 405 +% WARNING : Missing data for branch flow stat model on line 10-12 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0277 x=0.1262 +% INFO : Updated Thermal Rating: on line 10-12 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 228 +% WARNING : Missing data for branch flow stat model on line 11-13 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0223 x=0.0732 +% INFO : Updated Thermal Rating: on line 11-13 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 384 +% WARNING : Missing data for branch flow stat model on line 12-13 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0178 x=0.058 +% INFO : Updated Thermal Rating: on line 12-13 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 484 +% WARNING : Missing data for branch flow stat model on line 12-16 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.018 x=0.0813 +% INFO : Updated Thermal Rating: on line 12-16 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 353 +% WARNING : Missing data for branch flow stat model on line 12-17 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0397 x=0.179 +% INFO : Updated Thermal Rating: on line 12-17 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 160 +% WARNING : Missing data for branch flow stat model on line 14-15 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0171 x=0.0547 +% INFO : Updated Thermal Rating: on line 14-15 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 512 +% WARNING : Missing data for branch flow stat model on line 18-19 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.461 x=0.685 +% INFO : Updated Thermal Rating: on line 18-19 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 36 +% WARNING : Missing data for branch flow stat model on line 19-20 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.283 x=0.434 +% INFO : Updated Thermal Rating: on line 19-20 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 57 +% WARNING : Missing data for branch flow stat model on line 21-20 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.7767 +% INFO : Updated Thermal Rating: on transformer 21-20 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 38 +% WARNING : Missing data for branch flow stat model on line 21-22 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0736 x=0.117 +% INFO : Updated Thermal Rating: on line 21-22 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 213 +% WARNING : Missing data for branch flow stat model on line 22-23 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0099 x=0.0152 +% INFO : Updated Thermal Rating: on line 22-23 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 1617 +% WARNING : Missing data for branch flow stat model on line 23-24 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.166 x=0.256 +% INFO : Updated Thermal Rating: on line 23-24 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 97 +% WARNING : Missing data for branch flow stat model on line 24-25 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=1.182 +% INFO : Updated Thermal Rating: on transformer 24-25 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 25 +% WARNING : Missing data for branch flow stat model on line 24-25 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=1.23 +% INFO : Updated Thermal Rating: on transformer 24-25 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 24 +% WARNING : Missing data for branch flow stat model on line 24-26 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.0473 +% INFO : Updated Thermal Rating: on transformer 24-26 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 621 +% WARNING : Missing data for branch flow stat model on line 26-27 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.165 x=0.254 +% INFO : Updated Thermal Rating: on line 26-27 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 97 +% WARNING : Missing data for branch flow stat model on line 27-28 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0618 x=0.0954 +% INFO : Updated Thermal Rating: on line 27-28 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 259 +% WARNING : Missing data for branch flow stat model on line 28-29 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0418 x=0.0587 +% INFO : Updated Thermal Rating: on line 28-29 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 408 +% WARNING : Missing data for branch flow stat model on line 7-29 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.0648 +% INFO : Updated Thermal Rating: on transformer 7-29 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 453 +% WARNING : Missing data for branch flow stat model on line 25-30 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.135 x=0.202 +% INFO : Updated Thermal Rating: on line 25-30 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 121 +% WARNING : Missing data for branch flow stat model on line 30-31 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.326 x=0.497 +% INFO : Updated Thermal Rating: on line 30-31 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 50 +% WARNING : Missing data for branch flow stat model on line 31-32 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.507 x=0.755 +% INFO : Updated Thermal Rating: on line 31-32 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 33 +% WARNING : Missing data for branch flow stat model on line 32-33 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0392 x=0.036 +% INFO : Updated Thermal Rating: on line 32-33 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 552 +% WARNING : Missing data for branch flow stat model on line 34-32 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.953 +% INFO : Updated Thermal Rating: on transformer 34-32 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 31 +% WARNING : Missing data for branch flow stat model on line 34-35 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.052 x=0.078 +% INFO : Updated Thermal Rating: on line 34-35 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 313 +% WARNING : Missing data for branch flow stat model on line 35-36 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.043 x=0.0537 +% INFO : Updated Thermal Rating: on line 35-36 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 427 +% WARNING : Missing data for branch flow stat model on line 36-37 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.029 x=0.0366 +% INFO : Updated Thermal Rating: on line 36-37 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 629 +% WARNING : Missing data for branch flow stat model on line 37-38 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0651 x=0.1009 +% INFO : Updated Thermal Rating: on line 37-38 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 245 +% WARNING : Missing data for branch flow stat model on line 37-39 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0239 x=0.0379 +% INFO : Updated Thermal Rating: on line 37-39 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 655 +% WARNING : Missing data for branch flow stat model on line 36-40 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.03 x=0.0466 +% INFO : Updated Thermal Rating: on line 36-40 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 530 +% WARNING : Missing data for branch flow stat model on line 22-38 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0192 x=0.0295 +% INFO : Updated Thermal Rating: on line 22-38 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 834 +% WARNING : Missing data for branch flow stat model on line 11-41 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.749 +% INFO : Updated Thermal Rating: on transformer 11-41 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 40 +% WARNING : Missing data for branch flow stat model on line 41-42 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.207 x=0.352 +% INFO : Updated Thermal Rating: on line 41-42 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 72 +% WARNING : Missing data for branch flow stat model on line 41-43 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.412 +% INFO : Updated Thermal Rating: on line 41-43 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 72 +% WARNING : Missing data for branch flow stat model on line 38-44 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0289 x=0.0585 +% INFO : Updated Thermal Rating: on line 38-44 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 450 +% WARNING : Missing data for branch flow stat model on line 15-45 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.1042 +% INFO : Updated Thermal Rating: on transformer 15-45 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 282 +% WARNING : Missing data for branch flow stat model on line 14-46 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.0735 +% INFO : Updated Thermal Rating: on transformer 14-46 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 400 +% WARNING : Missing data for branch flow stat model on line 46-47 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.023 x=0.068 +% INFO : Updated Thermal Rating: on line 46-47 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 409 +% WARNING : Missing data for branch flow stat model on line 47-48 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0182 x=0.0233 +% INFO : Updated Thermal Rating: on line 47-48 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 993 +% WARNING : Missing data for branch flow stat model on line 48-49 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0834 x=0.129 +% INFO : Updated Thermal Rating: on line 48-49 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 191 +% WARNING : Missing data for branch flow stat model on line 49-50 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0801 x=0.128 +% INFO : Updated Thermal Rating: on line 49-50 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 195 +% WARNING : Missing data for branch flow stat model on line 50-51 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.1386 x=0.22 +% INFO : Updated Thermal Rating: on line 50-51 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 113 +% WARNING : Missing data for branch flow stat model on line 10-51 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.0712 +% INFO : Updated Thermal Rating: on transformer 10-51 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 412 +% WARNING : Missing data for branch flow stat model on line 13-49 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.191 +% INFO : Updated Thermal Rating: on transformer 13-49 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 154 +% WARNING : Missing data for branch flow stat model on line 29-52 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.1442 x=0.187 +% INFO : Updated Thermal Rating: on line 29-52 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 125 +% WARNING : Missing data for branch flow stat model on line 52-53 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0762 x=0.0984 +% INFO : Updated Thermal Rating: on line 52-53 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 236 +% WARNING : Missing data for branch flow stat model on line 53-54 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.1878 x=0.232 +% INFO : Updated Thermal Rating: on line 53-54 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 99 +% WARNING : Missing data for branch flow stat model on line 54-55 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.1732 x=0.2265 +% INFO : Updated Thermal Rating: on line 54-55 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 103 +% WARNING : Missing data for branch flow stat model on line 11-43 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.153 +% INFO : Updated Thermal Rating: on transformer 11-43 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 192 +% WARNING : Missing data for branch flow stat model on line 44-45 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0624 x=0.1242 +% INFO : Updated Thermal Rating: on line 44-45 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 212 +% WARNING : Missing data for branch flow stat model on line 40-56 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=1.195 +% INFO : Updated Thermal Rating: on transformer 40-56 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 25 +% WARNING : Missing data for branch flow stat model on line 56-41 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.553 x=0.549 +% INFO : Updated Thermal Rating: on line 56-41 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 38 +% WARNING : Missing data for branch flow stat model on line 56-42 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.2125 x=0.354 +% INFO : Updated Thermal Rating: on line 56-42 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 72 +% WARNING : Missing data for branch flow stat model on line 39-57 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=1.355 +% INFO : Updated Thermal Rating: on transformer 39-57 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 22 +% WARNING : Missing data for branch flow stat model on line 57-56 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.174 x=0.26 +% INFO : Updated Thermal Rating: on line 57-56 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 94 +% WARNING : Missing data for branch flow stat model on line 38-49 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.115 x=0.177 +% INFO : Updated Thermal Rating: on line 38-49 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 139 +% WARNING : Missing data for branch flow stat model on line 38-48 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0312 x=0.0482 +% INFO : Updated Thermal Rating: on line 38-48 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 511 +% WARNING : Missing data for branch flow stat model on line 9-55 using max current model : from_basekv=1.0 to_basekv=1.0 r=0.0 x=0.1205 +% INFO : Updated Thermal Rating: on transformer 9-55 : Rate A, Rate B, Rate C , 9900.0, 0.0, 0.0 -> 244 +% INFO : +% INFO : === Line Capacity Monotonicity Notes === +% INFO : +% INFO : === Voltage Setpoint Replacement Notes === +% INFO : Bus 1 : V=1.04, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 2 : V=1.01, theta=-1.18 -> V=1.0, theta=0.0 +% INFO : Bus 3 : V=0.985, theta=-5.97 -> V=1.0, theta=0.0 +% INFO : Bus 4 : V=0.981, theta=-7.32 -> V=1.0, theta=0.0 +% INFO : Bus 5 : V=0.976, theta=-8.52 -> V=1.0, theta=0.0 +% INFO : Bus 6 : V=0.98, theta=-8.65 -> V=1.0, theta=0.0 +% INFO : Bus 7 : V=0.984, theta=-7.58 -> V=1.0, theta=0.0 +% INFO : Bus 8 : V=1.005, theta=-4.45 -> V=1.0, theta=0.0 +% INFO : Bus 9 : V=0.98, theta=-9.56 -> V=1.0, theta=0.0 +% INFO : Bus 10 : V=0.986, theta=-11.43 -> V=1.0, theta=0.0 +% INFO : Bus 11 : V=0.974, theta=-10.17 -> V=1.0, theta=0.0 +% INFO : Bus 12 : V=1.015, theta=-10.46 -> V=1.0, theta=0.0 +% INFO : Bus 13 : V=0.979, theta=-9.79 -> V=1.0, theta=0.0 +% INFO : Bus 14 : V=0.97, theta=-9.33 -> V=1.0, theta=0.0 +% INFO : Bus 15 : V=0.988, theta=-7.18 -> V=1.0, theta=0.0 +% INFO : Bus 16 : V=1.013, theta=-8.85 -> V=1.0, theta=0.0 +% INFO : Bus 17 : V=1.017, theta=-5.39 -> V=1.0, theta=0.0 +% INFO : Bus 18 : V=1.001, theta=-11.71 -> V=1.0, theta=0.0 +% INFO : Bus 19 : V=0.97, theta=-13.2 -> V=1.0, theta=0.0 +% INFO : Bus 20 : V=0.964, theta=-13.41 -> V=1.0, theta=0.0 +% INFO : Bus 21 : V=1.008, theta=-12.89 -> V=1.0, theta=0.0 +% INFO : Bus 22 : V=1.01, theta=-12.84 -> V=1.0, theta=0.0 +% INFO : Bus 23 : V=1.008, theta=-12.91 -> V=1.0, theta=0.0 +% INFO : Bus 24 : V=0.999, theta=-13.25 -> V=1.0, theta=0.0 +% INFO : Bus 25 : V=0.982, theta=-18.13 -> V=1.0, theta=0.0 +% INFO : Bus 26 : V=0.959, theta=-12.95 -> V=1.0, theta=0.0 +% INFO : Bus 27 : V=0.982, theta=-11.48 -> V=1.0, theta=0.0 +% INFO : Bus 28 : V=0.997, theta=-10.45 -> V=1.0, theta=0.0 +% INFO : Bus 29 : V=1.01, theta=-9.75 -> V=1.0, theta=0.0 +% INFO : Bus 30 : V=0.962, theta=-18.68 -> V=1.0, theta=0.0 +% INFO : Bus 31 : V=0.936, theta=-19.34 -> V=1.0, theta=0.0 +% INFO : Bus 32 : V=0.949, theta=-18.46 -> V=1.0, theta=0.0 +% INFO : Bus 33 : V=0.947, theta=-18.5 -> V=1.0, theta=0.0 +% INFO : Bus 34 : V=0.959, theta=-14.1 -> V=1.0, theta=0.0 +% INFO : Bus 35 : V=0.966, theta=-13.86 -> V=1.0, theta=0.0 +% INFO : Bus 36 : V=0.976, theta=-13.59 -> V=1.0, theta=0.0 +% INFO : Bus 37 : V=0.985, theta=-13.41 -> V=1.0, theta=0.0 +% INFO : Bus 38 : V=1.013, theta=-12.71 -> V=1.0, theta=0.0 +% INFO : Bus 39 : V=0.983, theta=-13.46 -> V=1.0, theta=0.0 +% INFO : Bus 40 : V=0.973, theta=-13.62 -> V=1.0, theta=0.0 +% INFO : Bus 41 : V=0.996, theta=-14.05 -> V=1.0, theta=0.0 +% INFO : Bus 42 : V=0.966, theta=-15.5 -> V=1.0, theta=0.0 +% INFO : Bus 43 : V=1.01, theta=-11.33 -> V=1.0, theta=0.0 +% INFO : Bus 44 : V=1.017, theta=-11.86 -> V=1.0, theta=0.0 +% INFO : Bus 45 : V=1.036, theta=-9.25 -> V=1.0, theta=0.0 +% INFO : Bus 46 : V=1.05, theta=-11.89 -> V=1.0, theta=0.0 +% INFO : Bus 47 : V=1.033, theta=-12.49 -> V=1.0, theta=0.0 +% INFO : Bus 48 : V=1.027, theta=-12.59 -> V=1.0, theta=0.0 +% INFO : Bus 49 : V=1.036, theta=-12.92 -> V=1.0, theta=0.0 +% INFO : Bus 50 : V=1.023, theta=-13.39 -> V=1.0, theta=0.0 +% INFO : Bus 51 : V=1.052, theta=-12.52 -> V=1.0, theta=0.0 +% INFO : Bus 52 : V=0.98, theta=-11.47 -> V=1.0, theta=0.0 +% INFO : Bus 53 : V=0.971, theta=-12.23 -> V=1.0, theta=0.0 +% INFO : Bus 54 : V=0.996, theta=-11.69 -> V=1.0, theta=0.0 +% INFO : Bus 55 : V=1.031, theta=-10.78 -> V=1.0, theta=0.0 +% INFO : Bus 56 : V=0.968, theta=-16.04 -> V=1.0, theta=0.0 +% INFO : Bus 57 : V=0.965, theta=-16.56 -> V=1.0, theta=0.0 +% INFO : +% INFO : === Generator Setpoint Replacement Notes === +% INFO : Gen at bus 1 : Pg=128.9, Qg=-16.1 -> Pg=122.5, Qg=0.0 +% INFO : Gen at bus 1 : Vg=1.04 -> Vg=1.0 +% INFO : Gen at bus 2 : Pg=0.0, Qg=-0.8 -> Pg=0.0, Qg=16.5 +% INFO : Gen at bus 2 : Vg=1.01 -> Vg=1.0 +% INFO : Gen at bus 3 : Pg=40.0, Qg=-1.0 -> Pg=30.0, Qg=10.0 +% INFO : Gen at bus 3 : Vg=0.985 -> Vg=1.0 +% INFO : Gen at bus 6 : Pg=0.0, Qg=0.8 -> Pg=0.0, Qg=8.5 +% INFO : Gen at bus 6 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 8 : Pg=450.0, Qg=62.1 -> Pg=579.5, Qg=30.0 +% INFO : Gen at bus 8 : Vg=1.005 -> Vg=1.0 +% INFO : Gen at bus 9 : Pg=0.0, Qg=2.2 -> Pg=0.0, Qg=3.0 +% INFO : Gen at bus 9 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 12 : Pg=310.0, Qg=128.5 -> Pg=259.5, Qg=2.5 +% INFO : Gen at bus 12 : Vg=1.015 -> Vg=1.0 +% INFO : +% INFO : === Writing Matpower Case File Notes === diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case73_ieee_rts.m b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case73_ieee_rts.m new file mode 100644 index 00000000..5cec51f6 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/pglib/pglib_opf_case73_ieee_rts.m @@ -0,0 +1,755 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% %%%%% +%%%% IEEE PES Power Grid Library - Optimal Power Flow - v23.07 %%%%% +%%%% (https://github.com/power-grid-lib/pglib-opf) %%%%% +%%%% Benchmark Group - Typical Operations %%%%% +%%%% 23 - July - 2023 %%%%% +%%%% %%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Power flow data for the IEEE RELIABILITY TEST SYSTEM 1996. +% +% IEEE Reliability Test System Task Force of Applications of +% Probability Methods Subcommittee, "IEEE reliability test system-96," +% IEEE Transactions on Power Systems, Vol. 14, No. 3, Aug. 1999, +% pp. 1010-1020. +% +% See also (this network is three replicates of the RTS-79 system): +% IEEE Reliability Test System Task Force of the Applications of +% Probability Methods Subcommittee, "IEEE reliability test system," +% IEEE Transactions on Power Apparatus and Systems, Vol. 98, No. 6, +% Nov./Dec. 1979, pp. 2047-2054. +% +% Cost data is from Web site run by Georgia Tech Power Systems Control +% and Automation Laboratory: +% http://pscal.ece.gatech.edu/testsys/index.html +% +% Converted from data files on: +% http://www.ee.washington.edu/research/pstca/rts/pg_tcarts.htm +% +% Does not include optional DC link +% Bus voltage bounds from Matpower standard +/- 6% off nominal +% Reactive compensation at buses 106, 206, 306 is essential for feasibility due to +% line charging on branch 6-10. A shunt of 100 MVar is indicated in the RTS-79 paper. +% +% Matpower case file data provided by Clayton Barrows, Carleton Coffrin, +% and NICTA's Optisation Research Group. +% +% Copyright (c) 1999 The Institute of Electrical and Electronics Engineers (IEEE) +% Licensed under the Creative Commons Attribution 4.0 +% International license, http://creativecommons.org/licenses/by/4.0/ +% +% Contact M.E. Brennan (me.brennan@ieee.org) for inquries on further reuse of +% this dataset. +% +function mpc = pglib_opf_case73_ieee_rts +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% area data +% area refbus +mpc.areas = [ + 1 101; + 2 201; + 3 301; +]; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 101 2 108.0 22.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 102 2 97.0 20.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 103 1 180.0 37.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 104 1 74.0 15.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 105 1 71.0 14.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 106 1 136.0 28.0 0.0 -100.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 107 2 125.0 25.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 108 1 171.0 35.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 109 1 175.0 36.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 110 1 195.0 40.0 0.0 0.0 1 1.00000 0.00000 138.0 1 1.05000 0.95000; + 111 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 112 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 113 3 265.0 54.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 114 2 194.0 39.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 115 2 317.0 64.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 116 2 100.0 20.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 117 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 118 2 333.0 68.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 119 1 181.0 37.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 120 1 128.0 26.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 121 2 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 122 2 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 123 2 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 124 1 0.0 0.0 0.0 0.0 1 1.00000 0.00000 230.0 1 1.05000 0.95000; + 201 2 108.0 22.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 202 2 97.0 20.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 203 1 180.0 37.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 204 1 74.0 15.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 205 1 71.0 14.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 206 1 136.0 28.0 0.0 -100.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 207 2 125.0 25.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 208 1 171.0 35.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 209 1 175.0 36.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 210 1 195.0 40.0 0.0 0.0 2 1.00000 0.00000 138.0 2 1.05000 0.95000; + 211 1 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 212 1 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 213 2 265.0 54.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 214 2 194.0 39.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 215 2 317.0 64.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 216 2 100.0 20.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 217 1 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 218 2 333.0 68.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 219 1 181.0 37.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 220 1 128.0 26.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 221 2 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 222 2 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 223 2 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 224 1 0.0 0.0 0.0 0.0 2 1.00000 0.00000 230.0 2 1.05000 0.95000; + 301 2 108.0 22.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 302 2 97.0 20.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 303 1 180.0 37.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 304 1 74.0 15.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 305 1 71.0 14.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 306 1 136.0 28.0 0.0 -100.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 307 2 125.0 25.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 308 1 171.0 35.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 309 1 175.0 36.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 310 1 195.0 40.0 0.0 0.0 3 1.00000 0.00000 138.0 3 1.05000 0.95000; + 311 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 312 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 313 2 265.0 54.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 314 2 194.0 39.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 315 2 317.0 64.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 316 2 100.0 20.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 317 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 318 2 333.0 68.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 319 1 181.0 37.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 320 1 128.0 26.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 321 2 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 322 2 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 323 2 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 324 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; + 325 1 0.0 0.0 0.0 0.0 3 1.00000 0.00000 230.0 3 1.05000 0.95000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin +mpc.gen = [ + 101 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 101 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 101 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 101 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 102 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 102 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 102 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 102 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 107 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 107 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 107 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 113 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 113 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 113 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 114 0.0 75.0 200.0 -50.0 1.0 100.0 1 0.0 0.0; + 115 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 115 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 115 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 115 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 115 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 115 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 116 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 118 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 121 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 122 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 123 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 123 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 123 245.0 62.5 150.0 -25.0 1.0 100.0 1 350.0 140.0; + 201 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 201 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 201 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 201 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 202 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 202 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 202 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 202 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 207 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 207 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 207 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 213 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 213 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 213 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 214 0.0 75.0 200.0 -50.0 1.0 100.0 1 0.0 0.0; + 215 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 215 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 215 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 215 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 215 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 215 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 216 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 218 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 221 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 222 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 223 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 223 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 223 245.0 62.5 150.0 -25.0 1.0 100.0 1 350.0 140.0; + 301 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 301 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 301 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 301 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 302 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 302 18.0 5.0 10.0 0.0 1.0 100.0 1 20.0 16.0; + 302 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 302 45.6 2.5 30.0 -25.0 1.0 100.0 1 76.0 15.2; + 307 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 307 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 307 62.5 30.0 60.0 0.0 1.0 100.0 1 100.0 25.0; + 313 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 313 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 313 133.0 40.0 80.0 0.0 1.0 100.0 1 197.0 69.0; + 314 0.0 75.0 200.0 -50.0 1.0 100.0 1 0.0 0.0; + 315 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 315 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 315 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 315 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 315 7.2 3.0 6.0 0.0 1.0 100.0 1 12.0 2.4; + 315 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 316 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 318 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 321 250.0 75.0 200.0 -50.0 1.0 100.0 1 400.0 100.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 322 30.0 3.0 16.0 -10.0 1.0 100.0 1 50.0 10.0; + 323 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 323 104.65 15.0 80.0 -50.0 1.0 100.0 1 155.0 54.3; + 323 245.0 62.5 150.0 -25.0 1.0 100.0 1 350.0 140.0; +]; + +%% generator cost data +% 2 startup shutdown n c(n-1) ... c0 +mpc.gencost = [ + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.000000 0.000000 0.000000; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.004895 11.849500 665.109400; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.000000 0.000000 0.000000; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.004895 11.849500 665.109400; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.000000 130.000000 400.684900; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.014142 16.081100 212.307600; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.052672 43.661500 781.521000; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.007170 48.580400 832.757500; + 2 1500.0 0.0 3 0.000000 0.000000 0.000000; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.328412 56.564000 86.385200; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000213 4.423100 395.374900; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.000000 0.001000 0.001000; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.008342 12.388300 382.239100; + 2 1500.0 0.0 3 0.004895 11.849500 665.109400; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax +mpc.branch = [ + 101 102 0.003 0.014 0.461 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 101 103 0.055 0.211 0.057 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 101 105 0.022 0.085 0.023 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 102 104 0.033 0.127 0.034 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 102 106 0.05 0.192 0.052 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 103 109 0.031 0.119 0.032 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 103 124 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 104 109 0.027 0.104 0.028 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 105 110 0.023 0.088 0.024 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 106 110 0.014 0.061 2.459 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 107 108 0.016 0.061 0.017 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 107 203 0.042 0.161 0.044 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 108 109 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 108 110 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 109 111 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 109 112 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 110 111 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 110 112 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 111 113 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 111 114 0.005 0.042 0.088 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 112 113 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 112 123 0.012 0.097 0.203 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 113 123 0.011 0.087 0.182 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 113 215 0.01 0.075 0.158 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 114 116 0.005 0.059 0.082 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 115 116 0.002 0.017 0.036 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 115 121 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 115 121 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 115 124 0.007 0.052 0.109 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 116 117 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 116 119 0.003 0.023 0.049 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 117 118 0.002 0.014 0.03 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 117 122 0.014 0.105 0.221 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 118 121 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 118 121 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 119 120 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 119 120 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 120 123 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 120 123 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 121 122 0.009 0.068 0.142 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 123 217 0.01 0.074 0.155 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 201 202 0.003 0.014 0.461 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 201 203 0.055 0.211 0.057 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 201 205 0.022 0.085 0.023 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 202 204 0.033 0.127 0.034 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 202 206 0.05 0.192 0.052 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 203 209 0.031 0.119 0.032 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 203 224 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 204 209 0.027 0.104 0.028 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 205 210 0.023 0.088 0.024 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 206 210 0.014 0.061 2.459 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 207 208 0.016 0.061 0.017 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 208 209 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 208 210 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 209 211 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 209 212 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 210 211 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 210 212 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 211 213 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 211 214 0.005 0.042 0.088 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 212 213 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 212 223 0.012 0.097 0.203 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 213 223 0.011 0.087 0.182 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 214 216 0.005 0.059 0.082 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 215 216 0.002 0.017 0.036 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 215 221 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 215 221 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 215 224 0.007 0.052 0.109 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 216 217 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 216 219 0.003 0.023 0.049 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 217 218 0.002 0.014 0.03 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 217 222 0.014 0.105 0.221 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 218 221 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 218 221 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 219 220 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 219 220 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 220 223 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 220 223 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 221 222 0.009 0.068 0.142 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 301 302 0.003 0.014 0.461 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 301 303 0.055 0.211 0.057 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 301 305 0.022 0.085 0.023 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 302 304 0.033 0.127 0.034 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 302 306 0.05 0.192 0.052 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 303 309 0.031 0.119 0.032 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 303 324 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 304 309 0.027 0.104 0.028 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 305 310 0.023 0.088 0.024 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 306 310 0.014 0.061 2.459 175.0 193.0 200.0 0.0 0.0 1 -30.0 30.0; + 307 308 0.016 0.061 0.017 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 308 309 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 308 310 0.043 0.165 0.045 175.0 208.0 220.0 0.0 0.0 1 -30.0 30.0; + 309 311 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 309 312 0.002 0.084 0.0 400.0 510.0 600.0 1.03 0.0 1 -30.0 30.0; + 310 311 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 310 312 0.002 0.084 0.0 400.0 510.0 600.0 1.015 0.0 1 -30.0 30.0; + 311 313 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 311 314 0.005 0.042 0.088 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 312 313 0.006 0.048 0.1 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 312 323 0.012 0.097 0.203 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 313 323 0.011 0.087 0.182 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 314 316 0.005 0.059 0.082 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 315 316 0.002 0.017 0.036 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 315 321 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 315 321 0.006 0.049 0.103 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 315 324 0.007 0.052 0.109 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 316 317 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 316 319 0.003 0.023 0.049 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 317 318 0.002 0.014 0.03 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 317 322 0.014 0.105 0.221 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 318 321 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 318 321 0.003 0.026 0.055 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 319 320 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 319 320 0.005 0.04 0.083 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 320 323 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 320 323 0.003 0.022 0.046 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 321 322 0.009 0.068 0.142 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 325 121 0.012 0.097 0.203 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 318 223 0.013 0.104 0.218 500.0 600.0 625.0 0.0 0.0 1 -30.0 30.0; + 323 325 0.0 0.009 0.0 722.0 893.0 893.0 0.0 0.0 1 -30.0 30.0; +]; + +% INFO : === Translation Options === +% INFO : Phase Angle Bound: 30.0 (deg.) +% INFO : Setting Flat Start +% INFO : +% INFO : === Generator Bounds Update Notes === +% INFO : +% INFO : === Base KV Replacement Notes === +% INFO : +% INFO : === Transformer Setting Replacement Notes === +% INFO : +% INFO : === Line Capacity Monotonicity Notes === +% INFO : +% INFO : === Voltage Setpoint Replacement Notes === +% INFO : Bus 101 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 102 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 103 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 104 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 105 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 106 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 107 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 108 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 109 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 110 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 111 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 112 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 113 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 114 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 115 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 116 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 117 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 118 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 119 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 120 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 121 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 122 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 123 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 124 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 201 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 202 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 203 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 204 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 205 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 206 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 207 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 208 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 209 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 210 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 211 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 212 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 213 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 214 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 215 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 216 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 217 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 218 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 219 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 220 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 221 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 222 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 223 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 224 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 301 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 302 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 303 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 304 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 305 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 306 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 307 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 308 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 309 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 310 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 311 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 312 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 313 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 314 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 315 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 316 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 317 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 318 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 319 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 320 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 321 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 322 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 323 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 324 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : Bus 325 : V=1.0, theta=0.0 -> V=1.0, theta=0.0 +% INFO : +% INFO : === Generator Setpoint Replacement Notes === +% INFO : Gen at bus 101 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 101 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 101 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 101 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 101 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 101 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 101 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 101 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 102 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 102 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 102 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 102 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 102 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 102 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 102 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 102 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 107 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 107 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 107 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 107 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 107 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 107 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 113 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 113 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 113 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 113 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 113 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 113 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 114 : Pg=0.0, Qg=13.7 -> Pg=0.0, Qg=75.0 +% INFO : Gen at bus 114 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 115 : Pg=155.0, Qg=0.05 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 115 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 116 : Pg=155.0, Qg=25.22 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 116 : Vg=1.017 -> Vg=1.0 +% INFO : Gen at bus 118 : Pg=400.0, Qg=137.4 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 118 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 121 : Pg=400.0, Qg=108.2 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 121 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 122 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 122 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 123 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 123 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 123 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 123 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 123 : Pg=350.0, Qg=71.78 -> Pg=245.0, Qg=62.5 +% INFO : Gen at bus 123 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 201 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 201 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 201 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 201 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 201 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 201 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 201 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 201 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 202 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 202 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 202 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 202 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 202 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 202 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 202 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 202 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 207 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 207 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 207 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 207 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 207 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 207 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 213 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 213 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 213 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 213 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 213 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 213 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 214 : Pg=0.0, Qg=13.68 -> Pg=0.0, Qg=75.0 +% INFO : Gen at bus 214 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 215 : Pg=155.0, Qg=0.048 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 215 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 216 : Pg=155.0, Qg=25.22 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 216 : Vg=1.017 -> Vg=1.0 +% INFO : Gen at bus 218 : Pg=400.0, Qg=137.4 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 218 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 221 : Pg=400.0, Qg=108.2 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 221 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 222 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 222 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 223 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 223 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 223 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 223 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 223 : Pg=350.0, Qg=71.78 -> Pg=245.0, Qg=62.5 +% INFO : Gen at bus 223 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 301 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 301 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 301 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 301 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 301 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 301 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 301 : Pg=76.0, Qg=14.1 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 301 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 302 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 302 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 302 : Pg=10.0, Qg=0.0 -> Pg=18.0, Qg=5.0 +% INFO : Gen at bus 302 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 302 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 302 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 302 : Pg=76.0, Qg=7.0 -> Pg=45.6, Qg=2.5 +% INFO : Gen at bus 302 : Vg=1.035 -> Vg=1.0 +% INFO : Gen at bus 307 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 307 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 307 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 307 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 307 : Pg=80.0, Qg=17.2 -> Pg=62.5, Qg=30.0 +% INFO : Gen at bus 307 : Vg=1.025 -> Vg=1.0 +% INFO : Gen at bus 313 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 313 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 313 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 313 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 313 : Pg=95.1, Qg=40.7 -> Pg=133.0, Qg=40.0 +% INFO : Gen at bus 313 : Vg=1.02 -> Vg=1.0 +% INFO : Gen at bus 314 : Pg=0.0, Qg=13.68 -> Pg=0.0, Qg=75.0 +% INFO : Gen at bus 314 : Vg=0.98 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=12.0, Qg=0.0 -> Pg=7.2, Qg=3.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 315 : Pg=155.0, Qg=0.048 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 315 : Vg=1.014 -> Vg=1.0 +% INFO : Gen at bus 316 : Pg=155.0, Qg=25.22 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 316 : Vg=1.017 -> Vg=1.0 +% INFO : Gen at bus 318 : Pg=400.0, Qg=137.4 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 318 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 321 : Pg=400.0, Qg=108.2 -> Pg=250.0, Qg=75.0 +% INFO : Gen at bus 321 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 322 : Pg=50.0, Qg=-4.96 -> Pg=30.0, Qg=3.0 +% INFO : Gen at bus 322 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 323 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 323 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 323 : Pg=155.0, Qg=31.79 -> Pg=104.65, Qg=15.0 +% INFO : Gen at bus 323 : Vg=1.05 -> Vg=1.0 +% INFO : Gen at bus 323 : Pg=350.0, Qg=71.78 -> Pg=245.0, Qg=62.5 +% INFO : Gen at bus 323 : Vg=1.05 -> Vg=1.0 +% INFO : +% INFO : === Writing Matpower Case File Notes === diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/scenarios.json b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/scenarios.json new file mode 100644 index 00000000..076043c5 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/references/scenarios.json @@ -0,0 +1,1280 @@ +{ + "case_sha256": { + "pglib_opf_case24_ieee_rts.m": "5d4fc2d4a1a282f700c51747e592f5a5ac15fa6d5eadb7df7ae937bbe3063374", + "pglib_opf_case57_ieee.m": "aa3b48f7cbaade2afd69cb3790ef72be981db8494dcef9277bee460f754bdb22", + "pglib_opf_case73_ieee_rts.m": "fe8f15a2391e2c92138b712d146b04c038f0727e8e9220e1c6065507ea12a22c" + }, + "pglib_commit": "dc6be4b2f85ca0e776952ec22cbd4c22396ea5a3", + "pglib_release": "v23.07", + "scenarios": [ + { + "baseline_cost": 71529.03566149012, + "baseline_pg_mw": [ + 17.600000932625008, + 17.600000932625008, + 75.99999596931023, + 75.99999596931023, + 17.600000932949516, + 17.600000932949516, + 75.9999959720313, + 75.9999959720313, + 76.49741222424768, + 76.49741222424768, + 76.49741222424768, + 120.20005730608811, + 120.20005730608811, + 120.20005730608811, + 0.0, + 6.240006800045832, + 6.240006800045832, + 6.240006800045832, + 6.240006800045832, + 6.240006800045832, + 154.99999574006023, + 154.999995756926, + 280.0005070769384, + 385.7886292266078, + 34.00000132037547, + 34.00000132037547, + 34.00000132037547, + 34.00000132037547, + 34.00000132037547, + 34.00000132037547, + 154.99999576183055, + 154.99999576183055, + 349.9999957745381 + ], + "baseline_vg_pu": [ + 1.0091111575214937, + 1.0091111575214937, + 1.0091111575214937, + 1.0091111575214937, + 1.0097635351433678, + 1.0097635351433678, + 1.0097635351433678, + 1.0097635351433678, + 1.004972113972593, + 1.004972113972593, + 1.004972113972593, + 1.0393025387842045, + 1.0393025387842045, + 1.0393025387842045, + 1.0249065836587188, + 1.0283188088525133, + 1.0283188088525133, + 1.0283188088525133, + 1.0283188088525133, + 1.0283188088525133, + 1.0283188088525133, + 1.0308282999611051, + 1.04716289373882, + 1.049999746875441, + 1.041784460700476, + 1.041784460700476, + 1.041784460700476, + 1.041784460700476, + 1.041784460700476, + 1.041784460700476, + 1.0437827985688015, + 1.0437827985688015, + 1.0437827985688015 + ], + "case_id": "case24_ieee_rts", + "load_scale": 0.98, + "outage_branch": null, + "reference_cost": 60565.90940366975, + "scenario_id": "low_load", + "source_file": "pglib_opf_case24_ieee_rts.m" + }, + { + "baseline_cost": 64363.70514672694, + "baseline_pg_mw": [ + 16.000001842812004, + 16.000001842812004, + 75.99999527703551, + 75.99999527703551, + 16.00000184337742, + 16.00000184337742, + 75.9999952807454, + 75.9999952807454, + 70.34288841301013, + 91.89681687872724, + 70.34288841301013, + 78.5789491884319, + 78.5789491884319, + 78.5789491884319, + 0.0, + 2.4000141188823783, + 2.4000141188823783, + 2.4000141188823783, + 2.4000141188823783, + 2.4000141188823783, + 154.9999954651582, + 154.99999548749878, + 399.99999647107455, + 399.99999645718947, + 28.446068259331696, + 49.9999967250488, + 49.9999967250488, + 49.9999967250488, + 49.9999967250488, + 49.9999967250488, + 154.99999545409497, + 154.99999545409497, + 349.99999541163 + ], + "baseline_vg_pu": [ + 1.0472170007053212, + 1.0472170007053212, + 1.0472170007053212, + 1.0472170007053212, + 1.047195580384823, + 1.047195580384823, + 1.047195580384823, + 1.047195580384823, + 1.0360108379779132, + 1.0360108379779132, + 1.0360108379779132, + 1.033484455406125, + 1.033484455406125, + 1.033484455406125, + 1.0398694678233624, + 1.0410601843610316, + 1.0410601843610316, + 1.0410601843610316, + 1.0410601843610316, + 1.0410601843610316, + 1.0410601843610316, + 1.044277660812828, + 1.049999598221436, + 1.049999866461892, + 1.049999774379883, + 1.049999774379883, + 1.049999774379883, + 1.049999774379883, + 1.049999774379883, + 1.049999774379883, + 1.0499998074305839, + 1.0499998074305839, + 1.0499998074305839 + ], + "case_id": "case24_ieee_rts", + "load_scale": 1.0, + "outage_branch": null, + "reference_cost": 63352.207181300364, + "scenario_id": "nominal", + "source_file": "pglib_opf_case24_ieee_rts.m" + }, + { + "baseline_cost": 76583.42242190892, + "baseline_pg_mw": [ + 18.000000011540987, + 18.000000011540987, + 75.99999831873708, + 75.99999831873708, + 18.000000011418344, + 18.000000011418344, + 75.99999831843229, + 75.99999831843229, + 86.22804104280985, + 86.22804104280985, + 86.22804104280985, + 139.7078640488185, + 139.7078640488185, + 139.7078640488185, + 0.0, + 7.200000698015471, + 7.200000698015471, + 7.200000698015471, + 7.200000698015471, + 7.200000698015471, + 154.99999790447646, + 154.99999790782448, + 263.2841849884715, + 399.9995661502939, + 30.000003638532775, + 30.000003638532775, + 30.000003638532775, + 30.000003638532775, + 30.000003638532775, + 30.000003638532775, + 154.99999792584265, + 154.99999792584265, + 349.99999797003335 + ], + "baseline_vg_pu": [ + 1.0479040124495684, + 1.0479040124495684, + 1.0479040124495684, + 1.0479040124495684, + 1.0478353307478416, + 1.0478353307478416, + 1.0478353307478416, + 1.0478353307478416, + 1.027317208567876, + 1.027317208567876, + 1.027317208567876, + 1.0484388359275454, + 1.0484388359275454, + 1.0484388359275454, + 1.0400709912333066, + 1.0072122728647412, + 1.0072122728647412, + 1.0072122728647412, + 1.0072122728647412, + 1.0072122728647412, + 1.0072122728647412, + 1.0188132922731772, + 1.0000020459551866, + 1.0032060051612421, + 1.0000002755078978, + 1.0000002755078978, + 1.0000002755078978, + 1.0000002755078978, + 1.0000002755078978, + 1.0000002755078978, + 1.0499999323068623, + 1.0499999323068623, + 1.0499999323068623 + ], + "case_id": "case24_ieee_rts", + "load_scale": 1.0, + "outage_branch": 6, + "reference_cost": 64249.377171654065, + "scenario_id": "contingency_a", + "source_file": "pglib_opf_case24_ieee_rts.m" + }, + { + "baseline_cost": 78949.6180917657, + "baseline_pg_mw": [ + 18.200000273815405, + 18.200000273815405, + 75.99999643286199, + 75.99999643286199, + 18.200000274049454, + 18.200000274049454, + 75.99999643409002, + 75.99999643409002, + 88.53818932371819, + 88.53818932371819, + 88.53818932371819, + 150.54735366348757, + 150.54735366348757, + 150.54735366348757, + 0.0, + 7.680003597522548, + 7.680003597522548, + 7.680003597522548, + 7.680003597522548, + 7.680003597522548, + 154.99999577718714, + 154.99999578448737, + 279.0835886956513, + 399.99898353923277, + 28.000005859821826, + 28.000005859821826, + 28.000005859821826, + 28.000005859821826, + 28.000005859821826, + 28.000005859821826, + 154.99999581206217, + 154.99999581206217, + 349.9999958821557 + ], + "baseline_vg_pu": [ + 1.0470136467969613, + 1.0470136467969613, + 1.0470136467969613, + 1.0470136467969613, + 1.0470154262614304, + 1.0470154262614304, + 1.0470154262614304, + 1.0470154262614304, + 1.0011548463333986, + 1.0011548463333986, + 1.0011548463333986, + 1.014929367023473, + 1.014929367023473, + 1.014929367023473, + 1.0251227958925626, + 1.0034208864877243, + 1.0034208864877243, + 1.0034208864877243, + 1.0034208864877243, + 1.0034208864877243, + 1.0034208864877243, + 1.0114479670985255, + 1.0107920964494683, + 1.0167396642231072, + 1.0429194532359225, + 1.0429194532359225, + 1.0429194532359225, + 1.0429194532359225, + 1.0429194532359225, + 1.0429194532359225, + 1.0432631180839385, + 1.0432631180839385, + 1.0432631180839385 + ], + "case_id": "case24_ieee_rts", + "load_scale": 1.02, + "outage_branch": 14, + "reference_cost": 66266.96126842163, + "scenario_id": "contingency_b_high", + "source_file": "pglib_opf_case24_ieee_rts.m" + }, + { + "baseline_cost": 40028.57343530389, + "baseline_pg_mw": [ + 85.75000117969714, + 0.0, + 59.9998171689936, + 0.0, + 737.4268467223889, + 0.0, + 380.9009790477578 + ], + "baseline_vg_pu": [ + 1.017414995007557, + 1.0080168455709146, + 1.002759951132227, + 1.0225654055338436, + 1.0488477610316493, + 0.9901261473294625, + 0.9839205368137858 + ], + "case_id": "case57_ieee", + "load_scale": 0.98, + "outage_branch": null, + "reference_cost": 36709.21573667476, + "scenario_id": "low_load", + "source_file": "pglib_opf_case57_ieee.m" + }, + { + "baseline_cost": 37589.33898640282, + "baseline_pg_mw": [ + 244.99999515247288, + 0.0, + 59.99987618758338, + 0.0, + 860.3419166582622, + 0.0, + 139.81983398769523 + ], + "baseline_vg_pu": [ + 1.0260931210786095, + 1.0162278231577828, + 1.009471618330956, + 1.027857996147574, + 1.0599999144819463, + 0.9962194149192317, + 0.9965337842500104 + ], + "case_id": "case57_ieee", + "load_scale": 1.0, + "outage_branch": null, + "reference_cost": 37589.33898640282, + "scenario_id": "nominal", + "source_file": "pglib_opf_case57_ieee.m" + }, + { + "baseline_cost": 42689.9846363894, + "baseline_pg_mw": [ + 12.250000931091563, + 0.0, + 3.00001085650522, + 0.0, + 780.1842274554101, + 0.0, + 501.34406411038367 + ], + "baseline_vg_pu": [ + 1.0200658511320948, + 1.0065313944721708, + 0.9896710977719987, + 0.9879940168199832, + 1.0468004198291123, + 0.993769191004227, + 1.0121573367889347 + ], + "case_id": "case57_ieee", + "load_scale": 1.0, + "outage_branch": 5, + "reference_cost": 37719.74192929725, + "scenario_id": "contingency_a", + "source_file": "pglib_opf_case57_ieee.m" + }, + { + "baseline_cost": 43562.46529484518, + "baseline_pg_mw": [ + 12.250001144796784, + 0.0, + 24.415499392882047, + 0.0, + 783.5708488260417, + 0.0, + 502.3675893495571 + ], + "baseline_vg_pu": [ + 1.0228968511842735, + 1.010736686843187, + 0.9995308669465163, + 1.009101222688095, + 1.059999986089778, + 0.9992191589385073, + 1.0070402914998762 + ], + "case_id": "case57_ieee", + "load_scale": 1.02, + "outage_branch": 6, + "reference_cost": 38671.78982514236, + "scenario_id": "contingency_b_high", + "source_file": "pglib_opf_case57_ieee.m" + }, + { + "baseline_cost": 181397.38963108457, + "baseline_pg_mw": [ + 16.00000008057052, + 16.00000008057052, + 75.99999977217465, + 75.99999977217465, + 16.00000008059422, + 16.00000008059422, + 75.99999977236395, + 75.99999977236395, + 56.12623746899013, + 56.12623746899013, + 56.12623746899013, + 69.00000331781133, + 69.00000331781133, + 69.00000331781133, + 0.0, + 2.400000547714491, + 2.400000547714491, + 2.400000547714491, + 2.400000547714491, + 2.400000547714491, + 154.99999978553726, + 154.99999978625175, + 399.9999998357273, + 399.99999983530375, + 49.99999984803753, + 49.99999984803753, + 49.99999984803753, + 49.99999984803753, + 49.99999984803753, + 49.99999984803753, + 154.99999978400928, + 154.99999978400928, + 349.9999997818728, + 16.00000008158531, + 16.00000008158531, + 75.99999977991533, + 75.99999977991533, + 16.000000081607528, + 16.000000081607528, + 75.99999978007688, + 75.99999978007688, + 64.2936184233312, + 64.2936184233312, + 64.2936184233312, + 69.0000070402918, + 69.0000070402918, + 69.0000070402918, + 0.0, + 2.400000586051761, + 2.400000586051761, + 2.400000586051761, + 2.400000586051761, + 2.400000586051761, + 154.99999979089338, + 154.99999979111925, + 399.9999998381345, + 399.9999998376714, + 49.99999985003969, + 49.99999985003969, + 49.99999985003969, + 49.99999985003969, + 49.99999985003969, + 49.99999985003969, + 154.99999978775668, + 154.99999978775668, + 349.99999978569406, + 16.000000080997918, + 16.000000080997918, + 75.9999997755239, + 75.9999997755239, + 16.000000081024915, + 16.000000081024915, + 75.999999775731, + 75.999999775731, + 61.69924883546223, + 61.69924883546223, + 61.69924883546223, + 69.00000450014845, + 69.00000450014845, + 69.00000450014845, + 0.0, + 2.400000558049975, + 2.400000558049975, + 2.400000558049975, + 2.400000558049975, + 2.400000558049975, + 154.99999978708132, + 154.99999978782301, + 399.9999998368608, + 399.9999998360845, + 49.99999984876498, + 49.99999984876498, + 49.99999984876498, + 49.99999984876498, + 49.99999984876498, + 49.99999984876498, + 154.999999784348, + 154.999999784348, + 349.99999978221825 + ], + "baseline_vg_pu": [ + 1.0480059095869252, + 1.0480059095869252, + 1.0480059095869252, + 1.0480059095869252, + 1.0480753884746479, + 1.0480753884746479, + 1.0480753884746479, + 1.0480753884746479, + 1.031149661494352, + 1.031149661494352, + 1.031149661494352, + 1.0388396544957552, + 1.0388396544957552, + 1.0388396544957552, + 1.0435993217557513, + 1.0437402417585917, + 1.0437402417585917, + 1.0437402417585917, + 1.0437402417585917, + 1.0437402417585917, + 1.0437402417585917, + 1.0458795452657839, + 1.0499999768613493, + 1.0499999927151669, + 1.0499999898732861, + 1.0499999898732861, + 1.0499999898732861, + 1.0499999898732861, + 1.0499999898732861, + 1.0499999898732861, + 1.0499999916580625, + 1.0499999916580625, + 1.0499999916580625, + 1.0488026202676581, + 1.0488026202676581, + 1.0488026202676581, + 1.0488026202676581, + 1.0488500296243985, + 1.0488500296243985, + 1.0488500296243985, + 1.0488500296243985, + 1.0317667106899016, + 1.0317667106899016, + 1.0317667106899016, + 1.0366064357967613, + 1.0366064357967613, + 1.0366064357967613, + 1.04553916213856, + 1.0430673764328713, + 1.0430673764328713, + 1.0430673764328713, + 1.0430673764328713, + 1.0430673764328713, + 1.0430673764328713, + 1.0455488216257591, + 1.049999978634956, + 1.049999993053073, + 1.0499999900263841, + 1.0499999900263841, + 1.0499999900263841, + 1.0499999900263841, + 1.0499999900263841, + 1.0499999900263841, + 1.0499999934011197, + 1.0499999934011197, + 1.0499999934011197, + 1.0494225723409965, + 1.0494225723409965, + 1.0494225723409965, + 1.0494225723409965, + 1.049467705184996, + 1.049467705184996, + 1.049467705184996, + 1.049467705184996, + 1.029041353806461, + 1.029041353806461, + 1.029041353806461, + 1.0376848670642826, + 1.0376848670642826, + 1.0376848670642826, + 1.046676672768863, + 1.0435155190466934, + 1.0435155190466934, + 1.0435155190466934, + 1.0435155190466934, + 1.0435155190466934, + 1.0435155190466934, + 1.0459938502243493, + 1.0499999816831107, + 1.0499999929166755, + 1.0499999899844692, + 1.0499999899844692, + 1.0499999899844692, + 1.0499999899844692, + 1.0499999899844692, + 1.0499999899844692, + 1.0499999935347695, + 1.0499999935347695, + 1.0499999935347695 + ], + "case_id": "case73_ieee_rts", + "load_scale": 0.98, + "outage_branch": null, + "reference_cost": 181397.38963108457, + "scenario_id": "low_load", + "source_file": "pglib_opf_case73_ieee_rts.m" + }, + { + "baseline_cost": 189873.0321984882, + "baseline_pg_mw": [ + 16.000000629680084, + 16.000000629680084, + 75.99999836236387, + 75.99999836236387, + 16.974608537861485, + 16.000000629872766, + 75.02539045567654, + 75.99999836366527, + 66.81588447716284, + 66.81588447716284, + 66.81588447716284, + 69.00017227180562, + 69.00017227180562, + 69.00017227180562, + 0.0, + 2.4000048754569345, + 2.4000048754569345, + 2.4000048754569345, + 2.4000048754569345, + 2.4000048754569345, + 154.99999844731946, + 154.99999845198283, + 399.9999987948061, + 399.9999987915109, + 49.99999888045052, + 49.99999888045052, + 49.99999888045052, + 49.99999888045052, + 49.99999888045052, + 49.99999888045052, + 154.9999984333138, + 154.9999984333138, + 349.9999984186104, + 16.00000063472391, + 16.00000063472391, + 75.99999839551114, + 75.99999839551114, + 16.000000634896374, + 16.000000634896374, + 75.9999983966116, + 75.9999983966116, + 71.57371286575143, + 71.57371286575143, + 71.57371286575143, + 90.18613989519, + 90.18613989519, + 90.18613989519, + 0.0, + 2.4000051844748316, + 2.4000051844748316, + 2.4000051844748316, + 2.4000051844748316, + 2.4000051844748316, + 154.99999847624258, + 154.99999847661198, + 399.99999880756894, + 399.99999880400264, + 49.999998891156814, + 49.999998891156814, + 49.999998891156814, + 49.999998891156814, + 49.999998891156814, + 49.999998891156814, + 154.99999844824185, + 154.99999844824185, + 349.9999984338189, + 16.000000632122262, + 16.000000632122262, + 75.99999837862723, + 75.99999837862723, + 16.000000632338697, + 16.000000632338697, + 75.99999838004834, + 75.99999838004834, + 70.29723290231925, + 70.29723290231925, + 70.29723290231925, + 76.94714815554829, + 76.94714815554829, + 76.94714815554829, + 0.0, + 2.400004933380163, + 2.400004933380163, + 2.400004933380163, + 2.400004933380163, + 2.400004933380163, + 154.99999845310228, + 154.9999984581899, + 399.9999987995016, + 399.9999987940119, + 49.99999888308389, + 49.99999888308389, + 49.99999888308389, + 49.99999888308389, + 49.99999888308389, + 49.99999888308389, + 154.99999843341902, + 154.99999843341902, + 349.9999984187175 + ], + "baseline_vg_pu": [ + 1.0477647241707149, + 1.0477647241707149, + 1.0477647241707149, + 1.0477647241707149, + 1.0478238394400021, + 1.0478238394400021, + 1.0478238394400021, + 1.0478238394400021, + 1.037449724272406, + 1.037449724272406, + 1.037449724272406, + 1.0394291821549495, + 1.0394291821549495, + 1.0394291821549495, + 1.044016122511926, + 1.0433503698565294, + 1.0433503698565294, + 1.0433503698565294, + 1.0433503698565294, + 1.0433503698565294, + 1.0433503698565294, + 1.0456520137638436, + 1.0499998254003053, + 1.049999946500679, + 1.0499999252086631, + 1.0499999252086631, + 1.0499999252086631, + 1.0499999252086631, + 1.0499999252086631, + 1.0499999252086631, + 1.0499999393478765, + 1.0499999393478765, + 1.0499999393478765, + 1.0484035287511413, + 1.0484035287511413, + 1.0484035287511413, + 1.0484035287511413, + 1.048437025571047, + 1.048437025571047, + 1.048437025571047, + 1.048437025571047, + 1.0397295038077414, + 1.0397295038077414, + 1.0397295038077414, + 1.0375274294974999, + 1.0375274294974999, + 1.0375274294974999, + 1.0433559737610871, + 1.043269463296711, + 1.043269463296711, + 1.043269463296711, + 1.043269463296711, + 1.043269463296711, + 1.043269463296711, + 1.0455638542181402, + 1.049999823199845, + 1.0499999466534544, + 1.049999925624467, + 1.049999925624467, + 1.049999925624467, + 1.049999925624467, + 1.049999925624467, + 1.049999925624467, + 1.0499999459485352, + 1.0499999459485352, + 1.0499999459485352, + 1.04858557164228, + 1.04858557164228, + 1.04858557164228, + 1.04858557164228, + 1.0486269693835168, + 1.0486269693835168, + 1.0486269693835168, + 1.0486269693835168, + 1.0380452705886793, + 1.0380452705886793, + 1.0380452705886793, + 1.0380323069401396, + 1.0380323069401396, + 1.0380323069401396, + 1.0463134898280055, + 1.0429981872216645, + 1.0429981872216645, + 1.0429981872216645, + 1.0429981872216645, + 1.0429981872216645, + 1.0429981872216645, + 1.0455787099206604, + 1.0499998558516097, + 1.0499999479456865, + 1.049999925790569, + 1.049999925790569, + 1.049999925790569, + 1.049999925790569, + 1.049999925790569, + 1.049999925790569, + 1.0499999514989724, + 1.0499999514989724, + 1.0499999514989724 + ], + "case_id": "case73_ieee_rts", + "load_scale": 1.0, + "outage_branch": null, + "reference_cost": 189764.08643192108, + "scenario_id": "nominal", + "source_file": "pglib_opf_case73_ieee_rts.m" + }, + { + "baseline_cost": 228635.04622317135, + "baseline_pg_mw": [ + 18.000000325432236, + 18.000000325432236, + 75.99999862392421, + 75.99999862392421, + 18.000000325081697, + 18.000000325081697, + 75.99999862212195, + 75.99999862212195, + 84.89167941992136, + 84.89167941992136, + 84.89167941992136, + 135.9192887468997, + 135.91928874690007, + 135.91928874690007, + 0.0, + 7.200002575214127, + 7.200002575214127, + 7.200002575214127, + 7.200002575214127, + 7.200002575214127, + 154.99999846761472, + 154.99999847557302, + 399.99996763456903, + 399.9999695487542, + 30.00000080940806, + 30.00000080940806, + 30.00000080940806, + 30.00000080940806, + 30.00000080940806, + 30.00000080940806, + 154.99999847671114, + 154.99999847671114, + 349.9999984852659, + 18.000000319682975, + 18.000000319682975, + 75.99999859464998, + 75.99999859464998, + 18.000000319778053, + 18.000000319778053, + 75.99999859527269, + 75.99999859527269, + 85.79268571972179, + 85.79268571972179, + 85.79268571972179, + 144.46912172513413, + 144.46912172513413, + 144.46912172513413, + 0.0, + 7.200002956000489, + 7.200002956000489, + 7.200002956000489, + 7.200002956000489, + 7.200002956000489, + 154.99999849481532, + 154.99999849449392, + 250.00029867010315, + 337.33359328409153, + 30.000000756511362, + 30.000000756511362, + 30.000000756511362, + 30.000000756511362, + 30.000000756511362, + 30.000000756511362, + 154.99999848234359, + 154.99999848234359, + 349.99999849111794, + 18.000000317622757, + 18.000000317622757, + 75.99999857923886, + 75.99999857923886, + 18.000000317748743, + 18.000000317748743, + 75.99999858009413, + 75.99999858009413, + 84.93621536903822, + 84.93621536903822, + 84.93621536903822, + 134.45922522361397, + 134.45922522361397, + 134.45922522361397, + 0.0, + 7.200002737451568, + 7.200002737451568, + 7.200002737451568, + 7.200002737451568, + 7.200002737451568, + 154.99999847486782, + 154.9999984787676, + 344.1178532911666, + 252.7235526794508, + 30.000000749565352, + 30.000000749565352, + 30.000000749565352, + 30.000000749565352, + 30.000000749565352, + 30.000000749565352, + 154.99999847215884, + 154.99999847215884, + 349.9999984804334 + ], + "baseline_vg_pu": [ + 1.0492432923801545, + 1.0492432923801545, + 1.0492432923801545, + 1.0492432923801545, + 1.0492569470110464, + 1.0492569470110464, + 1.0492569470110464, + 1.0492569470110464, + 1.046948282316849, + 1.046948282316849, + 1.046948282316849, + 1.04977897864724, + 1.04977897864724, + 1.04977897864724, + 1.0220622358662377, + 0.9985121424406412, + 0.9985121424406412, + 0.9985121424406412, + 0.9985121424406412, + 0.9985121424406412, + 0.9985121424406412, + 1.003192344641045, + 0.9999999417024249, + 1.00390188699778, + 1.0000001403738066, + 1.0000001403738066, + 1.0000001403738066, + 1.0000001403738066, + 1.0000001403738066, + 1.0000001403738066, + 1.0499999278244743, + 1.0499999278244743, + 1.0499999278244743, + 1.0012219340480697, + 1.0012219340480697, + 1.0012219340480697, + 1.0012219340480697, + 1.0018254059495724, + 1.0018254059495724, + 1.0018254059495724, + 1.0018254059495724, + 1.0070636732611733, + 1.0070636732611733, + 1.0070636732611733, + 1.043601547331122, + 1.043601547331122, + 1.043601547331122, + 1.0076502657391213, + 1.0283529797404434, + 1.0283529797404434, + 1.0283529797404434, + 1.0283529797404434, + 1.0283529797404434, + 1.0283529797404434, + 1.0271991938961749, + 1.0374013312889674, + 1.0460519640740316, + 1.049999681049334, + 1.049999681049334, + 1.049999681049334, + 1.049999681049334, + 1.049999681049334, + 1.049999681049334, + 1.0499999091074539, + 1.0499999091074539, + 1.0499999091074539, + 1.049393068036951, + 1.049393068036951, + 1.049393068036951, + 1.049393068036951, + 1.0494145913575856, + 1.0494145913575856, + 1.0494145913575856, + 1.0494145913575856, + 1.00561187795508, + 1.00561187795508, + 1.00561187795508, + 1.0106708691342414, + 1.0106708691342414, + 1.0106708691342414, + 0.9989164532680561, + 1.0231904197813417, + 1.0231904197813417, + 1.0231904197813417, + 1.0231904197813417, + 1.0231904197813417, + 1.0231904197813417, + 1.0241390598445093, + 1.045727931703078, + 1.046071334464533, + 1.0499995169888252, + 1.0499995169888252, + 1.0499995169888252, + 1.0499995169888252, + 1.0499995169888252, + 1.0499995169888252, + 1.049618539367305, + 1.049618539367305, + 1.049618539367305 + ], + "case_id": "case73_ieee_rts", + "load_scale": 1.0, + "outage_branch": 6, + "reference_cost": 190536.4992479636, + "scenario_id": "contingency_a", + "source_file": "pglib_opf_case73_ieee_rts.m" + }, + { + "baseline_cost": 200072.643746204, + "baseline_pg_mw": [ + 16.000000100546572, + 16.000000100546572, + 75.99999974514392, + 75.99999974514392, + 16.0000001005778, + 16.0000001005778, + 75.99999974534437, + 75.99999974534437, + 70.05404804888288, + 90.65305505638825, + 70.05404804888288, + 76.82318016319013, + 76.82318016319013, + 76.82318016319013, + 0.0, + 2.400000810254803, + 2.400000810254803, + 2.400000810254803, + 2.400000810254803, + 2.400000810254803, + 154.99999975741565, + 154.99999975810152, + 399.9999998110125, + 399.9999998104553, + 49.99999982423445, + 49.99999982423445, + 49.99999982423445, + 49.99999982423445, + 49.99999982423445, + 49.99999982423445, + 154.9999997548663, + 154.9999997548663, + 349.999999752596, + 16.00000010106426, + 16.00000010106426, + 75.9999997484105, + 75.9999997484105, + 16.000000101090784, + 16.000000101090784, + 75.99999974857471, + 75.99999974857471, + 73.57888581204847, + 73.57888581204847, + 73.57888581204847, + 101.66487456187328, + 101.66487456187328, + 101.66487456187328, + 0.0, + 2.400000852674655, + 2.400000852674655, + 2.400000852674655, + 2.400000852674655, + 2.400000852674655, + 154.99999976097587, + 154.9999997608526, + 399.9999998125402, + 399.99999981196083, + 49.99999982552163, + 49.99999982552163, + 49.99999982552163, + 29.40099281801625, + 49.99999982552163, + 49.99999982552163, + 154.99999975532, + 154.99999975532, + 349.9999997530581, + 16.000000103151013, + 16.000000103151013, + 75.99999976047326, + 75.99999976047326, + 16.000000103050667, + 16.000000103050667, + 75.99999975993043, + 75.99999975993043, + 76.05190995156478, + 76.05190995156478, + 76.05190995156478, + 108.69330335780887, + 108.69330335780887, + 108.69330335780887, + 0.0, + 2.400000755802321, + 2.400000755802321, + 2.400000755802321, + 2.400000755802321, + 2.400000755802321, + 154.99999975206785, + 154.99999975480128, + 399.9999998090219, + 399.9999998078894, + 49.99999982227138, + 49.99999982227138, + 49.99999982227138, + 49.99999982227138, + 49.99999982227138, + 49.99999982227138, + 154.99999975379657, + 154.99999975379657, + 349.99999975150627 + ], + "baseline_vg_pu": [ + 1.0481386467887355, + 1.0481386467887355, + 1.0481386467887355, + 1.0481386467887355, + 1.0481958884134879, + 1.0481958884134879, + 1.0481958884134879, + 1.0481958884134879, + 1.0398712099769294, + 1.0398712099769294, + 1.0398712099769294, + 1.041335718152739, + 1.041335718152739, + 1.041335718152739, + 1.0455746983210281, + 1.0429871990336592, + 1.0429871990336592, + 1.0429871990336592, + 1.0429871990336592, + 1.0429871990336592, + 1.0429871990336592, + 1.0455777651920384, + 1.0499999725650404, + 1.049999989881675, + 1.0499999883121678, + 1.0499999883121678, + 1.0499999883121678, + 1.0499999883121678, + 1.0499999883121678, + 1.0499999883121678, + 1.0499999911562112, + 1.0499999911562112, + 1.0499999911562112, + 1.0487721928031684, + 1.0487721928031684, + 1.0487721928031684, + 1.0487721928031684, + 1.0488018684025495, + 1.0488018684025495, + 1.0488018684025495, + 1.0488018684025495, + 1.0420853050565861, + 1.0420853050565861, + 1.0420853050565861, + 1.0401234626983107, + 1.0401234626983107, + 1.0401234626983107, + 1.0442345097169765, + 1.0434289523637177, + 1.0434289523637177, + 1.0434289523637177, + 1.0434289523637177, + 1.0434289523637177, + 1.0434289523637177, + 1.0457508252584222, + 1.049999971064832, + 1.0499999917137475, + 1.049999988330228, + 1.049999988330228, + 1.049999988330228, + 1.049999988330228, + 1.049999988330228, + 1.049999988330228, + 1.0499999925511458, + 1.0499999925511458, + 1.0499999925511458, + 1.0499999822143213, + 1.0499999822143213, + 1.0499999822143213, + 1.0499999822143213, + 1.0499999770332795, + 1.0499999770332795, + 1.0499999770332795, + 1.0499999770332795, + 1.0499999750605524, + 1.0499999750605524, + 1.0499999750605524, + 1.049999991299466, + 1.049999991299466, + 1.049999991299466, + 1.049999990692022, + 1.0470243542388296, + 1.0470243542388296, + 1.0470243542388296, + 1.0470243542388296, + 1.0470243542388296, + 1.0470243542388296, + 1.046059029912613, + 1.049999977411953, + 1.0499999867123164, + 1.0499999881760609, + 1.0499999881760609, + 1.0499999881760609, + 1.0499999881760609, + 1.0499999881760609, + 1.0499999881760609, + 1.049977083364706, + 1.049977083364706, + 1.049977083364706 + ], + "case_id": "case73_ieee_rts", + "load_scale": 1.02, + "outage_branch": 85, + "reference_cost": 199092.21291544545, + "scenario_id": "contingency_b_high", + "source_file": "pglib_opf_case73_ieee_rts.m" + } + ], + "schema_version": 1 +} diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/scripts/init.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/scripts/init.py new file mode 100644 index 00000000..7ee89757 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/scripts/init.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +from typing import Any + + +def solve(case: dict[str, Any]) -> dict[str, list[float]]: + """Return active-power and voltage setpoints for every generator. + + The baseline uses a precomputed feasible but deliberately non-optimal + dispatch. Improve the logic inside the EVOLVE block while preserving the + function signature and output schema. + """ + + # EVOLVE-BLOCK-START + generators = case["generators"] + return { + "pg_mw": [float(generator["baseline_pg_mw"]) for generator in generators], + "vg_pu": [float(generator["baseline_vg_pu"]) for generator in generators], + } + # EVOLVE-BLOCK-END diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/__init__.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/__init__.py new file mode 100644 index 00000000..b3d56155 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/__init__.py @@ -0,0 +1 @@ +"""Frozen verification package for SecurityConstrainedDispatch.""" diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/candidate_worker.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/candidate_worker.py new file mode 100644 index 00000000..c2a4a2a2 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/candidate_worker.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import ctypes +import errno +import importlib.util +import json +import signal +import sys +from pathlib import Path +from types import ModuleType +from typing import Any + +import pyseccomp as seccomp + + +def emit(payload: dict[str, Any]) -> None: + print(json.dumps(payload, allow_nan=False, separators=(",", ":")), flush=True) + + +def load_candidate(path: Path) -> ModuleType: + spec = importlib.util.spec_from_file_location("frontier_candidate", path) + if spec is None or spec.loader is None: + raise RuntimeError("cannot import candidate") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + if not callable(getattr(module, "solve", None)): + raise TypeError("candidate must define solve(case)") + return module + + +def install_restrictions() -> None: + libc = ctypes.CDLL(None, use_errno=True) + if libc.prctl(38, 1, 0, 0, 0) != 0: # PR_SET_NO_NEW_PRIVS + raise OSError(ctypes.get_errno(), "failed to enable no_new_privs") + + denied = { + "open", "openat", "openat2", "creat", + "read", "readv", "pread64", "preadv", "preadv2", + "sendfile", "splice", "tee", "vmsplice", "copy_file_range", + "socket", "socketpair", "connect", "accept", "accept4", "bind", "listen", + "clone", "clone3", "fork", "vfork", "execve", "execveat", + "ptrace", "mount", "umount2", "pivot_root", "chroot", + "setns", "unshare", "bpf", "keyctl", "add_key", "request_key", + } + policy = seccomp.SyscallFilter(defaction=seccomp.ALLOW) + for syscall in sorted(denied): + try: + policy.add_rule(seccomp.ERRNO(errno.EPERM), syscall) + except RuntimeError: + pass + for syscall in ("write", "writev", "pwrite64", "pwritev", "pwritev2"): + try: + policy.add_rule(seccomp.ERRNO(errno.EPERM), syscall, seccomp.Arg(0, seccomp.GT, 2)) + except RuntimeError: + pass + policy.load() + + blocked_events = ( + "open", "os.open", "os.remove", "os.rename", "os.rmdir", "os.mkdir", + "os.system", "os.exec", "os.spawn", "subprocess.Popen", "socket.", + "ctypes.dlopen", "ctypes.dlsym", + ) + + def audit(event: str, _args: tuple[Any, ...]) -> None: + if event.startswith(blocked_events): + raise PermissionError(f"candidate operation prohibited: {event}") + + sys.addaudithook(audit) + + +def timeout_handler(_signum, _frame) -> None: + raise TimeoutError("candidate solve() exceeded 2 seconds") + + +def main() -> int: + if len(sys.argv) != 2: + emit({"status": "error", "error": "worker requires one candidate path"}) + return 2 + try: + candidate = load_candidate(Path(sys.argv[1]).resolve()) + except BaseException as exc: + emit({"status": "error", "error": f"candidate import failed: {type(exc).__name__}: {exc}"}) + return 1 + + emit({"status": "ready"}) + try: + line = sys.stdin.readline() + if not line: + raise ValueError("worker received no scenario payload") + payload = json.loads(line) + install_restrictions() + signal.signal(signal.SIGALRM, timeout_handler) + signal.setitimer(signal.ITIMER_REAL, 2.0) + output = candidate.solve(payload) + signal.setitimer(signal.ITIMER_REAL, 0.0) + emit({"status": "ok", "output": output}) + return 0 + except BaseException as exc: + signal.setitimer(signal.ITIMER_REAL, 0.0) + emit({"status": "error", "error": f"candidate solve failed: {type(exc).__name__}: {exc}"}) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/evaluator.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/evaluator.py new file mode 100644 index 00000000..7a488c48 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/evaluator.py @@ -0,0 +1,274 @@ +from __future__ import annotations + +import argparse +import json +import math +import os +import select +import signal +import shutil +import subprocess +import sys +import tempfile +import time +from pathlib import Path +from typing import Any + +import numpy as np +from pypower.idx_bus import VM, VMAX, VMIN +from pypower.idx_gen import GEN_BUS, GEN_STATUS, PG, PMAX, PMIN, VG + + +TASK_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(TASK_ROOT)) + +from verification.grid_utils import ( # noqa: E402 + apply_scenario, + assess_result, + generation_cost, + load_case, + public_payload, + run_candidate_pf, +) + + +WORKER_PATH = TASK_ROOT / "verification" / "candidate_worker.py" +IMPORT_TIMEOUT_S = 10.0 +SOLVE_TIMEOUT_S = 2.0 + + +def _terminate_worker(process: subprocess.Popen[str]) -> None: + if process.poll() is not None: + return + try: + os.killpg(process.pid, signal.SIGKILL) + except ProcessLookupError: + pass + process.wait(timeout=1.0) + + +def _read_json_line(process: subprocess.Popen[str], timeout_s: float, stage: str) -> dict[str, Any]: + assert process.stdout is not None + ready, _, _ = select.select([process.stdout], [], [], timeout_s) + if not ready: + _terminate_worker(process) + raise TimeoutError(f"candidate {stage} exceeded {timeout_s:g} seconds") + line = process.stdout.readline() + if not line: + stderr = process.stderr.read().strip() if process.stderr is not None else "" + raise RuntimeError(f"candidate worker exited during {stage}: {stderr[:500]}") + try: + message = json.loads(line) + except json.JSONDecodeError as exc: + raise ValueError(f"candidate worker emitted invalid JSON during {stage}") from exc + if not isinstance(message, dict): + raise TypeError(f"candidate worker emitted a non-object during {stage}") + return message + + +def run_candidate(candidate_path: Path, payload: dict[str, Any]) -> Any: + with tempfile.TemporaryDirectory(prefix="frontier-scd-candidate-") as temp_dir: + isolated_candidate = Path(temp_dir) / "candidate.py" + shutil.copyfile(candidate_path, isolated_candidate) + environment = { + "LANG": "C.UTF-8", + "LC_ALL": "C.UTF-8", + "PYTHONDONTWRITEBYTECODE": "1", + "PYTHONHASHSEED": "0", + } + process = subprocess.Popen( + [sys.executable, "-I", str(WORKER_PATH), str(isolated_candidate)], + cwd=temp_dir, + env=environment, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + encoding="utf-8", + start_new_session=True, + ) + try: + message = _read_json_line(process, IMPORT_TIMEOUT_S, "import") + if message.get("status") != "ready": + raise RuntimeError(str(message.get("error", "candidate import failed"))) + assert process.stdin is not None + process.stdin.write(json.dumps(payload, allow_nan=False, separators=(",", ":")) + "\n") + process.stdin.flush() + message = _read_json_line(process, SOLVE_TIMEOUT_S + 0.25, "solve") + if message.get("status") != "ok": + raise RuntimeError(str(message.get("error", "candidate solve failed"))) + return message.get("output") + finally: + _terminate_worker(process) + for stream in (process.stdin, process.stdout, process.stderr): + if stream is not None: + stream.close() + + +def write_json(path: Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2, ensure_ascii=False, default=str) + "\n", encoding="utf-8") + + +def parse_output(output: Any, mpc: dict[str, Any], payload: dict[str, Any]) -> tuple[np.ndarray, np.ndarray]: + if not isinstance(output, dict): + raise TypeError("solve(case) must return a dictionary") + if "pg_mw" not in output or "vg_pu" not in output: + raise ValueError("candidate output must contain both pg_mw and vg_pu") + pg = np.asarray(output["pg_mw"], dtype=float) + vg = np.asarray(output["vg_pu"], dtype=float) + generator_count = len(mpc["gen"]) + if pg.shape != (generator_count,) or vg.shape != (generator_count,): + raise ValueError(f"pg_mw and vg_pu must each contain {generator_count} values") + if not np.isfinite(pg).all() or not np.isfinite(vg).all(): + raise ValueError("candidate output contains non-finite values") + + gen = mpc["gen"] + online = gen[:, GEN_STATUS] > 0 + if np.any(pg[online] < gen[online, PMIN] - 1e-6) or np.any(pg[online] > gen[online, PMAX] + 1e-6): + raise ValueError("candidate active power is outside generator limits") + + bus_limits = {row["bus_id"]: (row["vmin_pu"], row["vmax_pu"]) for row in payload["buses"]} + voltage_by_bus: dict[int, float] = {} + for index, row in enumerate(gen): + if not online[index]: + continue + bus_id = int(row[GEN_BUS]) + low, high = bus_limits[bus_id] + if vg[index] < low - 1e-8 or vg[index] > high + 1e-8: + raise ValueError(f"generator voltage at bus {bus_id} is outside bus limits") + if bus_id in voltage_by_bus and abs(voltage_by_bus[bus_id] - vg[index]) > 1e-7: + raise ValueError(f"generators at bus {bus_id} must use the same voltage setpoint") + voltage_by_bus[bus_id] = float(vg[index]) + return pg, vg + + +def evaluate(candidate_path: Path) -> tuple[dict[str, float], dict[str, Any]]: + start = time.time() + scenario_data = json.loads((TASK_ROOT / "references" / "scenarios.json").read_text(encoding="utf-8")) + case_cache: dict[str, dict[str, Any]] = {} + details = [] + scenario_scores = [] + feasible_count = 0 + first_error = "" + expected_scenarios = len(scenario_data["scenarios"]) + + for scenario in scenario_data["scenarios"]: + case_id = scenario["case_id"] + if case_id not in case_cache: + case_cache[case_id] = load_case(TASK_ROOT / "references" / "pglib" / scenario["source_file"]) + mpc = apply_scenario( + case_cache[case_id], + load_scale=float(scenario["load_scale"]), + outage_branch=scenario["outage_branch"], + ) + payload = public_payload(mpc, scenario) + record: dict[str, Any] = { + "case_id": case_id, + "scenario_id": scenario["scenario_id"], + "valid": False, + "score": 0.0, + } + timed_out = False + try: + output = run_candidate(candidate_path, payload) + pg, vg = parse_output(output, mpc, payload) + repeated_output = run_candidate(candidate_path, payload) + repeated_pg, repeated_vg = parse_output(repeated_output, mpc, payload) + if not np.array_equal(pg, repeated_pg) or not np.array_equal(vg, repeated_vg): + raise ValueError("candidate solve(case) must be deterministic") + result = run_candidate_pf(mpc, pg, vg) + valid, checks = assess_result(result) + record.update(checks) + if not valid: + raise ValueError("AC power flow violates one or more hard constraints") + cost = generation_cost(result) + if not math.isfinite(cost) or cost <= 0: + raise ValueError("candidate generation cost is invalid") + cost_efficiency = min(1.05, float(scenario["reference_cost"]) / cost) + thermal_margin = float( + np.clip((100.0 - checks["max_loading_percent"]) / 20.0, 0.0, 1.0) + ) + bus = result["bus"] + voltage_band = np.maximum(bus[:, VMAX] - bus[:, VMIN], 1e-9) + normalized_voltage_margin = ( + 2.0 + * np.minimum(bus[:, VM] - bus[:, VMIN], bus[:, VMAX] - bus[:, VM]) + / voltage_band + ) + voltage_margin = float( + np.clip(np.percentile(normalized_voltage_margin, 10.0), 0.0, 1.0) + ) + score = 70.0 * cost_efficiency + 20.0 * thermal_margin + 10.0 * voltage_margin + record.update( + { + "valid": True, + "cost": cost, + "cost_efficiency": cost_efficiency, + "thermal_margin_score": thermal_margin, + "voltage_margin_score": voltage_margin, + "score": score, + } + ) + feasible_count += 1 + scenario_scores.append(score) + except Exception as exc: + timed_out = "exceeded" in str(exc).lower() + record["error"] = f"{type(exc).__name__}: {exc}" + if not first_error: + first_error = f"{case_id}/{scenario['scenario_id']}: {record['error']}" + details.append(record) + if timed_out: + break + + total = expected_scenarios + feasible_fraction = feasible_count / total if total else 0.0 + all_valid = feasible_count == total and total > 0 + mean_score = float(np.mean(scenario_scores)) if scenario_scores else 0.0 + min_score = float(np.min(scenario_scores)) if scenario_scores else 0.0 + combined_score = 0.75 * mean_score + 0.25 * min_score if all_valid else 0.0 + metrics = { + "valid": 1.0 if all_valid else 0.0, + "combined_score": combined_score, + "mean_scenario_score": mean_score, + "worst_scenario_score": min_score, + "feasible_fraction": feasible_fraction, + "scenarios_feasible": float(feasible_count), + "scenarios_total": float(total), + "runtime_s": float(time.time() - start), + } + artifacts = { + "candidate_path": str(candidate_path), + "pglib_release": scenario_data["pglib_release"], + "pglib_commit": scenario_data["pglib_commit"], + "failure_summary": first_error, + "scenario_results": details, + } + return metrics, artifacts + + +def main() -> int: + parser = argparse.ArgumentParser(description="Evaluate a PGLib security-constrained dispatch policy.") + parser.add_argument("candidate", type=Path) + parser.add_argument("--metrics-out", type=Path, default=Path("metrics.json")) + parser.add_argument("--artifacts-out", type=Path, default=Path("artifacts.json")) + args = parser.parse_args() + + try: + metrics, artifacts = evaluate(args.candidate.resolve()) + except Exception as exc: + metrics = { + "valid": 0.0, + "combined_score": 0.0, + "feasible_fraction": 0.0, + "runtime_s": 0.0, + } + artifacts = {"failure_summary": f"evaluator failure: {type(exc).__name__}: {exc}"} + write_json(args.metrics_out.resolve(), metrics) + write_json(args.artifacts_out.resolve(), artifacts) + print(json.dumps(metrics, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/grid_utils.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/grid_utils.py new file mode 100644 index 00000000..35f472cd --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/grid_utils.py @@ -0,0 +1,239 @@ +from __future__ import annotations + +import contextlib +import copy +import io +from pathlib import Path +from typing import Any + +import numpy as np +from matpowercaseframes import CaseFrames +from pypower.api import ppoption, runopf, runpf +from pypower.idx_brch import ( + ANGMAX, + ANGMIN, + BR_B, + BR_R, + BR_STATUS, + BR_X, + F_BUS, + PF, + PT, + QF, + QT, + RATE_A, + SHIFT, + TAP, + T_BUS, +) +from pypower.idx_bus import BASE_KV, BUS_I, BUS_TYPE, PD, QD, VA, VM, VMAX, VMIN +from pypower.idx_gen import ( + GEN_BUS, + GEN_STATUS, + PG, + PMAX, + PMIN, + QG, + QMAX, + QMIN, + VG, +) +from pypower.totcost import totcost + + +PF_OPTIONS = ppoption( + VERBOSE=0, + OUT_ALL=0, + PF_ALG=1, + PF_TOL=1e-9, + PF_MAX_IT=40, +) +OPF_OPTIONS = ppoption( + VERBOSE=0, + OUT_ALL=0, + OPF_VIOLATION=2e-5, + PDIPM_FEASTOL=1e-7, +) + + +def load_case(path: str | Path) -> dict[str, Any]: + mpc = CaseFrames(str(path)).to_mpc() + for key in ("bus", "gen", "branch", "gencost"): + mpc[key] = np.asarray(mpc[key], dtype=float) + return mpc + + +def apply_scenario( + source: dict[str, Any], + *, + load_scale: float, + outage_branch: int | None, +) -> dict[str, Any]: + mpc = copy.deepcopy(source) + mpc["bus"][:, PD] *= float(load_scale) + mpc["bus"][:, QD] *= float(load_scale) + if outage_branch is not None: + if outage_branch < 0 or outage_branch >= len(mpc["branch"]): + raise IndexError(f"outage branch {outage_branch} is out of range") + mpc["branch"][outage_branch, BR_STATUS] = 0.0 + return mpc + + +def _quiet_call(function, *args, **kwargs): + with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()): + return function(*args, **kwargs) + + +def run_reference_opf(mpc: dict[str, Any]) -> dict[str, Any]: + return _quiet_call(runopf, copy.deepcopy(mpc), OPF_OPTIONS) + + +def run_candidate_pf( + mpc: dict[str, Any], + pg_mw: np.ndarray, + vg_pu: np.ndarray, +) -> dict[str, Any]: + candidate = copy.deepcopy(mpc) + candidate["gen"][:, PG] = np.asarray(pg_mw, dtype=float) + candidate["gen"][:, VG] = np.asarray(vg_pu, dtype=float) + result, _ = _quiet_call(runpf, candidate, PF_OPTIONS) + return result + + +def generation_cost(result: dict[str, Any]) -> float: + values = totcost(result["gencost"], result["gen"][:, PG]) + return float(np.sum(values)) + + +def assess_result(result: dict[str, Any]) -> tuple[bool, dict[str, float]]: + if not bool(result.get("success", False)): + return False, {"converged": 0.0} + + bus = np.asarray(result["bus"], dtype=float) + gen = np.asarray(result["gen"], dtype=float) + branch = np.asarray(result["branch"], dtype=float) + + if not all(np.isfinite(array).all() for array in (bus, gen, branch)): + return False, {"converged": 1.0, "nonfinite": 1.0} + + online_gen = gen[:, GEN_STATUS] > 0 + online_branch = branch[:, BR_STATUS] > 0 + rated_branch = online_branch & (branch[:, RATE_A] > 0) + + voltage_low = float(np.maximum(bus[:, VMIN] - bus[:, VM], 0.0).max(initial=0.0)) + voltage_high = float(np.maximum(bus[:, VM] - bus[:, VMAX], 0.0).max(initial=0.0)) + p_low = float(np.maximum(gen[online_gen, PMIN] - gen[online_gen, PG], 0.0).max(initial=0.0)) + p_high = float(np.maximum(gen[online_gen, PG] - gen[online_gen, PMAX], 0.0).max(initial=0.0)) + q_low = float(np.maximum(gen[online_gen, QMIN] - gen[online_gen, QG], 0.0).max(initial=0.0)) + q_high = float(np.maximum(gen[online_gen, QG] - gen[online_gen, QMAX], 0.0).max(initial=0.0)) + + apparent_from = np.hypot(branch[:, PF], branch[:, QF]) + apparent_to = np.hypot(branch[:, PT], branch[:, QT]) + loading = np.zeros(len(branch), dtype=float) + loading[rated_branch] = ( + 100.0 + * np.maximum(apparent_from[rated_branch], apparent_to[rated_branch]) + / branch[rated_branch, RATE_A] + ) + max_loading = float(loading[rated_branch].max(initial=0.0)) + thermal_violation = max(0.0, max_loading - 100.0) + + bus_rows = {int(bus_id): row for row, bus_id in enumerate(bus[:, BUS_I])} + angle_difference = np.asarray( + [ + bus[bus_rows[int(from_bus)], VA] - bus[bus_rows[int(to_bus)], VA] + for from_bus, to_bus in branch[:, [F_BUS, T_BUS]] + ], + dtype=float, + ) + angle_low = float( + np.maximum(branch[online_branch, ANGMIN] - angle_difference[online_branch], 0.0).max(initial=0.0) + ) + angle_high = float( + np.maximum(angle_difference[online_branch] - branch[online_branch, ANGMAX], 0.0).max(initial=0.0) + ) + + violations = { + "converged": 1.0, + "max_loading_percent": max_loading, + "min_voltage_pu": float(bus[:, VM].min()), + "max_voltage_pu": float(bus[:, VM].max()), + "voltage_violation_pu": max(voltage_low, voltage_high), + "active_power_violation_mw": max(p_low, p_high), + "reactive_power_violation_mvar": max(q_low, q_high), + "thermal_violation_percent": thermal_violation, + "angle_violation_deg": max(angle_low, angle_high), + } + valid = ( + violations["voltage_violation_pu"] <= 5e-4 + and violations["active_power_violation_mw"] <= 5e-3 + and violations["reactive_power_violation_mvar"] <= 5e-3 + and violations["thermal_violation_percent"] <= 5e-2 + and violations["angle_violation_deg"] <= 5e-3 + ) + return bool(valid), violations + + +def public_payload( + mpc: dict[str, Any], + scenario: dict[str, Any], +) -> dict[str, Any]: + bus = mpc["bus"] + gen = mpc["gen"] + branch = mpc["branch"] + gencost = mpc["gencost"] + baseline_pg = scenario["baseline_pg_mw"] + baseline_vg = scenario["baseline_vg_pu"] + + return { + "case_id": scenario["case_id"], + "scenario_id": scenario["scenario_id"], + "base_mva": float(mpc["baseMVA"]), + "load_scale": float(scenario["load_scale"]), + "outage_branch": scenario["outage_branch"], + "total_active_load_mw": float(bus[:, PD].sum()), + "buses": [ + { + "bus_id": int(row[BUS_I]), + "type": int(row[BUS_TYPE]), + "pd_mw": float(row[PD]), + "qd_mvar": float(row[QD]), + "base_kv": float(row[BASE_KV]), + "vmin_pu": float(row[VMIN]), + "vmax_pu": float(row[VMAX]), + } + for row in bus + ], + "generators": [ + { + "index": int(index), + "bus_id": int(row[GEN_BUS]), + "online": bool(row[GEN_STATUS] > 0), + "pmin_mw": float(row[PMIN]), + "pmax_mw": float(row[PMAX]), + "qmin_mvar": float(row[QMIN]), + "qmax_mvar": float(row[QMAX]), + "baseline_pg_mw": float(baseline_pg[index]), + "baseline_vg_pu": float(baseline_vg[index]), + "cost_model": [float(value) for value in gencost[index].tolist()], + } + for index, row in enumerate(gen) + ], + "branches": [ + { + "index": int(index), + "from_bus": int(row[F_BUS]), + "to_bus": int(row[T_BUS]), + "resistance_pu": float(row[BR_R]), + "reactance_pu": float(row[BR_X]), + "charging_pu": float(row[BR_B]), + "rate_a_mva": float(row[RATE_A]), + "tap_ratio": float(row[TAP]), + "phase_shift_deg": float(row[SHIFT]), + "in_service": bool(row[BR_STATUS] > 0), + "angle_min_deg": float(row[ANGMIN]), + "angle_max_deg": float(row[ANGMAX]), + } + for index, row in enumerate(branch) + ], + } diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt new file mode 100644 index 00000000..6b83ddb2 --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/requirements.txt @@ -0,0 +1,7 @@ +matpowercaseframes==2.1.1 +numpy==1.26.4 +pandas==2.3.3 +PYPOWER==5.1.19 +pyseccomp==0.1.2 +pytest>=8,<9 +scipy==1.12.0 diff --git a/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/test_candidate_isolation.py b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/test_candidate_isolation.py new file mode 100644 index 00000000..e651577e --- /dev/null +++ b/benchmarks/PowerSystems/SecurityConstrainedDispatch/verification/test_candidate_isolation.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +import tempfile +import textwrap +import unittest +from pathlib import Path + +from verification.evaluator import evaluate + + +class CandidateIsolationTests(unittest.TestCase): + def evaluate_source(self, source: str): + with tempfile.TemporaryDirectory() as directory: + candidate = Path(directory) / "candidate.py" + candidate.write_text(textwrap.dedent(source), encoding="utf-8") + return evaluate(candidate) + + def assert_invalid(self, source: str, expected_error: str) -> None: + metrics, artifacts = self.evaluate_source(source) + self.assertEqual(metrics["valid"], 0.0) + self.assertEqual(metrics["combined_score"], 0.0) + self.assertIn(expected_error, artifacts["failure_summary"]) + + def test_missing_vg_is_rejected(self): + self.assert_invalid( + """ + def solve(case): + return {"pg_mw": [g["baseline_pg_mw"] for g in case["generators"]]} + """, + "both pg_mw and vg_pu", + ) + + def test_file_read_is_rejected(self): + self.assert_invalid( + """ + def solve(case): + open("/etc/hostname").read() + """, + "operation prohibited: open", + ) + + def test_preopened_file_read_is_rejected(self): + self.assert_invalid( + """ + handle = open("/etc/hostname") + def solve(case): + handle.read() + """, + "Operation not permitted", + ) + + def test_preopened_file_write_is_rejected(self): + self.assert_invalid( + """ + handle = open("candidate-output.txt", "w") + def solve(case): + handle.write("forbidden") + handle.flush() + """, + "Operation not permitted", + ) + + def test_subprocess_is_rejected(self): + self.assert_invalid( + """ + import subprocess + def solve(case): + subprocess.run(["/bin/true"]) + """, + "operation prohibited: subprocess.Popen", + ) + + def test_network_is_rejected(self): + self.assert_invalid( + """ + import socket + def solve(case): + socket.socket() + """, + "operation prohibited: socket.__new__", + ) + + def test_nondeterminism_is_rejected(self): + self.assert_invalid( + """ + import random + def solve(case): + generators = case["generators"] + return { + "pg_mw": [g["baseline_pg_mw"] + random.random() * 1e-6 for g in generators], + "vg_pu": [g["baseline_vg_pu"] for g in generators], + } + """, + "must be deterministic", + ) + + def test_import_timeout_writes_invalid_result(self): + self.assert_invalid("while True: pass", "import exceeded 10 seconds") + + def test_solve_timeout_writes_invalid_result(self): + self.assert_invalid( + """ + def solve(case): + while True: + pass + """, + "solve() exceeded 2 seconds", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/docs/superpowers/specs/2026-07-13-scd-restricted-process-design.md b/docs/superpowers/specs/2026-07-13-scd-restricted-process-design.md new file mode 100644 index 00000000..efdacfdb --- /dev/null +++ b/docs/superpowers/specs/2026-07-13-scd-restricted-process-design.md @@ -0,0 +1,109 @@ +# SecurityConstrainedDispatch Restricted-Process Design + +Date: 2026-07-13 + +## Scope + +This change fixes only three contract violations confirmed during contribution review: + +1. `vg_pu` is documented as required but is currently optional in the evaluator. +2. Candidate code can currently read task internals, access the network, and launch subprocesses despite explicit prohibitions. +3. Candidate module import has no infrastructure timeout and can prevent metrics from being written. + +It does not add constraints that are absent from `Task.md`, `frontier_eval/constraints.txt`, or repository contribution requirements. + +## Architecture + +The trusted host evaluator retains scenario loading, AC power flow, hard-constraint checking, scoring, and metrics/artifact writing. Candidate import and `solve(case)` execute in a dedicated worker subprocess because the target server prohibits Linux namespaces and therefore cannot run Docker, Podman, or `unshare` isolation. + +For every scenario, the evaluator serializes only the public `case` payload to JSON on standard input. The worker emits one JSON result on standard output. It starts in an empty temporary working directory and receives the candidate path plus public payload only; benchmark, verifier, and reference paths are not passed to candidate code. + +The runner imports the candidate under an external wall-clock timeout, then installs a Python audit hook and Linux seccomp filter immediately before `solve()`. The audit hook rejects file-open, subprocess/process-launch, socket/network, dynamic-library loading, and equivalent audited operations. Seccomp independently denies filesystem-opening, process creation/execution, networking, tracing, namespace, mount, and other unnecessary system calls. + +The worker runs with: + +- an empty temporary current directory; +- sanitized environment variables; +- inherited standard input/output/error only; +- `no_new_privs` enabled before the seccomp filter; +- resource limits for address space, CPU time, output size, and open descriptors; +- a separate fixed ten-second infrastructure timeout for interpreter startup and candidate import; +- the contract-defined two-second wall-clock timeout for each `solve()` call, measured only after the audit and seccomp controls are installed; +- termination of the entire worker process group on timeout. + +This design does not claim container-equivalent or mathematically absolute isolation. Without namespaces or a virtual machine, arbitrary native code cannot be made perfectly safe. The implementation must state this limitation accurately while enforcing every confirmed prohibited behavior with both application-level and kernel-level controls available on the server. + +The host evaluator remains responsible for turning every candidate-side failure into numeric invalid metrics while returning exit code zero, as required by the unified runner contract. + +## Candidate Runner Contract + +The runner accepts: + +- the candidate path supplied to the isolated worker; +- exactly one public scenario payload as JSON through standard input. + +It imports the candidate under the separate ten-second infrastructure timeout, verifies that `solve` is callable, installs the restrictive audit hook and seccomp filter, then starts a fresh two-second budget and calls `solve()` once. Interpreter startup and import time never consume the `solve()` budget. It writes the returned object as JSON and does not read benchmark files or perform scoring. Import is allowed to load the candidate and ordinary Python dependencies. Prohibited behavior is blocked while `solve()` runs, which is the boundary stated in `Task.md`. + +The host parser requires a dictionary containing both `pg_mw` and `vg_pu`. Each value must be a one-dimensional finite numeric list of exactly the generator count. Missing `vg_pu` is invalid; there is no fallback. + +## Worker and Invocation + +The benchmark adds an immutable candidate worker under `verification/`. The trusted evaluator invokes it with the same Python interpreter through `subprocess.Popen`, uses JSON pipes for communication, creates a new process group, sanitizes the environment, and applies the import infrastructure timeout. The worker enables `no_new_privs`, resource limits, the Python audit hook, and a seccomp allowlist/denylist before beginning the independent two-second `solve()` timeout. + +The requirements file pins the selected Python seccomp binding. If seccomp is unavailable or filter installation fails, evaluation fails closed: the evaluator writes invalid numeric metrics and an actionable infrastructure failure rather than running the candidate without enforcement. + +The unified task continues to call the trusted host evaluator through `frontier_eval/run_eval.sh`, so direct and unified evaluation enforce the same worker behavior. + +## Error Handling + +The following all produce `valid=0.0`, `combined_score=0.0`, and written `metrics.json` plus `artifacts.json`: + +- candidate import exception; +- import-time or solve-time timeout; +- missing or non-callable `solve`; +- malformed JSON or extra non-JSON stdout; +- missing `pg_mw` or `vg_pu`; +- wrong output shape or non-finite values; +- worker launch, seccomp installation, or communication failure; +- any existing AC feasibility violation. + +Failure artifacts identify the failure category without exposing reference answers or verifier internals. + +## Documentation and Metadata + +`README.md` and `README_zh-CN.md` will state the Linux/seccomp requirement, document dependency installation, explain the no-namespace security boundary, and retain exact direct and unified evaluation commands. Readonly metadata covers the candidate worker through the existing readonly `verification/` directory entry. + +No API key, cache, or run output is committed. + +## Verification + +Automated negative tests will cover: + +- missing `vg_pu`; +- wrong shape and non-finite output; +- file read and write attempts during `solve()`; +- subprocess attempts; +- network attempts; +- import-time infinite loop; +- solve-time infinite loop; +- candidate exceptions. + +Positive verification will cover: + +1. Seccomp capability and fail-closed check. +2. Direct baseline evaluation with the documented score. +3. Unified `algorithm.iterations=0` evaluation. +4. Strict readonly metadata audit, considering only requirements applicable to this benchmark. +5. A small authorized DeepSeek optimization run using the official OpenAI-compatible endpoint, `deepseek-v4-pro`, high reasoning effort, and enabled thinking. + +The optimization run is evidence of end-to-end operability, not a claim of full reproducibility or optimization quality. + +## Acceptance Criteria + +- The released baseline remains valid and its score matches the documented value within normal floating-point tolerance. +- A candidate lacking `vg_pu` is invalid. +- Candidate `solve()` cannot open benchmark/reference/verifier files or access the network. +- Process-spawning attempts from `solve()` are rejected and cannot affect the host. +- Import hangs terminate within the separate ten-second infrastructure timeout; solve hangs terminate within the contract-defined two-second per-scenario budget. Both still produce numeric invalid metrics. +- Direct and unified baseline commands exit successfully and collect metrics/artifacts. +- The repository contains no secrets, absolute machine paths, caches, or transient outputs introduced by this change.