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.8-cp314-cp314-win_amd64.whl (11.1 MB view details)

Uploaded CPython 3.14Windows x86-64

surge_py-0.1.8-cp314-cp314-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

surge_py-0.1.8-cp314-cp314-manylinux_2_28_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

surge_py-0.1.8-cp314-cp314-macosx_11_0_arm64.whl (9.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

surge_py-0.1.8-cp313-cp313-win_amd64.whl (10.9 MB view details)

Uploaded CPython 3.13Windows x86-64

surge_py-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

surge_py-0.1.8-cp313-cp313-manylinux_2_28_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

surge_py-0.1.8-cp313-cp313-macosx_11_0_arm64.whl (9.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

surge_py-0.1.8-cp312-cp312-win_amd64.whl (10.9 MB view details)

Uploaded CPython 3.12Windows x86-64

surge_py-0.1.8-cp312-cp312-manylinux_2_28_x86_64.whl (10.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

surge_py-0.1.8-cp312-cp312-manylinux_2_28_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

surge_py-0.1.8-cp312-cp312-macosx_11_0_arm64.whl (9.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: surge_py-0.1.8-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 11.1 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.8-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f60112999c72a5ec630d4c6548cb6778ab2f99579becd969da924e3a0afac9af
MD5 f73fad4f897d209e8d4bdcadbc9917da
BLAKE2b-256 d87bbf11de0dbb77edc041ccec0136620dfaed4978d2e556565a1f36c8da9a51

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 22bb3631bd3e80fa638bfeec184fcd2f28b71d5c22fbbc54e96ce7f747f312f3
MD5 dc2504acd3a44f4127cf1a797302389a
BLAKE2b-256 01e88c5e4649226e214cb7cbd65572dd7eab1575b576664e63a6fdefc7c05447

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b14b6c1db632fc11966c7f4ec2c132f107cdd4d06c4906cc7993af3861d7d4a1
MD5 278e3814414f66941c9789b8968e14f5
BLAKE2b-256 da061424368fc285c6a8ed9ab1cdc46da3fe4dacd2381fc29a36efa860ff23fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 292cbd608478b02aa2c7993acd8f62acbb7d893396b6a64999872014dbdf1543
MD5 0dd78a3597103366ede6f9e2643a1c6d
BLAKE2b-256 ce87c1263f34548cfebad49f04b0f8816f5949b81bdbd7bb5265dd4b3f02bdc9

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 10.9 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.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ecf2463162d381353a25ec09bf1dfcd4e73959d1b05abee1257fe30ca7aefdda
MD5 709e4a2d760625b10d3d265ca923d0fa
BLAKE2b-256 14a586fe5cf893e74912a5738cdd5ebf6fccef8bbbeee24636c6cf2d47b1ec25

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 de9cc00568ad4009f57fbdfdd370d72e0dc6fc38a8da21fcfb37a262ffb247d8
MD5 1cfa4f89e3c5d010ad763a0adac23a2b
BLAKE2b-256 986a8cf0650297c0c523cef2a6e4b52d3197a4012e7eb0b707299bbd8aee8085

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 060e9be8526e5c835fef7e1018e0a7233ca7328158fdc02e816d8165d1aed513
MD5 a82d48b29b146c6d04500c1ca5898494
BLAKE2b-256 a59618177d14cf742d17c0c812818fb52f5bc1786dccdf704a093dd0a696e8c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c89387d9be7b5c38ab6e0b8e69f5117577a1a3122f1052732b6069e38feffbb1
MD5 19ebcf63df02e0ff19a3c5f031ef5bc6
BLAKE2b-256 123a461fe5847e4a8658da1e87f7ee9edf989b6adda0b617a14dd24ed4208a76

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 10.9 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.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c03272d0cb63d0ac639054be2d57ad3a5fced1e8a192a09958e997c64f51ae04
MD5 0db70d783553c3dd3bafc7ac3b862334
BLAKE2b-256 73eab10df98098fdc293a648d9938c01f959915b9d22743bcd005b064e8ce91e

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a7019b5e65f9ec80f7139fd3e1063b74b7d52d3061a1e468a766a85436b766b8
MD5 ac483218993115ba3a0eedc66e319120
BLAKE2b-256 ed6f11adc3de7cb42f997b91915c414932edfb88e444de9b8c8d0a82721f1869

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fcd4168d77a149d126e1e9014a41a408398516264352e7ab73a4db1507e43e87
MD5 80b60f7d8507a63a0578884313758f14
BLAKE2b-256 98d369e13154bcd3d94bd3c3d8d9700744af0a760eeaaea71aa1e918dedf5ebc

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for surge_py-0.1.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 590711dc0d5a4dd884689d18d5eae27311b94f2d4d943c4a1ed90b7a66dd4901
MD5 f1e138ac58e1af909587a2024bd19c14
BLAKE2b-256 8e5a577331dae9fbaf793d34eb67a51bc7a5fd20687890f47b0c0c7c6cae9dcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for surge_py-0.1.8-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