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 @@ -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
Expand Down Expand Up @@ -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:
Expand Down
5 changes: 4 additions & 1 deletion qiskit_experiments/randomized_benchmarking/rb_experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
54 changes: 48 additions & 6 deletions test/test_rb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


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