Skip to main content
SCOTT logo

SCOTT

Synthesizing Curvature Operations and Topological Tools

Maintainability GitHub contributors GitHub arXiv

SCOTT is a Python package for computing curvature filtrations for graphs and graph distributions. This repository accompanies our NeurIPS 2023 paper: Curvature Filtrations for Graph Generative Model Evaluation.

Our method introduces a novel way to compare graph distributions, avoiding the limitations of Maximal Mean Discrepancy (MMD), which has known drawbacks.

By combining discrete curvature on graphs with persistent homology, SCOTT provides expressive descriptors of graph sets that are:

  • Robust
  • Stable
  • Expressive
  • Compatible with Statistical Testing

The package is highly adaptable, offering several options for user customization, including different curvature computation methods and diverse metrics for comparing persistent homology outputs.

Cite Us

If you find this package useful in your research, please consider citing:

@misc{southern2023curvature,
      title={Curvature Filtrations for Graph Generative Model Evaluation},
      author={Joshua Southern and Jeremy Wayland and Michael Bronstein and Bastian Rieck},
      year={2023},
      eprint={2301.12906},
      archivePrefix={arXiv},
      primaryClass={cs.LG}
}

Installation

Using pip

Install curvature-filtrations via pip:

$ pip install curvature-filtrations

Building from Source

Our dependencies are managed with poetry, which can be installed with pip install poetry. To install from source:

  1. Clone the repository
$ git clone https://github.com/aidos-lab/curvature-filtrations.git
  1. Navigate to the directory
$ cd curvature-filtrations
  1. Install dependencies
$ poetry install

Quick Start

The example.py script demonstrates how to compute the distance between two graph distributions.

To use SCOTT with your own data, replace the example graph distributions with your own. Distributions should be lists of networkx graphs or single networkx graphs.

Run our Example Script

python scripts/example.py

Tutorials

For a walkthrough of customization options and the intermediary functionalities supported by SCOTT objects, please see /notebooks. We offer the following two tutorials:

1. Customizing how your comparison is executed: custom_compare.ipynb

Read this section if: Your primary goal is to find the distance between your graph distributions, but you are looking for additional ways to customize the curvature and distance measures used.

Functionalities demonstrated in this tutorial include:

  • Changing the method used for curvature calculations and associated hyperparameters
  • Selecting and customizing the vectorization used to compare persistence diagrams

2. Breakdown of intermediate functionalities: bagpipeline.ipynb

Read this section if: You want to better understand the underlying workflow of this process and/or are interested in the output from intermediate steps in the process.

Functionalities demonstrated in this tutorial include:

  • Calculating curvature for one graph or graph distribution
  • Executing a curvature filtration to produce a persistence diagram
  • Converting persistence diagrams into a topological descriptor (e.g. persistence landscape)
  • Computing the distance between topological descriptors

Both tutorials are supported by /notebooks/utils.py.

Core Components

KILT

KILT stands for: Krvature-Informed Links and Topology is an object that can compute curvature filtrations for single graphs.

import networkx as nx
from scott import KILT,Comparator

G = nx.erdos_reyni(14,0.4)

kilt = KILT(measure="forman_curvature")

D = kilt.fit_transform(G)
print(f"Forman Curvature Filtration:")
print(f"Curvature Filtration Values:{kilt.curvature}")
print(D)

Comparator

Comparator handles comparisons between graphs or graph distributions!

import networkx as nx
from scott import KILT,Comparator

graph_dist1 = [nx.erdos_reyni(10,0.4) for _ in range(40)]
graph_dist2 = [nx.erdos_reyni(20,0.6) for _ in range(50)]

compare = Compare(measure="forman_curvature")

dist = compare.fit_transform(graph_dist1,graph_dist2,metric="image")

print(f"Distance between distributions measured by Forman Filtration: {dist}")

Metadata

Release files for curvature-filtrations 0.1.2

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

Source distribution (sdist)

Source distribution for curvature-filtrations 0.1.2
File Size Uploaded
curvature_filtrations-0.1.2.tar.gz 989.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for curvature-filtrations 0.1.2
File Interpreter ABI Platform
curvature_filtrations-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / curvature_filtrations-0.1.2.tar.gz

Download URL curvature_filtrations-0.1.2.tar.gz
Size 989.2 kB
Tags Source
SHA-256 checksum
How to use checksums
37e829182199fd5f88ea52d65c41106b68359a96a5a9f5178bdf098ba33709c5
BLAKE2b-256 checksum
How to use checksums
92f60459640cb7e1bfe31dc4b8300b5dfa844b1072f12865cc82b2e0d11d9ca1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 22, 2025.

Transparency log

Release files / curvature_filtrations-0.1.2-py3-none-any.whl

Download URL curvature_filtrations-0.1.2-py3-none-any.whl
Size 31.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a24de5b563d728ad1e66b51db1ad2e4747f2b175df89592db87bca13940b03d8
BLAKE2b-256 checksum
How to use checksums
7ff72c30121374cc8977d17064c593ec9acecaad3d64c98f4d553883e853bbce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 22, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

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