diff --git a/crates/pecos-python/src/sparse_sim.rs b/crates/pecos-python/src/sparse_sim.rs index 6f5442e78..213b60121 100644 --- a/crates/pecos-python/src/sparse_sim.rs +++ b/crates/pecos-python/src/sparse_sim.rs @@ -10,13 +10,9 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -// use pecos_core::VecSet; -// use pecos_qsims::CliffordSimulator; -// use pecos_qsims::SparseStab; use pecos::prelude::*; use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; -use std::collections::HashMap; #[pyclass] pub struct SparseSim { @@ -32,195 +28,117 @@ impl SparseSim { } } + fn reset(&mut self) { + self.inner.reset(); + } + #[allow(clippy::too_many_lines)] #[pyo3(signature = (symbol, location, params=None))] - fn run_gate( + fn run_1q_gate( &mut self, symbol: &str, - location: &Bound<'_, PyTuple>, + location: usize, params: Option<&Bound<'_, PyDict>>, - ) -> PyResult>> { - match (symbol, location.len()) { - ("X", 1) => { - self.inner.x(location.get_item(0)?.extract()?); - Ok(None) - } - ("Y", 1) => { - self.inner.y(location.get_item(0)?.extract()?); - Ok(None) - } - ("Z", 1) => { - self.inner.z(location.get_item(0)?.extract()?); - Ok(None) - } - ("H", 1) => { - self.inner.h(location.get_item(0)?.extract()?); + ) -> PyResult> { + match symbol { + "X" => { + self.inner.x(location); Ok(None) } - ("H2", 1) => { - self.inner.h2(location.get_item(0)?.extract()?); + "Y" => { + self.inner.y(location); Ok(None) } - ("H3", 1) => { - self.inner.h3(location.get_item(0)?.extract()?); + "Z" => { + self.inner.z(location); Ok(None) } - ("H4", 1) => { - self.inner.h4(location.get_item(0)?.extract()?); + "H" => { + self.inner.h(location); Ok(None) } - ("H5", 1) => { - self.inner.h5(location.get_item(0)?.extract()?); + "H2" => { + self.inner.h2(location); Ok(None) } - ("H6", 1) => { - self.inner.h6(location.get_item(0)?.extract()?); + "H3" => { + self.inner.h3(location); Ok(None) } - ("F", 1) => { - self.inner.f(location.get_item(0)?.extract()?); + "H4" => { + self.inner.h4(location); Ok(None) } - ("Fdg", 1) => { - self.inner.fdg(location.get_item(0)?.extract()?); + "H5" => { + self.inner.h5(location); Ok(None) } - ("F2", 1) => { - self.inner.f2(location.get_item(0)?.extract()?); + "H6" => { + self.inner.h6(location); Ok(None) } - ("F2dg", 1) => { - self.inner.f2dg(location.get_item(0)?.extract()?); + "F" => { + self.inner.f(location); Ok(None) } - ("F3", 1) => { - self.inner.f3(location.get_item(0)?.extract()?); + "Fdg" => { + self.inner.fdg(location); Ok(None) } - ("F3dg", 1) => { - self.inner.f3dg(location.get_item(0)?.extract()?); + "F2" => { + self.inner.f2(location); Ok(None) } - ("F4", 1) => { - self.inner.f4(location.get_item(0)?.extract()?); + "F2dg" => { + self.inner.f2dg(location); Ok(None) } - ("F4dg", 1) => { - self.inner.f4dg(location.get_item(0)?.extract()?); + "F3" => { + self.inner.f3(location); Ok(None) } - ("SX", 1) => { - self.inner.sx(location.get_item(0)?.extract()?); + "F3dg" => { + self.inner.f3dg(location); Ok(None) } - ("SXdg", 1) => { - self.inner.sxdg(location.get_item(0)?.extract()?); + "F4" => { + self.inner.f4(location); Ok(None) } - ("SY", 1) => { - self.inner.sy(location.get_item(0)?.extract()?); + "F4dg" => { + self.inner.f4dg(location); Ok(None) } - ("SYdg", 1) => { - self.inner.sydg(location.get_item(0)?.extract()?); + "SX" => { + self.inner.sx(location); Ok(None) } - ("SZ", 1) => { - self.inner.sz(location.get_item(0)?.extract()?); + "SXdg" => { + self.inner.sxdg(location); Ok(None) } - ("SZdg", 1) => { - self.inner.szdg(location.get_item(0)?.extract()?); + "SY" => { + self.inner.sy(location); Ok(None) } - ("CX", 2) => { - self.inner.cx( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); + "SYdg" => { + self.inner.sydg(location); Ok(None) } - ("CY", 2) => { - self.inner.cy( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); + "SZ" => { + self.inner.sz(location); Ok(None) } - ("CZ", 2) => { - self.inner.cz( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); + "SZdg" => { + self.inner.szdg(location); Ok(None) } - ("SXX", 2) => { - self.inner.sxx( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SXXdg", 2) => { - self.inner.sxxdg( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SYY", 2) => { - self.inner.syy( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SYYdg", 2) => { - self.inner.syydg( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SZZ", 2) => { - self.inner.szz( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SZZdg", 2) => { - self.inner.szzdg( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ("SWAP", 2) => { - self.inner.swap( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - - ("G2", 2) => { - self.inner.g2( - location.get_item(0)?.extract()?, - location.get_item(1)?.extract()?, - ); - Ok(None) - } - ( - "MZ" | "MX" | "MY" | "MZForced" | "PZ" | "PX" | "PY" | "PZForced" | "PnZ" | "PnX" - | "PnY", - 1, - ) => { - let qubit: usize = location.get_item(0)?.extract()?; + "MZ" | "MX" | "MY" | "MZForced" | "PZ" | "PX" | "PY" | "PZForced" | "PnZ" | "PnX" + | "PnY" => { let (result, _) = match symbol { - "MZ" => self.inner.mz(qubit), - "MX" => self.inner.mx(qubit), - "MY" => self.inner.my(qubit), + "MZ" => self.inner.mz(location), + "MX" => self.inner.mx(location), + "MY" => self.inner.my(location), "MZForced" => { let forced_value = params .ok_or_else(|| { @@ -236,11 +154,11 @@ impl SparseSim { })? .call_method0("__bool__")? .extract::()?; - self.inner.mz_forced(qubit, forced_value) + self.inner.mz_forced(location, forced_value) } - "PZ" => self.inner.pz(qubit), - "PX" => self.inner.px(qubit), - "PY" => self.inner.py(qubit), + "PZ" => self.inner.pz(location), + "PX" => self.inner.px(location), + "PY" => self.inner.py(location), "PZForced" => { let forced_value = params .ok_or_else(|| { @@ -256,21 +174,103 @@ impl SparseSim { })? .call_method0("__bool__")? .extract::()?; - self.inner.pz_forced(qubit, forced_value) + self.inner.pz_forced(location, forced_value) } - "PnZ" => self.inner.pnz(qubit), - "PnX" => self.inner.pnx(qubit), - "PnY" => self.inner.pny(qubit), + "PnZ" => self.inner.pnz(location), + "PnX" => self.inner.pnx(location), + "PnY" => self.inner.pny(location), _ => unreachable!(), }; - let mut map = HashMap::new(); - if result { - map.insert(qubit, 1); - } - Ok(Some(map)) + Ok(Some(u8::from(result))) + } + _ => Err(PyErr::new::( + "Unsupported single-qubit gate", + )), + } + } + + #[pyo3(signature = (symbol, location, _params))] + fn run_2q_gate( + &mut self, + symbol: &str, + location: &Bound<'_, PyTuple>, + _params: Option<&Bound<'_, PyDict>>, + ) -> PyResult> { + if location.len() != 2 { + return Err(PyErr::new::( + "Two-qubit gate requires exactly 2 qubit locations", + )); + } + + let q1: usize = location.get_item(0)?.extract()?; + let q2: usize = location.get_item(1)?.extract()?; + + match symbol { + "CX" => { + self.inner.cx(q1, q2); + Ok(None) + } + "CY" => { + self.inner.cy(q1, q2); + Ok(None) + } + "CZ" => { + self.inner.cz(q1, q2); + Ok(None) + } + "SXX" => { + self.inner.sxx(q1, q2); + Ok(None) + } + "SXXdg" => { + self.inner.sxxdg(q1, q2); + Ok(None) + } + "SYY" => { + self.inner.syy(q1, q2); + Ok(None) + } + "SYYdg" => { + self.inner.syydg(q1, q2); + Ok(None) + } + "SZZ" => { + self.inner.szz(q1, q2); + Ok(None) + } + "SZZdg" => { + self.inner.szzdg(q1, q2); + Ok(None) + } + "SWAP" => { + self.inner.swap(q1, q2); + Ok(None) + } + "G2" => { + self.inner.g2(q1, q2); + Ok(None) + } + _ => Err(PyErr::new::( + "Unsupported two-qubit gate", + )), + } + } + + #[pyo3(signature = (symbol, location, params=None))] + fn run_gate( + &mut self, + symbol: &str, + location: &Bound<'_, PyTuple>, + params: Option<&Bound<'_, PyDict>>, + ) -> PyResult> { + match location.len() { + 1 => { + let qubit: usize = location.get_item(0)?.extract()?; + self.run_1q_gate(symbol, qubit, params) } + 2 => self.run_2q_gate(symbol, location, params), _ => Err(PyErr::new::( - "Unsupported gate or incorrect number of qubits", + "Gate location must be specified for either 1 or 2 qubits", )), } } diff --git a/python/pecos-rslib/src/pecos_rslib/rssparse_sim.py b/python/pecos-rslib/src/pecos_rslib/rssparse_sim.py index 5c8ce2abf..6aa2340cc 100644 --- a/python/pecos-rslib/src/pecos_rslib/rssparse_sim.py +++ b/python/pecos-rslib/src/pecos_rslib/rssparse_sim.py @@ -38,9 +38,6 @@ def run_gate( if params.get("simulate_gate", True) and locations: for location in locations: - if isinstance(location, int): - location = (location,) - if params.get("angles") and len(params["angles"]) == 1: params.update({"angle": params["angles"][0]}) elif "angle" in params and "angles" not in params: @@ -49,10 +46,11 @@ def run_gate( if symbol in self.bindings: results = self.bindings[symbol](self, location, **params) else: - results = self._sim.run_gate(symbol, location, params) + msg = f"Gate {symbol} is not supported in this simulator." + raise Exception(msg) if results: - output.update(results) + output[location] = results return output @@ -192,88 +190,97 @@ def adjust_tableau_string(line: str, *, is_stab: bool) -> str: # Define the gate dictionary gate_dict = { "I": lambda sim, q, **params: None, - "X": lambda sim, q, **params: sim._sim.run_gate("X", q, params), - "Y": lambda sim, q, **params: sim._sim.run_gate("Y", q, params), - "Z": lambda sim, q, **params: sim._sim.run_gate("Z", q, params), - "SX": lambda sim, q, **params: sim._sim.run_gate("SX", q, params), - "SXdg": lambda sim, q, **params: sim._sim.run_gate("SXdg", q, params), - "SY": lambda sim, q, **params: sim._sim.run_gate("SY", q, params), - "SYdg": lambda sim, q, **params: sim._sim.run_gate("SYdg", q, params), - "SZ": lambda sim, q, **params: sim._sim.run_gate("SZ", q, params), - "SZdg": lambda sim, q, **params: sim._sim.run_gate("SZdg", q, params), - "H": lambda sim, q, **params: sim._sim.run_gate("H", q, params), - "H2": lambda sim, q, **params: sim._sim.run_gate("H2", q, params), - "H3": lambda sim, q, **params: sim._sim.run_gate("H3", q, params), - "H4": lambda sim, q, **params: sim._sim.run_gate("H4", q, params), - "H5": lambda sim, q, **params: sim._sim.run_gate("H5", q, params), - "H6": lambda sim, q, **params: sim._sim.run_gate("H6", q, params), - "F": lambda sim, q, **params: sim._sim.run_gate("F", q, params), - "Fdg": lambda sim, q, **params: sim._sim.run_gate("Fdg", q, params), - "F2": lambda sim, q, **params: sim._sim.run_gate("F2", q, params), - "F2dg": lambda sim, q, **params: sim._sim.run_gate("F2dg", q, params), - "F3": lambda sim, q, **params: sim._sim.run_gate("F3", q, params), - "F3dg": lambda sim, q, **params: sim._sim.run_gate("F3dg", q, params), - "F4": lambda sim, q, **params: sim._sim.run_gate("F4", q, params), - "F4dg": lambda sim, q, **params: sim._sim.run_gate("F4dg", q, params), + "X": lambda sim, q, **params: sim._sim.run_1q_gate("X", q, params), + "Y": lambda sim, q, **params: sim._sim.run_1q_gate("Y", q, params), + "Z": lambda sim, q, **params: sim._sim.run_1q_gate("Z", q, params), + "SX": lambda sim, q, **params: sim._sim.run_1q_gate("SX", q, params), + "SXdg": lambda sim, q, **params: sim._sim.run_1q_gate("SXdg", q, params), + "SY": lambda sim, q, **params: sim._sim.run_1q_gate("SY", q, params), + "SYdg": lambda sim, q, **params: sim._sim.run_1q_gate("SYdg", q, params), + "SZ": lambda sim, q, **params: sim._sim.run_1q_gate("SZ", q, params), + "SZdg": lambda sim, q, **params: sim._sim.run_1q_gate("SZdg", q, params), + "H": lambda sim, q, **params: sim._sim.run_1q_gate("H", q, params), + "H2": lambda sim, q, **params: sim._sim.run_1q_gate("H2", q, params), + "H3": lambda sim, q, **params: sim._sim.run_1q_gate("H3", q, params), + "H4": lambda sim, q, **params: sim._sim.run_1q_gate("H4", q, params), + "H5": lambda sim, q, **params: sim._sim.run_1q_gate("H5", q, params), + "H6": lambda sim, q, **params: sim._sim.run_1q_gate("H6", q, params), + "F": lambda sim, q, **params: sim._sim.run_1q_gate("F", q, params), + "Fdg": lambda sim, q, **params: sim._sim.run_1q_gate("Fdg", q, params), + "F2": lambda sim, q, **params: sim._sim.run_1q_gate("F2", q, params), + "F2dg": lambda sim, q, **params: sim._sim.run_1q_gate("F2dg", q, params), + "F3": lambda sim, q, **params: sim._sim.run_1q_gate("F3", q, params), + "F3dg": lambda sim, q, **params: sim._sim.run_1q_gate("F3dg", q, params), + "F4": lambda sim, q, **params: sim._sim.run_1q_gate("F4", q, params), + "F4dg": lambda sim, q, **params: sim._sim.run_1q_gate("F4dg", q, params), "II": lambda sim, qs, **params: None, - "CX": lambda sim, qs, **params: sim._sim.run_gate("CX", qs, params), - "CNOT": lambda sim, qs, **params: sim._sim.run_gate("CX", qs, params), - "CY": lambda sim, qs, **params: sim._sim.run_gate("CY", qs, params), - "CZ": lambda sim, qs, **params: sim._sim.run_gate("CZ", qs, params), - "SXX": lambda sim, qs, **params: sim._sim.run_gate("SXX", qs, params), - "SXXdg": lambda sim, qs, **params: sim._sim.run_gate("SXXdg", qs, params), - "SYY": lambda sim, qs, **params: sim._sim.run_gate("SYY", qs, params), - "SYYdg": lambda sim, qs, **params: sim._sim.run_gate("SYYdg", qs, params), - "SZZ": lambda sim, qs, **params: sim._sim.run_gate("SZZ", qs, params), - "SZZdg": lambda sim, qs, **params: sim._sim.run_gate("SZZdg", qs, params), - "SWAP": lambda sim, qs, **params: sim._sim.run_gate("SWAP", qs, params), - "G": lambda sim, qs, **params: sim._sim.run_gate("G2", qs, params), - "G2": lambda sim, qs, **params: sim._sim.run_gate("G2", qs, params), - "MZ": lambda sim, q, **params: sim._sim.run_gate("MZ", q, params), - "MX": lambda sim, q, **params: sim._sim.run_gate("MX", q, params), - "MY": lambda sim, q, **params: sim._sim.run_gate("MY", q, params), - "PZ": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "PX": lambda sim, q, **params: sim._sim.run_gate("PX", q, params), - "PY": lambda sim, q, **params: sim._sim.run_gate("PY", q, params), - "PnZ": lambda sim, q, **params: sim._sim.run_gate("PnZ", q, params), - "Init +Z": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "Init -Z": lambda sim, q, **params: sim._sim.run_gate("PnZ", q, params), - "Init +X": lambda sim, q, **params: sim._sim.run_gate("PX", q, params), - "Init -X": lambda sim, q, **params: sim._sim.run_gate("PnX", q, params), - "Init +Y": lambda sim, q, **params: sim._sim.run_gate("PY", q, params), - "Init -Y": lambda sim, q, **params: sim._sim.run_gate("PnY", q, params), - "init |0>": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "init |1>": lambda sim, q, **params: sim._sim.run_gate("PnZ", q, params), - "init |+>": lambda sim, q, **params: sim._sim.run_gate("PX", q, params), - "init |->": lambda sim, q, **params: sim._sim.run_gate("PnX", q, params), - "init |+i>": lambda sim, q, **params: sim._sim.run_gate("PY", q, params), - "init |-i>": lambda sim, q, **params: sim._sim.run_gate("PnY", q, params), - "leak": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "leak |0>": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "leak |1>": lambda sim, q, **params: sim._sim.run_gate("PnZ", q, params), - "unleak |0>": lambda sim, q, **params: sim._sim.run_gate("PZ", q, params), - "unleak |1>": lambda sim, q, **params: sim._sim.run_gate("PnZ", q, params), - "Measure +X": lambda sim, q, **params: sim._sim.run_gate("MX", q, params), - "Measure +Y": lambda sim, q, **params: sim._sim.run_gate("MY", q, params), - "Measure +Z": lambda sim, q, **params: sim._sim.run_gate("MZ", q, params), - "Q": lambda sim, q, **params: sim._sim.run_gate("SX", q, params), - "Qd": lambda sim, q, **params: sim._sim.run_gate("SXdg", q, params), - "R": lambda sim, q, **params: sim._sim.run_gate("SY", q, params), - "Rd": lambda sim, q, **params: sim._sim.run_gate("SYdg", q, params), - "S": lambda sim, q, **params: sim._sim.run_gate("SZ", q, params), - "Sd": lambda sim, q, **params: sim._sim.run_gate("SZdg", q, params), - "H1": lambda sim, q, **params: sim._sim.run_gate("H1", q, params), - "F1": lambda sim, q, **params: sim._sim.run_gate("F", q, params), - "F1d": lambda sim, q, **params: sim._sim.run_gate("Fdg", q, params), - "F2d": lambda sim, q, **params: sim._sim.run_gate("F2dg", q, params), - "F3d": lambda sim, q, **params: sim._sim.run_gate("F3dg", q, params), - "F4d": lambda sim, q, **params: sim._sim.run_gate("F4dg", q, params), - "SqrtXX": lambda sim, qs, **params: sim._sim.run_gate("SXX", qs, params), - "SqrtYY": lambda sim, qs, **params: sim._sim.run_gate("SYY", qs, params), - "SqrtZZ": lambda sim, qs, **params: sim._sim.run_gate("SZZ", qs, params), - "measure Z": lambda sim, q, **params: sim._sim.run_gate("MZ", q, params), - "MZForced": lambda sim, q, **params: sim._sim.run_gate("MZForced", q, params), - "PZForced": lambda sim, q, **params: sim._sim.run_gate("PZForced", q, params), + "CX": lambda sim, qs, **params: sim._sim.run_2q_gate("CX", qs, params), + "CNOT": lambda sim, qs, **params: sim._sim.run_2q_gate("CX", qs, params), + "CY": lambda sim, qs, **params: sim._sim.run_2q_gate("CY", qs, params), + "CZ": lambda sim, qs, **params: sim._sim.run_2q_gate("CZ", qs, params), + "SXX": lambda sim, qs, **params: sim._sim.run_2q_gate("SXX", qs, params), + "SXXdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SXXdg", qs, params), + "SYY": lambda sim, qs, **params: sim._sim.run_2q_gate("SYY", qs, params), + "SYYdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SYYdg", qs, params), + "SZZ": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZ", qs, params), + "SZZdg": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZdg", qs, params), + "SWAP": lambda sim, qs, **params: sim._sim.run_2q_gate("SWAP", qs, params), + "G": lambda sim, qs, **params: sim._sim.run_2q_gate("G2", qs, params), + "G2": lambda sim, qs, **params: sim._sim.run_2q_gate("G2", qs, params), + "MZ": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params), + "MX": lambda sim, q, **params: sim._sim.run_1q_gate("MX", q, params), + "MY": lambda sim, q, **params: sim._sim.run_1q_gate("MY", q, params), + "PZ": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "PX": lambda sim, q, **params: sim._sim.run_1q_gate("PX", q, params), + "PY": lambda sim, q, **params: sim._sim.run_1q_gate("PY", q, params), + "PnZ": lambda sim, q, **params: sim._sim.run_1q_gate("PnZ", q, params), + "Init +Z": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "Init -Z": lambda sim, q, **params: sim._sim.run_1q_gate("PnZ", q, params), + "Init +X": lambda sim, q, **params: sim._sim.run_1q_gate("PX", q, params), + "Init -X": lambda sim, q, **params: sim._sim.run_1q_gate("PnX", q, params), + "Init +Y": lambda sim, q, **params: sim._sim.run_1q_gate("PY", q, params), + "Init -Y": lambda sim, q, **params: sim._sim.run_1q_gate("PnY", q, params), + "init |0>": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "init |1>": lambda sim, q, **params: sim._sim.run_1q_gate("PnZ", q, params), + "init |+>": lambda sim, q, **params: sim._sim.run_1q_gate("PX", q, params), + "init |->": lambda sim, q, **params: sim._sim.run_1q_gate("PnX", q, params), + "init |+i>": lambda sim, q, **params: sim._sim.run_1q_gate("PY", q, params), + "init |-i>": lambda sim, q, **params: sim._sim.run_1q_gate("PnY", q, params), + "leak": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "leak |0>": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "leak |1>": lambda sim, q, **params: sim._sim.run_1q_gate("PnZ", q, params), + "unleak |0>": lambda sim, q, **params: sim._sim.run_1q_gate("PZ", q, params), + "unleak |1>": lambda sim, q, **params: sim._sim.run_1q_gate("PnZ", q, params), + "Measure +X": lambda sim, q, **params: sim._sim.run_1q_gate("MX", q, params), + "Measure +Y": lambda sim, q, **params: sim._sim.run_1q_gate("MY", q, params), + "Measure +Z": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params), + "Q": lambda sim, q, **params: sim._sim.run_1q_gate("SX", q, params), + "Qd": lambda sim, q, **params: sim._sim.run_1q_gate("SXdg", q, params), + "R": lambda sim, q, **params: sim._sim.run_1q_gate("SY", q, params), + "Rd": lambda sim, q, **params: sim._sim.run_1q_gate("SYdg", q, params), + "S": lambda sim, q, **params: sim._sim.run_1q_gate("SZ", q, params), + "Sd": lambda sim, q, **params: sim._sim.run_1q_gate("SZdg", q, params), + "H1": lambda sim, q, **params: sim._sim.run_1q_gate("H1", q, params), + "F1": lambda sim, q, **params: sim._sim.run_1q_gate("F", q, params), + "F1d": lambda sim, q, **params: sim._sim.run_1q_gate("Fdg", q, params), + "F2d": lambda sim, q, **params: sim._sim.run_1q_gate("F2dg", q, params), + "F3d": lambda sim, q, **params: sim._sim.run_1q_gate("F3dg", q, params), + "F4d": lambda sim, q, **params: sim._sim.run_1q_gate("F4dg", q, params), + "SqrtXX": lambda sim, qs, **params: sim._sim.run_2q_gate("SXX", qs, params), + "SqrtYY": lambda sim, qs, **params: sim._sim.run_2q_gate("SYY", qs, params), + "SqrtZZ": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZ", qs, params), + "measure Z": lambda sim, q, **params: sim._sim.run_1q_gate("MZ", q, params), + "MZForced": lambda sim, q, **params: sim._sim.run_1q_gate("MZForced", q, params), + "PZForced": lambda sim, q, **params: sim._sim.run_1q_gate("PZForced", q, params), + "SqrtXXd": lambda sim, qs, **params: sim._sim.run_2q_gate("SXXdg", qs, params), + "SqrtYYd": lambda sim, qs, **params: sim._sim.run_2q_gate("SYYdg", qs, params), + "SqrtZZd": lambda sim, qs, **params: sim._sim.run_2q_gate("SZZdg", qs, params), + "SqrtX": lambda sim, q, **params: sim._sim.run_1q_gate("SX", q, params), + "SqrtXd": lambda sim, q, **params: sim._sim.run_1q_gate("SXdg", q, params), + "SqrtY": lambda sim, q, **params: sim._sim.run_1q_gate("SY", q, params), + "SqrtYd": lambda sim, q, **params: sim._sim.run_1q_gate("SYdg", q, params), + "SqrtZ": lambda sim, q, **params: sim._sim.run_1q_gate("SZ", q, params), + "SqrtZd": lambda sim, q, **params: sim._sim.run_1q_gate("SZdg", q, params), } # "force output": qmeas.force_output,