Skip to main content

quantrs2_sim/stabilizer/
stabilizersimulator_traits.rs

1//! # StabilizerSimulator - Trait Implementations
2//!
3//! This module contains trait implementations for `StabilizerSimulator`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Simulator`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use crate::simulator::{Simulator, SimulatorResult};
12use quantrs2_circuit::prelude::*;
13use quantrs2_core::prelude::*;
14use scirs2_core::random::prelude::*;
15
16use super::functions::gate_to_stabilizer;
17use super::types::StabilizerSimulator;
18
19/// Implement the Simulator trait for `StabilizerSimulator`
20impl Simulator for StabilizerSimulator {
21    fn run<const N: usize>(
22        &mut self,
23        circuit: &Circuit<N>,
24    ) -> crate::error::Result<SimulatorResult<N>> {
25        let mut sim = Self::new(N);
26        for gate in circuit.gates() {
27            match gate_to_stabilizer(gate) {
28                Some(stab_gate) => sim.apply_gate(stab_gate)?,
29                None => {
30                    // The stabilizer formalism can only simulate Clifford gates.
31                    // Silently dropping an unrecognised gate would fabricate an
32                    // incorrect result, so surface it as an honest error instead.
33                    return Err(crate::error::SimulatorError::UnsupportedOperation(format!(
34                        "StabilizerSimulator cannot simulate non-Clifford gate '{}' on qubits {:?}",
35                        gate.name(),
36                        gate.qubits()
37                    )));
38                }
39            }
40        }
41        let amplitudes = sim.get_statevector();
42        Ok(SimulatorResult::new(amplitudes))
43    }
44}