Core data models and I/O for the psforge power system analysis ecosystem. LLM-friendly design for AI-assisted analysis.
Project description
psforge-grid
Hub data model for the psforge power system analysis ecosystem
Core data models and I/O for power system analysis with LLM-friendly design.
Quick Start
pip install psforge-grid
from psforge_grid import System
# Load from any supported format
system = System.from_raw("ieee14.raw") # PSS/E RAW
system = System.from_matpower("case14.m") # MATPOWER
system = System.from_pop("WEST10peak.pop") # CPAT .pop
system = System.from_dyna("model.dyna") # CPAT .dyna
system = System.from_dss("network.dss") # OpenDSS
system = System.from_json("ieee14.psfg.json") # psforge JSON
system = System.from_file("case14.m") # Auto-detect
# Export to any format
system.to_raw("output.raw")
system.to_matpower("output.m")
system.to_json("output.psfg.json") # Human/LLM-friendly
system.to_file("output.m") # Auto-detect
# Explore the system
print(f"Buses: {len(system.buses)}, Branches: {len(system.branches)}")
print(system.to_summary())
# Or use the CLI
psforge-grid info ieee14.raw
psforge-grid show case14.m buses -f json
Why psforge-grid?
| Feature | psforge-grid | Others |
|---|---|---|
| LLM-friendly output | Built-in JSON/summary formats | Manual formatting |
| Educational design | Rich docstrings, clear naming | Varies |
| Type hints | Complete type annotations | Often missing |
| CLI included | Yes, with multiple output formats | Usually separate |
| Multi-format I/O | 7 formats: RAW, MATPOWER, CPAT, OpenDSS, JSON | Usually single format |
Overview
psforge-grid serves as the Hub of the psforge ecosystem, providing:
- Common data classes (
System,Bus,Branch,Generator,GeneratorCost,Load,Shunt) - Parsers & Writers for 7 formats (see Supported Formats)
- Factory pattern:
ParserFactory/WriterFactoryfor format-agnostic I/O - Scenario loading: Base case + differential modifications for N-1 / parametric studies
- OPF data support (
GeneratorCostwith polynomial and piecewise-linear cost models) - Zero-sequence impedance and generator machine parameters for fault/stability analysis
Supported Formats
| Format | Parse | Write | Extension | Round-trip |
|---|---|---|---|---|
| PSS/E RAW (v33/v34) | Yes | Yes (v33) | .raw |
Yes |
| MATPOWER | Yes | Yes | .m |
Yes |
| CPAT .pop (ZIP/XML) | Yes | Yes | .pop |
Yes |
| CPAT .dyna (cards) | Yes | Yes | .dyna |
Yes |
| OpenDSS | Yes | Yes | .dss |
Yes |
| psforge JSON | Yes | Yes | .psfg.json |
Yes |
| psforge Scenario | Yes | Yes | .psfg.json |
- |
PSS/E RAW format details
PSS/E RAW
The parser supports core power flow data for AC power flow analysis:
| Section | v33 | v34 | Notes |
|---|---|---|---|
| Case Identification | Yes | Yes | Base MVA, system info |
| Bus Data | Yes | Yes | All bus types (PQ, PV, Slack, Isolated) |
| Load Data | Yes | Yes | Constant power loads |
| Fixed Shunt Data | Yes | Yes | Capacitors and reactors |
| Generator Data | Yes | Yes | P, Q, voltage setpoint, Q limits |
| Branch Data | Yes | Yes | Transmission lines |
| Transformer Data | Yes | Yes | Two-winding, magnetizing admittance, is_xfmr flag |
Not yet supported: Area/Zone/Owner Data, DC lines, FACTS, Switched Shunts, Three-winding Transformers.
Test data sources:
- IEEE 9-bus (v34): GitHub - todstewart1001
- IEEE 14-bus (v33): GitHub - ITI/models
- IEEE 118-bus (v33): GitHub - powsybl
MATPOWER format details
MATPOWER
Supports MATPOWER .m files, including pglib-opf benchmark cases.
| Section | Notes |
|---|---|
| Bus Data (13 columns) | All bus types, Vmin/Vmax for OPF |
| Generator Data (10 columns) | Pmin/Pmax, Qmin/Qmax |
| Branch Data (13 columns) | Including angmin/angmax for OPF |
| Generator Cost Data | Polynomial (model=2) and piecewise-linear (model=1) |
system = System.from_matpower("pglib_opf_case14_ieee.m")
for cost in system.generator_costs:
print(cost.to_description())
# "Generator Cost (polynomial, degree 2): 0.0430 * P^2 + 20.00 * P + 0.00"
CPAT format details (.pop / .dyna)
CPAT
Supports two CPAT formats for IEEJ standard model systems.
.pop format (recommended): CPAT-GUI native project file (ZIP archive + XML).
| Feature | Status | Notes |
|---|---|---|
| System data (pnsd) | Yes | Nodes, branches, generators, loads |
| Generator machine data | Yes | G1-G5 card fields (Xd, Xd', Xd'', etc.) |
| Zero-sequence data | Yes | Branch and generator zero-sequence impedances |
.dyna card format: Legacy Fortran fixed-column (80-character) cards.
| Card Type | Description |
|---|---|
| DATA | System name, base MVA, frequency |
| T / X / N | Transmission lines / Transformers / Nodes |
| G1-G5 | Generator machine parameters |
OpenDSS format details
OpenDSS
Supports OpenDSS .dss script files via opendssdirect.py.
DSSWriter converts per-unit → physical units:
| System Element | OpenDSS Element |
|---|---|
| Swing bus | New Circuit (Vsource) |
| Branch (line) | New Line |
| Branch (transformer) | New Transformer |
| Generator | New Generator |
| Load / Shunt | New Load / New Capacitor / New Reactor |
Fault study mode (write_fault_study()): Y-circuit transformer model with Yg-Delta grounding for zero-sequence analysis.
DSSParser compiles .dss files with OpenDSS and extracts data via API.
psforge JSON format details (.psfg.json)
psforge JSON
Human/LLM-friendly native format with explicit metadata, distinct from pglib-uc JSON.
- Extension:
.psfg.json - Metadata:
"format": "psforge-grid","version": "1.0" - Field names: snake_case with unit suffixes (
_pu,_mw,_kv) - Compact output:
Nonefields omitted by default
# Export / Import
system.to_json("ieee14.psfg.json")
system = System.from_json("ieee14.psfg.json")
# Include all fields (with null values)
system.to_json("full.psfg.json", omit_none=False)
Scenario loading (base case + modifications)
Define N-1 contingencies or parametric studies with minimal data:
from psforge_grid.io import load_scenarios, write_scenario
# Define scenarios
write_scenario(
"contingencies.psfg.json",
base_case="ieee14.psfg.json",
scenarios=[
{
"name": "N-1_Line_1-5",
"modifications": [
{"target": "branches", "match": {"from_bus": 1, "to_bus": 5},
"set": {"status": 0}}
]
},
],
)
# Load: returns {"base": System, "N-1_Line_1-5": System, ...}
scenarios = load_scenarios("contingencies.psfg.json")
LLM Affinity Design
"Pickaxe in the Gold Rush" - psforge is designed for seamless LLM integration.
| Feature | Description |
|---|---|
| Explicit Units | Field names include units (voltage_pu, power_mw) |
| Semantic Status | Enum-based status annotations (VoltageStatus.LOW) |
| Self-Documenting | Rich docstrings explaining physical meaning |
| to_description() | Human/LLM-readable output methods |
bus = system.get_bus(14)
print(bus.to_description())
# Output: "Bus 14 (LOAD_BUS): 13.8 kV, PQ type"
CLI for LLM Integration
psforge-grid info ieee14.raw # Table format
psforge-grid info ieee14.raw -f json # JSON for API/LLM
psforge-grid info ieee14.raw -f summary # Compact for tokens
psforge-grid show ieee14.raw buses -f json
psforge-grid validate ieee14.raw --strict
Output Formats: table (default), json, summary, csv
See CLAUDE.md for detailed AI development guidelines.
Installation
pip install psforge-grid
# Or install from source
pip install -e .
Development
See docs/development.md for full setup instructions (pre-commit hooks, editor config, etc.).
pip install -e ".[dev]" # Install dev dependencies
pytest tests/ -v # Run tests
ruff check src/ tests/ # Lint
mypy src/ # Type check
psforge Ecosystem (Hub & Spoke Architecture)
┌──────────────────────┐
│ psforge-grid │
│ (Hub: Data & I/O) │
└──────────┬───────────┘
│
┌─────────────┬───────────┼───────────┬─────────────┐
│ │ │ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼─────┐ ┌───▼────┐ ┌────▼────┐
│ psforge │ │ psforge │ │ psforge- │ │psforge-│ │ psforge │
│ -flow │ │ -fault │ │stability │ │schedule│ │ -turbo │
│ (Power │ │ (Fault │ │(Transient│ │ (Unit │ │ (C++ │
│ Flow) │ │Analysis)│ │Stability)│ │Commit.)│ │ Engine) │
└─────────┘ └─────────┘ └──────────┘ └────────┘ └─────────┘
| Package | Description | Status |
|---|---|---|
| psforge-grid (this) | Core data models, parsers, and CLI | Active |
| psforge-flow | AC power flow (Newton-Raphson) | Active |
| psforge-fault | Short-circuit fault analysis | Active |
| psforge-stability | Transient stability analysis | Planned |
| psforge-schedule | Unit commitment optimization | Planned |
| psforge-turbo | High-performance C++ engine (Phase 2) | Frozen |
All packages are developed and maintained by Manabe Lab LLC.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Run tests (
pytest tests/) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CLAUDE.md for AI development guidelines.
License
MIT License - see LICENSE for details.
Developed by Manabe Lab LLC
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file psforge_grid-0.5.0.tar.gz.
File metadata
- Download URL: psforge_grid-0.5.0.tar.gz
- Upload date:
- Size: 128.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7cc2bb5a6225c10b717af0ce63570d27d0611a7ef393ec11a46bbd266ec8f08c
|
|
| MD5 |
573915678bff3a1becd4d78774bc42e7
|
|
| BLAKE2b-256 |
211cc9d34a02e78a93ea1f18d916e751a1dce4e32fbb3e90f069b6871bab9356
|
Provenance
The following attestation bundles were made for psforge_grid-0.5.0.tar.gz:
Publisher:
publish.yml on manabelab/psforge-grid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
psforge_grid-0.5.0.tar.gz -
Subject digest:
7cc2bb5a6225c10b717af0ce63570d27d0611a7ef393ec11a46bbd266ec8f08c - Sigstore transparency entry: 1107160317
- Sigstore integration time:
-
Permalink:
manabelab/psforge-grid@229ff9fce1335f39d00a2faabd2ddbfd5fe847d2 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/manabelab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@229ff9fce1335f39d00a2faabd2ddbfd5fe847d2 -
Trigger Event:
release
-
Statement type:
File details
Details for the file psforge_grid-0.5.0-py3-none-any.whl.
File metadata
- Download URL: psforge_grid-0.5.0-py3-none-any.whl
- Upload date:
- Size: 118.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd90878e9609a70312fb44880209d2f8fc892834899cb3ae7a391883f89b414c
|
|
| MD5 |
d9f693860227c1cffed472923d84440f
|
|
| BLAKE2b-256 |
8f4317c636f3115fc0a1cb178b3cb5cdab0172fed96561b2b1a3c9e590e1efce
|
Provenance
The following attestation bundles were made for psforge_grid-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on manabelab/psforge-grid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
psforge_grid-0.5.0-py3-none-any.whl -
Subject digest:
bd90878e9609a70312fb44880209d2f8fc892834899cb3ae7a391883f89b414c - Sigstore transparency entry: 1107160319
- Sigstore integration time:
-
Permalink:
manabelab/psforge-grid@229ff9fce1335f39d00a2faabd2ddbfd5fe847d2 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/manabelab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@229ff9fce1335f39d00a2faabd2ddbfd5fe847d2 -
Trigger Event:
release
-
Statement type: