everett/backend/
statevector.rs1use super::{Backend, drive};
4use crate::circuit::Circuit;
5use crate::gate::{Gate1, Gate2};
6use crate::kernel;
7use crate::measure::measure_qubit;
8use crate::rng::Rng;
9use crate::state::State;
10
11pub struct StateVectorBackend {
26 state: State,
27 rng: Rng,
28}
29
30#[derive(Clone, Debug)]
32pub struct Execution {
33 state: State,
34 classical: Vec<bool>,
35}
36
37impl Execution {
38 #[must_use]
40 pub fn state(&self) -> &State {
41 &self.state
42 }
43
44 #[must_use]
46 pub fn classical(&self) -> &[bool] {
47 &self.classical
48 }
49
50 #[must_use]
52 pub fn into_state(self) -> State {
53 self.state
54 }
55}
56
57impl StateVectorBackend {
58 pub fn run(circuit: &Circuit) -> crate::Result<Execution> {
69 Self::run_seeded(circuit, 0)
70 }
71
72 pub fn run_seeded(circuit: &Circuit, seed: u64) -> crate::Result<Execution> {
78 circuit.validate()?;
79 let mut backend = Self {
80 state: State::zero(circuit.num_qubits()),
81 rng: Rng::seed_from_u64(seed),
82 };
83 let classical = drive(&mut backend, circuit.ops(), circuit.num_classical());
84 Ok(Execution {
85 state: backend.state,
86 classical,
87 })
88 }
89}
90
91impl Backend for StateVectorBackend {
92 fn apply_1q(&mut self, gate: &Gate1, target: usize) {
93 kernel::apply_1q(self.state.amplitudes_mut(), target, gate);
94 }
95
96 fn apply_2q(&mut self, gate: &Gate2, a: usize, b: usize) {
97 kernel::apply_2q(self.state.amplitudes_mut(), a, b, gate);
98 }
99
100 fn apply_controlled(&mut self, controls: &[usize], gate: &Gate1, target: usize) {
101 kernel::apply_controlled_1q(self.state.amplitudes_mut(), controls, target, gate);
102 }
103
104 fn measure(&mut self, qubit: usize) -> bool {
105 measure_qubit(&mut self.state, qubit, &mut self.rng)
106 }
107}