GPU-accelerated temporal random walks on streaming graphs
Project description
Tempest
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 innode_ids.t.get_walks_for_last_batch(...)— walks starting only from the nodes touched by the most recentadd_edgescall.
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_edgescall pinsfeature_dim. Every subsequent call must match: all-with-features or all-without, samefeature_dim. Switching modes mid-stream raises. t.clear()wipes features and resets the schema, so the nextadd_edgesmay pick a newfeature_dim.- Features accept either a 2D
[num_edges, feature_dim]float32 array or a flat 1D array of lengthnum_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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tempest_rw-0.0.4-cp313-cp313-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: tempest_rw-0.0.4-cp313-cp313-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 15.1 MB
- Tags: CPython 3.13, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed3e0c97b521b97d4742f07644983798f31c1746228f2ab6c8214941c5f9f395
|
|
| MD5 |
497cbd2bb39ba2cac8c194af593b5f6e
|
|
| BLAKE2b-256 |
d401b08e7d0571b39384630e946f95cc6e2302e9ccad0c9f0f5d6aad801d3a2b
|
File details
Details for the file tempest_rw-0.0.4-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: tempest_rw-0.0.4-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 15.1 MB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d102d37efd56f42818f4773275e1e386e62fbdc21246dbb6f92051a9002190cd
|
|
| MD5 |
ca71895203e3bf083acdb14b040a2b56
|
|
| BLAKE2b-256 |
071dd63b2f7a1112e1bcf892a8e5fcfbcca37d6d4c5cbb0a8c1a79e9489e528d
|
File details
Details for the file tempest_rw-0.0.4-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: tempest_rw-0.0.4-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 15.1 MB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c65ca32e7861be842a8131372cd3d484b4e259f00672b9afa42a7c183825d03
|
|
| MD5 |
957b51a31fce8827e14bd4dc5648db73
|
|
| BLAKE2b-256 |
6af7d475d2bf9b38ef17d693990be98009a9c983ac0d4cf3f135087943cc13be
|
File details
Details for the file tempest_rw-0.0.4-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: tempest_rw-0.0.4-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 15.1 MB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae19eb547e72e9557aa7572da4730124a0ed8ad07cf635e8d10c0131edc6e813
|
|
| MD5 |
9b07f889ca18bc3702488c51c2973096
|
|
| BLAKE2b-256 |
80fc1652557fe3e4926a9db7dd3fdcbae6edc7825291d260f660b7c31cd0dbbd
|
File details
Details for the file tempest_rw-0.0.4-cp39-cp39-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: tempest_rw-0.0.4-cp39-cp39-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 15.1 MB
- Tags: CPython 3.9, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73eea698df7cc8083ad6b122a5e41e6c052cee0fbe5aa391edb2572e7734d0d8
|
|
| MD5 |
2d83a2f891ec28aedd8f3b56e0a4e6f1
|
|
| BLAKE2b-256 |
c5a47ff23e525df21885a2315a1974b9ef2649a0345d556d158ecba5a939ba76
|