-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
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
import cirq, cirq_google
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(cirq.CZ.on(q0, q1))
processor_id = "rainbow"
cal = cirq_google.engine.load_median_device_calibration(processor_id)
noise_props = cirq_google.noise_properties_from_calibration(cal)
noise_model = cirq_google.NoiseModelFromGoogleNoiseProperties(noise_props)
cirq.DensityMatrixSimulator(noise=noise_model).simulate(circuit).final_density_matrix[0, 0].real
The same snippet works if I set noise=None
, or if the circuit has a CNOT instead of a CZ gate.
Traceback:
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/sim/simulator.py:496, in SimulatesFinalState.simulate(self, program, param_resolver, qubit_order, initial_state)
471 def simulate(
472 self,
473 program: 'cirq.AbstractCircuit',
(...)
476 initial_state: Any = None,
477 ) -> TSimulationTrialResult:
478 """Simulates the supplied Circuit.
479
480 This method returns a result which allows access to the entire
(...)
494 SimulationTrialResults for the simulation. Includes the final state.
495 """
--> 496 return self.simulate_sweep(
497 program, study.ParamResolver(param_resolver), qubit_order, initial_state
498 )[0]
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/sim/simulator.py:511, in SimulatesFinalState.simulate_sweep(self, program, params, qubit_order, initial_state)
500 def simulate_sweep(
501 self,
502 program: 'cirq.AbstractCircuit',
(...)
505 initial_state: Any = None,
506 ) -> List[TSimulationTrialResult]:
507 """Wraps computed states in a list.
508
509 Prefer overriding simulate_sweep_iter
.
510 """
--> 511 return list(self.simulate_sweep_iter(program, params, qubit_order, initial_state))
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/sim/simulator_base.py:328, in SimulatorBase.simulate_sweep_iter(self, program, params, qubit_order, initial_state)
322 prefix, suffix = (
323 split_into_matching_protocol_then_general(program, sweep_prefixable)
324 if self._can_be_in_run_prefix(self.noise)
325 else (program[0:0], program)
326 )
327 step_result = None
--> 328 for step_result in self._core_iterator(circuit=prefix, sim_state=sim_state):
329 pass
330 sim_state = step_result._sim_state
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/sim/simulator_base.py:206, in SimulatorBase._core_iterator(self, circuit, sim_state, all_measurements_are_terminal)
203 yield self._create_step_result(sim_state)
204 return
--> 206 noisy_moments = self.noise.noisy_moments(circuit, sorted(circuit.all_qubits()))
207 measured: Dict[Tuple['cirq.Qid', ...], bool] = collections.defaultdict(bool)
208 for moment in noisy_moments:
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/devices/noise_properties.py:111, in NoiseModelFromNoiseProperties.noisy_moments(self, moments, system_qubits)
109 noisy_circuit = split_measure_circuit.copy()
110 for model in self.noise_models:
--> 111 noisy_circuit = noisy_circuit.with_noise(model)
113 # Recombine measurements.
114 final_moments = []
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/circuits/circuit.py:2463, in Circuit.with_noise(self, noise)
2461 qubits = sorted(self.all_qubits())
2462 c_noisy = Circuit()
-> 2463 for op_tree in noise_model.noisy_moments(self, qubits):
2464 # Keep moments aligned
2465 c_noisy += Circuit(op_tree)
2466 return c_noisy
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/value/abc_alt.py:137, in ABCMetaImplementAnyOneOf.new..wrap_scope..impl_of_abstract(*args, **kwargs)
136 def impl_of_abstract(*args, **kwargs):
--> 137 return impl(*args, **kwargs)
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/devices/noise_model.py:102, in NoiseModel._noisy_moments_impl_moment(self, moments, system_qubits)
100 result = []
101 for moment in moments:
--> 102 result.append(self.noisy_moment(moment, system_qubits))
103 return result
File /opt/miniconda3/envs/mitiqenv/lib/python3.11/site-packages/cirq/devices/thermal_noise_model.py:278, in ThermalNoiseModel.noisy_moment(self, moment, system_qubits)
276 if self.skip_measurements and protocols.is_measurement(qubit_op):
277 continue
--> 278 rates = self.rate_matrix_GHz[qubit] * moment_ns
279 kraus_ops = _kraus_ops_from_rates(tuple(rates.reshape(-1)), rates.shape)
280 noise_ops.append(ops.KrausChannel(kraus_ops).on(qubit))
KeyError: cirq.LineQubit(0)
Cirq version
1.3.0