9.7 KiB
ruQu Simulation Integration Guide
Status: Proposed Date: 2026-01-17 Authors: ruv.io, RuVector Team
Overview
This guide documents how to build and prove the RuVector + dynamic mincut control system against real quantum error correction workloads using Rust-native simulation engines before moving to cloud hardware.
Available Simulation Engines
1. Stim with Rust Bindings (Recommended)
Stim is a high-performance stabilizer circuit simulator designed for quantum error correction workloads. It can sample syndrome data at kilohertz rates and handle QEC circuits with thousands of qubits.
Rust Bindings: stim-rs provides direct embedding of Stim's high-performance logic into Rust workflows.
[dependencies]
stim-rs = "0.x" # Rust bindings to Stim
Use Case: Feed Stim circuits into your Rust pipeline and generate high-throughput syndrome streams for processing with the dynamic mincut engine.
2. Pure Rust Quantum Simulators
| Crate | Description | Best For |
|---|---|---|
quantsim_core |
Rust quantum circuit simulator engine | Small to moderate circuits, portable |
onq |
Experimental Rust quantum engine | Trying out control loops |
LogosQ |
High-performance state-vector simulation | Dense circuits, comparing strategies |
[dependencies]
quantsim_core = "0.x"
onq = "0.4"
3. Emerging High-Performance Libraries
LogosQ offers dramatic speedups over Python frameworks for state-vector and circuit simulation. Good for:
- Dense circuit simulation
- Testing control loops on simulated quantum state data
- Comparing performance impacts of different classical gating strategies
Latency-Oriented Test Workflow
Step 1: Build a Syndrome Generator
Use Stim via stim-rs with a Rust harness that:
- Defines a surface code QEC circuit
- Produces syndrome streams in a loop
- Exposes streams via async channels or memory buffers to the dynamic mincut kernel
use stim_rs::{Circuit, Detector, Sampler};
use tokio::sync::mpsc;
pub struct SyndromeGenerator {
circuit: Circuit,
sampler: Sampler,
}
impl SyndromeGenerator {
pub fn new(distance: usize, noise_rate: f64) -> Self {
let circuit = Circuit::surface_code(distance, noise_rate);
let sampler = circuit.compile_sampler();
Self { circuit, sampler }
}
pub async fn stream(&self, tx: mpsc::Sender<SyndromeRound>) {
loop {
let detection_events = self.sampler.sample();
let round = SyndromeRound::from_stim(detection_events);
if tx.send(round).await.is_err() {
break;
}
}
}
}
Step 2: Integrate RuVector Kernel
Embed RuVector + dynamic mincut implementation in Rust:
use ruvector_mincut::SubpolynomialMinCut;
use ruqu::coherence_gate::CoherenceGate;
pub struct QuantumController {
gate: CoherenceGate,
mincut: SubpolynomialMinCut,
}
impl QuantumController {
pub async fn process_syndrome(&mut self, round: SyndromeRound) -> GateDecision {
// Update patch graphs
self.mincut.apply_delta(round.to_graph_delta());
// Compute cut value and risk score
let cut_value = self.mincut.current_cut();
let risk_score = self.evaluate_risk(cut_value);
// Output permission-to-act signal with region mask
self.gate.decide(risk_score).await
}
}
Step 3: Profile Latency
Measure critical performance metrics:
| Metric | Target | Measurement Tool |
|---|---|---|
| Worst-case latency per cycle | < 4μs | criterion.rs |
| Tail latency (p99) | < 10μs | Custom histogram |
| Tail latency (p999) | < 50μs | Custom histogram |
| Scaling with code distance | Sublinear | Parametric benchmark |
use criterion::{criterion_group, criterion_main, Criterion, BenchmarkId};
fn latency_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("gate_latency");
for distance in [5, 9, 13, 17, 21] {
group.bench_with_input(
BenchmarkId::new("decide", distance),
&distance,
|b, &d| {
let controller = QuantumController::new(d);
let syndrome = generate_test_syndrome(d);
b.iter(|| controller.process_syndrome(syndrome.clone()));
},
);
}
group.finish();
}
Step 4: Benchmark Against Standard Decoders
Compare configurations:
| Configuration | Description |
|---|---|
| Kernel only | Fast gating without decoder |
| Gated decoder | Baseline decoder with ruQu gating |
| Baseline only | Standard decoder without gating |
Metrics to Compare:
struct BenchmarkResults {
run_success_rate: f64,
logical_error_rate: f64,
overhead_cycles: u64,
cpu_utilization: f64,
}
fn compare_configurations(distance: usize, noise: f64) -> ComparisonReport {
let kernel_only = benchmark_kernel_only(distance, noise);
let gated_decoder = benchmark_gated_decoder(distance, noise);
let baseline_only = benchmark_baseline_only(distance, noise);
ComparisonReport {
kernel_only,
gated_decoder,
baseline_only,
improvement_factor: calculate_improvement(gated_decoder, baseline_only),
}
}
Why Rust is Optimal for This
| Advantage | Benefit |
|---|---|
| Systems performance | Control over memory layout, cache-friendly structures |
| Async support | Excellent async/await for real-time data paths |
| Safe parallelism | Multi-tile and patch processing without data races |
| Growing ecosystem | Quantum libraries like stim-rs, quantsim_core |
| Type safety | Catch bugs at compile time, not in production |
Project Template
Cargo.toml
[package]
name = "ruqu-simulation"
version = "0.1.0"
edition = "2021"
[dependencies]
# Quantum simulation
stim-rs = "0.x"
quantsim_core = "0.x"
onq = "0.4"
# RuVector integration
ruvector-mincut = { path = "../ruvector-mincut" }
cognitum-gate-tilezero = { path = "../cognitum-gate-tilezero" }
# Async runtime
tokio = { version = "1.0", features = ["full"] }
# Benchmarking
criterion = { version = "0.5", features = ["async_tokio"] }
# Metrics and profiling
metrics = "0.21"
tracing = "0.1"
Main Entry Point
use tokio::sync::mpsc;
use tracing::{info, instrument};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::init();
// Create syndrome generator
let generator = SyndromeGenerator::new(
distance: 17,
noise_rate: 0.001,
);
// Create controller with mincut engine
let mut controller = QuantumController::new(17);
// Channel for syndrome streaming
let (tx, mut rx) = mpsc::channel(1024);
// Spawn generator task
tokio::spawn(async move {
generator.stream(tx).await;
});
// Process syndromes
let mut cycle = 0u64;
while let Some(syndrome) = rx.recv().await {
let decision = controller.process_syndrome(syndrome).await;
if cycle % 10000 == 0 {
info!(
cycle,
decision = ?decision,
cut_value = controller.current_cut(),
"Gate decision"
);
}
cycle += 1;
}
Ok(())
}
Runtime Model Options
Synchronous (Simple)
Best for: Initial prototyping, single-threaded testing
fn main() {
let mut controller = QuantumController::new(17);
let generator = SyndromeGenerator::new(17, 0.001);
for _ in 0..1_000_000 {
let syndrome = generator.sample();
let decision = controller.process_syndrome_sync(syndrome);
}
}
Async Tokio (Recommended)
Best for: Production workloads, multi-tile parallelism
#[tokio::main(flavor = "multi_thread", worker_threads = 4)]
async fn main() {
let controller = Arc::new(Mutex::new(QuantumController::new(17)));
// Process multiple tiles in parallel
let handles: Vec<_> = (0..255)
.map(|tile_id| {
let controller = controller.clone();
tokio::spawn(async move {
process_tile(tile_id, controller).await;
})
})
.collect();
futures::future::join_all(handles).await;
}
No Async (Bare Metal)
Best for: FPGA/ASIC deployment prep, minimal overhead
#![no_std]
fn process_cycle(syndrome: &[u8], state: &mut GateState) -> GateDecision {
// Pure computation, no allocation, no runtime
state.update(syndrome);
state.decide()
}
Performance Targets
| Code Distance | Qubits | Target Latency | Memory |
|---|---|---|---|
| 5 | 41 | < 1μs | < 4 KB |
| 9 | 145 | < 2μs | < 16 KB |
| 13 | 313 | < 3μs | < 32 KB |
| 17 | 545 | < 4μs | < 64 KB |
| 21 | 841 | < 5μs | < 128 KB |
Next Steps
- Set up Stim integration: Install
stim-rsand generate first syndrome streams - Port mincut kernel: Adapt
ruvector-mincutfor syndrome-driven updates - Profile baseline: Establish latency baseline with trivial gate logic
- Add three-filter pipeline: Implement structural, shift, and evidence filters
- Compare with decoders: Benchmark against PyMatching, fusion blossom
- Scale testing: Test with larger code distances and higher noise rates
References
- Stim GitHub - High-performance QEC simulator
- stim-rs - Rust bindings for Stim
- quantsim_core - Rust quantum simulator
- onq - Experimental Rust quantum engine
- Criterion.rs - Rust benchmarking