Skip to main content

GPU-accelerated temporal random walks on streaming graphs

Project description

Tempest

CPU Tests PyPI Latest Release PyPI Downloads

GPU-accelerated library for streaming temporal random walks. Walks follow a temporal graph's edges forward or backward in time under configurable bias (uniform, linear, exponential, reservoir-exponential, or temporal Node2Vec), with a sliding window that evicts old edges as new ones arrive. Edges may optionally carry a float feature vector that stays in sync with the edge store and is returned per hop alongside walks.

Documentation

Installation

pip install tempest-rw

Or from a local checkout:

pip install .

Requires CMake ≥ 3.24, a C++17 compiler, and pybind11. A CUDA toolkit is optional; without it the package builds CPU-only.

To disable the CUDA backend at build time:

TEMPEST_DISABLE_CUDA=1 pip install .

Quick Start

One import, one class, one object:

from tempest import Tempest
import numpy as np

t = Tempest(is_directed=True, use_gpu=True)

t.add_edges(
    np.array([0, 1, 2], dtype=np.int32),
    np.array([1, 2, 3], dtype=np.int32),
    np.array([100, 200, 300], dtype=np.int64),
)

walks = t.get_walks(
    max_walk_len=10,
    num_walks_per_node=5,
    walk_bias="ReservoirExponential",
    direction="Forward",
    seed=42,
)
print(walks["nodes"].shape)           # (num_walks, max_walk_len)
print(walks["timestamps"].shape)      # (num_walks, max_walk_len)
print(walks["walk_lens"].shape)       # (num_walks,)
print(walks["edge_features"])         # None when no features were attached

Unused positions in nodes and timestamps are padded with -1. When edge features are attached at add_edges time they come back resolved per hop as walks["edge_features"] — see Edge Features (Optional) below.

Other entry points:

  • t.get_walks_for_nodes(node_ids, ...) — one walk per entry in node_ids.
  • t.get_walks_for_last_batch(...) — walks starting only from the nodes touched by the most recent add_edges call.

Walk Bias Types

Bias Description
Uniform Equal probability across valid timestamp groups.
Linear Triangular probability, linear in group index.
ExponentialIndex Exponential probability via inverse CDF over group index.
ReservoirExponential Temporal exponential bias via Efraimidis-Spirakis reservoir sampling (zero precomputed weights).
TemporalNode2Vec Structural (p, q) bias combined with temporal reservoir draw; pass enable_node2vec=True + node2vec_p + node2vec_q at construction time.

Edge Features (Optional)

Every edge can carry a fixed-size float feature vector. Features are stored CPU-side regardless of use_gpu and are never read during walk generation — they exist purely as a lookup table. Tempest keeps them in sync with the edge arrays across ingest-time sort/merge and sliding-window eviction, and get_walks / get_walks_for_nodes / get_walks_for_last_batch return them already resolved for every hop of every walk:

t = Tempest(is_directed=True, use_gpu=True)

sources    = np.array([0, 1, 2], dtype=np.int32)
targets    = np.array([1, 2, 3], dtype=np.int32)
timestamps = np.array([100, 200, 300], dtype=np.int64)
features   = np.array([[1.0, 2.0],
                       [3.0, 4.0],
                       [5.0, 6.0]], dtype=np.float32)  # [num_edges, feature_dim]

t.add_edges(sources, targets, timestamps, features)
assert t.feature_dim == 2

walks = t.get_walks(max_walk_len=5, num_walks_per_node=10, walk_bias="Uniform")
walks["edge_features"]         # float32, shape (num_walks, max_walk_len - 1, 2)
# Each row [w, i] is the feature vector of the edge traversed from
# nodes[w, i] to nodes[w, i + 1]. Padding slots past the walk's length are
# zero rows. When no features were attached, walks["edge_features"] is None.

Rules:

  • The first add_edges call pins feature_dim. Every subsequent call must match: all-with-features or all-without, same feature_dim. Switching modes mid-stream raises.
  • t.clear() wipes features and resets the schema, so the next add_edges may pick a new feature_dim.
  • Features accept either a 2D [num_edges, feature_dim] float32 array or a flat 1D array of length num_edges * feature_dim.

Streaming API

t = Tempest(is_directed=True, max_time_capacity=3600)

for batch in stream_of_batches():
    t.add_edges(batch.sources, batch.targets, batch.timestamps)
    fresh_walks = t.get_walks_for_last_batch(max_walk_len=10, num_walks_per_node=1)

max_time_capacity defines the sliding-window length in timestamp units. After every batch, edges older than latest_timestamp - max_time_capacity are evicted and the temporal index is rebuilt. get_walks_for_last_batch starts walks only from the nodes touched by the most recent add_edges call — sources only for directed forward walks, targets only for directed backward walks, and the union of both for undirected graphs.

Building from Source

mkdir build && cd build
cmake .. -DTEMPEST_BUILD_TESTS=ON
cmake --build . -j
ctest --output-on-failure

Key CMake options:

  • -DTEMPEST_ENABLE_CUDA=ON|OFF — build with/without the GPU backend.
  • -DTEMPEST_BUILD_PYTHON=ON|OFF — build the pybind11 module.
  • -DTEMPEST_BUILD_TESTS=ON|OFF — build the C++ test suite.
  • -DTEMPEST_BUILD_BENCH=ON|OFF — build the CSV-emitting benchmarks.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tempest_rw-0.0.5-cp313-cp313-manylinux_2_34_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.5-cp312-cp312-manylinux_2_34_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.5-cp311-cp311-manylinux_2_34_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.5-cp310-cp310-manylinux_2_34_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.5-cp39-cp39-manylinux_2_34_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

File details

Details for the file tempest_rw-0.0.5-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tempest_rw-0.0.5-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8119965e03d1ca0a5c294e9384ef4307f4425ce11efe185356dfd70aae69a685
MD5 681e896b58be081390fccaa4a0ef3b32
BLAKE2b-256 c3f80642ab6e188e6d4b2e3d968607ee91971c91748ecf17c22c84f1d99f2812

See more details on using hashes here.

File details

Details for the file tempest_rw-0.0.5-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tempest_rw-0.0.5-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7636a98fac2b65a9ef614e357a8a49a18f5f1c6e537ba5bfa68cab8e6038ecf6
MD5 ff0eaa99c9c786846ea4088d0abe740d
BLAKE2b-256 c866e18ad7b79f9bd5d07db15d8bac56ce8c7423cdf41d49d3d3596f2bbd2c40

See more details on using hashes here.

File details

Details for the file tempest_rw-0.0.5-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tempest_rw-0.0.5-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 9b8b6f65a96e4f6d8c416e839253d8374301f506e6d6d6128212ede68a6f1fa3
MD5 3f0ced4f7d607257bab4a41ebfa6081e
BLAKE2b-256 ec909f1b5c7eb397be32ac3d701169f425a910c3ceb304af6c3ccc59d6e81216

See more details on using hashes here.

File details

Details for the file tempest_rw-0.0.5-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tempest_rw-0.0.5-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 68fc63a618195c3b2d198f470405c183c93de353aeb38125f14f4fc11e03b5db
MD5 1c461c5bdf607f9476ec044dcc061fae
BLAKE2b-256 9845e0394e8503cd8d507ad714ece09c35adee425ab726eb2a0aa485fc2fcdb1

See more details on using hashes here.

File details

Details for the file tempest_rw-0.0.5-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for tempest_rw-0.0.5-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 31b52b4df9fa1a5f326c798f442b96be61bfe27d93eaf33c932ba6156b71e8ff
MD5 24d3baa10993d4d6a23184abc65ccb3d
BLAKE2b-256 023f816612c30d7f1b4a5de70bd212a2d96413047847bda67a6a5295176b0c81

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page