Skip to main content

Fast case parsing and conversion: "pandoc for power systems"

Project description

PowerIO

PowerIO format and matrix flow

PowerIO is a fast, universal parser and converter for power system case files. It aspires to be "the pandoc for power systems."

Using PowerIO, you can build sparse matrices and graph views for downstream analysis and solver code. PowerIO can serve as a drop-in replacement for the data layers of many popular community libraries, enhancing interoperability between diverse packages and formats.

PowerIO is implemented in Rust with a low-level C ABI; any language with a C foreign function interface (FFI) can call it, including Python and Julia. You can also use it directly in Rust itself or through the command line.

Overview

When writing back to the source format, PowerIO returns the original file exactly when the parser retained it. Cross format conversion obeys sane defaults and explicitly emits Conversion::warnings for fields the target format cannot represent.

Formats

The following formats are currently supported with read/write functionality:

Support for the following formats is under development (see the open pull requests):

Other formats are planned; see the GitHub issues. If a format you need is missing, open an issue or a pull request. All are welcome to contribute to this community project.

Packages

This repository contains multiple packages.

powerio          # parser, Network model, source retaining writers, converters
powerio-matrix   # sparse matrices, DC sensitivity factors, graph views
powerio-cli      # the `powerio` command and ratatui TUI
powerio-py       # PyO3 extension for the Python `powerio` package
powerio-capi     # C ABI for C, C++, Julia, and other foreign function interfaces
PowerIO.jl       # Julia bindings over the C ABI

The core powerio Rust crate is as dependency light as possible, with its companion Python package requiring zero dependencies.

API docs: https://eigenergy.github.io/powerio/. Language API map: languages guide.

Install

cargo add powerio
cargo add powerio-matrix
cargo install powerio-cli

pip install powerio
pip install 'powerio[all]'     # scipy, numpy, networkx, polars extras
pip install 'powerio[gridfm]'  # polars for Parquet inspection
pip install 'powerio[pandas]'  # pandas, pyarrow compatibility reads (Python 3.10+)

julia -e 'using Pkg; Pkg.add(url="https://github.com/eigenergy/PowerIO.jl")'

Use

Rust

use powerio::{TargetFormat, parse_file};

let net = parse_file("case14.m")?;
let conv = net.to_format(TargetFormat::PowerModelsJson);

for warning in &conv.warnings {
    eprintln!("conversion warning: {warning}");
}

std::fs::write("case14.json", conv.text)?;

Python

import powerio as pio

case = pio.parse_file("case9.m")
bprime = case.bprime()            # scipy.sparse, needs powerio[matrix]
raw, warnings = pio.convert_file("case9.m", "psse")

Julia

using PowerIO

case = parse_file("case9.m")
text = to_matpower(case)
json, warnings = to_format(case, "powermodels-json")

Command line interface (CLI)

powerio convert tests/data/case14.m --to psse -o case14.raw
powerio convert tests/data/case14.m --to pandapower-json -o case14.pp.json
powerio convert tests/data/case14.m --to pypsa-csv -o pypsa_case
powerio convert pypsa_case --from pypsa-csv --to matpower -o case14.m
powerio verify tests/data/case30.m --kind bdoubleprime
powerio dcopf tests/data/case30.m -o out
powerio sensitivities tests/data/case30.m -o out
powerio gridfm tests/data/case14.m -o out
powerio

Features

Current Format Fidelity

reader / writer MATPOWER PowerModels JSON PSS/E PowerWorld egret JSON pandapower JSON
MATPOWER original text full partial partial partial partial
PowerModels JSON partial original text partial partial partial partial
PSS/E full full original text partial partial partial
PowerWorld full full partial original text partial partial
PowerWorld .pwb full full partial partial partial partial
egret JSON partial full partial partial original text partial
pandapower JSON partial partial partial partial partial original text

partial means the target lacks fields present in the source. The writer reports those cases in Conversion::warnings. PowerWorld .pwb is read only (no writer, no retained source): the row shows where its decoded power flow core lands; the decoded vintages and per field evidence live in docs/powerworld.md.

PyPSA CSV folders and GridFM Parquet are not in this table only because they are directory datasets, not single text outputs. Both read and write: PyPSA with regenerable committed fixtures (tests/data/pypsa/README.md), GridFM with a deliberately lossy read that recovers the power flow core. Known limits for every format are documented in the format fidelity guide.

Matrices

The powerio-matrix Rust crate derives an IndexedNetwork with dense bus indices. It enables you to build common power system matrices with minimal dependencies:

  • B' and B'' DCPF and FDPF matrices
  • Nodal admittance matrix
  • LACPF block matrix
  • Signed incidence, weighted Laplacian, and flow map matrices
  • PTDF and LODF sensitivity matrices
  • Adjacency matrix and petgraph view
  • Matrix Market bundles for low-level OPF solvers
  • KKT operators for OPF solvers (experimental)

Current conventions for signs, taps, phase shifts, per unit scaling, reference buses, and line parameters are documented in the matrices guide.

Normalized View

Network::to_normalized derives a mildly opinionated, post-processed copy of a case that is designed to be solver-friendly:

  • powers are in per unit,
  • voltage phase angles are in radians,
  • inactive elements are removed,
  • tap == 0 replaced with 1,
  • surviving buses reindexed to a dense 1-based id space, and
  • bus types are made consistent with generator placement and reference buses.

The normalized copy carries no retained source text, so writing it emits the derived model rather than the original file.

Python exposes the normalized view as case.to_normalized(), the C ABI as pio_to_normalized, and Julia as to_normalized(case).

C ABI

powerio-capi exposes parse, query, conversion, JSON transport, normalization, and numeric table extraction through pio_* functions. The public header is powerio-capi/include/powerio.h. Build with --features arrow to enable pio_export_arrow over the Arrow C Data Interface.

PowerAgent

PowerIO is part of the PowerAgent community. The Python interface for PowerIO currently includes an optional MCP server exposing low-level conversion, summaries, JSON transport, matrix views, and file staging as tools.

pip install 'powerio[mcp]'
powerio-mcp

The PowerIO MCP server is currently being integrated as the low-level data exchange substrate for the MCP server bundle in PowerMCP. The PowerMCP bundle ships the same tool surface as PowerIO alongside a wide array of simulator servers, whose bridges ingest the transport directly.

GridFM (experimental)

PowerIO ships first-class support for the LF Energy open Grid Foundation Model (GridFM) project. In the command line:

powerio gridfm <case> -o <dir>

This writes the Parquet tables gridfm-datakit and gridfm-graphkit consume under <dir>/<case>/raw/; several compatible cases stack by scenario id.

The gridfm feature also supports reading a .parquet dataset back into a Network (read_gridfm_dataset in powerio-matrix, pio.read_gridfm in Python), so a perturbed training scenario or a GNN predicted state can be extracted and converted back out in any classical format:

powerio convert out/case14/raw --from gridfm --to matpower -o case14.m

The --from gridfm read functionality is currently lossy. What it recovers, what it drops, and the warnings contract are in the format fidelity guide. Improving gridfm read/write functionality is a key priority for the initial development of PowerIO.

Validation

The Rust test suite covers parsers, writers, format conversion, matrix builders, and normalization; the C ABI crate carries its own tests, and pytest covers the Python bindings. The benchmark validation suite compares selected outputs against PowerModels.jl, egret, ExaPowerIO.jl, and pandapower, and imports PowerIO's PyPSA CSV folders with PyPSA when the optional oracle is installed.

cargo fmt --all --check
cargo test
cargo test -p powerio-capi
cargo clippy --all-targets
pytest python/tests
bash benchmarks/run_validation.sh

Benchmark method, environment, and current tables are documented in benchmarks/RESULTS.md.

License

PowerIO is distributed under either of:

PowerIO logo

Project details


Download files

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

Source Distribution

powerio-0.2.0.tar.gz (302.8 kB view details)

Uploaded Source

Built Distributions

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

powerio-0.2.0-cp39-abi3-win_amd64.whl (2.7 MB view details)

Uploaded CPython 3.9+Windows x86-64

powerio-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

powerio-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.4 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

powerio-0.2.0-cp39-abi3-macosx_11_0_arm64.whl (2.3 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

powerio-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file powerio-0.2.0.tar.gz.

File metadata

  • Download URL: powerio-0.2.0.tar.gz
  • Upload date:
  • Size: 302.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for powerio-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1f0e9c2f4a740921039ab21faabde4d2c3ca558ce1edfd6345f287b9573321bb
MD5 d78da7c3319d6a0b9436c1d03defd19a
BLAKE2b-256 c4d52d1a80f1c1b5cd587081584c588adf4bf8b0b8366783aa14f002f472082c

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0.tar.gz:

Publisher: python.yml on eigenergy/powerio

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

File details

Details for the file powerio-0.2.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: powerio-0.2.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for powerio-0.2.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c011514d697f27f92b42d9c14f9c91f46ace68c4ff8b83c4706143e3f7b7df9a
MD5 1898209533e704c4db9c3dbf0cd052d7
BLAKE2b-256 b6641849d01aeaedbe358672b389173fd3e55890b9bf621f6a50d7cb1f32a8cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0-cp39-abi3-win_amd64.whl:

Publisher: python.yml on eigenergy/powerio

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

File details

Details for the file powerio-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for powerio-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 19b9c530b7cf66a2191358ca68c8813000a0c90fb511a8c18f2f75b1b1c6dcb3
MD5 0f73c4b6f6e8d8ddd5e4449631a7ba12
BLAKE2b-256 5980c8ba464c844f8f3178b86ceb67cf440c17f403dd34c216534af74361efd7

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python.yml on eigenergy/powerio

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

File details

Details for the file powerio-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for powerio-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d3a8f27b9bc990d3c7967ef35ce9c7422a27374be310bde8af1dd6f5505dbe0a
MD5 6d1cffa8e33bfe3c8f581f61cf4faa02
BLAKE2b-256 b11e48e225965120bbbb63180efe47ee0c3bd77dcec99e3fb97d1efe820f3991

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: python.yml on eigenergy/powerio

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

File details

Details for the file powerio-0.2.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for powerio-0.2.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05a6a49f495e47aa0c04b4c4a54d65343a5e1bcc0568d51cf5e11236ab017a23
MD5 8e8ab170ac8a407552e9d26beda34e5b
BLAKE2b-256 554055f7ab55a59e6c477efdaf4c1f14c5b2fbc55d6a0bf0ecdc164c0153489c

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: python.yml on eigenergy/powerio

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

File details

Details for the file powerio-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for powerio-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1be87b678d9f7db7de1841060c4ff00251a3fcb45e9cff1e4fe562622ac2be5c
MD5 d3ba49443a25b08f22c97f70d4978d02
BLAKE2b-256 71894bddffce6203010e27aa8e405029a7a6479015e06be7ec5b82c49ce43dae

See more details on using hashes here.

Provenance

The following attestation bundles were made for powerio-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: python.yml on eigenergy/powerio

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