quantrs2_sim/
optimized_simulator_simple.rs1use quantrs2_circuit::builder::{Circuit, Simulator};
7use quantrs2_core::{
8 error::{QuantRS2Error, QuantRS2Result},
9 gate::{multi, single, GateOp},
10 register::Register,
11};
12
13use crate::optimized_simple::OptimizedStateVector;
14
15#[derive(Debug, Clone)]
17pub struct OptimizedSimulatorSimple;
18
19impl OptimizedSimulatorSimple {
20 pub fn new() -> Self {
22 Self
23 }
24}
25
26impl Default for OptimizedSimulatorSimple {
27 fn default() -> Self {
28 Self::new()
29 }
30}
31
32impl<const N: usize> Simulator<N> for OptimizedSimulatorSimple {
33 fn run(&self, circuit: &Circuit<N>) -> QuantRS2Result<Register<N>> {
34 let mut state_vector = OptimizedStateVector::new(N);
36
37 for gate in circuit.gates() {
39 match gate.name() {
40 "H" => {
42 if let Some(g) = gate.as_any().downcast_ref::<single::Hadamard>() {
43 let matrix = g.matrix()?;
44 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
45 }
46 }
47 "X" => {
48 if let Some(g) = gate.as_any().downcast_ref::<single::PauliX>() {
49 let matrix = g.matrix()?;
50 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
51 }
52 }
53 "Y" => {
54 if let Some(g) = gate.as_any().downcast_ref::<single::PauliY>() {
55 let matrix = g.matrix()?;
56 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
57 }
58 }
59 "Z" => {
60 if let Some(g) = gate.as_any().downcast_ref::<single::PauliZ>() {
61 let matrix = g.matrix()?;
62 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
63 }
64 }
65 "RX" => {
66 if let Some(g) = gate.as_any().downcast_ref::<single::RotationX>() {
67 let matrix = g.matrix()?;
68 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
69 }
70 }
71 "RY" => {
72 if let Some(g) = gate.as_any().downcast_ref::<single::RotationY>() {
73 let matrix = g.matrix()?;
74 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
75 }
76 }
77 "RZ" => {
78 if let Some(g) = gate.as_any().downcast_ref::<single::RotationZ>() {
79 let matrix = g.matrix()?;
80 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
81 }
82 }
83 "S" => {
84 if let Some(g) = gate.as_any().downcast_ref::<single::Phase>() {
85 let matrix = g.matrix()?;
86 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
87 }
88 }
89 "T" => {
90 if let Some(g) = gate.as_any().downcast_ref::<single::T>() {
91 let matrix = g.matrix()?;
92 state_vector.apply_single_qubit_gate(&matrix, g.target.id() as usize);
93 }
94 }
95
96 "CNOT" => {
98 if let Some(g) = gate.as_any().downcast_ref::<multi::CNOT>() {
99 state_vector.apply_cnot(g.control.id() as usize, g.target.id() as usize);
100 }
101 }
102 "CZ" => {
103 if let Some(g) = gate.as_any().downcast_ref::<multi::CZ>() {
104 let matrix = g.matrix()?;
105 state_vector.apply_two_qubit_gate(
106 &matrix,
107 g.control.id() as usize,
108 g.target.id() as usize,
109 );
110 }
111 }
112 "SWAP" => {
113 if let Some(g) = gate.as_any().downcast_ref::<multi::SWAP>() {
114 let matrix = g.matrix()?;
115 state_vector.apply_two_qubit_gate(
116 &matrix,
117 g.qubit1.id() as usize,
118 g.qubit2.id() as usize,
119 );
120 }
121 }
122
123 "Toffoli" | "Fredkin" => {
125 return Err(QuantRS2Error::UnsupportedOperation(
126 format!("Direct {} gate not yet implemented in optimized simulator. Use gate decomposition.", gate.name())
127 ));
128 }
129
130 _ => {
131 return Err(QuantRS2Error::UnsupportedOperation(format!(
132 "Gate {} not supported in optimized simulator",
133 gate.name()
134 )));
135 }
136 }
137 }
138
139 Register::<N>::with_amplitudes(state_vector.state().to_vec())
141 }
142}