- [07/2026] Released v1.1.0 on PyPI with the latest features and performance improvements.
- [04/2026] PluRel is accepted to ICML 2026!
PluRel is an open-source library for synthesizing diverse relational and tabular data using Structural Causal Models (SCMs). It is the reference implementation for the PluRel paper.
Note
Pretraining models on PluRel data (preprocessing, checkpoints, inference with Relational Transformer) is covered in examples/relational_transformer/.
To use PluRel as a library (requires Python 3.12+):
pip install plurelFor development and testing, set up the full environment with pixi.
# setup pixi environment
$ pixi install
# Run tests
$ pixi run pytest
# Lint and format code
$ pixi run ruff check .
$ pixi run ruff format .
# Install pre-commit hooks
$ pixi run pre-commit install- The
SyntheticDatasetclass can be used to create relbench compatible dataset objects. With acache_dirset,get_db()writes the dataset inrelbenchformat (manifest.yaml+db/*.parquet), ready forrelbench.load.load_dataset. - It only requires a
seedand aConfigobject that containsdatabase,scmanddaglevel params for sampling. See example below.
from plurel import SyntheticDataset, Config
# create relbench compatible dataset
dataset = SyntheticDataset(seed=0, config=Config())
# create database which can be cached via relbench APIs
db = dataset.make_db()The Config class controls all aspects of synthetic database generation through three parameter groups:
| Parameters | Description |
|---|---|
DatabaseParams |
Table layout (BarabasiAlbert, ReverseRandomTree, WattsStrogatz, Layered), number of tables, row counts, column counts, timestamp ranges, and column post-processing (transforms, zero inflation, NaN rate). |
SCMParams |
SCM graph layouts, column types, MLP initialization, activation functions, noise distributions, and time-series trend/cycle parameters. |
DAGParams |
DAG-specific parameters like edge dropout, in-degree limits, and rewiring probabilities for different graph types. |
from plurel import Config, DatabaseParams, SCMParams
config = Config(
database_params=DatabaseParams(num_tables_choices=Choices(kind="range", value=[5, 10])),
schema_file="path/to/schema.sql", # optional: generate from SQL schema
cache_dir="~/.cache/relbench", # optional: cache generated databases
)We also provide a multiprocessing-based script to generate databases in parallel.
$ pixi run python scripts/synthetic_gen.py \
--seed_offset 0 \
--num_dbs 1000 \
--num_proc 16| Argument | Description |
|---|---|
--seed_offset |
Seed offset for database generation. DBs will be named plurel-<seed> (override with --db_prefix). |
--num_dbs |
Number of databases to generate. |
--num_proc |
Number of parallel processes (default: number of CPU cores). |
Note
See examples/generation/ for a notebook that synthesizes from a SQL schema.
If you find this work useful, please cite our paper:
@inproceedings{kothapalli2026plurel,
title={{PluRel:} Synthetic Data unlocks Scaling Laws for Relational Foundation Models},
author={Vignesh Kothapalli and Rishabh Ranjan and Valter Hudovernik and Vijay Prakash Dwivedi and Johannes Hoffart and Carlos Guestrin and Jure Leskovec},
booktitle={Forty-third International Conference on Machine Learning},
year={2026}
}If you use the architecture, training loop or sampler code, please also cite the Relational Transformer paper:
@inproceedings{ranjan2026relationaltransformer,
title={{Relational Transformer:} Toward Zero-Shot Foundation Models for Relational Data},
author={Rishabh Ranjan and Valter Hudovernik and Mark Znidar and Charilaos Kanatsoulis and Roshan Upendra and Mahmoud Mohammadi and Joe Meyer and Tom Palczewski and Carlos Guestrin and Jure Leskovec},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026}
}
