🚀 Tempest
A high-performance temporal random walk sampler for dynamic networks with GPU acceleration. Built for scale.
🔥 Why Tempest?
✅ Performance First – GPU-accelerated sampling for massive networks
✅ Memory Efficient – Smart memory management for large graphs
✅ Flexible Integration – Easy Python bindings with NumPy/NetworkX support
✅ Production Ready – Tested with hundreds of extensive unit tests.
✅ Multi Platform Builds and runs seamlessly on devices with or without CUDA.
⚡ Quick Start
from tempest import Tempest
# Create a directed temporal graph
walker = Tempest(is_directed=True, use_gpu=True, max_time_capacity=-1)
# Add edges - can be numpy arrays or python lists
sources = [3, 2, 0, 3, 3, 1]
targets = [4, 4, 2, 1, 2, 4]
timestamps = [71, 82, 19, 34, 79, 19]
walker.add_multiple_edges(sources, targets, timestamps)
# Sample walks with exponential time bias
walk_nodes, walk_timestamps, walk_lens, edge_features = walker.get_random_walks_and_times_for_all_nodes(
max_walk_len=5,
walk_bias="ExponentialIndex",
num_walks_per_node=10,
initial_edge_bias="Uniform"
)
# edge_features is None when no edge features were added (feature_dim=0)
✨ Key Features
- ⚡ GPU acceleration for large graphs
- 🎯 Multiple sampling strategies – Uniform, Linear, Exponential
- 🧠 Advanced temporal biases – ExponentialWeight (CTDNE-style) and TemporalNode2Vec
- 🔄 Forward & backward temporal walks
- 📡 Rolling window support for streaming data
- 🏷️ Optional edge feature propagation from input edges to sampled walks
- 🔗 NetworkX integration
- 🛠️ Efficient memory management
- ⚙️ Uses C++ std libraries or Thrust API selectively based on hardware availability and configuration.
🏷️ Edge Features (Optional)
If your edges carry attributes (weights, embeddings, types, etc.), you can pass them to
add_multiple_edges(...) and receive aligned edge features for each sampled transition.
import numpy as np
from tempest import Tempest
walker = Tempest(is_directed=True, use_gpu=False)
sources = np.array([0, 0, 1], dtype=np.int32)
targets = np.array([1, 2, 2], dtype=np.int32)
timestamps = np.array([10, 20, 30], dtype=np.int64)
# shape: [num_edges, feature_dim]
edge_features = np.array([
[0.1, 1.0],
[0.2, 0.5],
[0.9, 0.3],
], dtype=np.float32)
walker.add_multiple_edges(sources, targets, timestamps, edge_features=edge_features)
walk_nodes, walk_timestamps, walk_lens, walk_edge_features = walker.get_random_walks_and_times(
max_walk_len=4,
walk_bias="Uniform",
num_walks_total=5,
)
# walk_edge_features.shape == [num_walks, max_walk_len - 1, feature_dim]
walk_edge_features is None when no edge features are provided.
🏷️ Node Features
The library can also store dense node features. Use set_node_features(node_ids, node_features)
to populate features for specific nodes, then get_node_features() to retrieve the dense matrix.
🧭 Bias Selection Notes
- Use
ExponentialIndexorLinearfor recency-aware sampling with no extra setup. - Use
ExponentialWeightwhen you want CTDNE-style weight computation (enable_weight_computation=True, optionally tunetimescale_bound). - Use
TemporalNode2Vecwhen you need return/in-out control viatemporal_node2vec_pandtemporal_node2vec_q.
📦 Dependencies
| Dependency | Purpose |
|---|---|
| pybind11 | Python-C++ bindings |
| python3 | Required for building the python interfaces |
| gtest | Unit testing framework |
💡 Tip: Use vcpkg to easily install and link the C++ dependencies.
📦 Installation
GPU (default) — Linux with NVIDIA driver
pip install tempest-rw
This pulls the manylinux wheel plus the two NVIDIA CUDA runtime libraries that the wheel links against:
nvidia-cuda-runtime-cu12— provideslibcudart.so.12nvidia-curand-cu12— provideslibcurand.so.10
CPU-only — source build
Machines without a GPU (or without a driver) should build from
source; the CMake config detects the absence of nvcc and compiles
a CPU-only extension:
pip install --no-binary tempest-rw tempest-rw
You'll need a C++17 compiler, CMake, and OpenMP/TBB installed
(via vcpkg — see the Dependencies section above).
📖 Documentation
📌 C++ Documentation →
📌 Python Interface Documentation →
📚 Citation
If you use Tempest in your research, please cite:
Md Ashfaq Salehin, George Parisis, and Luc Berthouze. 2026. Tempest: A GPU-Accelerated Engine for Streaming Temporal Random Walks. In Proceedings of the 55th International Conference on Parallel Processing (ICPP '26), Singapore.
@inproceedings{salehin2026tempest,
title = {Tempest: A GPU-Accelerated Engine for Streaming Temporal Random Walks},
author = {Salehin, Md Ashfaq and Parisis, George and Berthouze, Luc},
booktitle = {Proceedings of the 55th International Conference on Parallel Processing (ICPP '26)},
address = {Singapore},
year = {2026},
publisher = {Association for Computing Machinery},
doi = {10.1145/3832810.3832885}
}
👨🔬 Built by Packets Research Lab
🚀 Contributions welcome! Open a PR or issue if you have suggestions.
Metadata
Release files for tempest-rw 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tempest_rw-1.0.4-cp310-cp310-macosx_15_0_arm64.whl | CPython 3.10 | CPython 3.10 | macOS 15.0+ ARM64 | Details |
Release files / tempest_rw-1.0.4-cp310-cp310-macosx_15_0_arm64.whl
| Download URL | tempest_rw-1.0.4-cp310-cp310-macosx_15_0_arm64.whl |
|---|---|
| Size | 541.2 kB |
| Tags | CPython 3.10 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2a51000738aab479b3d8793044d32fdeef1355fe249ad326f546db2538669ca1
|
|
BLAKE2b-256 checksum How to use checksums |
8e1f967e566d5cc422e8da485d93cfac693d8a1adfcb7bb6ae410d094a93a40f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.14
|