Recent Releases of PowerIO
PowerIO - v0.6.3
- Arrow matrix axes (#234): the C ABI Arrow export gains a table catalog and
dense matrix axis maps.pio_to_arrowexposesmatrix_busand
matrix_branchaxis tables alongside theybus,incidence,bprime, and
bdoubleprimeCOO tables, which carrypowerio.row_axis/powerio.col_axis
schema metadata so a consumer maps dense matrix rows and incidence columns
back to source bus and branch rows. Matrix rows are labeled with the
matrix_busaxis, which stays correct when 3-winding transformer star-point
lowering expands the bus set past the handle bus order. - FDPF matrices (#234):
bprime/bdoubleprimefollow MATPOWERmakeB
semantics, with self-loop handling and asymmetric Matrix Market writes pinned
by Rust, C ABI, and Python coverage. - Summary JSON (#234): the C ABI exposes balanced (
pio_summary_json) and
distribution summary JSON, so a binding can render network summaries without
materializing the full model payload. - Matrix Arrow export (#234): the numeric matrix export path fills Julia-owned
buffers directly for the copy-free fast path.
What's Changed
- [codex] Add Arrow catalog and matrix axes by @samtalki in https://github.com/eigenergy/powerio/pull/234
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.6.2...v0.6.3
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 17 days ago
PowerIO - v0.6.2
- Normalization (#210): angle bound clamping now keeps every repaired branch
interval ordered. One sided intervals wholly outside the supported window are
widened to the configured pad instead of producingangmin > angmax; Rust,
C ABI, and Python normalize option coverage pin the behavior. - Binding coverage (#185): the already shipped study block and distribution
graph projection now have C ABI and Python accessors. The remaining geo
binding symbols stay in the v0.6.3 follow through. - BMOPF diagnostics (#219): distribution conversions now carry structured
diagnostics alongside warning strings, and transformer export losses expose
stableEMIT.BMOPF.*codes for downstream tests and capability checks. - BMOPF transformer fidelity (#214, #215, #216, #217): OpenDSS fixed
transformer taps, center tap convention fields, delta_wye leakage referral,
and n_windingdelta_rollnow export directly in BMOPF form with regression
coverage against schema valid output and unaffected fixture byte identity. - BMOPF source fidelity (#218): per phase OpenDSS voltage sources on the same
bus merge into one BMOPFvoltage_sourcewhen their phase angles are
coherent; ambiguous, bounded, priced, or conflicting source banks stay split
with warnings. - Distribution capabilities (#213): the C ABI
distfeature exposes
pio_dist_capabilities_json, reporting the six BMOPF fidelity flags that
PowerIO.jl and downstream tools can probe at runtime. - Geographic fields (#180): balanced and distribution models now share typed
GeoMeta/LocationJSON shapes.Network.geo,Bus.location,
DistNetwork.geo, andDistBus.locationare optional and omitted when
absent. OpenDSS Buscoords and BMOPF longitude/latitude sideloads promote into
typed bus locations; OpenDSS writes a Buscoords sidecar when locations are
present, while BMOPF longitude/latitude output remains opt in and only emits
declared geographic coordinates. .pio.jsonmodel JSON: the balanced and multiconductor payload schema
versions move from1.0.0to1.1.0for the additive geographic fields.
The package metadata schema, C ABI version, and Python package surface stay
in the 0.6 compatibility band.- JSON strategy:
.pio.jsondocs now state that it is PowerIO's compiled
artifact, not a case format; payload schemas are for validating model JSON
inside.pio.jsondocuments;powerio-jsonremains supported, is deprecated
for CLI file handoffs, and is no longer shown in the PR conversion matrix.
What's Changed
- Keep angle bound clamp repairs ordered by @samtalki in https://github.com/eigenergy/powerio/pull/211
- Expose study and dist graph bindings by @samtalki in https://github.com/eigenergy/powerio/pull/212
- Emit structured BMOPF transformer diagnostics by @samtalki in https://github.com/eigenergy/powerio/pull/220
- Preserve fixed OpenDSS transformer taps in BMOPF export by @samtalki in https://github.com/eigenergy/powerio/pull/221
- Emit BMOPF center tap transformers in the BMOPF convention by @samtalki in https://github.com/eigenergy/powerio/pull/222
- Refer BMOPF delta_wye leakage to each winding base by @samtalki in https://github.com/eigenergy/powerio/pull/223
- Emit explicit delta_roll for BMOPF n_winding transformers by @samtalki in https://github.com/eigenergy/powerio/pull/224
- Merge split OpenDSS voltage sources in BMOPF export by @samtalki in https://github.com/eigenergy/powerio/pull/225
- Expose distribution capability flags through C ABI by @samtalki in https://github.com/eigenergy/powerio/pull/226
- Add typed geographic fields to network models by @samtalki in https://github.com/eigenergy/powerio/pull/227
- Prepare v0.6.2 release by @samtalki in https://github.com/eigenergy/powerio/pull/228
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.6.1...v0.6.2
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 19 days ago
PowerIO - v0.6.1
- CI: added wasm32 coverage for the core Rust crates (#186), external BMOPF
JSON Schema validation for emitted distribution documents (#192), and
generated.pio.json/ model JSON schema drift checks (#178). - Distribution fidelity (#197): OpenDSS and BMOPF writers preserve transformer
winding voltage bases, no load admittance, tap settings, neutral impedances,
and multi winding transformer structure. Roundtripped OpenDSS decks now run
through a solve oracle that checks voltage agreement, load voltage model
behavior, and neutral return handling. - Distribution DER mapping (#197): typed IBR and control profile data now round
trips through OpenDSSPVSystem/Generator/InvControland BMOPF
ibr/control_profilerecords, with warnings for unsupported control
details. .pio.jsondocuments (#181, #193): added the study block for replayable
balanced model edits, materialization helpers, deterministic uid stamping,
and balanced reader warnings as structured.pio.jsondiagnostics.- Normalization (#188): added an opt-in angle bound clamp pass with Rust, C ABI,
and Python entry points; existing normalization behavior is unchanged. - Distribution graph projection (#182): added a bus and terminal graph view for
DistNetwork, including transformers, open switches, and terminal metadata. - Matrix bindings (#190): added Arrow C ABI matrix exports as COO triplet tables
for Ybus, incidence, B', and B'', with C and Python golden coverage. - Sensitivities (#8): added sparse and iterative PTDF/LODF export paths with
drop tolerance metadata, while retaining the dense path as the small case
oracle. - Documentation (#191): standardized released docs, READMEs, and crate metadata
around.pio.jsondocument, model JSON, and metadata terminology.
powerio-pycontinues to inherit the workspace version; no separate Python
version bump is needed.
What's Changed
- Add wasm32 CI check by @samtalki in https://github.com/eigenergy/powerio/pull/198
- Preserve transformer neutral impedance by @samtalki in https://github.com/eigenergy/powerio/pull/199
- Add OpenDSS solve fidelity oracle by @samtalki in https://github.com/eigenergy/powerio/pull/200
- Map distribution IBR controls to OpenDSS by @samtalki in https://github.com/eigenergy/powerio/pull/201
- Validate emitted BMOPF JSON in CI by @samtalki in https://github.com/eigenergy/powerio/pull/202
- Clamp normalize angle bounds opt in by @samtalki in https://github.com/eigenergy/powerio/pull/203
- Add package study block diagnostics by @samtalki in https://github.com/eigenergy/powerio/pull/204
- Add distribution graph projection by @samtalki in https://github.com/eigenergy/powerio/pull/205
- Add C ABI matrix Arrow tables by @samtalki in https://github.com/eigenergy/powerio/pull/206
- Sparse PTDF and drop tolerance by @samtalki in https://github.com/eigenergy/powerio/pull/207
- Serve generated JSON Schemas by @samtalki in https://github.com/eigenergy/powerio/pull/208
- Prepare v0.6.1 release by @samtalki in https://github.com/eigenergy/powerio/pull/209
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.6.0...v0.6.1
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 19 days ago
PowerIO - v0.6.0
- Breaking (#175):
ElementRef.rowisOption<usize>, the honest form of the
0.5.1 wire semantics.Noneaddresses by identity alone (refs built with
by_source_uid); the private wire-presence shim (wire_row()) is gone, and
rowitself says whether the wire carried one. The.pio.jsonwire format
is unchanged. The other break collected in #175, keyed-object addressing for
multiconductor operating point updates, needs design and moves to the 1.0
window (#196). - C ABI: the package payload extraction inverses land as additive symbols (no
ABI version change; probe the symbols like the other feature surfaces):
pio_package_to_balanced_networkandpio_package_to_multiconductor_network
materialize an owned network handle from a parsed.pio.jsonpackage handle,
the inverses of thepio_package_from_*constructors. A handle built from a
payload retains no source text, so a same-format write is a fresh
serialization rather than a byte-exact echo; the multiconductor payload's
parse warnings ride along. - C ABI:
pio_to_json/pio_from_jsonare the function form of the balanced
model JSON (byte identical to thepowerio-jsonwriter); the format token
remains as a compatibility alias for file based workflows. This is the
additive half of #194; retiring the token waits for 1.0. - C ABI:
pio_dist_to_json/pio_dist_from_jsonserialize a distribution
handle to its model JSON and back in one call each: the same object a
.pio.jsondocument carries undermodel.multiconductor_network, without
the surrounding document. Bindings materialize element tables with this
instead of building a throwaway package; it is not a case format (the
converter, CLI, and inference do not know it), so BMOPF JSON remains the
distribution JSON exchanged with other tools. - C ABI:
pio_classify_strclassifies in-memory JSON by the same top level
markers the transmission parser's.jsonsniffing uses, and recognizes
.pio.jsonenvelopes:transmission:<format>,distribution:<format>,
package,ambiguous, orunknown, size-then-fill. Bindings can route a
bare.jsonbefore choosing a parser instead of matching error text. - The JSON classifier reports a
.pio.jsonenvelope as its own outcome
(routing::JsonClass), so every consumer handles it: the CLI, the Python
readers, and the Pythonclassify_json_textnow name the package surface
for an envelope instead of a generic cannot-infer error (or, for the Python
string reader, a MATPOWER syntax error). Envelope detection requires
model_kindto bebalancedormulticonductor, so a case document
carrying those key names with other values still classifies as a case, and
classification parses the document once. - Directed errors at the transmission boundary: a
.dsspath, a distribution
fromtoken (dss/pmd/bmopf), and a.pio.jsonenvelope handed to the
balanced parser now name the surface that reads them instead of a generic
unknown-format message.
What's Changed
- Document what the .pio.json format is and how it relates to BMOPF by @samtalki in https://github.com/eigenergy/powerio/pull/177
- Add design chapters for geographic data and the study block by @samtalki in https://github.com/eigenergy/powerio/pull/179
- Package payload inverses, JSON classifier entry point, directed boundary errors by @samtalki in https://github.com/eigenergy/powerio/pull/187
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.5.1...v0.6.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 20 days ago
PowerIO - v0.5.1
The .pio.json payload schema is declared and versioned independently of the envelope (payload_schema, payload_schema_version; envelope schema_version 0.1.1). Payload rows carry stable uid identities. Operating point updates resolve by identity, a present row is a consistency check, and unknown identities are rejected at materialization and by validation. Packages from 0.5.0 read unchanged.
Python table dicts expose uid. No C ABI signature changes. Docs are restructured and served at https://powerio.dev.
Details in CHANGELOG.md.
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by samtalki 20 days ago
PowerIO - v0.5.0
powerio-pkg:NetworkPackageis the one package type name (CompilerPackage
is gone); the Julia binding already leads withNetworkPackage. The.pio.json
format is unchanged.- Python API: the seven module level
package_*functions are replaced by the
powerio.Packagehandle class, which parses the envelope once and exposes
model_kind,operating_points(),materialize_operating_point(),
as_balanced()/as_multiconductor(),validate(),validation(),
diagnostics(), and the multiconductor to balanced preflight and lowering. .pio.jsonoperating points: the per pointlabelandduration_hoursfields
are gone;time_axis.labelsandtime_axis.duration_hours(indexed by
points[].index) are the one source of truth. Readers ignore the old fields.- Transmission formats: added GOC3 JSON input and Surge JSON read and write paths.
GOC3 packages lift source time series into.pio.jsonoperating_points,
and package APIs can materialize one point into a static package. - GOC3 reader fixes: branches with
additional_shuntkeep the line charging
(b/2per terminal added to the extra shunts, per the GO Challenge 3
formulation);ta_lb/ta_ubmap to anActiveFlowtransformer control
range instead of fabricatingangmin/angmaxbus angle limits; producers
and consumers honorinitial_status.on_statuslike every other record type;
object form section keys sort under a total order (mixed numeric and non
numeric keys no longer risk a sort panic). powerio-pkg: GOC3 operating point extraction now consumes the parser's own
document walking (device_rows,section,cost_atshared through a
bridge), so update row indices match the payload by construction, including
devices without auid. A failed extraction attaches a
READ.GOC3.OPERATING_POINTS_DROPPEDdiagnostic instead of silently
producing a static only package. Materialized packages clearpackage_id
(the parent id lives inorigin.parent_package_id).- PSS/E
.raw: revision aware record layouts for v34/v35 transformer winding
lines (twelve ratings,NODE), v35 generator records (NREG,BASLOD),
and v35 switched shunts (NREG, per block status triples), on both read and
write; the 2W/3W transformer split accepts float formKfields. The
case14_v34.raw/case14_v35.rawfixtures are regenerated in the genuine
layouts. - PSLF
.epcwriter: parallel loads and shunts on one bus get distinct ids
(extras["id"]preferred, positional fallback); the reader captures load,
shunt, and SVD ids intoextras["id"]so they survive cross format writes. - PowerWorld
.pwb: the table location search runs under a work budget, so a
crafted file fails with a read error instead of pinning a core for hours. - Surge JSON writer warns when named branch rating sets are dropped, like every
other lossy writer. - Writing a read only format (
goc3-json) returns the new
Error::WriteUnsupportedinstead of a misleadingUnknownFormat. - C ABI: the panic guard now covers index construction in the parse entry
points;pio_package_validatedocuments its exclusive access requirement
(the one nonconstentry point) and the header preamble scopes the
concurrent read guarantee accordingly;PioDistNetworkgains the same
compile timeSend + Syncassertion as the other handles. SourceFormat::name()is the one source format name mapping; the package,
CLI, and Python copies are gone.
What's Changed
- draft: v0.5.0/v1.0.0-alpha - prepare IR structs for stable construction by @samtalki in https://github.com/eigenergy/powerio/pull/169
- Add package operating points, GoC3, and Surge JSON support by @samtalki in https://github.com/eigenergy/powerio/pull/172
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.4.0...v0.5.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 22 days ago
PowerIO - v0.4.0
powerio-pkg:.pio.jsonreads now enforce the envelope compatibility rule:
same majorschema_versionvalues load, while incompatible major versions
fail before payload use. The mdBook schema page documents the rule.powerio-pkg: balanced package output now emits source maps for stable bus,
load, shunt, branch, and generator fields; validation diagnostics attach the
matching source reference where a map exists. Format folded fields use
mapping kinds such assplit, and defaulted fields are not marked as exact
source fields.- Converter tests now compare stable per element values across writable legacy
formats, not only counts and totals. PSLF export now warns when transformer
charging admittance is dropped. powerio-distBMOPF: OpenDSS fixed P/Q generators now emit as BMOPF
generator.*entries with pinned P/Q bounds instead of negativeload.*
entries. The old negative load warning is gone; generators without source
costs keep the existing cost 0 warning.- Python API: removed the one release
powerio.Caseand
powerio.dist.DistCasecompatibility aliases. Usepowerio.Network/
powerio.BalancedNetworkandpowerio.dist.MulticonductorNetwork/
powerio.dist.DistNetwork. - No C ABI rename in this migration slice:
PIO_ABI_VERSIONstays 4 and
PIO_DIST_ABI_VERSIONstays 1.
What's Changed
- [data] rich data model parity by @samtalki in https://github.com/eigenergy/powerio/pull/143
- [pkg] add .pio.json compiler package envelope by @samtalki in https://github.com/eigenergy/powerio/pull/156
- [codex] Add generator cost policy and package validation diagnostics by @samtalki in https://github.com/eigenergy/powerio/pull/154
- Consolidate docs into mdBook guide by @samtalki in https://github.com/eigenergy/powerio/pull/160
- Stabilize compiler package spine by @samtalki in https://github.com/eigenergy/powerio/pull/161
- Implement multiconductor lowering by @samtalki in https://github.com/eigenergy/powerio/pull/163
- Add MCP package transport by @samtalki in https://github.com/eigenergy/powerio/pull/162
- Add normalized solver table package metadata by @samtalki in https://github.com/eigenergy/powerio/pull/164
- [codex] Accept PSS/E Start of section markers by @samtalki in https://github.com/eigenergy/powerio/pull/165
- Add package C ABI surface by @samtalki in https://github.com/eigenergy/powerio/pull/166
- [codex] fix BMOPF generator export by @samtalki in https://github.com/eigenergy/powerio/pull/167
- [codex] prep v0.4.0 release by @samtalki in https://github.com/eigenergy/powerio/pull/168
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.3.3...v0.4.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 24 days ago
PowerIO - v0.3.3
- MCP server: unified the advertised tool surface to semantic verbs:
convert,save,summary,parse,normalize,matrix, anddisplay.
The tools route transmission cases, distribution cases, PyPSA CSV folders, and
gridfm datasets by format. Distributionparsereturns canonicalbmopf-json
as its serial transport; transmissionparsereturnspowerio-json.
summarynow has one canonical JSON schema across MCP and the CLI's new
powerio summarycommand. Gridfm is a format behindparse/save, not its
own MCP tool. PowerWorld.pwddisplay files parse throughdisplay, leaving
room for a future open display format without renaming the tool. Older case,
matrix, and PyPSA helper names stay as direct Python compatibility callables
for one release, but they are no longer advertised as MCP tools. - Python API: restored the undocumented
powerio.Case = Networkalias for one
release, but left it out of__all__and docs; remove it in 0.4.0. The
experimental distribution surface now usespowerio.dist.DistNetworkas
the primary name to match the nativeDistNetworkhub type, while the
exportedpowerio.dist.DistCase = DistNetworkalias stays for one release.
powerio.distis gated on the draft BMOPF schema (PIO_DIST_ABI_VERSION= 1)
and not yet under the stability guarantee. - No C ABI change:
PIO_ABI_VERSIONstays 4 andPIO_DIST_ABI_VERSIONstays 1,
and the matrix builders are unchanged. The native extension's internal pyclass
names changed (PyCase → PyNetwork,_DistCase → _DistNetwork) sorepr()
now renders the publicNetwork(...)/DistNetwork(...)form directly; a
rebuilt wheel is required.
What's Changed
- MCP: distribution + display tools; unified tool surface by @samtalki in https://github.com/eigenergy/powerio/pull/141
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.3.2...v0.3.3
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] 29 days ago
PowerIO - v0.3.2
powerio-distOpenDSS: grounding reactors written from a bus terminal to the
same bus's node 0 now type as shunts in BMOPF instead of staying untyped.
Impedance form reactors use the equivalent admittance matrix, so neutral
grounding resistors survive DSS to BMOPF conversion.powerio-distOpenDSS: delta capacitor and reactor banks now type as shunt
admittance matrices, including off diagonal branch terms, instead of being
dropped as untyped objects.- DSS writing now regenerates conductance bearing shunts as grounding reactors
and preserves delta shunts asconn=deltawhere the typed model identifies
them. - No core or distribution C ABI break;
PIO_ABI_VERSIONstays 4 and
PIO_DIST_ABI_VERSIONstays 1.
What's Changed
- Fix DSS shunts in BMOPF conversion by @samtalki in https://github.com/eigenergy/powerio/pull/140
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.3.1...v0.3.2
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - v0.3.1
- Parser warnings: PSS/E and PowerWorld
.auxparse warnings now surface
throughParsed::warningsand the C ABI'spio_warningspath instead of
living only in docs or writer warnings. - PSS/E: hardened record tokenization and continuation handling. Slash
characters inside quoted fields are no longer treated as comments; incomplete
transformer and two-terminal DC continuation records now error clearly instead
of consuming section terminators; transformer records with non-unitCW/CZ
now warn that impedance and turns values were read without conversion. - PSS/E: load ZIP components and v34/v35 load tail fields are retained in extras
and replayed on write. If typed loadp/qno longer match retained
PL/QL/IP/IQ/YP/YQ, the writer emits typed constant power and reports the
stale extras instead of replaying wrong source components. - PSS/E: quoted IDs, names, and HVDC names are sanitized before duplicate ID
allocation, so collisions created by replacing quotes or/are handled
deterministically and reported in conversion warnings. - Normalization: generator cost per-unit scaling now dispatches through explicit
cost models, and slack bus selection ignoresNaNgeneratorpmaxvalues
when choosing among candidate reference buses. - PSLF and PowerWorld AUX tokenization: quoted
/and//text is kept as data
rather than treated as continuation or comments. PowerWorld.auxnow reports
unmodeledDATAblocks as parse warnings while retaining source text for
same-format writeback. powerio-distOpenDSS: quoted comment markers are preserved in lexer values,
indented block comments are skipped, capacitor and reactor kvar shunts share
validation, reactors with kvar/kv map to typed shunts with negative
susceptance, and invalid shunt forms stay untyped with explicit warnings.powerio-distBMOPF: fixed OpenDSS generators with fixed P/Q setpoints now
encode as negative BMOPF loads with warnings. The vendored draft schema was
refreshed for multi-digit matrix keys, corrected$id, and nonnegative
switchi_max, so 10-conductor linecode output validates without the old
schema warning.- C distribution ABI v1 (
PIO_DIST_ABI_VERSION1): directpio_dist_*callers
get a separate version check; the supported one-shot conversion order is
(input, from, to, ...). - C ABI tests now reject the old target-before-source conversion order for both
pio_convert_*andpio_dist_convert_*, including the compiled C smoke test
againstpowerio.h. - C ABI hardening: unit tests pin every public
PIO_*macro, opaque typedef,
andpio_*prototype inpowerio.h; Cargo now checks Rust source/header
symbol parity; CI builds the no-default core ABI plus the release
arrow,gridfm,distfeature smoke test and C++ header/link sanity checks. - No core C ABI break;
PIO_ABI_VERSIONstays 4. No existing Rust or Python
API was removed or reordered.
What's Changed
- [codex] Harden parser tokenization and dist shunts by @samtalki in https://github.com/eigenergy/powerio/pull/138
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.3.0...v0.3.1
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - v0.3.0
- Distribution systems: new
powerio-distcrate for multi conductor unbalanced
networks. Reads OpenDSS and the PowerModelsDistribution engineering JSON, and
reads/writes the IEEE BMOPF Taskforce JSON (schema v0.0.1). First crates.io
release ofpowerio-dist. thanks @frederikgeth @deakinmt @matheusduartedm - PSS/E: read and write support for v34 and v35 alongside v33.
- GE PSLF: an
.epcwriter, with better interoperability between PSLF and PSS/E. - Transformers with three or more windings.
- C ABI v4 (
PIO_ABI_VERSION4): a smaller canonical surface designed so future
changes stay additive. Breaking ABI change in this release. - Memory safety hardening across the readers.
What's Changed
- v0.3.0 candidate: memory safety hardening + C ABI v4 by @samtalki in https://github.com/eigenergy/powerio/pull/116
- PSS/E v33/v34/v35, A PSLF
.epcwriter, closing model gaps, and network operations toolchain by @samtalki in https://github.com/eigenergy/powerio/pull/130 - feat: powerio-dist, a multiconductor distribution crate with dss/PMD/BMOPF converters by @samtalki and @frederikgeth in https://github.com/eigenergy/powerio/pull/82
- chore(deps): update bot workflows, PyO3, Arrow/Parquet stack, and remove transitive Thrift 0.17 by dependabot in https://github.com/eigenergy/powerio/pull/128
- feat(dist): typed grounding reactor support by @matheusduartedm in https://github.com/eigenergy/powerio/pull/137
- Release: v0.3.0 by @samtalki in https://github.com/eigenergy/powerio/pull/133
New Contributors
- @matheusduartedm made their first contribution in https://github.com/eigenergy/powerio/pull/137
- @frederikgeth made their first contribution in https://github.com/eigenergy/powerio/pull/82
- special thanks to @deakinmt for the thorough review on https://github.com/eigenergy/powerio/pull/82
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.2.4...v0.3.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - v0.2.4
- PSLF
.epc: read support for GE PSLF power flow cases, including.epc
extension inference andpslf/epcinput aliases. The reader is read only
and keeps source text plus warnings for sections outsideNetwork. - PowerWorld
.pwb: expanded binary reader coverage across older and newer
header constants, with stricter record probes, companion format parity checks,
and clearer rejection of unsupported vintages. - PowerWorld
.pwd: display parsing keeps the separate display API path and
retains the malformed input invariant: corrupt or truncated display files
return a structured error or a parsed display, not a panic. - No C ABI break;
PIO_ABI_VERSIONstays 3.
What's Changed
- Add PSLF EPC reader + Improve coverage of PW vintages by @samtalki in https://github.com/eigenergy/powerio/pull/125
- release: v0.2.4 by @samtalki in https://github.com/eigenergy/powerio/pull/127
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.2.3...v0.2.4
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
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
- Preserve source bus IDs in normalized networks by @samtalki in https://github.com/eigenergy/powerio/pull/122
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.2.2...v0.2.3
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - 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 https://github.com/eigenergy/powerio/pull/119
- ci: notify PowerIO.jl on release publish by @samtalki in https://github.com/eigenergy/powerio/pull/118
- feat: Add display parsing API by @samtalki in https://github.com/eigenergy/powerio/pull/120
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.2.1...v0.2.2
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - 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
- release: 0.2.1 by @samtalki in https://github.com/eigenergy/powerio/pull/117
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.2.0...v0.2.1
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - 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 https://github.com/eigenergy/powerio/pull/95
- feat(powerworld): 2019+ era .pwb decode, table search at speed, .pwd substation coordinates by @samtalki in https://github.com/eigenergy/powerio/pull/102
- feat(powerworld): every Texas7k save decodes; the 2021 era record layouts and headers 483 through 551 by @samtalki in https://github.com/eigenergy/powerio/pull/105
- issue-47 by @qian-harvard in https://github.com/eigenergy/powerio/pull/106
- release: 0.2.0 by @samtalki in https://github.com/eigenergy/powerio/pull/108
- fix: rename powerworld/aux.rs, a Windows-reserved filename that broke release checkout by @samtalki in https://github.com/eigenergy/powerio/pull/110
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.1.1...v0.2.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - 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 https://github.com/eigenergy/powerio/pull/94
- fix: make file extension detection case-insensitive by @samtalki in https://github.com/eigenergy/powerio/pull/101
- fix(mcp): unreadable files keep the ValueError shape; harden error mapping by @samtalki in https://github.com/eigenergy/powerio/pull/93
- release: 0.1.1 by @samtalki in https://github.com/eigenergy/powerio/pull/103
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.1.0...v0.1.1
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago
PowerIO - 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 https://github.com/eigenergy/powerio/pull/76
- fix(py): pack license files into the sdist; dispatchable publish; draft releases by @samtalki in https://github.com/eigenergy/powerio/pull/79
- ci: bump actions off Node 20 by @samtalki in https://github.com/eigenergy/powerio/pull/80
- ci: publish the library crates to crates.io on release by @samtalki in https://github.com/eigenergy/powerio/pull/81
- ci: pin crates-io-auth-action to v1.0.4 for Node 24 by @samtalki in https://github.com/eigenergy/powerio/pull/83
- feat(gridfm): read a gridfm Parquet dataset back into a Network (#60) by @cameronkhanpour in https://github.com/eigenergy/powerio/pull/70
- feat: in-memory convert_str through the hub, Python bindings, and the MCP server by @samtalki in https://github.com/eigenergy/powerio/pull/88
- feat: upstream the full PowerMCP tool surface into powerio.mcp.server by @samtalki in https://github.com/eigenergy/powerio/pull/90
- docs + release prep: landing page, 0.1.0 version bump, gridfm tarballs, README trim by @samtalki in https://github.com/eigenergy/powerio/pull/92
Full Changelog: https://github.com/eigenergy/powerio/compare/v0.0.1...v0.1.0
Energy Systems - Energy Data Accessibility and Integration
- Rust
Published by github-actions[bot] about 1 month ago