File size: 4,991 Bytes
80d7559
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// 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(),
        })
    }
}