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

Uploaded CPython 3.14Windows x86-64

surge_py-0.1.3-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.3-cp314-cp314-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

surge_py-0.1.3-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.3-cp313-cp313-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

surge_py-0.1.3-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.3-cp312-cp312-manylinux_2_28_aarch64.whl (9.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

surge_py-0.1.3-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.3-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: surge_py-0.1.3-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.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6193327f8c8d44f040086a76f85c65015e50b6ab0f0f8ae6266d7cbe186cdbda
MD5 4dca7cb5c519d9ff4efd1904803414fc
BLAKE2b-256 918d70f6f3418520e40fd0d64fe125ecddd4a50c4e2b8ab2c6d3584f616f8aa7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4bf300e3b2e991d5dc2139a6f176b179b4710be05bffcee4c7aa17df9c6389f3
MD5 9d15ec4e91667639fc0600bac355f026
BLAKE2b-256 ad494008e53ab9717465050395ea758ef5237ca339e46cc71a4e45c5ab470520

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b70bffa3275fee696adc34399df32310d8b8c18273035a315a4209659ab09a73
MD5 ac47994e438b1e6b2119f5c6f3884885
BLAKE2b-256 3f2dbf7391342b6c25414ec5a7bb7aeaf7c27ae5db356c1f1f9125ed502e5c9d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f96125528ea85d03b54545e75ec3d748dcfd196ebcc1c55bf2893be9a8248fb6
MD5 f1c8066c11ada984668899287a888b99
BLAKE2b-256 26ffa78b3d4521eb7ca28c7461d1d384007d75e6332f19755e20ef416341dc2c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: surge_py-0.1.3-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.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9b94f26fda57fcb604c8d8454454fc75dabc6d52ef20bccdac0410d0231b11bb
MD5 995a2a4585d14cf097956dba6be4d548
BLAKE2b-256 f07a14f5cb0f1da40aa55201dc36ac05c913013d8511ec180aff469ab5991ee8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fa5af62606fad87e891efecbf098f15af927ba63ae432ee0ad3e7ac698edbd90
MD5 5a26d80eb44b90cda89b3f942bfab8d8
BLAKE2b-256 8ca8cb47956e6d177e46156fe3e4aced254539ed9e8ae6ad71c54aa27f13e446

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ff80cf90e7f7a442295e81d0ab9063d989aefcf3733400e9fa1cbbb35d08e1fd
MD5 153504b41dbbeb3ac5a4c8f291250e1e
BLAKE2b-256 661c6d61dd1c8c0f57a2467a995e18e985af080909088a095623d78807d494c0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 51e1a824dd59de43589cc2788a38054d1a4452d32e4a5e216c9a2e38a615b8fa
MD5 8de5575db4893c0da0ca3d093118d71e
BLAKE2b-256 ffca383a63e3ebe269dbfe3d412337a87efa041c307fb04480444ff62e3b8d07

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: surge_py-0.1.3-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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b8ffd4dbc3b491d7d8ff7186745f80e6512fbf5b316af4dbc47febe58018b408
MD5 93105c951b8cad5bd0f9cac92735720c
BLAKE2b-256 9712219211be925bd9076aa5aea01d30af2c73fecbb630736db94e5316474f3e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cc30d12499bc2fdb899d5b4747e1a9375b98d9ca8dad2294ef169f9857662c92
MD5 7a97a0fcbe1e660061ba37eca0dc0b47
BLAKE2b-256 f45dc17441e989fb8e9ea4e2566e567c69cf0489647f5981577d4d628a349c4e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 35d6d52d1192b11d26a9b43dc419e81abf29ef38334bdf8f92fcdad37b2ca326
MD5 4bbb0f01bf661a94f64993b7601a954f
BLAKE2b-256 aea045be3cad3227487d93321af32003536aa8605e6d1ebd8b77c09cb92ce6f7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for surge_py-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7bd0b761f522aa9ef694dcdcfd83aba2f2e45fd2e8ed9a3ebc4f2989b6e1dbe4
MD5 45dc3d27f039e16cff9b1389fae4e5cb
BLAKE2b-256 0f7a176ac2a964b26b4c35a17578f7f117c9a4e563e37e506149a37ed7b8b939

See more details on using hashes here.

Provenance

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