Symmetric Stabilizer Benchmarking (SSB)
To demonstrate SSB consider a noise model where single and two qubit gates are independently affected by depolarising channels.
[1]:
from __future__ import annotations
import cirq
class IndependentDepolariseNoiseModel(cirq.NoiseModel):
"""Applies single and two qubit depolarising channels independently."""
def __init__(self, single_qubit_error: float, two_qubit_error: float) -> None:
"""Args:
single_qubit_error: Single qubit pauli error.
two_qubit_error: Two qubit pauli error.
"""
super().__init__()
self.single_qubit_error = single_qubit_error
self.two_qubit_error = two_qubit_error
self.single_qubit_depolarise = cirq.DepolarizingChannel(p=single_qubit_error, n_qubits=1)
self.two_qubit_depolarise = cirq.DepolarizingChannel(p=two_qubit_error, n_qubits=2)
def noisy_operation(self, operation: cirq.Operation) -> list[cirq.OP_TREE]:
"""Produces a list of operations by applying each noise model
to the provided operation depending on the number of qubits it acts on.
"""
if len(operation.qubits) == 1:
return [operation, self.single_qubit_depolarise(*operation.qubits)]
if len(operation.qubits) == 2:
return [operation, self.two_qubit_depolarise(*operation.qubits)]
return [operation]
e_1 = 0.001
e_2 = 0.025
noise = IndependentDepolariseNoiseModel(single_qubit_error=e_1, two_qubit_error=e_2)
simulator = cirq.DensityMatrixSimulator(noise=noise, seed=0)
Now run the experiment and analyse the results.
[2]:
import supermarq.qcvv
experiment = supermarq.qcvv.SSB(seed=0, num_circuits=100, cycle_depths=[2, 5, 10, 15, 20])
results = experiment.run_with_simulator(simulator)
results.analyze(plot_results=True)
Estimated CZ fidelity: 0.97377 +/- 0.0029033
[3]:
print(f"Expected CZ gate fidelity: {1 - 16 / 15 * e_2:.5f}")
results.print_results()
Expected CZ gate fidelity: 0.97333
Estimated CZ fidelity: 0.97377 +/- 0.0029033
[ ]: