Closed cosenal closed 4 months ago
hi, this is exactly as the error says. the qubits don't exist on the device. the realsitic noise model represent the noise for the device, that's noise is keyed by qubits and qubit pairs. you can list the qubits on the device by calling
>> noise_props.qubits
[cirq.GridQubit(3, 2),
cirq.GridQubit(4, 1),
cirq.GridQubit(4, 2),
cirq.GridQubit(4, 3),
cirq.GridQubit(5, 0),
cirq.GridQubit(5, 1),
cirq.GridQubit(5, 2),
cirq.GridQubit(5, 3),
cirq.GridQubit(5, 4),
cirq.GridQubit(6, 1),
cirq.GridQubit(6, 2),
cirq.GridQubit(6, 3),
cirq.GridQubit(6, 4),
cirq.GridQubit(6, 5),
cirq.GridQubit(7, 2),
cirq.GridQubit(7, 3),
cirq.GridQubit(7, 4),
cirq.GridQubit(7, 5),
cirq.GridQubit(7, 6),
cirq.GridQubit(8, 3),
cirq.GridQubit(8, 4),
cirq.GridQubit(8, 5),
cirq.GridQubit(9, 4)]
for example I reran you circuit using cirq.GridQubit(4, 1), cirq.GridQubit(4, 2)
which exist on the device
>> q0, q1 = cirq.q(4, 1), cirq.q(4, 2)
>> circuit = cirq.Circuit(cirq.CZ.on(q0, q1))
>> cirq.DensityMatrixSimulator(noise=noise_model).simulate(circuit)
measurements: (no measurements)
qubits: (cirq.GridQubit(4, 1), cirq.GridQubit(4, 2))
final density matrix:
[[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 0.+0.j]]
phase:
final density matrix:
[[1.+0.j]]
you may also want to call noise_props.expected_gates()
to see which gates are supported by the device and if your circuit contains an unsupported gate then you can compile your circuit to the target gateset using cirq.optimize_for_target_gateset
@NoureldinYosri Thanks for your reply.
this is exactly as the error says. the qubits don't exist on the device.
This doesn't explain why on the same device I can connect the same qubits with a CNOT gate (as opposed to a CZ), i.e., the following snippet works just fine 🤔
...
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(cirq.CNOT.on(q0, q1))
...
And in fact, CNOT (CXPowGate
) doesn't even show up in the list from noise_props.expected_gates()
🤔
@cosenal CNOT is not a native gate on the device (but CZ is) so the simulator doesn't apply any noise to it (so it doesn't lookup the noise). notice how the result of the simulation is perfect without any noise.
from noise_props.expected_gates()
we see that one of the native gatesets on the device is CZGateset so the correct way to run the noisy simulation would be to compile the circuit to that gateset (or another supported gateset)
>> q0, q1 = cirq.LineQubit.range(2)
>> circuit = cirq.Circuit(cirq.CX.on(q0, q1))
>> compiled_circuit = cirq.optimize_for_target_gateset(circuit, gateset=cirq.CZTargetGateset())
>> cirq.DensityMatrixSimulator(noise=noise_model).simulate(compiled_circuit)
KeyError: cirq.LineQubit(0)
Which gives the error as expected since now the simulator actually tries to add the noise and fails because the qubit is not present on the device, if instead we use qubits on the device we get the correct execution
>> q0, q1 = cirq.q(4, 1), cirq.q(4, 2)
>> circuit = cirq.Circuit(cirq.CX.on(q0, q1))
>> compiled_circuit = cirq.optimize_for_target_gateset(circuit, gateset=cirq.CZTargetGateset())
>> cirq.DensityMatrixSimulator(noise=noise_model).simulate(compiled_circuit)
measurements: (no measurements)
qubits: (cirq.GridQubit(4, 1), cirq.GridQubit(4, 2))
final density matrix:
[[ 9.9393892e-01+0.j -1.7796451e-03+0.j 0.0000000e+00+0.j
0.0000000e+00+0.j]
[-1.7796451e-03+0.j 4.6467967e-03+0.j 0.0000000e+00+0.j
0.0000000e+00+0.j]
[ 0.0000000e+00+0.j 0.0000000e+00+0.j 1.4076923e-03+0.j
-2.5204695e-06+0.j]
[ 0.0000000e+00+0.j 0.0000000e+00+0.j -2.5204695e-06+0.j
6.5811464e-06+0.j]]
phase:
final density matrix:
[[1.+0.j]]
notice that in the ideal simulation (i.e. without noise) we expect to get density matrix with all zeros except at [0, 0], but in this noisy simulation we get a 0.99 at [0, 0] and small values at other entries.
I created https://github.com/quantumlib/Cirq/issues/6608 to raise an error when trying to run simulations with qubits not on the device or a circuit not compiled to a supported gateset.
All clear now! Thanks, @NoureldinYosri
Description of the issue
I wanted to use the noise model described in https://quantumai.google/cirq/simulate/noisy_simulation#simulation_with_realistic_noise in the simulation of a very simple circuit (one C-Z gate, nothing else), but it throws a KeyError (see traceback below).
How to reproduce the issue
The same snippet works if I set
noise=None
, or if the circuit has a CNOT instead of a CZ gate.Traceback:
Cirq version 1.3.0