gspx is a Rust crate for sparse graph signal processing. It provides fast
implementations of graph convolution using rational kernel fitting and
Chebyshev polynomial approximation. Supports dynamic graphs for applications
with a changing network topology.
Designed around large sparse networks such as power systems, but the API works with any sparse Laplacian.
License: GPL-3.0-only
MSRV: Rust 1.85
[dependencies]
gspx = "0.1"Load a Laplacian from a .mat file and filter:
use gspx::{StaticConvolver, impulse, load_laplacian};
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let laplacian = load_laplacian(Path::new("graph.mat"))?;
let signal = impulse(&laplacian, 0, 1)?;
let mut convolver = StaticConvolver::new(laplacian)?;
let filtered = convolver.bandpass(signal.view(), &[0.25, 1.0, 4.0], 2)?;
Ok(())
}Other loaders: load_signal for .mat signal matrices, load_ply_laplacian
and load_ply_xyz for PLY meshes.
Filtering APIs accept 1D signals (n_vertices,) or 2D matrices
(n_vertices, n_signals). For SGMA the signal matrix is
(n_vertices, n_times) and the time vector length must match n_times.
The repository includes runnable examples under examples/. Larger example
Laplacians and meshes live under resources/library and are not packaged into
the published crate.
use gspx::{Dataset, ExampleData, GraphKind, KernelPreset};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let data = ExampleData::from_dir("resources/library")?;
let texas = data.graph(Dataset::Texas, GraphKind::Delay)?;
let coords = data.coords(Dataset::Texas)?;
let kernel = data.vf_kernel(KernelPreset::ModifiedMorlet)?;
Ok(())
}cargo run --example basic_static_filters
cargo run --example basic_dynamic_topology
cargo run --example basic_chebyshev
cargo run --example basic_vf_fit
cargo run --example basic_sgma
cargo run --example basic_resource
cargo run --example basic_local_filesperf_core measures end-to-end filtering calls with Criterion. Each value is
the mean time in milliseconds for one deterministic real N x 1 signal. Exact
filters use one scale ([1.0]) and lowpass/bandpass use order 1.
Real power-grid Laplacians from resources/library. No branch edits are
applied between dynamic calls, isolating filtering cost.
| Graph | N | Static (ms) | Dynamic (ms) | ||||
|---|---|---|---|---|---|---|---|
| Lowpass | Bandpass | Highpass | Lowpass | Bandpass | Highpass | ||
| Hawaii | 37 | 0.00051 | 0.00101 | 0.00054 | 0.00051 | 0.00118 | 0.00053 |
| WECC | 240 | 0.00179 | 0.00344 | 0.00169 | 0.00171 | 0.00359 | 0.00195 |
| Texas | 2k | 0.01704 | 0.03621 | 0.01754 | 0.01742 | 0.03490 | 0.01720 |
| East | 16k | 1.63247 | 3.66904 | 1.42601 | 1.26126 | 2.91676 | 0.96470 |
| EastWest | 65k | 2.09393 | 3.60965 | 1.53460 | 2.02737 | 3.35085 | 1.74977 |
| USA | 82k | 2.02103 | 4.04234 | 1.45063 | 1.62788 | 3.88886 | 1.52146 |
Exact filtering on 65k–82k nodes stays in the low-single-digit millisecond range. Structure matters as much as node count.
| Graph | N | Constructor (ms) | Lowpass (ms) |
|---|---|---|---|
Texas |
2k |
0.00286 |
0.01713 |
East |
16k |
0.76098 |
1.65513 |
EastWest |
65k |
0.77505 |
2.02311 |
USA |
82k |
0.80452 |
2.00556 |
| Operation | Time (ms) |
|---|---|
Warmed add_branch_once |
1.78406 |
bandpass_one after 1 update |
5.22890 |
bandpass_one after 10 updates |
7.25095 |
bandpass_one after 50 updates |
19.39280 |
- Targets Linux, macOS, and Windows
- Sparse shifted solves use SuiteSparse-backed LDL factorization via
sprs-ldl - The published crate does not include repository example datasets
If you use gspx for research, cite the associated HICSS paper.
@inproceedings{lowery-gspx-2026,
title={Using Spectral Graph Wavelets to Analyze Large Power System Oscillation Modes},
author={Lowery, Luke and Baek, Jongoh and Birchfield, Adam},
year={2026}
}The same citation metadata is also available in CITATION.cff.
- Python
sgwt: github.com/lukelowry/sgwt - Python docs: sgwt.readthedocs.io
- Julia: github.com/lukelowry/SpectralGraphWavelet.jl
- SuiteSparse: github.com/DrTimothyAldenDavis/SuiteSparse
- Synthetic grid cases: electricgrids.engr.tamu.edu
- Author: lukelowry.github.io
- Google Scholar: scholar.google.com/citations
