Releases: eigenergy/powerio
Releases · eigenergy/powerio
v0.2.3
- Normalization:
Network::to_normalizedpreserves source bus ids instead of
renumbering surviving buses to dense 1-based ids. Dense row mapping remains
available throughIndexedNetworkand the C ABI table order.
What's Changed
Full Changelog: v0.2.2...v0.2.3
v0.2.2
- Display API:
parse_display_file/parse_display_bytesread display
artifacts separately from network cases. PowerWorld.pwdreturns
DisplayData::PowerWorld(PwdDisplay)in Rust and
DisplayData("powerworld", PwdDisplay(...))in Python.parse_file
remains Network only and points.pwdcallers at the display API. - PowerWorld AUX: name keyed complete case exports can resolve
BusName_NomVoltlabels for loads, shunts, generators, and branches. - PSS/E: the reader accepts comment headers, system wide records before
BEGIN BUS DATA, and v34 named branch records without misclassifying
long v33 branch rows. - MCP: add dedicated tools for PyPSA CSV folders and gridfm Parquet datasets.
- DC sensitivities: PTDF/LODF fall back to dense Gaussian elimination for
invertible indefinite grounded Laplacians.
What's Changed
- feat(mcp): add PyPSA CSV folder and gridfm Parquet read/write tools by @qian-harvard in #119
- ci: notify PowerIO.jl on release publish by @samtalki in #118
- feat: Add display parsing API by @samtalki in #120
Full Changelog: v0.2.1...v0.2.2
v0.2.1
Hardening fixes only; no API or ABI change (PIO_ABI_VERSION stays 3).
- MATPOWER: a crafted
gencostNCOST (e.g.1e20) overflowed the row
width arithmetic and panicked on every build profile, a denial of
service on untrusted input through the Rust API and the CLI. The width
now saturates and the row is rejected as aShortRowparse error.
Found by malformed input fuzzing. - C ABI: error and warning messages were clipped at a raw byte count,
which could split a multibyte UTF-8 character and hand the caller an
invalid string. Truncation now lands on a character boundary. - PowerWorld
.pwd: the reader's byte accessors returnOptioninstead
of indexing, so an out of range offset from a corrupt file rejects the
record instead of panicking. A corruption sweep test pins the
invariant; the differential oracle tests pass unchanged. powerio.h: a doc comment contained a literal*/that terminated
the generated block comment, so compiling with-DPIO_GRIDFMagainst
the shipped 0.2.0 header failed withunknown type name 'raw'.
What's Changed
Full Changelog: v0.2.0...v0.2.1
v0.2.0
- PowerWorld
.pwbbinary reader (#95, #102, #105): read only, covering
June 2016 through 2022 era exports under header constants 425, 483, 508,
537, 550, and 551, parity tested against same vintage.aux/.RAW/.m
siblings up to the 6717 bus Texas7k. Unsupported writer vintages are
rejected with the format constant named. - pandapower JSON converter (#106): read and write
pandapowerNetJSON.
Written trafo parameters reproduce the source Y_bus exactly through
pandapower 3.x's transformer model, ZIP load columns go out in both the
<= 3.1 and >= 3.2 namings, and CI validates the converter against
pandapower itself over the vendored fixtures. - PyPSA CSV folder converter (#106): read and write the static network
CSV folder, CI validated against PyPSA over the vendored fixtures.
Folders parse throughparse_file(..., "pypsa-csv"), auto-detected for
a directory holdingnetwork.csv; the CLI takes--from pypsa-csvand
--to pypsa-csv -o <dir>. - PowerWorld
.pwddisplay reader (#102): substation diagram coordinates,
matched 1-1 against the aux substations on every probed save with a same
vintage aux (the v19 resave matches 1248/1250 against the published
case, a vintage skew). - Read fidelity channel (#106):
parse_file/parse_strreturn
Parsed { network, warnings }, so what a reader cannot carry is
itemized instead of dropped silently. Python exposes
Network.read_warningsand the MCP tools report it; the C ABI gains
pio_parse_warningsandpio_write_pypsa_csv_folder(additive, ABI
version stays 3). - Full
.auxfidelity (#95): all three field naming generations through
Simulator 21+, validated against the vendored ACTIVSg200 set. docs/powerworld.mdrecords the decode evidence, mapping notes, and the
coverage matrix the corpus tests assert.
What's Changed
- feat(powerworld): full aux fidelity, .pwb reader, ACTIVSg validation by @samtalki in #95
- feat(powerworld): 2019+ era .pwb decode, table search at speed, .pwd substation coordinates by @samtalki in #102
- feat(powerworld): every Texas7k save decodes; the 2021 era record layouts and headers 483 through 551 by @samtalki in #105
- issue-47 by @qian-harvard in #106
- release: 0.2.0 by @samtalki in #108
- fix: rename powerworld/aux.rs, a Windows-reserved filename that broke release checkout by @samtalki in #110
Full Changelog: v0.1.1...v0.2.0
v0.1.1
- File extension detection is case-insensitive (#97, #101):
parse_file
accepts.RAW/.M/.JSON/.AUXand any mixed case alongside the
lowercase forms, and the CLI batch discovery and TUI file browser find
such files too. Reported by @jd-foster. - MCP server error hardening (#93): an unreadable input file surfaces as
the documented ValueError shape instead of a rawPermissionError, with
defensive guards on the JSON load and matrix dispatch paths.
What's Changed
- Add Claude Code GitHub Workflow by @samtalki in #94
- fix: make file extension detection case-insensitive by @samtalki in #101
- fix(mcp): unreadable files keep the ValueError shape; harden error mapping by @samtalki in #93
- release: 0.1.1 by @samtalki in #103
Full Changelog: v0.1.0...v0.1.1
v0.1.0
- gridfm read path (#70):
read_gridfm_dataset/read_gridfm_scenarios/
gridfm_base_caseinpowerio-matrix,pio_read_gridfm/
pio_gridfm_scenario_idsin the C ABI behind--features gridfm, and
powerio.read_gridfm/read_gridfm_scenariosin Python. Release tarballs
now build the C ABI with the gridfm feature, so the symbols ship to the
Julia bindings. convert_str(#88): in-memory conversion through the hub in Rust and
Python; the MCP server's inline conversion no longer stages temp files.
Closes #66.- The MCP server grows from two tools to eight (#90):
parse_case,
normalize_case, andcase_to_jsonemit the JSON transport,
compute_matrixreturns nine sparse kinds in COO form,dense_view
returns the dense table view, andsave_casewrites converted cases to
disk;convert_caseandcase_summaryare unchanged. - Docs (#92): Pages landing page with the released/development split, guide
links, and the logo; the crate homepage points at the docs site; release
drafts carry the CHANGELOG section instead of a bare title.
What's Changed
- docs: lead the crate doc with all five formats by @samtalki in #76
- fix(py): pack license files into the sdist; dispatchable publish; draft releases by @samtalki in #79
- ci: bump actions off Node 20 by @samtalki in #80
- ci: publish the library crates to crates.io on release by @samtalki in #81
- ci: pin crates-io-auth-action to v1.0.4 for Node 24 by @samtalki in #83
- feat(gridfm): read a gridfm Parquet dataset back into a Network (#60) by @cameronkhanpour in #70
- feat: in-memory convert_str through the hub, Python bindings, and the MCP server by @samtalki in #88
- feat: upstream the full PowerMCP tool surface into powerio.mcp.server by @samtalki in #90
- docs + release prep: landing page, 0.1.0 version bump, gridfm tarballs, README trim by @samtalki in #92
Full Changelog: v0.0.1...v0.1.0
v0.0.1
powerio v0.0.1 — C ABI 3