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

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.4-cp312-cp312-manylinux_2_34_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.4-cp311-cp311-manylinux_2_34_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.4-cp310-cp310-manylinux_2_34_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

tempest_rw-0.0.4-cp39-cp39-manylinux_2_34_x86_64.whl (15.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.4-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ed3e0c97b521b97d4742f07644983798f31c1746228f2ab6c8214941c5f9f395
MD5 497cbd2bb39ba2cac8c194af593b5f6e
BLAKE2b-256 d401b08e7d0571b39384630e946f95cc6e2302e9ccad0c9f0f5d6aad801d3a2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.4-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 d102d37efd56f42818f4773275e1e386e62fbdc21246dbb6f92051a9002190cd
MD5 ca71895203e3bf083acdb14b040a2b56
BLAKE2b-256 071dd63b2f7a1112e1bcf892a8e5fcfbcca37d6d4c5cbb0a8c1a79e9489e528d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.4-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0c65ca32e7861be842a8131372cd3d484b4e259f00672b9afa42a7c183825d03
MD5 957b51a31fce8827e14bd4dc5648db73
BLAKE2b-256 6af7d475d2bf9b38ef17d693990be98009a9c983ac0d4cf3f135087943cc13be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.4-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ae19eb547e72e9557aa7572da4730124a0ed8ad07cf635e8d10c0131edc6e813
MD5 9b07f889ca18bc3702488c51c2973096
BLAKE2b-256 80fc1652557fe3e4926a9db7dd3fdcbae6edc7825291d260f660b7c31cd0dbbd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for tempest_rw-0.0.4-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 73eea698df7cc8083ad6b122a5e41e6c052cee0fbe5aa391edb2572e7734d0d8
MD5 2d83a2f891ec28aedd8f3b56e0a4e6f1
BLAKE2b-256 c5a47ff23e525df21885a2315a1974b9ef2649a0345d556d158ecba5a939ba76

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