diff --git a/cirq-google/cirq_google/engine/calibration_to_noise_properties.py b/cirq-google/cirq_google/engine/calibration_to_noise_properties.py index 316fa2070a8..a55655711ac 100644 --- a/cirq-google/cirq_google/engine/calibration_to_noise_properties.py +++ b/cirq-google/cirq_google/engine/calibration_to_noise_properties.py @@ -34,6 +34,7 @@ from cirq_google import ops as cg_ops from cirq_google.devices import google_noise_properties from cirq_google.engine import util +from cirq.circuits import circuit if TYPE_CHECKING: import cirq @@ -88,6 +89,7 @@ def _unpack_2q_from_calibration( def noise_properties_from_calibration( calibration: engine.Calibration, + cir: circuit.Circuit = None, zphase_data: Optional[util.ZPhaseDataType] = None, gate_times_ns: Optional[Dict[Type['cirq.Gate'], float]] = None, ) -> google_noise_properties.GoogleNoiseProperties: @@ -203,7 +205,7 @@ def noise_properties_from_calibration( fsim_errors[op_id_reverse] = error_gate # Known false positive: https://github.com/PyCQA/pylint/issues/5857 - return google_noise_properties.GoogleNoiseProperties( # pylint: disable=unexpected-keyword-arg + noise_props = google_noise_properties.GoogleNoiseProperties( # pylint: disable=unexpected-keyword-arg gate_times_ns=gate_times_ns, t1_ns=t1_ns, tphi_ns=tphi_ns, @@ -211,3 +213,25 @@ def noise_properties_from_calibration( gate_pauli_errors=gate_pauli_errors, fsim_errors=fsim_errors, ) + if cir is not None: + for qubit in cir.all_qubits(): + if qubit not in noise_props.qubits: + raise ValueError(f"Qubit {qubit} is not part of the system qubits.") + known_gates = [] + unknown_gates = [] + for gates in cir.all_operations(): + if not isinstance(gates.gate, ops.PhasedXZGate): + known_gates.append(gates.gate) + for gates in known_gates: + found = False + for ex_gate in noise_props.expected_gates(): + if isinstance(gates, ex_gate): + found = True + break + if not found: + unknown_gates.append(gates) + + if len(unknown_gates) != 0: + raise ValueError(f"these {unknown_gates} does not correspond to compiled target gateset." + f"Please compile circuit with corresponding target gateset") + return noise_props; \ No newline at end of file diff --git a/cirq-google/cirq_google/engine/calibration_to_noise_properties_test.py b/cirq-google/cirq_google/engine/calibration_to_noise_properties_test.py index 3d7eb1ed73d..efb46e4ba49 100644 --- a/cirq-google/cirq_google/engine/calibration_to_noise_properties_test.py +++ b/cirq-google/cirq_google/engine/calibration_to_noise_properties_test.py @@ -234,7 +234,13 @@ def test_noise_properties_from_calibration(): syc_angles, iswap_angles, ) - prop = cirq_google.noise_properties_from_calibration(calibration) + circuit = cirq.Circuit( + cirq.H(qubits[0]), + cirq.H(qubits[1]), + cirq.H(qubits[2]), + ) + compiled_circuit = cirq.optimize_for_target_gateset(circuit, gateset=cirq.CZTargetGateset()) + prop = cirq_google.noise_properties_from_calibration(calibration, compiled_circuit) for i, q in enumerate(qubits): assert np.isclose( @@ -313,8 +319,14 @@ def test_zphase_data(): "gamma": {qubit_pairs[0]: iswap_angles[0].gamma, qubit_pairs[1]: iswap_angles[1].gamma}, }, } + circuit = cirq.Circuit( + cirq.H(qubits[0]), + cirq.H(qubits[1]), + cirq.H(qubits[2]), + ) + compiled_circuit = cirq.optimize_for_target_gateset(circuit, gateset=cirq.CZTargetGateset()) - prop = cirq_google.noise_properties_from_calibration(calibration, zphase_data) + prop = cirq_google.noise_properties_from_calibration(calibration, compiled_circuit, zphase_data) for i, qs in enumerate(qubit_pairs): for gate, values in [ (cirq_google.SycamoreGate, syc_angles), @@ -411,8 +423,21 @@ def test_incomplete_calibration(): """, cirq_google.api.v2.metrics_pb2.MetricsSnapshot(), ) + 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()) # Create NoiseProperties object from Calibration calibration = cirq_google.Calibration(_CALIBRATION_DATA) with pytest.raises(ValueError, match='Keys specified for T1 and Tphi are not identical.'): - _ = cirq_google.noise_properties_from_calibration(calibration) + _ = cirq_google.noise_properties_from_calibration(calibration,compiled_circuit) + +def test_validate_gateset(): + + # Add various gates to the circuit + processor_id = "rainbow" + q0, q1 = cirq.q(4, 1), cirq.q(4, 2) + cal = cirq_google.engine.load_median_device_calibration(processor_id) + circuit = cirq.Circuit(cirq.CX.on(q0, q1)) + compiled_circuit = cirq.optimize_for_target_gateset(circuit, gateset=cirq.CZTargetGateset()) + cirq_google.noise_properties_from_calibration(cal, compiled_circuit) \ No newline at end of file diff --git a/docs/simulate/noisy_simulation.ipynb b/docs/simulate/noisy_simulation.ipynb index ba27b94c9b2..d1d2a2b57f3 100644 --- a/docs/simulate/noisy_simulation.ipynb +++ b/docs/simulate/noisy_simulation.ipynb @@ -1001,4 +1001,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file diff --git a/docs/simulate/quantum_virtual_machine.ipynb b/docs/simulate/quantum_virtual_machine.ipynb index f8142898fe3..e4673b86f9e 100644 --- a/docs/simulate/quantum_virtual_machine.ipynb +++ b/docs/simulate/quantum_virtual_machine.ipynb @@ -273,4 +273,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file