surge-py
Python bindings for Surge.
surge-py provides the curated Python interface to Surge, a Rust-native power systems analysis engine. The package surface is intentionally small at the root and uses explicit namespaces for specialist workflows such as transfer studies, prepared contingency studies, batch runs, and advanced power-flow methods.
Installation
# Distribution name declared in pyproject metadata
pip install surge-py
# From source (requires Rust toolchain + maturin)
cd src/surge-py
pip install maturin
maturin develop --release
When surge-py is built with COPT_HOME pointing at a COPT 8.x install, the
wheel bundles the Surge COPT NLP shim and the surge package auto-configures
SURGE_COPT_NLP_SHIM_PATH at import time. End users still need a working COPT
runtime installation and license to run nlp_solver="copt", but they do not
need to build a separate shim by hand.
Source builds keep optional commercial backends runtime-loaded. If you want the build to fail unless the packaged COPT NLP shim is bundled, require it explicitly:
COPT_HOME=/opt/copt80 SURGE_PY_REQUIRE_COPT_NLP_SHIM=1 maturin develop --release
System dependencies (build from source)
- Rust stable toolchain
libsuitesparse-dev(KLU sparse solver)libhighs-dev(HiGHS LP solver for OPF — install via system package manager)coinor-libipopt-dev(optional, open-source AC-OPF backend — install via system package manager)- COPT 8.x install + license (optional, commercial AC-OPF backend)
Note:
pip install highspyandpip install cyipoptdo not provide the C shared libraries Surge needs. Both HiGHS and Ipopt must be installed via your system package manager (brew install highs ipopt/apt install libhighs-dev coinor-libipopt-dev).
Quick Start
import surge
# Load a MATPOWER/PSS-E/CIM case
net = surge.load("case118.m")
print(f"{net.n_buses} buses, {net.n_branches} branches")
# AC power flow (Newton-Raphson)
sol = surge.solve_ac_pf(net)
print(f"Converged: {sol.converged}, max mismatch: {sol.max_mismatch:.2e}")
# Results as pandas DataFrame when pandas is installed
df = sol.to_dataframe()
print(df[["bus_id", "vm_pu", "va_deg"]].head())
# DC optimal power flow
opf = surge.solve_dc_opf(net)
print(f"Total cost: ${opf.total_cost:.2f}/hr")
print(f"LMPs: {opf.lmp}") # numpy array
# N-1 contingency analysis
ca = surge.analyze_n1_branch(net)
print(f"{ca.n_with_violations} contingencies with violations")
to_dataframe() returns a pandas DataFrame when pandas is installed and a plain
column dictionary otherwise.
The repository metadata declares the distribution name surge-py and the import module surge. Publication status is a release-process question, not an unresolved naming question.
Pandas Network Construction
For pandas-native workflows, build a network directly from DataFrames:
import pandas as pd
import surge
buses = pd.DataFrame(
[
{"number": 1, "type": "Slack", "base_kv": 230.0, "name": "SWING"},
{"number": 2, "type": "PV", "base_kv": 230.0, "name": "GEN"},
{"number": 3, "type": "PQ", "base_kv": 230.0, "name": "LOAD", "pd_mw": 90.0, "qd_mvar": 30.0},
]
)
branches = pd.DataFrame(
[
{"from_bus": 1, "to_bus": 2, "r": 0.01, "x": 0.10, "rate_a": 250.0},
{"from_bus": 2, "to_bus": 3, "r": 0.01, "x": 0.08, "rate_a": 250.0},
{"from_bus": 1, "to_bus": 3, "r": 0.02, "x": 0.12, "rate_a": 250.0},
]
)
generators = pd.DataFrame(
[
{"bus": 1, "pg": 100.0, "pmax": 150.0, "qmax": 80.0, "qmin": -80.0},
{"bus": 2, "pg": 40.0, "pmax": 80.0, "vs": 1.02},
]
)
net = surge.construction.from_dataframes(buses, branches, generators, name="pandas-demo")
sol = surge.solve_ac_pf(net)
print(sol.converged)
surge.construction.from_dataframes(...) follows a MATPOWER-like schema:
buses: requirednumber,base_kv; optionaltype,name,pd_mw,qd_mvar,vm_pu,va_degbranches: requiredfrom_bus,to_bus,r,x; optionalb,rate_a,tap,shift,circuitgenerators: requiredbus,pg; optionalpmax,pmin,qmax,qmin,vs,machine_id
This helper is intentionally narrow for 0.1. It does not ingest separate load
tables, shunts, HVDC, topology assets, or market objects. See
docs/tutorials/09-pandas-construction.md for the full schema and error
semantics.
Subsystems
surge.subsystem.Subsystem gives you a named, reusable bus-set view over a
network for area/zone, voltage-level, or explicit-bus filtering:
import surge
net = surge.case118()
extra_high = surge.subsystem.Subsystem(net, name="ehv", kv_min=345.0)
area_one_load = surge.subsystem.Subsystem(net, areas=[1], bus_type="PQ")
print(extra_high.bus_numbers[:5])
print(area_one_load.total_load_mw)
print(area_one_load.tie_branches[:3])
Subsystem filters intersect. branches includes only lines whose endpoints are
both inside the bus set, while tie_branches includes exactly one-in / one-out
connections. See docs/tutorials/10-subsystems.md for examples.
Prepared DC Studies
For repeated DC power flow and sensitivity work on one network, prepare the DC study once and reuse it. The prepared study supports both single-island and multi-island AC networks:
import surge
net = surge.load("case118.m")
dc = surge.dc.prepare_study(net)
monitored = [
surge.dc.BranchKey(net.branches[i].from_bus, net.branches[i].to_bus, net.branches[i].circuit)
for i in (0, 3, 7)
]
outages = [
surge.dc.BranchKey(net.branches[i].from_bus, net.branches[i].to_bus, net.branches[i].circuit)
for i in (1, 5)
]
pf = dc.solve_pf()
ptdf = dc.compute_ptdf(
surge.dc.PtdfRequest(monitored_branches=monitored, bus_numbers=[1, 5, 10])
)
lodf = dc.compute_lodf(
surge.dc.LodfRequest(monitored_branches=monitored, outage_branches=outages)
)
workflow = dc.run_analysis(
surge.dc.DcAnalysisRequest(
monitored_branches=monitored,
lodf_outage_branches=outages,
n2_outage_pairs=[
(monitored[0], monitored[1]),
(monitored[1], monitored[0]),
],
)
)
Prepared Transfer Studies
For repeated transfer work on one network, prepare the transfer study once and reuse it across ATC, AFC, and multi-interface runs:
import surge
net = surge.load("case118.m")
study = surge.transfer.prepare_transfer_study(net)
path = surge.transfer.TransferPath("north_to_south", [8], [1])
atc = study.compute_nerc_atc(
path,
surge.transfer.AtcOptions(
monitored_branches=list(range(net.n_branches)),
contingency_branches=list(range(net.n_branches)),
),
)
afc = study.compute_afc(
path,
[surge.transfer.Flowgate("fg0", 10, 500.0)],
)
multi = study.compute_multi_transfer(
[
surge.transfer.TransferPath("north", [8], [1]),
surge.transfer.TransferPath("west", [10], [2]),
],
weights=[1.0, 1.5],
)
For repeated contingency screening on one network, build a study object once,
run it on demand, and reuse the latest analysis for follow-on corrective
redispatch. The same ContingencyStudy surface is used for branch N-1,
generator N-1, and branch N-2:
import surge
net = surge.load("case118.m")
n1 = surge.contingency.n1_branch_study(net, surge.ContingencyOptions(screening="lodf"))
gen_n1 = surge.contingency.n1_generator_study(net, surge.ContingencyOptions(screening="lodf"))
n2 = surge.contingency.n2_branch_study(net, surge.ContingencyOptions(screening="lodf", top_k=100))
analysis = n1.analyze()
scrd = n1.solve_corrective_dispatch()
Supported Entry Points
| Solver | Function | Description |
|---|---|---|
| Newton-Raphson | solve_ac_pf() |
Full AC power flow (KLU sparse) |
| Fast Decoupled | surge.powerflow.solve_fdpf() |
BX/XB decoupled AC power flow |
| DC Power Flow | solve_dc_pf() |
Linear B-theta approximation |
| HVDC Power Flow | solve_hvdc() |
Coupled AC/DC HVDC power flow with automatic topology-aware method selection |
| DC-OPF | solve_dc_opf() |
Optimal dispatch via LP (HiGHS) |
| AC-OPF | solve_ac_opf() |
Optimal dispatch via NLP (auto-detected runtime backend; COPT first, then Ipopt) |
| SCOPF | solve_scopf() |
Security-constrained OPF (DC/AC, preventive/corrective) |
| N-1 Contingency | analyze_n1_branch() |
Parallel contingency analysis |
| Contingency Study | surge.contingency.n1_branch_study() |
Reusable branch N-1 / generator N-1 / N-2 study object family |
| Prepared DC Study | surge.dc.prepare_study() |
Reusable DC power flow + sensitivity study object |
| DC Analysis Workflow | surge.dc.run_analysis() |
Canonical one-call DC flow + PTDF/LODF/N-2 sensitivities |
| PTDF/LODF | surge.dc.compute_ptdf() / surge.dc.compute_lodf() |
Individual sensitivity matrix entry points |
| Prepared Transfer Study | surge.transfer.prepare_transfer_study() |
Reusable ATC / AFC / multi-transfer study object |
| NERC ATC | surge.transfer.compute_nerc_atc() |
Canonical transfer capability entry point |
| GSF | surge.transfer.compute_gsf() |
Generation shift factors |
| Voltage Stress | surge.contingency.compute_voltage_stress() |
Base-case exact L-index and local Q-V proxy screening |
DC power flow angle reporting can be controlled independently of slack distribution. For example:
dc = surge.solve_dc_pf(
net,
surge.DcPfOptions(
participation_factors={101: 0.7, 205: 0.3},
angle_reference="distributed_load",
),
)
This changes only the reported bus-angle reference frame; it does not change branch flows or how the slack mismatch is shared.
The Python package intentionally does not expose unfinished or out-of-scope study surfaces such as continuation PF, planning/compliance helpers, protection convenience layers, dynamics/ride-through workflows, state estimation, fault analysis, arc flash, GIC, or distribution solves until they have a supported package contract.
Supported File Formats
| Format | Read | Write |
|---|---|---|
| MATPOWER (.m) | Yes | Yes |
| PSS/E RAW (.raw) | Yes | Yes |
| PSS/E DYR (.dyr) | Yes | Yes |
| IEEE CDF | Yes | — |
| CGMES/CIM XML | Yes | Yes, via surge.io.cgmes.save(...) |
| UCTE-DEF | Yes | Yes |
| JSON | Yes | Yes |
License
PolyForm Noncommercial 1.0.0 — free for non-commercial use. Commercial use requires a license from Amptimal.
Metadata
Release files for surge-py 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 120.2 MB
Release files / surge_py-0.1.9-cp314-cp314-win_amd64.whl
| Download URL | surge_py-0.1.9-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 11.1 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
818bac76c90a8388a4401b89286f052e938a5b13c14bf5a55743daae6e491743
|
|
BLAKE2b-256 checksum How to use checksums |
892a898bf0ba03fc930fe85893bfc6108b3986a2258d807eed2a7ba5fb41d6f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp314-cp314-manylinux_2_28_x86_64.whl
| Download URL | surge_py-0.1.9-cp314-cp314-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 10.5 MB |
| Tags | CPython 3.14 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
b49ebed083c6e2e0e5b8b084d9c3ac00a504db67a695b27e3dbaad60f169b8ad
|
|
BLAKE2b-256 checksum How to use checksums |
9201f55b612cf71b0077827d3e968fd51cd7b3962043caad35655b3022168c20
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp314-cp314-manylinux_2_28_aarch64.whl
| Download URL | surge_py-0.1.9-cp314-cp314-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 9.4 MB |
| Tags | CPython 3.14 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
55ee489c10c4732d20c5c489aa3f29ac1a599c422eb101ca0b1cf3ea573a4b2f
|
|
BLAKE2b-256 checksum How to use checksums |
19cb57301341985f42a64bfaebbdee0fd2ba884b4af40b37389ecdd03a270286
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | surge_py-0.1.9-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.0 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5f9842cb821d6e4e0034b877766450a08fccb97292c5e1801374bb5bfda34d63
|
|
BLAKE2b-256 checksum How to use checksums |
f48ee48dfd1b515d929e8c895cef611975cb3190c05fc6b2f276d5c57baec738
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp313-cp313-win_amd64.whl
| Download URL | surge_py-0.1.9-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 11.1 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e516be451917bea701ead71d8b5c11b71ac520043248aa2cc48ba4de79149505
|
|
BLAKE2b-256 checksum How to use checksums |
6eb81558eebf521ace720780cbadb385d6b576413c7862e3cfbb21256d854aa4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | surge_py-0.1.9-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 10.5 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
73eb159e7f3c22b5c5441c451214449691724b46ede9dbe847ff5de8504568c2
|
|
BLAKE2b-256 checksum How to use checksums |
57aa57d58741996515f843886c4f392bb15ab8444ccd817ac3045f6b5784beca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp313-cp313-manylinux_2_28_aarch64.whl
| Download URL | surge_py-0.1.9-cp313-cp313-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 9.4 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
580cef118d553a8145737ef869211c089bf53a245b736b948b290912c52f0aea
|
|
BLAKE2b-256 checksum How to use checksums |
ddf8c60eb29c501e1da249d5ed76620396b751af5db90e8fc5d67ca1036f45b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | surge_py-0.1.9-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.0 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e76bdf06629909740b7a9100c16e9fc522a179bd99d8254aac505d21a7b0aa78
|
|
BLAKE2b-256 checksum How to use checksums |
8c024440bcdafa68015b76ba9212bd231d1d788c6244d4206cc1b5b21a5b3bd4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp312-cp312-win_amd64.whl
| Download URL | surge_py-0.1.9-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 11.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
92a57c085f9c94153c94fa904edad78f7aec1ee4dcc5235b76258f6fdb2dcd5a
|
|
BLAKE2b-256 checksum How to use checksums |
0eac9df9ebadaa72f05cf91c4c9db08bf5be382213052b69ecf3a581b57318c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | surge_py-0.1.9-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 10.5 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
204ec186c303f44d94bcba05390e819cec8969843f35c21c38827aac8ba04f6f
|
|
BLAKE2b-256 checksum How to use checksums |
9d8085367a9bdc37cbf4dae14844c2dde13415155d98e155bde3cc425cef90d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp312-cp312-manylinux_2_28_aarch64.whl
| Download URL | surge_py-0.1.9-cp312-cp312-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 9.4 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
67f60b9aae890a5f5ca81cae1b95aca9262c191a01631be4311942dd1280e05c
|
|
BLAKE2b-256 checksum How to use checksums |
0e01a4a64c098c0b9fba3ba980b8170f1ae90e25fc7c7f648c14c0d9de92a482
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / surge_py-0.1.9-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | surge_py-0.1.9-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 9.0 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
89f3afb92def112874ad188306e661a5e5a8e7aad4412be1fbf4a4be30df959b
|
|
BLAKE2b-256 checksum How to use checksums |
a4219b8c27256c9aefd117fd7916c89df5467c049fb3c58f9de866d5fad7b369
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency log