Skip to main content

AC/DC power flow solver for large-scale transmission networks

Project description

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 highspy and pip install cyipopt do 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: required number, base_kv; optional type, name, pd_mw, qd_mvar, vm_pu, va_deg
  • branches: required from_bus, to_bus, r, x; optional b, rate_a, tap, shift, circuit
  • generators: required bus, pg; optional pmax, 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

surge_py-0.1.2-cp314-cp314-win_amd64.whl (10.6 MB view details)

Uploaded CPython 3.14Windows x86-64

surge_py-0.1.2-cp314-cp314-manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

surge_py-0.1.2-cp314-cp314-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

surge_py-0.1.2-cp314-cp314-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

surge_py-0.1.2-cp313-cp313-win_amd64.whl (10.6 MB view details)

Uploaded CPython 3.13Windows x86-64

surge_py-0.1.2-cp313-cp313-manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

surge_py-0.1.2-cp313-cp313-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

surge_py-0.1.2-cp313-cp313-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

surge_py-0.1.2-cp312-cp312-win_amd64.whl (10.6 MB view details)

Uploaded CPython 3.12Windows x86-64

surge_py-0.1.2-cp312-cp312-manylinux_2_28_x86_64.whl (10.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

surge_py-0.1.2-cp312-cp312-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

surge_py-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (8.7 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file surge_py-0.1.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 10.6 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for surge_py-0.1.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 fdcd32bafbab8226f53f4a9b0dfa5382388eacaa7a5636eaa35e0fedbf2f9986
MD5 cd28fef9e3a2acf12e87db80b27a0391
BLAKE2b-256 faf974f45a3fda1f1de57dc877510e050acce7d482e94b2aa4421b4b6d3ee403

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp314-cp314-win_amd64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 166221ef8d93a246c64e6f236229a31597981b99e46ab2efceb6885c492ba048
MD5 f9c84f2feff4a94132f8af2ee8d9cb44
BLAKE2b-256 54aeb2a896280191046db1ebd94dd0b6664c3810e10888deda14f4f9e64a7af5

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e9b0e290e7e69bdfd06e0c036ec8be3a9205930fc13f4d0e61ae44dc486a217
MD5 71e8c6c6222e9a9ac9f2f9b0fa82a3f7
BLAKE2b-256 1dc884c5bb57bc0a8dc906412f6295d4a4b84e2dfaa5338cae3bb20bd6cd935e

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp314-cp314-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64048bcc162b96f79f36b3a9281eced1e0167aa83c62e6ef43abd055592a28a1
MD5 cf3846ce003c3b441ff962b3dcadbeef
BLAKE2b-256 7573c8c81ed10d7a06dd9a677489d4303370720ef5a3158a72982593f7bf8854

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 10.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for surge_py-0.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a85949cea35287734c4d404c6576344478be7d29584fcea8cf1ab9f297a34288
MD5 b11bfa463d08c4695ba85b3ddc1b1fef
BLAKE2b-256 e4db95221301dd664900c7644cc6f8709993976d3ea6a4162cd25b473d8e8766

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp313-cp313-win_amd64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7672085c0cce2d7afea98d42f559009057176150f420328cd04628bc8475da1f
MD5 a27f10f1cb078602a298ec9a7e5e58dd
BLAKE2b-256 f0d99295e7e422f545891a0f14c85fa8a8a5a2b5616fce918fd3c507dbd89073

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89e6e144f2d5f5b23c5b6672579f029fc8463f06672560df465752e4cee4992d
MD5 fad702fae374d80aa5b5105b64aca982
BLAKE2b-256 cff74ba222eaf9ea25d96d6a4c1a6568560ad0acb236df96d4790a2c83defa16

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp313-cp313-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf6e2fec1e6f11bbb801c6571126bce2a3b421e0d5a9dc1c3887bc30baa1f190
MD5 bb33b3e75d4d70c0c3477db6c69af55a
BLAKE2b-256 53a1346e3b93a32a699ccc3fc72c6a424943ee9e2b8be521625c26bbc7059020

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 10.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for surge_py-0.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1f204ec8545cfe2c13a2b09a15dba689021f2ac7a5d04062bc3dff8d0bf40bd5
MD5 7ca53160b45e997a6e53c0a6ec88a473
BLAKE2b-256 5e8152f7e23d4fa8bd026853bf71abb3a2b715de66db3b29ef2a2d7358d016a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp312-cp312-win_amd64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f41fa6fe01d8b0d846cd297b5f652af88967c692828df96d356ba6a06c17ab48
MD5 4c21d484470ae6a8be31a6e4e5e452cb
BLAKE2b-256 794bbf0d0507ef0a14b79b10872f99224321a012fc83a306a31e93773990d716

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9167a22de097d571296d768664ae9a9ffc75957a1d0a98e64677db2fa2ac8a19
MD5 3d2fbd258e9ee574efc3e3497970b405
BLAKE2b-256 714ac13e496c8eb0bfa530ca34c410807c4f9d367500daa7879003ade8191fcd

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp312-cp312-manylinux_2_28_aarch64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file surge_py-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 234436a1326a0a4e83af4feba598b22f365601dd2654f9af75c03e9adc774c07
MD5 8810b03538fad3dcf0231d8c1cde7dc4
BLAKE2b-256 1743968766e64edbf7e152344cf1123db29cc4105aa6475ac0a9c69e649e66fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build-wheels.yml on amptimal/surge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page