Files
wifi-densepose/crates/ruQu/docs/SIMULATION-INTEGRATION.md
ruv d803bfe2b1 Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
2026-02-28 14:39:40 -05:00

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

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:

  1. Defines a surface code QEC circuit
  2. Produces syndrome streams in a loop
  3. 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);
    }
}

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

  1. Set up Stim integration: Install stim-rs and generate first syndrome streams
  2. Port mincut kernel: Adapt ruvector-mincut for syndrome-driven updates
  3. Profile baseline: Establish latency baseline with trivial gate logic
  4. Add three-filter pipeline: Implement structural, shift, and evidence filters
  5. Compare with decoders: Benchmark against PyMatching, fusion blossom
  6. Scale testing: Test with larger code distances and higher noise rates

References