diff --git a/qiskit_experiments/library/randomized_benchmarking/interleaved_rb_experiment.py b/qiskit_experiments/library/randomized_benchmarking/interleaved_rb_experiment.py index cf3c40d7a8..5b593254da 100644 --- a/qiskit_experiments/library/randomized_benchmarking/interleaved_rb_experiment.py +++ b/qiskit_experiments/library/randomized_benchmarking/interleaved_rb_experiment.py @@ -19,6 +19,7 @@ from qiskit import QuantumCircuit from qiskit.circuit import Instruction from qiskit.quantum_info import Clifford +from qiskit.exceptions import QiskitError from .rb_experiment import StandardRB from .interleaved_rb_analysis import InterleavedRBAnalysis @@ -71,7 +72,7 @@ def __init__( sequences are constructed by appending additional Clifford samples to shorter sequences. """ - self._interleaved_element = interleaved_element + self._set_interleaved_element(interleaved_element) super().__init__(qubits, lengths, num_samples, seed, full_sampling) def _sample_circuits(self, lengths, seed=None): @@ -107,3 +108,23 @@ def _interleave(self, element_list: List) -> List: new_element_list.append(element) new_element_list.append(self._interleaved_element) return new_element_list + + def _set_interleaved_element(self, interleaved_element): + """Handle the various types of the interleaved element + + Args: + interleaved_element: The element to interleave + + Raises: + QiskitError: if there is no known conversion of interleaved_element + to a Clifford group element + """ + try: + interleaved_element_op = Clifford(interleaved_element) + self._interleaved_element = (interleaved_element, interleaved_element_op) + except QiskitError as error: + raise QiskitError( + "Interleaved element {} could not be converted to Clifford element".format( + interleaved_element.name + ) + ) from error diff --git a/qiskit_experiments/library/randomized_benchmarking/rb_experiment.py b/qiskit_experiments/library/randomized_benchmarking/rb_experiment.py index bf9f3b29e1..d917dd47fd 100644 --- a/qiskit_experiments/library/randomized_benchmarking/rb_experiment.py +++ b/qiskit_experiments/library/randomized_benchmarking/rb_experiment.py @@ -188,10 +188,16 @@ def _generate_circuit( circ_op = Clifford(np.eye(2 * self.num_qubits)) for current_length, group_elt_circ in enumerate(elements): - group_elt_gate = group_elt_circ + if isinstance(group_elt_circ, tuple): + group_elt_gate = group_elt_circ[0] + group_elt_op = group_elt_circ[1] + else: + group_elt_gate = group_elt_circ + group_elt_op = Clifford(group_elt_circ) + if not isinstance(group_elt_gate, Gate): group_elt_gate = group_elt_gate.to_gate() - circ_op = circ_op.compose(Clifford(group_elt_circ)) + circ_op = circ_op.compose(group_elt_op) for circ in circs: circ.append(group_elt_gate, qubits) circ.barrier(qubits) diff --git a/test/randomized_benchmarking/test_rb.py b/test/randomized_benchmarking/test_rb.py index 3a9fa3d532..af593d2bc4 100644 --- a/test/randomized_benchmarking/test_rb.py +++ b/test/randomized_benchmarking/test_rb.py @@ -26,6 +26,7 @@ from qiskit.circuit.library import ( XGate, CXGate, + TGate, ) from qiskit_experiments.library import StandardRB, InterleavedRB @@ -232,3 +233,16 @@ def test_interleaved_structure(self, interleaved_element: "Gate", qubits: list, self.assertEqual(c_int[int_idx + 3][0].name, interleaved_element.name) std_idx += 2 int_idx += 4 + + def test_non_clifford_interleaved_element(self): + """Verifies trying to run interleaved RB with non Clifford element throws an exception""" + qubits = 1 + lengths = [1, 4, 6, 9, 13, 16] + interleaved_element = TGate() # T gate is not Clifford, this should fail + self.assertRaises( + QiskitError, + InterleavedRB, + interleaved_element, + qubits, + lengths, + )