RINGS: Relevant Information in Node Features and Graph Structure. An evaluation framework for graph-learning based on first principles.
Project description
RINGS
No Metric to Rule Them All: Toward Principled Evaluations of Graph-Learning Datasets — ICML 2025.
RINGS is a perturbation framework for attributed graphs that lets you evaluate graph-learning datasets and models from first principles: apply structured perturbations, train as usual, and compare performance distributions with statistically rigorous tests.
Install
pip install uv
git clone https://github.com/aidos-lab/rings.git && cd rings
uv sync && source .venv/bin/activate
Quickstart
Drop RINGS evaluations into your GNN pipeline.
Keep your training loop. Wrap it with SeparabilityStudy to iterate perturbation × seed, record one scalar per run from your evaluator, and get a pairwise separability table back.
from rings import Original, EmptyGraph, RandomFeatures, CompleteFeatures
from rings.integrations import SeparabilityStudy
study = SeparabilityStudy(
perturbations={
"Original": Original(),
"EmptyGraph": EmptyGraph(),
"RandomFeatures": RandomFeatures(shuffle=True),
"CompleteFeatures": CompleteFeatures(max_nodes=max_nodes),
},
num_seeds=5,
comparator="ks", # or "wilcoxon"
alpha=0.05,
)
for name, transform, seed in study.runs():
perturbed = study.apply(base_dataset, transform)
score = train_and_eval(perturbed, seed=seed) # your code
study.record(name, score)
results = study.evaluate(n_permutations=1000)
# DataFrame: mode1, mode2, score, pvalue_adjusted, significant
PyTorch Lightning — attach SeparabilityCallback to your Trainer and it records the logged test_acc automatically:
import pytorch_lightning as pl
from rings.integrations import SeparabilityStudy, SeparabilityCallback
for name, transform, seed in study.runs():
pl.seed_everything(seed, workers=True)
dm = make_datamodule(study.apply(base_dataset, transform), seed=seed)
trainer = pl.Trainer(
max_epochs=20,
callbacks=[SeparabilityCallback(study, perturbation_name=name)],
)
trainer.fit(model, datamodule=dm)
trainer.test(model, datamodule=dm)
results = study.evaluate()
Custom evaluator (GraphBench, OGB, anything that returns a scalar): just pass the number to study.record(name, score).
Runnable examples
uv run -m examples.integrations.pyg
uv run --with lightning -m examples.integrations.lightning
uv run --with graphbench-lib -m examples.integrations.graphbench
Learn more
- Perturbations — node-feature and graph-structure transforms (
Original,EmptyGraph,RandomFeatures,CompleteFeatures,RandomConnectedGraph, …) - SeparabilityFunctor — pairwise distribution tests (KS, Wilcoxon) with permutation p-values and Bonferroni correction
- ComplementarityFunctor — metric-space alignment between node features and graph structure
- Integrations API — full reference for
SeparabilityStudyandSeparabilityCallback examples/— end-to-end scripts for separability, complementarity, and the three integration recipes
Citation
@inproceedings{coupette2025metric,
title = {No Metric to Rule Them All: Toward Principled Evaluations of Graph-Learning Datasets},
author = {Corinna Coupette and Jeremy Wayland and Emily Simons and Bastian Rieck},
booktitle = {Forty-second International Conference on Machine Learning},
year = {2025},
url = {https://openreview.net/forum?id=XbmBNwrfG5}
}
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 rings_evaluation-0.1.0.tar.gz.
File metadata
- Download URL: rings_evaluation-0.1.0.tar.gz
- Upload date:
- Size: 29.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91bdc1e5ab3aef318c9f2d2d1b02697ca12eff560406f0fe6c88675613475867
|
|
| MD5 |
ab7c6d7ed1a9347db1c5557d45e4e57f
|
|
| BLAKE2b-256 |
d0045ddde92dab465f5828a7e4bf73a26da35bea11d32b77022dffa4555e52f8
|
File details
Details for the file rings_evaluation-0.1.0-py3-none-any.whl.
File metadata
- Download URL: rings_evaluation-0.1.0-py3-none-any.whl
- Upload date:
- Size: 4.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee4d79e58e14ba0b074538c638ba08da6df65f91a17d677c418687ca4b164865
|
|
| MD5 |
7321530c8b01ff51ebe562cf80f4be63
|
|
| BLAKE2b-256 |
f4e77f4039451212689f8a5f9f99d5aae5cf5abbc008edda5aa83e1c69b6d1cb
|