git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
233 lines
7.2 KiB
Rust
233 lines
7.2 KiB
Rust
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
|
|
use ruqu_core::prelude::*;
|
|
|
|
fn bench_single_qubit_gates(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("single_qubit_gates");
|
|
|
|
for num_qubits in [4, 8, 12, 16, 20] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("hadamard", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::H(0)).unwrap();
|
|
});
|
|
},
|
|
);
|
|
|
|
group.bench_with_input(
|
|
BenchmarkId::new("rx_rotation", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::Rx(0, 1.234)).unwrap();
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_two_qubit_gates(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("two_qubit_gates");
|
|
|
|
for num_qubits in [4, 8, 12, 16, 20] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("cnot", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::CNOT(0, 1)).unwrap();
|
|
});
|
|
},
|
|
);
|
|
|
|
group.bench_with_input(BenchmarkId::new("rzz", num_qubits), &num_qubits, |b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::Rzz(0, 1, 0.5)).unwrap();
|
|
});
|
|
});
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_bell_state_creation(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("bell_state");
|
|
|
|
for num_qubits in [2, 4, 8, 12, 16] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("create", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut circuit = QuantumCircuit::new(n);
|
|
circuit.h(0).cnot(0, 1);
|
|
Simulator::run(&circuit).unwrap();
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_grover_circuit(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("grover_circuit");
|
|
|
|
for num_qubits in [4, 6, 8, 10] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("full_algorithm", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new_with_seed(n, 42).unwrap();
|
|
// Apply Hadamard to all qubits
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::H(q)).unwrap();
|
|
}
|
|
let target = 0usize;
|
|
let iterations =
|
|
(std::f64::consts::FRAC_PI_4 * ((1u64 << n) as f64).sqrt()) as u32;
|
|
for _ in 0..iterations {
|
|
// Oracle (simplified)
|
|
state.apply_gate(&Gate::Z(0)).unwrap();
|
|
// Diffuser
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::H(q)).unwrap();
|
|
}
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::X(q)).unwrap();
|
|
}
|
|
state.apply_gate(&Gate::Z(n - 1)).unwrap();
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::X(q)).unwrap();
|
|
}
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::H(q)).unwrap();
|
|
}
|
|
}
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_qaoa_layer(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("qaoa_layer");
|
|
|
|
for num_qubits in [4, 8, 12, 16] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("one_layer", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::H(q)).unwrap();
|
|
}
|
|
// Phase separation: linear chain
|
|
for q in 0..n.saturating_sub(1) {
|
|
state.apply_gate(&Gate::Rzz(q, q + 1, 0.5)).unwrap();
|
|
}
|
|
// Mixing
|
|
for q in 0..n {
|
|
state.apply_gate(&Gate::Rx(q, 0.3)).unwrap();
|
|
}
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_expectation_value(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("expectation_value");
|
|
|
|
for num_qubits in [4, 8, 12, 16] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("single_z", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::H(0)).unwrap();
|
|
let z = PauliString {
|
|
ops: vec![(0, PauliOp::Z)],
|
|
};
|
|
b.iter(|| {
|
|
state.expectation_value(&z);
|
|
});
|
|
},
|
|
);
|
|
|
|
group.bench_with_input(
|
|
BenchmarkId::new("zz_pair", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
let mut state = QuantumState::new(n).unwrap();
|
|
state.apply_gate(&Gate::H(0)).unwrap();
|
|
state.apply_gate(&Gate::CNOT(0, 1)).unwrap();
|
|
let zz = PauliString {
|
|
ops: vec![(0, PauliOp::Z), (1, PauliOp::Z)],
|
|
};
|
|
b.iter(|| {
|
|
state.expectation_value(&zz);
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_measurement(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("measurement");
|
|
|
|
for num_qubits in [4, 8, 12, 16] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("single_qubit_measure", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
let mut state = QuantumState::new_with_seed(n, 42).unwrap();
|
|
state.apply_gate(&Gate::H(0)).unwrap();
|
|
state.measure(0).unwrap();
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
fn bench_state_allocation(c: &mut Criterion) {
|
|
let mut group = c.benchmark_group("state_allocation");
|
|
|
|
for num_qubits in [8, 12, 16, 20] {
|
|
group.bench_with_input(
|
|
BenchmarkId::new("allocate_and_init", num_qubits),
|
|
&num_qubits,
|
|
|b, &n| {
|
|
b.iter(|| {
|
|
QuantumState::new(n).unwrap();
|
|
});
|
|
},
|
|
);
|
|
}
|
|
group.finish();
|
|
}
|
|
|
|
criterion_group!(
|
|
benches,
|
|
bench_single_qubit_gates,
|
|
bench_two_qubit_gates,
|
|
bench_bell_state_creation,
|
|
bench_grover_circuit,
|
|
bench_qaoa_layer,
|
|
bench_expectation_value,
|
|
bench_measurement,
|
|
bench_state_allocation,
|
|
);
|
|
criterion_main!(benches);
|