![]() |
![]() |
![]() |
![]() |
This notebook demonstrates how to use a Quantum Virtual Machine with larger, more elaborate circuits to demonstrate stabilizer circuits and how they can reveal hardware errors.
Install Cirq and qsim, Create Quantum Virtual Machine
# @title Install `cirq_google` and `qsimcirq`
try:
import cirq
import cirq_google
except ImportError:
print("installing cirq...")
!pip install --quiet cirq-google
print("installed cirq.")
import cirq
import cirq_google
try:
import qsimcirq
except ImportError:
print("installing qsimcirq...")
!pip install --quiet qsimcirq
print(f"installed qsimcirq.")
import qsimcirq
# Other modules used in this colab
import matplotlib.pyplot as plt
import time
import random
# @title Create Quantum Virtual Machine: Choose a processor ("willow_pink", "rainbow" or "weber")
# (see cirq_google.engine.list_virtual_processors() for available names)
processor_id = "willow_pink" # @param {type:"string"}
# Instantiate the engine.
sim_engine = cirq_google.engine.create_default_noisy_quantum_virtual_machine(
processor_id=processor_id, simulator_class=qsimcirq.QSimSimulator
)
print(
"Your quantum virtual machine",
processor_id,
"is ready, here is the qubit grid:",
"\n========================\n",
)
print(sim_engine.get_processor(processor_id).get_device())
Your quantum virtual machine willow_pink is ready, here is the qubit grid: ======================== (0, 6)ββββ(0, 7)ββββ(0, 8) β β β β β β (1, 5)ββββ(1, 6)ββββ(1, 7)ββββ(1, 8) β β β β β β β β (2, 4)ββββ(2, 5)ββββ(2, 6)ββββ(2, 7)ββββ(2, 8)ββββ(2, 9)ββββ(2, 10) β β β β β β β β β β β β β β (3, 3)βββ(3, 4)ββββ(3, 5)ββββ(3, 6)ββββ(3, 7)ββββ(3, 8)ββββ(3, 9)ββββ(3, 10) β β β β β β β β β β β β β β β β (4, 2)βββ(4, 3)βββ(4, 4)ββββ(4, 5)ββββ(4, 6)ββββ(4, 7)ββββ(4, 8)ββββ(4, 9)ββββ(4, 10)ββββ(4, 11)βββ(4, 12) β β β β β β β β β β β β β β β β β β β β β β (5, 1)βββ(5, 2)βββ(5, 3)βββ(5, 4)ββββ(5, 5)ββββ(5, 6)ββββ(5, 7)ββββ(5, 8)ββββ(5, 9)ββββ(5, 10)ββββ(5, 11)βββ(5, 12) β β β β β β β β β β β β β β β β β β β β β β β β (6, 0)βββ(6, 1)βββ(6, 2)βββ(6, 3)βββ(6, 4)ββββ(6, 5)ββββ(6, 6)ββββ(6, 7)ββββ(6, 8)ββββ(6, 9)ββββ(6, 10)ββββ(6, 11)βββ(6, 12)βββ(6, 13)βββ(6, 14) β β β β β β β β β β β β β β β β β β β β β β β β (7, 2)βββ(7, 3)βββ(7, 4)ββββ(7, 5)ββββ(7, 6)ββββ(7, 7)ββββ(7, 8)ββββ(7, 9)ββββ(7, 10)ββββ(7, 11)βββ(7, 12)βββ(7, 13) β β β β β β β β β β β β β β β β β β β β β β (8, 2)βββ(8, 3)βββ(8, 4)ββββ(8, 5)ββββ(8, 6)ββββ(8, 7)ββββ(8, 8)ββββ(8, 9)ββββ(8, 10)ββββ(8, 11)βββ(8, 12) β β β β β β β β β β β β β β β β (9, 4)ββββ(9, 5)ββββ(9, 6)ββββ(9, 7)ββββ(9, 8)ββββ(9, 9)ββββ(9, 10)ββββ(9, 11) β β β β β β β β β β β β β β (10, 4)βββ(10, 5)βββ(10, 6)βββ(10, 7)βββ(10, 8)βββ(10, 9)βββ(10, 10) β β β β β β β β (11, 6)βββ(11, 7)βββ(11, 8)βββ(11, 9) β β β β β β (12, 6)βββ(12, 7)βββ(12, 8)
Introduction to stabilizer measurements
The following code blocks measure a Z stabilizer as described by Fowler et al (2012). This type of circuit is central to the field of quantum error correction via the idea of a Stabilizer Code.
This circuit is constructed such that the central "measure" qubit will be in the \(|1\rangle\) state if an odd number of the four surrounding "data" qubits (named a-d in the figure) have a bit-flip error (corresponding to an X gate).
Stabilizer measurements on a small grid
The examples below demonstrate a single Z stabilizer, similar to the image above.
Without noise
In a perfectly noiseless Z stabilizer, all qubits will remain in the \(|0\rangle\) state.
data_qubits = [cirq.NamedQubit('data_' + str(x)) for x in 'abcd']
measure_qubit = cirq.NamedQubit('_meas')
stabilizer_circuit = cirq.Circuit(
*[cirq.CX(data_qubit, measure_qubit) for data_qubit in data_qubits],
cirq.measure(measure_qubit, key='meas'),
)
print(f'Z-stabilizer circuit:')
print('========================')
print(stabilizer_circuit)
Z-stabilizer circuit: ======================== _meas: ββββXβββXβββXβββXβββM('meas')βββ β β β β data_a: βββ@ββββΌββββΌββββΌβββββββββββββββ β β β data_b: βββββββ@ββββΌββββΌβββββββββββββββ β β data_c: βββββββββββ@ββββΌβββββββββββββββ β data_d: βββββββββββββββ@βββββββββββββββ
simulator = cirq.Simulator()
result = simulator.run(stabilizer_circuit, repetitions=100)
cirq.plot_state_histogram(result)
<Axes: title={'center': 'Result State Histogram'}, xlabel='qubit state', ylabel='result count'>
With fixed noise
If one of the qubits is flipped, the measure qubit will also flip to match the parity of the data qubits.
random_data_qubit = random.choice(data_qubits)
stabilizer_circuit_with_error = cirq.X(random_data_qubit) + stabilizer_circuit
print(f'Z-stabilizer circuit with single error:')
print('========================')
print(stabilizer_circuit_with_error)
Z-stabilizer circuit with single error: ======================== _meas: ββββββββXβββXβββXβββXβββM('meas')βββ β β β β data_a: βββββββ@ββββΌββββΌββββΌβββββββββββββββ β β β data_b: βββββββββββ@ββββΌββββΌβββββββββββββββ β β data_c: βββββββββββββββ@ββββΌβββββββββββββββ β data_d: βββXβββββββββββββββ@βββββββββββββββ
result = simulator.run(stabilizer_circuit_with_error, repetitions=100)
cirq.plot_state_histogram(result)
<Axes: title={'center': 'Result State Histogram'}, xlabel='qubit state', ylabel='result count'>
With hardware noise on the QVM
With hardware-like noise, the stabilizer circuit becomes much more interesting. An arbitrary error could occur at any point:
- On a data qubit before or after the CNOT
- On the measure qubit before or after the CNOTs
- On the measure qubit between CNOTs
- Multiple errors in any combination of the above locations
The only indication of that error comes from the output of the measure qubit. By creating a grid of stabilizers and observing how they change over time, it's possible to decode when and where errors occured and compensate for them.
The example below only runs a single cycle of one Z stabilizer, so it can't pinpoint error precisely. However, by measuring the data qubits afterwards it's possible to guess at where the error(s) took place.
# Add measurements to the data qubits.
stabilizer_circuit_for_hardware = stabilizer_circuit + (
cirq.Moment(cirq.measure(data_qubit, key=str(data_qubit)[-1]) for data_qubit in data_qubits)
)
print(f'Z-stabilizer circuit with data measurement:')
print('========================')
print(stabilizer_circuit_for_hardware)
Z-stabilizer circuit with data measurement: ======================== _meas: ββββXβββXβββXβββXβββM('meas')ββββββββββββ β β β β data_a: βββ@ββββΌββββΌββββΌβββββββββββββββM('a')βββ β β β data_b: βββββββ@ββββΌββββΌβββββββββββββββM('b')βββ β β data_c: βββββββββββ@ββββΌβββββββββββββββM('c')βββ β data_d: βββββββββββββββ@βββββββββββββββM('d')βββ
# Device_stabilizer_plaquette is an X-shaped region of qubits
# on the actual device.
device_stabilizer_plaquette = [
cirq.GridQubit(5, 3),
cirq.GridQubit(5, 2),
cirq.GridQubit(4, 3),
cirq.GridQubit(5, 4),
cirq.GridQubit(6, 3),
]
if processor_id == "willow_pink":
target_gateset = cirq.CZTargetGateset()
else:
target_gateset = cirq.SqrtIswapTargetGateset()
# Translate the circuit to a suitable gate set.
test_stabilizer_circuit = cirq.optimize_for_target_gateset(
stabilizer_circuit_for_hardware,
context=cirq.TransformerContext(deep=True),
gateset=target_gateset,
)
# Map circuit qubits to hardware ones.
qubit_map = dict(zip([measure_qubit] + data_qubits, device_stabilizer_plaquette))
# Re-map the circuit to the hardware qubits.
test_stabilizer_circuit = test_stabilizer_circuit.transform_qubits(lambda q: qubit_map[q])
print(f'Z-stabilizer circuit optimized for {processor_id}:')
print('========================')
print(test_stabilizer_circuit)
Z-stabilizer circuit optimized for willow_pink: ======================== (4, 3): βββββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0,x=0,z=1)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββM('b')βββ β (5, 2): βββββββββββββββββββββββββββ@βββPhXZ(a=0,x=0,z=1)ββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββM('a')βββ β β (5, 3): βββPhXZ(a=0.5,x=0.5,z=0)βββ@βββββββββββββββββββββββ@βββββββββββββββββββββββ@βββββββββββββββββββββββ@βββPhXZ(a=-0.5,x=0.5,z=-8.88e-16)βββM('meas')ββββββββββββ β β (5, 4): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0,x=0,z=1)ββββΌββββββββββββββββββββββββββββββββββββββββββββββββM('c')βββ β (6, 3): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0,x=0,z=1)ββββββββββββββββββββββββββββM('d')βββ
# Run for 1k repetitions.
repetitions = 1000
start = time.time()
results = sim_engine.get_sampler(processor_id).run(test_stabilizer_circuit, repetitions=repetitions)
elapsed = time.time() - start
print(f'{repetitions} repetitions completed in {elapsed:.03f}s')
1000 repetitions completed in 0.269s
Each result in the histogram below corresponds to a different set of possible errors. Below are some of the most likely cases for each measured result, or "syndrome", but there are many other possible cases not listed.
- No flips (
0_0000
) could be no error, or two errors on the same qubit. - A single data flip (e.g.
0_1000
) could be a post-CNOT data error, or a pre-CNOT data error and a measurement error. - A data flip and a measure flip (e.g.
1_1000
) could be a pre-CNOT data error or post-CNOT errors on both flipped qubits. - Two data flips (e.g.
0_1100
) could be pre-CNOT or post-CNOT errors on both flipped qubits.
...and so on, for more unusual cases.
# A labeling function.
def fold_func(bits) -> str:
suffix = "".join(map(str, [bits[i][0] for i in range(1, 5)]))
return f"{bits[0][0]}_{suffix}"
hist = results.multi_measurement_histogram(keys=['meas'] + list('abcd'), fold_func=fold_func)
print("Results (<meas>_<data>)")
ax = cirq.plot_state_histogram(hist)
plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right');
Results (<meas>_<data>)
As a final exercise on this circuit, it's possible to display a 2D heatmap of measurement results. This will show which qubits measured a \(|1\rangle\) most often; on a hardware device, this could be used to highlight the performance of specific qubits. See Heatmaps for more on visualizing error.
meas_map = {qubit_map[measure_qubit]: sum(results.measurements['meas']) / repetitions}
data_map = {
qubit_map[dq]: sum(results.measurements[str(dq)[-1]]) / repetitions for dq in data_qubits
}
heatmap = cirq.Heatmap({**meas_map, **data_map})
heatmap.plot();
Stabilizer measurements on a large grid
The next examples scale up the stabilizer grid to a 2x3 block of three Z stabilizers and three X stabilizers. Combining both stabilizer types allows many types of error to be detected and compensated for, although some ambiguity still remains. It also manually maps the circuit to the hardware qubits.
A real logical qubit would require many more stabilizers to be fault-tolerant; however, this toy example is already near the upper bound of what a full statevector simulator can simulate on personal-level computers.
# Consider the following grid, where numbers represent
# measure qubits and letters represent data qubits:
#
# A
# B0C
# D1E2F
# G3H4J
# K5L
# M
#
# Center Z-plaquettes on [0, 3, 4] and
# X-plaquettes on [1, 2, 5]
# Instantiate the alphabetical data qubits and numerical measurement qubits.
grid_data_qubits = {x: cirq.NamedQubit(x) for x in 'ABCDEFGHJKLM'}
grid_meas_qubits = {x: cirq.NamedQubit(str(x)) for x in range(6)}
# Build the diamond shaped stabilizer circuit from six layered smaller stabilizers.
stabilizer_grid_circuit = cirq.Circuit(
cirq.H.on_each(grid_meas_qubits[x] for x in [1, 2, 5]),
*[cirq.CX(grid_data_qubits[x], grid_meas_qubits[0]) for x in 'ABCE'],
*[cirq.CX(grid_meas_qubits[1], grid_data_qubits[x]) for x in 'BDEG'],
*[cirq.CX(grid_meas_qubits[2], grid_data_qubits[x]) for x in 'CEFH'],
*[cirq.CX(grid_data_qubits[x], grid_meas_qubits[3]) for x in 'EGHK'],
*[cirq.CX(grid_data_qubits[x], grid_meas_qubits[4]) for x in 'FHJL'],
*[cirq.CX(grid_meas_qubits[5], grid_data_qubits[x]) for x in 'HKLM'],
cirq.H.on_each(grid_meas_qubits[x] for x in [1, 2, 5]),
*[cirq.measure(mq) for mq in grid_meas_qubits.values()],
*[cirq.measure(dq) for dq in grid_data_qubits.values()],
)
# Map the named qubits of the stabilizer circuit to GridQubits on the hardware.
qubit_map = {
cirq.NamedQubit('A'): cirq.GridQubit(4, 3),
cirq.NamedQubit('B'): cirq.GridQubit(5, 2),
cirq.NamedQubit('0'): cirq.GridQubit(5, 3),
cirq.NamedQubit('C'): cirq.GridQubit(5, 4),
cirq.NamedQubit('D'): cirq.GridQubit(6, 1),
cirq.NamedQubit('1'): cirq.GridQubit(6, 2),
cirq.NamedQubit('E'): cirq.GridQubit(6, 3),
cirq.NamedQubit('2'): cirq.GridQubit(6, 4),
cirq.NamedQubit('F'): cirq.GridQubit(6, 5),
cirq.NamedQubit('G'): cirq.GridQubit(7, 2),
cirq.NamedQubit('3'): cirq.GridQubit(7, 3),
cirq.NamedQubit('H'): cirq.GridQubit(7, 4),
cirq.NamedQubit('4'): cirq.GridQubit(7, 5),
cirq.NamedQubit('J'): cirq.GridQubit(7, 6),
cirq.NamedQubit('K'): cirq.GridQubit(8, 3),
cirq.NamedQubit('5'): cirq.GridQubit(8, 4),
cirq.NamedQubit('L'): cirq.GridQubit(8, 5),
cirq.NamedQubit('M'): cirq.GridQubit(9, 4),
}
stabilizer_grid_circuit = stabilizer_grid_circuit.transform_qubits(lambda q: qubit_map[q])
print(stabilizer_grid_circuit)
ββββ ββββββββββ ββββ ββββ ββββββββββ βββββββββ βββββββββ ββββββββββββββ βββββββββ (4, 3): βββ@βββM('A')ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β (5, 2): ββββΌβββ@ββββββββββXβββββM('B')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (5, 3): βββXβββXβββββββββXβΌβββββXβββββββββββM('0')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β (5, 4): βββββββββββββββββ@βΌββββββΌββββββXββββM('C')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (6, 1): βββββββββββββββββββΌββββββΌβββββXβΌββββM('D')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β ββ (6, 2): βββHββββββββββββββ@ββββββΌβββββ@βΌββββ@βββββββββ@ββββββHββββββM('1')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (6, 3): ββββββββββββββββββββββββ@βββββββΌββββXββββββββββΌXββββββ@βββββM('E')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββ β (6, 4): βββHβββββββββββββββββββββββββββ@βββββββββββββββΌ@βββββ@βΌβββββ@βββββββββββHβββββββββM('2')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββ β (6, 5): βββββββββββββββββββββββββββββββββββββββββββββββΌββββββXβΌββββββΌββββββ@ββββM('F')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 2): ββββββββββββββββββββββββββββββββββββββββββββββXββββββββΌββββββΌβββββ@βΌββββM('G')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β ββ (7, 3): ββββββββββββββββββββββββββββββββββββββββββββββββββββββXββββββΌβββββXβΌββββXβββββββββXβββββββββββM('3')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 4): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββXβββββββΌββββ@ββββββββββΌβββββ@βββββββββββXβββββM('H')βββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 5): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββXβββββββββββββββΌβββββXβββββXββββββΌβββββXβββββββββββββββM('4')βββββββββββββββββββββββββββββββββ β β β β (7, 6): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββ@ββββββΌββββββΌβββββM('J')βββββββββββββββββββββββββββββββββββββββββββ β β β (8, 3): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@ββββββββββββββββββΌββββββΌβββββXβββββββββM('K')βββββββββββββββββββββββββββββββββ β β β (8, 4): βββHββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@ββββββΌβββββ@βββββββββ@βββββββββ@ββββββββββHββββββββM('5')βββ β β β (8, 5): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββββββββββββββXββββββββββΌM('L')ββββββββββββββββββββββ β (9, 4): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββXββββββββββM('M')ββββββββββββ ββββ ββββββββββ ββββ ββββ ββββββββββ βββββββββ βββββββββ ββββββββββββββ βββββββββ
[Optional] View 3D circuit
Large circuits that are mapped to grids are suitable to be visualized in 3D with cirq_web
, if you find it useful, as follows:
!pip install --quiet cirq-web
import cirq_web
circuit_vis = cirq_web.Circuit3D(stabilizer_grid_circuit)
display(circuit_vis)
Without noise
The noiseless version of the larger grid is slightly more exciting than the small grid example: the X measure qubits will measure a random state since their neighbors are initialized in the Z basis. However, subsequent measurements will remain consistent.
The example below runs a single cycle of the 2x3 grid 100 times, then does a Z-basis measurement of all data qubits. Since each of these is a separate execution of the circuit, no correlation is expected between repetitions.
noiseless_sim = qsimcirq.QSimSimulator()
repetitions = 100
start = time.time()
results = noiseless_sim.run(stabilizer_grid_circuit, repetitions=repetitions)
elapsed = time.time() - start
print(f'{repetitions} repetitions completed in {elapsed:.03f}s')
100 repetitions completed in 0.010s
# Set to view results from each repetition.
repetition = 0 # @param {type:"number"}
meas_map = {
qubit_map[q]: results.measurements[str(q)][repetition] for q in grid_meas_qubits.values()
}
data_map = {
qubit_map[q]: results.measurements[str(q)][repetition] for q in grid_data_qubits.values()
}
heatmap = cirq.Heatmap({**meas_map, **data_map})
heatmap.plot();
With hardware noise on the QVM
Adding in hardware-like noise means that subsequent cycles of a stabilizer might disagree with one another. These inconsistencies can be interpreted as various error modes, which can be decoded to compensate for the errors observed.
Decoding stabilizer error is a complex topic not covered here, but the pre-decoding results and data qubit measurements shown below may shed some light on how to approach this process.
test_stabilizer_grid_circuit = cirq.optimize_for_target_gateset(
cirq.Circuit(cirq.decompose(stabilizer_grid_circuit)),
context=cirq.TransformerContext(deep=True),
gateset=target_gateset,
)
print(test_stabilizer_grid_circuit)
ββββ βββββββββ (4, 3): ββββββββββββββββββββββββββββ@βββM('A')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β (5, 2): βββββββββββββββββββββββββββββΌββββββββββββ@βββPhXZ(a=0.5,x=-0.5,z=0)ββββ@βββPhXZ(a=0.5,x=0.5,z=0)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββM('B')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (5, 3): βββPhXZ(a=0.5,x=-0.5,z=0)βββ@ββββββββββββ@ββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ@ββββββββββββββββββββββββPhXZ(a=0.5,x=0.5,z=0)ββββPhXZ(a=0.5,x=-0.5,z=0)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0.5,x=0.5,z=0)βββββββββββββM('0')ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (5, 4): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ@ββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0.5,x=0.5,z=0)ββββΌββββββββββββββββββββββββββββM('C')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (6, 1): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββ@ββββββββββββββββββββββββPhXZ(a=0.5,x=0.5,z=0)βββββββββββββM('D')βββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (6, 2): βββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=-0.5,x=0.5,z=-1)βββ@ββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββββββ@βββPhXZ(a=-0.5,x=0.5,z=-1)βββββββββββββββββββββββββββββββM('1')ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (6, 3): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ@βββPhXZ(a=0.5,x=-0.5,z=0)ββββββββββββ@ββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββ@βββPhXZ(a=0.5,x=0.5,z=0)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@ββββββββββββββββββββββββββββββM('E')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (6, 4): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=0.5,z=0)βββPhXZ(a=0,x=1,z=0)βββ@ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββ@ββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββ@βΌββββPhXZ(a=-0.5,x=0.5,z=-1)βββββββββββββββββββββββββββββββββββββββββM('2')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β ββ (6, 5): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββ@βββPhXZ(a=0.5,x=0.5,z=0)ββββββΌβΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββM('F')ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββ β (7, 2): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββ@βββPhXZ(a=0.5,x=0.5,z=0)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββ@ββββββββM('G')ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββ β β (7, 3): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββββΌ@ββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββ@βββββββββββββββββ@ββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββPhXZ(a=0.5,x=0.5,z=0)ββββββββββββββββββββββββββββββββββββM('3')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 4): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)ββββ@βββββPhXZ(a=0.5,x=0.5,z=0)βββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββ@βββ@βββPhXZ(a=0.5,x=-0.5,z=0)ββββΌββββββββββββββββββββββββββββββββββββββββββββββββ@βββPhXZ(a=0.5,x=0.5,z=0)βββββββM('H')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 5): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββ@ββββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββββββββββββββββ@ββββPhXZ(a=0.5,x=0.5,z=0)ββββM('4')βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β (7, 6): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ@βββM('J')βββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (8, 3): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@βββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)ββββΌβββββββββββββββββββββββββββββββ@ββββββββPhXZ(a=0.5,x=0.5,z=0)ββββM('K')βΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β (8, 4): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=0.5,z=0)βββPhXZ(a=0,x=1,z=0)ββββββββ@βββββββββββββββββββββββββββββββ@ββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββ@βββββββββββββββββββββββββββββββββ@βββPhXZ(a=-0.5,x=0.5,z=-1)βββββββββββββββββββββM('5')βββ β β β (8, 5): ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ@ββββPhXZ(a=0.5,x=-0.5,z=0)βββ@ββββββββPhXZ(a=0.5,x=0.5,z=0)βββββΌβββββββββββββββββββββββββββββM('L')βββββββββββββββββββββ β (9, 4): βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββPhXZ(a=0.5,x=-0.5,z=0)βββ@βββPhXZ(a=0.5,x=0.5,z=0)ββββββββββββββM('M')ββββββββββββ ββββ βββββββββ
repetitions = 100
start = time.time()
results = sim_engine.get_sampler(processor_id).run(
test_stabilizer_grid_circuit, repetitions=repetitions
)
elapsed = time.time() - start
print(f'{repetitions} repetitions completed in {elapsed:.03f}s')
100 repetitions completed in 5.278s
# Set to view results from each repetition.
repetition = 0 # @param {type:"number"}
meas_map = {
qubit_map[q]: results.measurements[str(q)][repetition] for q in grid_meas_qubits.values()
}
data_map = {
qubit_map[q]: results.measurements[str(q)][repetition] for q in grid_data_qubits.values()
}
heatmap = cirq.Heatmap({**meas_map, **data_map})
heatmap.plot();