carry-agent / runtime /quantum /benchmarks.rs
SNAPKITTYWEST's picture
push from SNAPKITTYWEST/carry-agent
80d7559 verified
Raw History Blame Contribute Delete
4.99 kB
// CARRY Quantum Simulator Benchmark Suite
// Standard Reference Circuits & Multi-Agent Verification Overhead Benchmark Suite.
use std::time::Instant;
use crate::quantum::core::{Circuit, Gate, QuantumSimulator, SimulationMode, ErrorModel};
/// Benchmark Summary Result.
#[derive(Debug, Clone)]
pub struct BenchmarkReport {
pub circuit_name: String,
pub num_qubits: usize,
pub num_gates: usize,
pub shots: usize,
pub execution_time_ms: u128,
pub verification_overhead_ms: u128,
pub fidelity: f64,
pub status: String,
}
pub struct BenchmarkSuite;
impl BenchmarkSuite {
/// Build Bell state circuit: H(0), CNOT(0, 1)
pub fn build_bell_circuit() -> Circuit {
let mut circuit = Circuit::new(2);
circuit.add_gate(Gate::h(0));
circuit.add_gate(Gate::cnot(0, 1));
circuit
}
/// Build GHZ state circuit: H(0), CNOT(0, 1), CNOT(1, 2)
pub fn build_ghz_circuit(num_qubits: usize) -> Circuit {
let mut circuit = Circuit::new(num_qubits);
circuit.add_gate(Gate::h(0));
for i in 0..(num_qubits - 1) {
circuit.add_gate(Gate::cnot(i, i + 1));
}
circuit
}
/// Build Quantum Teleportation circuit (3 qubits)
pub fn build_teleportation_circuit() -> Circuit {
let mut circuit = Circuit::new(3);
// Prepare state on q0: H(0)
circuit.add_gate(Gate::h(0));
// Entangle Bell pair on q1, q2
circuit.add_gate(Gate::h(1));
circuit.add_gate(Gate::cnot(1, 2));
// Bell measurement on q0, q1
circuit.add_gate(Gate::cnot(0, 1));
circuit.add_gate(Gate::h(0));
// Corrections on q2
circuit.add_gate(Gate::cnot(1, 2));
circuit.add_gate(Gate::cz(0, 2));
circuit
}
/// Build Deutsch-Jozsa circuit (2 qubits)
pub fn build_deutsch_circuit() -> Circuit {
let mut circuit = Circuit::new(2);
circuit.add_gate(Gate::x(1));
circuit.add_gate(Gate::h(0));
circuit.add_gate(Gate::h(1));
// Balanced oracle: CNOT(0, 1)
circuit.add_gate(Gate::cnot(0, 1));
circuit.add_gate(Gate::h(0));
circuit
}
/// Build Grover 2-qubit search circuit
pub fn build_grover_circuit() -> Circuit {
let mut circuit = Circuit::new(2);
// Equal superposition
circuit.add_gate(Gate::h(0));
circuit.add_gate(Gate::h(1));
// Oracle for |11⟩: CZ(0, 1)
circuit.add_gate(Gate::cz(0, 1));
// Diffuser: H, X, CZ, X, H
circuit.add_gate(Gate::h(0));
circuit.add_gate(Gate::h(1));
circuit.add_gate(Gate::x(0));
circuit.add_gate(Gate::x(1));
circuit.add_gate(Gate::cz(0, 1));
circuit.add_gate(Gate::x(0));
circuit.add_gate(Gate::x(1));
circuit.add_gate(Gate::h(0));
circuit.add_gate(Gate::h(1));
circuit
}
/// Build QFT (Quantum Fourier Transform) circuit for n qubits
pub fn build_qft_circuit(n: usize) -> Circuit {
let mut circuit = Circuit::new(n);
for i in 0..n {
circuit.add_gate(Gate::h(i));
for j in (i + 1)..n {
let angle = std::f64::consts::PI / (1 << (j - i)) as f64;
circuit.add_gate(Gate::rz(j, angle));
circuit.add_gate(Gate::cz(i, j));
}
}
for i in 0..(n / 2) {
circuit.add_gate(Gate::swap(i, n - 1 - i));
}
circuit
}
/// Run full benchmark for a given circuit with execution timing & verification overhead measurement.
pub fn run_benchmark(name: &str, circuit: &Circuit, shots: usize) -> Result<BenchmarkReport, String> {
let start_time = Instant::now();
let mut sim = QuantumSimulator::new(circuit.num_qubits, SimulationMode::StateVector, ErrorModel::None);
// Execute circuit gates
for gate in &circuit.gates {
sim.apply_gate(gate)?;
}
let exec_time = start_time.elapsed().as_millis();
// Verification overhead timing
let verify_start = Instant::now();
let _purity = sim.state.purity();
let _valid = sim.state.is_valid_state();
let verify_time = verify_start.elapsed().as_millis();
Ok(BenchmarkReport {
circuit_name: name.to_string(),
num_qubits: circuit.num_qubits,
num_gates: circuit.gates.len(),
shots,
execution_time_ms: exec_time,
verification_overhead_ms: verify_time,
// WC-3 fix: compute actual fidelity as post-circuit norm validity.
// 1.0 = state remains normalised; values < 1.0 indicate drift.
fidelity: if _valid { 1.0 - (_purity - 1.0).abs().min(1.0) } else { 0.0 },
status: "SUCCESS".to_string(),
})
}
}