Skip to main content
Seahorse logo

A benchmark and library for spatio-temporal point processes: 13 datasets, 28 model presets, one evaluation protocol with exact likelihoods and calibration. NeurIPS 2026.

PyPI DOI License Docs

The Seahorse paper is accepted at NeurIPS 2026 (Track on Evaluations and Datasets); preprint: arXiv:2607.01022.


| News | What's inside | Quick Start | Supported models | Datasets | CLI | Citation | License | Acknowledgment |


🗞️ News [Back to Top]

  • v1.0.0, the NeurIPS 2026 camera-ready release: corrected likelihood reporting, exact compensator-based evaluation and calibration, frozen campaigns and hash-verified datasets (changelog). pip install seahorse-stpp.
  • The Seahorse paper is accepted at NeurIPS 2026 (Track on Evaluations and Datasets). Preprint: arXiv:2607.01022.
More news

🧭 What's inside [Back to Top]

  • Models — 28 presets: 10 neural STPPs from the literature, 11 parametric and 5 statistical baselines, and dnsk/glide (table).
  • Datasets — the 13 benchmark datasets (10 real, 3 synthetic controls), the 3 legacy Neural-STPP splits and 3 further real datasets, on the Hugging Face Hub with pinned revisions and hash-verified splits (list).
  • Evaluation — next-event NLL with exact / quadrature / approximate labels; sampler-free calibration (time-rescaling PIT, threshold-weighted CRPS, spatial HPD-PIT) from the same compensator (seahorse.evaluation.v1).
  • Campaigns — frozen multi-seed campaigns: seahorse campaign compiles, verifies, runs, calibrates and reports them, with Slurm dispatch.

🚀 Quick Start [Back to Top]

pip install seahorse-stpp                 # pip install "seahorse-stpp[hpo]" adds Ray Tune HPO
from seahorse import AutoSTPP, PoissonGMM, load_jsonl

train = load_jsonl("dataset_root/train.jsonl")
val   = load_jsonl("dataset_root/val.jsonl")
test  = load_jsonl("dataset_root/test.jsonl")

model    = AutoSTPP(device="cpu")
baseline = PoissonGMM()

model.fit(train, val, test, epochs=50, batch_size=64)
scores  = model.evaluate(test)          # {"test_nll": ..., "mean_seq_nll": ...}
samples = model.predict_next(test, n_samples=32)

Released datasets load by short name (see Datasets):

from seahorse.data import load_released_dataset
splits = load_released_dataset("nyc_collisions")   # {"train": [...], "val": [...], "test": [...], "__provenance__": [...]}

Guides: Getting Started · Why Seahorse? · End-to-End Case Study · Predicting with Models

Development install from source

macOS / Linux:

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

Windows:

python -m venv .venv
.\.venv\Scripts\activate
pip install -e ".[dev]"

STPPRunner (lower-level) — YAML-configured runs on PyTorch Lightning:

from seahorse import STPPRunner

runner = STPPRunner.from_preset("auto_stpp")
result = runner.fit(train, val, test)   # returns RunResult
runner.save("/tmp/my_run/")

runner2 = STPPRunner.load("/tmp/my_run/")   # reloads config, normalisation and weights
# post-fit metrics: python -m seahorse evaluate metrics --run /tmp/my_run --data dataset_root/test.jsonl

🤖 Supported models [Back to Top]

Neural presets benchmarked in the paper:

No Venue Preset Paper Implementation
1 NeurIPS'23 auto_stpp Automatic Integration for Spatiotemporal Neural Point Processes PyTorch
2 L4DC'22 deep_stpp Neural Point Process for Learning Spatiotemporal Event Dynamics (DeepSTPP) PyTorch
3 ICLR'21 neural_jumpcnf / neural_attncnf Neural Spatio-Temporal Point Processes PyTorch
4 ICLR'21 njsde (alias neural_stpp_gmm) Neural Spatio-Temporal Point Processes: jump-ODE state model with the conditional-GMM spatial decoder (the preset id is historical; this is not Jia & Benson's Neural Jump SDE) PyTorch
5 ACM KDD'23 diffusion_stpp Spatio-temporal Diffusion Point Processes PyTorch
6 ICLR'22 nsmpp Neural Spectral Marked Point Processes PyTorch
7 arXiv smash Embedding Event History to Vector PyTorch
8 ICML'20 thp_gmm Transformer Hawkes Process PyTorch
9 KDD'16 rmtpp_gmm Recurrent Marked Temporal Point Processes PyTorch

Parametric baselines (closed-form likelihood): poisson_gmm · hawkes_gmm · selfcorrecting_gmm · poisson_cnf · hawkes_cnf · selfcorrecting_cnf · poisson_tvcnf · hawkes_tvcnf · selfcorrecting_tvcnf · static_hawkes · gaussian_poisson

Statistical presets (NumPy/SciPy, CPU, no gradient training): homogeneous_poisson · spatial_poisson · seasonal_poisson · hawkes_exp_gaussian · hawkes_omori_pareto

Available, not benchmarked in the paper: dnsk (DNSK+Barrier, Dong et al. ICLR'23) · glide (GLIDE, diffusion objective, no point-process NLL).

NLL labels: NSMPP and THP-GMM evaluate their density directly and integrate the compensator by numerical quadrature; SMASH and DSTPP report approximate values (sample-based estimates, not likelihood bounds). See the capability matrix.


📊 Datasets [Back to Top]

Seahorse reads any collection of JSONL event sequences. The canonical split layout is:

dataset_root/
  train.jsonl
  val.jsonl
  test.jsonl

Each line is one sequence:

{"times": [0.1, 0.4, 1.2], "locations": [[0.2, 0.4], [0.3, 0.8], [0.7, 0.1]]}

The datasets are released under the seahorse-stpp Hugging Face organisation (17 repositories: 16 real datasets and the synthetic controls) and load by short name with pinned revisions and card-hash verification:

from seahorse.data import load_released_dataset
splits = load_released_dataset("austin311")      # {"train": [...], "val": [...], "test": [...], "__provenance__": [...]}
  • Real-data benchmark (paper) — comcat_california, geonet_nz, austin311, nyc311, nyc_collisions, chicago_crime, la_crime, uber_nyc, plus the script-only seattle_fire911 and citibike_nyc.
  • Synthetic controls (paper) — synthetic (homogeneous Poisson, moving seasonal Poisson, gamma renewal).
  • Legacy Neural-STPP splits — earthquakes (USGS), covid (New York Times), citibike_legacy (script-only).
  • Released, not benchmarked in the paper — bold5000, us_wildfires, us_accidents.

The three script-only repositories cannot host their data under the source licences; they ship a rebuild script and the expected split hashes, and load_released_dataset(name, local_root=...) verifies a local rebuild against the card. Any other JSONL dataset on the Hugging Face Hub loads via --dataset owner/repo.

For the complete catalog see the Datasets Documentation.


💻 CLI [Back to Top]

Fit one model

python -m seahorse fit \
  --preset auto_stpp \
  --train dataset_root/train.jsonl \
  --val   dataset_root/val.jsonl \
  --test  dataset_root/test.jsonl \
  --out   runs/quickstart

Benchmark (multi-preset × multi-seed)

python -m seahorse bench \
  --presets auto_stpp deep_stpp njsde poisson_gmm \
  --splits_dir splits/ \
  --seeds 1 2 3 \
  --out runs/bench \
  --n_workers 4

HPO sweep (Ray Tune; pip install "seahorse-stpp[hpo]")

python -m seahorse tune \
  --config configs/auto_stpp_hpo.yaml \
  --train dataset_root/train.jsonl \
  --val   dataset_root/val.jsonl \
  --out   runs/hpo/best.yaml

The search space lives in the YAML's tuning: block ({min: .., max: ..} ranges and choice lists).

Frozen campaign (the paper's protocol; specs under experiments/campaign_2026/)

python -m seahorse campaign prepare --spec experiments/campaign_2026/spec_v1.json --out campaigns/v1
python -m seahorse campaign --help     # verify, preflight, run, evaluate, calibrate, report, slurm

📝 Citation [Back to Top]

If Seahorse supports your work, please cite the paper:

@inproceedings{aalaila2026seahorse,
  title     = {Seahorse: A Unified Benchmarking Framework for Spatiotemporal Event Modeling},
  author    = {Aalaila, Yahya and Vollmer, Sebastian and Gro{\ss}mann, Gerrit},
  booktitle = {Advances in Neural Information Processing Systems (NeurIPS 2026), Track on Evaluations and Datasets},
  year      = {2026},
  note      = {Preprint: arXiv:2607.01022}
}

To cite the software release, use the Zenodo concept DOI (it resolves to the latest version):

@software{seahorse2026,
  title   = {Seahorse: Unified Benchmarking for Spatio-Temporal Point Processes},
  author  = {Aalaila, Yahya and Gro{\ss}mann, Gerrit and Vollmer, Sebastian},
  year    = {2026},
  version = {1.0.0},
  doi     = {10.5281/zenodo.21078077},
  url     = {https://github.com/YahyaAalaila/seahorse},
  license = {Apache-2.0}
}

GitHub's Cite this repository button (from CITATION.cff) offers these entries in APA and BibTeX.


⚖️ License [Back to Top]

Seahorse is distributed under the Apache License 2.0. See LICENSE and NOTICE.

Licensing. Apache-2.0, except the CNF spatial decoder (seahorse/models/spatial_models/independent_cnf.py), which is adapted from neural_stpp and remains under CC BY-NC 4.0 (non-commercial). The vendored Hawkes source under seahorse/models/statistical/_hawkes_source/ is MIT.


🙏 Acknowledgment [Back to Top]

Funding. The authors received support from the Bundesministerium für Bildung und Forschung (BMBF) under Grant No. 01W23005 for the project EVENTFUL.

Contributors. Beyond the authors, we thank Ismail Drief and Raphael Sonabend-Friend for their contributions to the codebase and its early design.

Upstream implementations. Seahorse builds on the original implementations of the paper families it wraps. We thank the authors of AutoSTPP, DeepSTPP, Neural STPP, DiffusionSTPP, NSMPP, SMASH, THP, and RMTPP for releasing their code.

Metadata

Release files for seahorse-stpp 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for seahorse-stpp 1.0.0
File Size Uploaded Provenance
seahorse_stpp-1.0.0.tar.gz 918.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for seahorse-stpp 1.0.0
File Interpreter ABI Platform
seahorse_stpp-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.9 MB

Release files / seahorse_stpp-1.0.0.tar.gz

Download URL seahorse_stpp-1.0.0.tar.gz
Size 918.7 kB
Tags Source
SHA-256 checksum
How to use checksums
c723cb17b0e0667ba0f9a8d21bfb0a96ef124d5cb9a67af546fa316c8a622216
BLAKE2b-256 checksum
How to use checksums
01fdfa8b58d9a13a126ce950de2a8930fa12a27d025ea402a5d941fe3271bf06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / seahorse_stpp-1.0.0-py3-none-any.whl

Download URL seahorse_stpp-1.0.0-py3-none-any.whl
Size 946.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4d130f0e0522a42fe44389a8f53c95fd7b76472546e7f9816ad086a1ad1beff8
BLAKE2b-256 checksum
How to use checksums
b538e242b4f77e6a86ba0e8454714a8185b5a157b77a7cbb5ca23ade4fd255c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for seahorse-stpp 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for seahorse_stpp-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page