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
//! Common simulator interface and results for quantum circuit simulations.
use scirs2_core::Complex64;
/// Result of a quantum circuit simulation
#[derive(Debug, Clone)]
pub struct SimulatorResult<const N: usize> {
/// State vector amplitudes (complex coefficients)
pub amplitudes: Vec<Complex64>,
/// Number of qubits
pub num_qubits: usize,
}
impl<const N: usize> SimulatorResult<N> {
/// Create a new simulator result with the given amplitudes
#[must_use]
pub const fn new(amplitudes: Vec<Complex64>) -> Self {
Self {
amplitudes,
num_qubits: N,
}
}
/// Get the state vector amplitudes
#[must_use]
pub fn amplitudes(&self) -> &[Complex64] {
&self.amplitudes
}
/// Get the probabilities for each basis state
#[must_use]
pub fn probabilities(&self) -> Vec<f64> {
self.amplitudes
.iter()
.map(scirs2_core::Complex::norm_sqr)
.collect()
}
/// Get the number of qubits
#[must_use]
pub const fn num_qubits(&self) -> usize {
self.num_qubits
}
}
/// Common trait for all quantum circuit simulators
pub trait Simulator {
/// Run a quantum circuit and return the simulation result
fn run<const N: usize>(
&mut self,
circuit: &quantrs2_circuit::prelude::Circuit<N>,
) -> crate::error::Result<SimulatorResult<N>>;
}