Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions test/randomized_benchmarking/test_rb.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from qiskit.circuit.library import (
XGate,
CXGate,
TGate,
)
from qiskit_experiments.library import StandardRB, InterleavedRB

Expand Down Expand Up @@ -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,
)