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.2-cp313-cp313-manylinux_2_34_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.2-cp312-cp312-manylinux_2_34_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.2-cp311-cp311-manylinux_2_34_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.2-cp310-cp310-manylinux_2_34_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.2-cp39-cp39-manylinux_2_34_x86_64.whl (15.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 05199e8e473c317c05fb74d8498f52ddf971618a8293980076dcce5ac271b15e
MD5 daaf9e44fe659e06c206707a02fa0fa5
BLAKE2b-256 f92b533586904fa61d4c65b6efe373dd99ee26940a3add44db410f3cb4604db9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6fef66257c61ef92a670ec188d2951430640715b31dc6b3cbf271487e82e5656
MD5 c9e098c9d9e1d9c7f2ee591937957bfd
BLAKE2b-256 0017a2fe3b3b52d62a7f57b4a7dcb64c29db50a5f82b9bd0c0bd4ff25cb21d26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ccc2e2ab2f86a01746e1dca7c9a9506187953dcd629a759aaff3cbc97e986c23
MD5 94cf47d970bcdff55826b308c8ce58b3
BLAKE2b-256 73e4d5608611a792aca0f706fd2c77b3d738527222ea8fe98b53323029e03a60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 12c9fe91a3d5ac73d5fda965eafa91df12111759cab959bb524c3fed0c271bae
MD5 b791eece7ad6018f4630ef92a7fad436
BLAKE2b-256 0036111a1e03d323cf1c8e42da966a2a799de260752e83b010ce286424dd3f2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.2-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c181f89daec2d4fafa9bd7314871524d5cf05e8814bda2a03933a1803067fbc7
MD5 053e275d155089e5c4a04883c91819f8
BLAKE2b-256 0e236e4c6bb2e5210e9491e54d41d160130f0f63706918332dea5d2a252b945f

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