Skip to main content

stateset-rl-core

High-performance Rust implementations of reinforcement learning operations, with optional Python bindings via PyO3.

Features

  • GAE (Generalized Advantage Estimation) - Fast, parallel GAE computation
  • Advantage Computation - Group-relative advantages for GRPO/PPO training
  • Reward Normalization - Welford's algorithm for numerically stable online normalization
  • GSPO Support - Sequence-level importance ratios and clipping for GSPO
  • PPO Surrogate - Clipped surrogate objective computation
  • Parallel Processing - Automatic parallelization via Rayon

Installation

As a Python extension (recommended)

Pre-built abi3 wheels are published to PyPI on each rust-core-v* tag. Install directly or via the [rust] extra on stateset-agents:

# Standalone
pip install stateset-rl-core

# Bundled with the framework
pip install "stateset-agents[rust]"

One wheel per (OS, arch) covers Python 3.10–3.13 via the stable PyO3 ABI. Supported targets: Linux x86_64/aarch64 (manylinux2014), macOS x86_64/arm64, Windows x86_64.

As a Rust crate

[dependencies]
stateset-rl-core = "0.1"

From source (development)

cd rust_core
maturin develop --release

Usage

Rust

use stateset_rl_core::{compute_gae_internal, compute_advantages_for_group};

// Compute GAE
let rewards = vec![1.0, 0.0, 1.0, 0.0];
let values = vec![0.5, 0.5, 0.5, 0.5, 0.0]; // n+1 values for bootstrap
let advantages = compute_gae_internal(&rewards, &values, 0.99, 0.95);

// Compute group-relative advantages
let group_rewards = vec![1.0, 2.0, 3.0, 4.0];
let advantages = compute_advantages_for_group(&group_rewards, "mean", true);

Python

import numpy as np
import stateset_rl_core

# Compute GAE
rewards = np.array([1.0, 0.0, 1.0, 0.0])
values = np.array([0.5, 0.5, 0.5, 0.5, 0.0])
advantages = stateset_rl_core.compute_gae(rewards, values, gamma=0.99, gae_lambda=0.95)

# Batch GAE (parallel)
all_rewards = [np.random.randn(100) for _ in range(32)]
all_values = [np.random.randn(101) for _ in range(32)]
all_advantages = stateset_rl_core.batch_compute_gae(all_rewards, all_values)

# Group-relative advantages for GRPO
rewards_2d = np.random.randn(16, 4)  # 16 groups, 4 samples each
advantages = stateset_rl_core.compute_group_advantages(rewards_2d, "mean", normalize=True)

# Reward normalization with running stats
rewards = np.array([1.0, 2.0, 3.0])
normalized, mean, var, count = stateset_rl_core.normalize_rewards(rewards)

# GSPO importance ratios
log_probs_new = np.array([-10.0, -12.0, -11.0])
log_probs_old = np.array([-10.5, -11.5, -11.0])
seq_lengths = np.array([50, 60, 55])
ratios = stateset_rl_core.compute_gspo_importance_ratios(log_probs_new, log_probs_old, seq_lengths)

# PPO surrogate objective
ratios = np.array([1.1, 0.9, 1.05])
advantages = np.array([1.0, -1.0, 0.5])
objectives = stateset_rl_core.compute_ppo_surrogate(ratios, advantages, clip_epsilon=0.2)

API Reference

GAE Functions

  • compute_gae(rewards, values, gamma=0.99, gae_lambda=0.95) - Single trajectory GAE
  • batch_compute_gae(all_rewards, all_values, gamma=0.99, gae_lambda=0.95) - Parallel batch GAE

Advantage Functions

  • compute_group_advantages(rewards_2d, baseline_type, normalize) - GRPO-style group advantages
    • baseline_type: "mean", "median", or "min"

Reward Functions

  • normalize_rewards(rewards, running_mean=0, running_var=1, count=0, epsilon=1e-8) - Online normalization
  • clip_rewards(rewards, min_val, max_val) - Reward clipping
  • compute_reward_statistics(rewards) - Compute mean, std, min, max, median

Policy Gradient Functions

  • compute_gspo_importance_ratios(log_probs_new, log_probs_old, sequence_lengths) - GSPO ratios
  • apply_gspo_clipping(ratios, advantages, clip_left=3e-4, clip_right=4e-4) - GSPO clipping
  • compute_ppo_surrogate(ratios, advantages, clip_epsilon=0.2) - PPO clipped objective

Performance

This crate is optimized for performance:

  • LTO enabled - Link-time optimization for maximum speed
  • Single codegen unit - Better optimization opportunities
  • Rayon parallelization - Automatic multi-threading for batch operations
  • Zero-copy Python interop - Minimal overhead when called from Python

Typical speedups over pure Python/NumPy: 10-100x for batch operations.

License

BUSL-1.1

Metadata

Release files for stateset-rl-core 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stateset-rl-core 0.1.1
File Size Uploaded
stateset_rl_core-0.1.1.tar.gz 17.9 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for stateset-rl-core 0.1.1
File
stateset_rl_core-0.1.1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
stateset_rl_core-0.1.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
stateset_rl_core-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 1.3 MB

Release files / stateset_rl_core-0.1.1.tar.gz

Download URL stateset_rl_core-0.1.1.tar.gz
Size 17.9 kB
Tags Source
SHA-256 checksum
How to use checksums
1a22d3751f8f981ee1fbbf66a45d8974dbe97ac5c7c8a0696057961c5380dfc7
BLAKE2b-256 checksum
How to use checksums
d8331db1cd26ce295f791d893294c03c453255ff9da3316a1cb42e710fd05e1f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release files / stateset_rl_core-0.1.1-cp310-abi3-win_amd64.whl

Download URL stateset_rl_core-0.1.1-cp310-abi3-win_amd64.whl
Size 206.8 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e0f603ef349d413e466f91d1761a4305ccd0e2e4b825b29d619ce3c2650f4b40
BLAKE2b-256 checksum
How to use checksums
135f45ed3ee64073ee9c20f7c629d185afbaa2c9c882af12261dd62f3ae6c1e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release files / stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 297.3 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
7f4528422f64dcdcd9959429296f50e79d656d0d1b1fc54bc767b529ebd9a074
BLAKE2b-256 checksum
How to use checksums
227aaa7c1d1904d1c167e5dcbcf1935ac85e29e3dfcb2d6a515f2f70637fd9e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release files / stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL stateset_rl_core-0.1.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 282.4 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
2f910474d97cf1752320906122212221db5d211aeb062464a448c5f9f132934d
BLAKE2b-256 checksum
How to use checksums
9312970386e99d148753f69f17859085d56690ac8794cee6391b60415e1f92f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release files / stateset_rl_core-0.1.1-cp310-abi3-macosx_11_0_arm64.whl

Download URL stateset_rl_core-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
Size 261.8 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8b9de36ecebbda123051c5a3bcf6fcfb9a95923b9d350f5aff3dcb2872db1db4
BLAKE2b-256 checksum
How to use checksums
07d9d02859a50788962b992869827d11cb902ea60b0b5dc86a93acf90144fb38
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release files / stateset_rl_core-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL stateset_rl_core-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl
Size 275.7 kB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
701de8400fa712ef76c00eefbffb83ba808d4b3b8322eb8f1912482d2f192ae4
BLAKE2b-256 checksum
How to use checksums
448f7190ccc4eebf8e8a835330064e2601864d0cc4c8655f8dfd2c68ce1e3e8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.16

Release history Release notifications | RSS feed

This release

0.1.1 This release

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page