Skip to content
Merged
26 changes: 15 additions & 11 deletions cirq-core/cirq/experiments/qubit_characterizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ def single_qubit_randomized_benchmarking(
A RandomizedBenchMarkResult object that stores and plots the result.
"""

qubits = cast(Iterator['cirq.Qid'], (qubit,))
qubits = (qubit,)
Comment thread
NoureldinYosri marked this conversation as resolved.
Outdated
result = parallel_single_qubit_randomized_benchmarking(
sampler,
qubits,
Expand All @@ -271,7 +271,7 @@ def single_qubit_randomized_benchmarking(

def parallel_single_qubit_randomized_benchmarking(
sampler: 'cirq.Sampler',
qubits: Iterator['cirq.Qid'],
qubits: Sequence['cirq.Qid'],
use_xy_basis: bool = True,
*,
num_clifford_range: Sequence[int] = tuple(
Expand Down Expand Up @@ -560,11 +560,16 @@ def _measurement(two_qubit_circuit: circuits.Circuit) -> np.ndarray:


def _create_parallel_rb_circuit(
qubits: Iterator['cirq.Qid'], num_cliffords: int, c1: list
qubits: Sequence['cirq.Qid'], num_cliffords: int, c1: list
) -> 'cirq.Circuit':
circuits_to_zip = [_random_single_q_clifford(qubit, num_cliffords, c1) for qubit in qubits]
circuit = circuits.Circuit.zip(*circuits_to_zip)
return circuits.Circuit.from_moments(*circuit, ops.measure_each(*qubits))
sequences_to_zip = [_random_single_q_clifford(qubit, num_cliffords, c1) for qubit in qubits]
# Ensure each sequence has the same number of moments.
num_moments = max(len(sequence) for sequence in sequences_to_zip)
for q, sequence in zip(qubits, sequences_to_zip):
if (n := len(sequence)) < num_moments:
sequence.extend([ops.SingleQubitCliffordGate.I(q)] * (num_moments - n))
moments = zip(*sequences_to_zip)
return circuits.Circuit.from_moments(*moments, ops.measure_each(*qubits))


def _indices_after_basis_rot(i: int, j: int) -> Tuple[int, Sequence[int], Sequence[int]]:
Expand Down Expand Up @@ -609,13 +614,12 @@ def _two_qubit_clifford_matrices(

def _random_single_q_clifford(
qubit: 'cirq.Qid', num_cfds: int, cfds: Sequence[Sequence['cirq.Gate']]
) -> 'cirq.Circuit':
) -> List['cirq.Operation']:
clifford_group_size = 24
operations = [[gate(qubit) for gate in gates] for gates in cfds]
gate_ids = list(np.random.choice(clifford_group_size, num_cfds))
gate_sequence = [gate for gate_id in gate_ids for gate in cfds[gate_id]]
gate_sequence.append(_reduce_gate_seq(gate_sequence) ** -1)
circuit = circuits.Circuit(gate(qubit) for gate in gate_sequence)
return circuit
adjoint = _reduce_gate_seq([gate for gate_id in gate_ids for gate in cfds[gate_id]]) ** -1
return [op for gate_id in gate_ids for op in operations[gate_id]] + [adjoint(qubit)]


def _random_two_q_clifford(
Expand Down
6 changes: 4 additions & 2 deletions cirq-core/cirq/sim/clifford/clifford_simulator_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,9 +324,11 @@ def test_clifford_circuit_SHSYSHS():
clifford_simulator = cirq.CliffordSimulator()
state_vector_simulator = cirq.Simulator()

# workaround until #6402 is resolved.
final_state_vector = state_vector_simulator.simulate(circuit).final_state_vector
final_state_vector /= np.sqrt(np.linalg.norm(final_state_vector))
np.testing.assert_almost_equal(
clifford_simulator.simulate(circuit).final_state.state_vector(),
state_vector_simulator.simulate(circuit).final_state_vector,
clifford_simulator.simulate(circuit).final_state.state_vector(), final_state_vector
)


Expand Down