Skip to content

Releases: eigenergy/powerio

v0.2.3

15 Jun 02:41

Choose a tag to compare

  • Normalization: Network::to_normalized preserves source bus ids instead of
    renumbering surviving buses to dense 1-based ids. Dense row mapping remains
    available through IndexedNetwork and the C ABI table order.

What's Changed

  • Preserve source bus IDs in normalized networks by @samtalki in #122

Full Changelog: v0.2.2...v0.2.3

v0.2.2

14 Jun 20:15
dc90c3f

Choose a tag to compare

  • Display API: parse_display_file / parse_display_bytes read display
    artifacts separately from network cases. PowerWorld .pwd returns
    DisplayData::PowerWorld(PwdDisplay) in Rust and
    DisplayData("powerworld", PwdDisplay(...)) in Python. parse_file
    remains Network only and points .pwd callers at the display API.
  • PowerWorld AUX: name keyed complete case exports can resolve
    BusName_NomVolt labels 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

Full Changelog: v0.2.1...v0.2.2

v0.2.1

12 Jun 19:44
966fa9b

Choose a tag to compare

Hardening fixes only; no API or ABI change (PIO_ABI_VERSION stays 3).

  • MATPOWER: a crafted gencost NCOST (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 a ShortRow parse 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 return Option instead
    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_GRIDFM against
    the shipped 0.2.0 header failed with unknown type name 'raw'.

What's Changed

Full Changelog: v0.2.0...v0.2.1

v0.2.0

12 Jun 02:00
ce59909

Choose a tag to compare

  • PowerWorld .pwb binary 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 pandapowerNet JSON.
    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 through parse_file(..., "pypsa-csv"), auto-detected for
    a directory holding network.csv; the CLI takes --from pypsa-csv and
    --to pypsa-csv -o <dir>.
  • PowerWorld .pwd display 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_str return
    Parsed { network, warnings }, so what a reader cannot carry is
    itemized instead of dropped silently. Python exposes
    Network.read_warnings and the MCP tools report it; the C ABI gains
    pio_parse_warnings and pio_write_pypsa_csv_folder (additive, ABI
    version stays 3).
  • Full .aux fidelity (#95): all three field naming generations through
    Simulator 21+, validated against the vendored ACTIVSg200 set.
  • docs/powerworld.md records 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

11 Jun 08:54
4a26329

Choose a tag to compare

  • File extension detection is case-insensitive (#97, #101): parse_file
    accepts .RAW/.M/.JSON/.AUX and 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 raw PermissionError, 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

10 Jun 21:17
110e04a

Choose a tag to compare

  • gridfm read path (#70): read_gridfm_dataset / read_gridfm_scenarios /
    gridfm_base_case in powerio-matrix, pio_read_gridfm /
    pio_gridfm_scenario_ids in the C ABI behind --features gridfm, and
    powerio.read_gridfm / read_gridfm_scenarios in 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, and case_to_json emit the JSON transport,
    compute_matrix returns nine sparse kinds in COO form, dense_view
    returns the dense table view, and save_case writes converted cases to
    disk; convert_case and case_summary are 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

10 Jun 02:50
db944af

Choose a tag to compare

powerio v0.0.1 — C ABI 3