diff --git a/qiskit_experiments/randomized_benchmarking/interleaved_rb_experiment.py b/qiskit_experiments/randomized_benchmarking/interleaved_rb_experiment.py index 17ed0fcd1f..1ac6d1afd1 100644 --- a/qiskit_experiments/randomized_benchmarking/interleaved_rb_experiment.py +++ b/qiskit_experiments/randomized_benchmarking/interleaved_rb_experiment.py @@ -18,7 +18,7 @@ from qiskit import QuantumCircuit from qiskit.circuit import Instruction -from qiskit.quantum_info import Clifford, random_clifford +from qiskit.quantum_info import Clifford from .rb_experiment import RBExperiment from .interleaved_rb_analysis import InterleavedRBAnalysis @@ -62,7 +62,7 @@ def __init__( def _sample_circuits(self, lengths, seed=None): circuits = [] for length in lengths if self._full_sampling else [lengths[-1]]: - elements = [random_clifford(self.num_qubits, seed=seed) for _ in range(length)] + elements = self._clifford_utils.random_clifford_circuits(self.num_qubits, length, seed) element_lengths = [len(elements)] if self._full_sampling else lengths std_circuits = self._generate_circuit(elements, element_lengths) for circuit in std_circuits: diff --git a/qiskit_experiments/randomized_benchmarking/rb_experiment.py b/qiskit_experiments/randomized_benchmarking/rb_experiment.py index 476b3f7975..85cb6d9835 100644 --- a/qiskit_experiments/randomized_benchmarking/rb_experiment.py +++ b/qiskit_experiments/randomized_benchmarking/rb_experiment.py @@ -21,6 +21,7 @@ from qiskit.providers import Backend from qiskit.quantum_info import Clifford from qiskit.providers.options import Options +from qiskit.circuit import Gate from qiskit_experiments.base_experiment import BaseExperiment from .rb_analysis import RBAnalysis @@ -137,7 +138,9 @@ 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.to_gate() + group_elt_gate = 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)) for circ in circs: circ.append(group_elt_gate, qubits) diff --git a/test/test_rb.py b/test/test_rb.py index 99a49729c5..df8cb9764c 100644 --- a/test/test_rb.py +++ b/test/test_rb.py @@ -16,12 +16,13 @@ A Tester for the RB experiment """ +import numpy as np +from ddt import ddt, data, unpack from qiskit.quantum_info.operators.predicates import matrix_equal from qiskit.quantum_info import Clifford from qiskit.test import QiskitTestCase from qiskit.test.mock import FakeParis -from ddt import ddt, data, unpack -import numpy as np +from qiskit.circuit.library import XGate, CXGate import qiskit_experiments as qe @@ -43,7 +44,7 @@ def test_rb_experiment(self, qubits: list): exp_attributes = { "qubits": qubits, "lengths": [1, 4, 6, 9, 13, 16], - "num_samples": 1, + "num_samples": 2, "seed": 100, } rb = qe.randomized_benchmarking @@ -82,10 +83,11 @@ def validate_metadata(self, circuits: list, exp_attributes: dict): circuits (list): A list containing quantum circuits exp_attributes (dict): A dictionary with the experiment variable and values """ - for ind, qc in enumerate(circuits): + for qc in circuits: self.assertTrue( - qc.metadata["xval"] == exp_attributes["lengths"][ind], - "The number of gates in the experiment metadata doesn't match to the one provided.", + qc.metadata["xval"] in exp_attributes["lengths"], + "The number of gates in the experiment metadata doesn't match " + "any of the provided lengths", ) self.assertTrue( qc.metadata["qubits"] == tuple(exp_attributes["qubits"]), @@ -115,3 +117,43 @@ def validate_circuit_data( tuple(exp_attributes["qubits"]) == experiment.physical_qubits, "The qubits indices in the experiment doesn't match to the one in the metadata.", ) + + +@ddt +class TestInterleavedRB(TestRB): + """ + A test class for the interleaved RB Experiment to check that the + InterleavedRBExperiment class is working correctly. + """ + + @data([XGate(), [3]], [CXGate(), [4, 7]]) + @unpack + def test_interleaved_rb_experiment(self, interleaved_element: "Gate", qubits: list): + """ + Initializes data and executes an interleaved RB experiment with specific parameters. + Args: + interleaved_element: The Clifford element to interleave + qubits (list): A list containing qubit indices for the experiment + """ + backend = FakeParis() + exp_attributes = { + "interleaved_element": interleaved_element, + "qubits": qubits, + "lengths": [1, 4, 6, 9, 13, 16], + "num_samples": 2, + "seed": 100, + } + rb = qe.randomized_benchmarking + rb_exp = rb.InterleavedRBExperiment( + exp_attributes["interleaved_element"], + exp_attributes["qubits"], + exp_attributes["lengths"], + num_samples=exp_attributes["num_samples"], + seed=exp_attributes["seed"], + ) + experiment_obj = rb_exp.run(backend) + exp_data = experiment_obj.experiment + exp_circuits = rb_exp.circuits() + self.validate_metadata(exp_circuits, exp_attributes) + self.validate_circuit_data(exp_data, exp_attributes) + self.is_identity(exp_circuits)