def test_get_parameters(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) result = PhasedFSimCalibrationResult( parameters={ (q_00, q_01): PhasedFSimCharacterization(theta=0.1, zeta=0.2, chi=None, gamma=None, phi=0.3), (q_02, q_03): PhasedFSimCharacterization(theta=0.4, zeta=0.5, chi=None, gamma=None, phi=0.6), }, gate=gate, options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) assert result.get_parameters(q_00, q_01) == PhasedFSimCharacterization( theta=0.1, zeta=0.2, chi=None, gamma=None, phi=0.3) assert result.get_parameters(q_01, q_00) == PhasedFSimCharacterization( theta=0.1, zeta=-0.2, chi=None, gamma=None, phi=0.3) assert result.get_parameters(q_02, q_03) == PhasedFSimCharacterization( theta=0.4, zeta=0.5, chi=None, gamma=None, phi=0.6) assert result.get_parameters(q_00, q_03) is None
def test_floquet_to_calibration_layer_with_measure_qubits(): qubits = tuple(cirq.GridQubit(0, index) for index in range(5)) q_00, q_01, q_02, q_03, _ = qubits gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, measure_qubits=qubits, ), ) assert request.to_calibration_layer() == cirq_google.CalibrationLayer( calibration_type='floquet_phased_fsim_characterization', program=cirq.Circuit( [gate.on(q_00, q_01), gate.on(q_02, q_03), cirq.measure(*qubits)], ), args={ 'est_theta': True, 'est_zeta': True, 'est_chi': False, 'est_gamma': False, 'est_phi': True, 'readout_corrections': True, 'version': 2, }, )
def test_floquet_parse_result_bad_metric(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) result = cirq_google.CalibrationResult( code=cirq_google.api.v2.calibration_pb2.SUCCESS, error_message=None, token=None, valid_until=None, metrics=cirq_google.Calibration( cirq_google.api.v2.metrics_pb2.MetricsSnapshot(metrics=[ cirq_google.api.v2.metrics_pb2.Metric( name='angles', targets=[ '1000gerbils', ], values=[ cirq_google.api.v2.metrics_pb2.Value(str_val='100_10'), ], ) ])), ) with pytest.raises(ValueError, match='Unknown metric name 1000gerbils'): _ = request.parse_result(result)
def test_floquet_to_calibration_layer_readout_thresholds(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, readout_error_tolerance=0.4, ), ) assert request.to_calibration_layer() == cirq_google.CalibrationLayer( calibration_type='floquet_phased_fsim_characterization', program=cirq.Circuit([gate.on(q_00, q_01), gate.on(q_02, q_03)]), args={ 'est_theta': True, 'est_zeta': True, 'est_chi': False, 'est_gamma': False, 'est_phi': True, 'readout_corrections': True, 'readout_error_tolerance': 0.4, 'correlated_readout_error_tolerance': 7 / 6 * 0.4 - 1 / 6, 'version': 2, }, )
def test_run_characterization_with_simulator(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = SQRT_ISWAP_GATE request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) simulator = PhasedFSimEngineSimulator.create_with_ideal_sqrt_iswap() actual = workflow.run_calibrations([request], simulator) assert actual == [ PhasedFSimCalibrationResult( parameters={ (q_00, q_01): PhasedFSimCharacterization(theta=np.pi / 4, zeta=0.0, chi=None, gamma=None, phi=0.0), (q_02, q_03): PhasedFSimCharacterization(theta=np.pi / 4, zeta=0.0, chi=None, gamma=None, phi=0.0), }, gate=SQRT_ISWAP_GATE, options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) ]
def test_options_phase_corrected_override(): assert (ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION. zeta_chi_gamma_correction_override() == PhasedFSimCharacterization( zeta=0.0, chi=0.0, gamma=0.0)) assert (FloquetPhasedFSimCalibrationOptions( characterize_theta=False, characterize_zeta=False, characterize_chi=False, characterize_gamma=False, characterize_phi=False, ).zeta_chi_gamma_correction_override() == PhasedFSimCharacterization())
def test_from_moment(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] m = cirq.Moment(cirq.ISWAP(q_00, q_01)**0.5, cirq.ISWAP(q_02, q_03)**0.5) options = FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ) request = FloquetPhasedFSimCalibrationRequest.from_moment(m, options) assert request == FloquetPhasedFSimCalibrationRequest(gate=cirq.ISWAP**0.5, pairs=((q_00, q_01), (q_02, q_03)), options=options) non_identical = cirq.Moment( cirq.ISWAP(q_00, q_01)**0.5, cirq.ISWAP(q_02, q_03)) with pytest.raises(ValueError, match='must be identical'): _ = FloquetPhasedFSimCalibrationRequest.from_moment( non_identical, options) sq = cirq.Moment(cirq.X(q_00)) with pytest.raises(ValueError, match='must be two qubit gates'): _ = FloquetPhasedFSimCalibrationRequest.from_moment(sq, options) threeq = cirq.Moment(cirq.TOFFOLI(q_00, q_01, q_02)) with pytest.raises(ValueError, match='must be two qubit gates'): _ = FloquetPhasedFSimCalibrationRequest.from_moment(threeq, options) not_gate = cirq.Moment(cirq.CircuitOperation(cirq.FrozenCircuit())) with pytest.raises(ValueError, match='must be two qubit gates'): _ = FloquetPhasedFSimCalibrationRequest.from_moment(not_gate, options) empty = cirq.Moment() with pytest.raises(ValueError, match='No gates found'): _ = FloquetPhasedFSimCalibrationRequest.from_moment(empty, options)
def test_floquet_parse_result_failure(): gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=(), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) result = cirq_google.CalibrationResult( code=cirq_google.api.v2.calibration_pb2.ERROR_CALIBRATION_FAILED, error_message="Test message", token=None, valid_until=None, metrics=cirq_google.Calibration(), ) with pytest.raises(PhasedFSimCalibrationError, match='Test message'): request.parse_result(result)
def test_run_floquet_characterization_for_moments(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) circuit = cirq.Circuit([gate.on(q_00, q_01), gate.on(q_02, q_03)]) options = FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ) job = cirq_google.engine.EngineJob('', '', '', None) job._calibration_results = [ cirq_google.CalibrationResult( code=cirq_google.api.v2.calibration_pb2.SUCCESS, error_message=None, token=None, valid_until=None, metrics=cirq_google.Calibration( cirq_google.api.v2.metrics_pb2.MetricsSnapshot(metrics=[ cirq_google.api.v2.metrics_pb2.Metric( name='angles', targets=[ '0_qubit_a', '0_qubit_b', '0_theta_est', '0_zeta_est', '0_phi_est', '1_qubit_a', '1_qubit_b', '1_theta_est', '1_zeta_est', '1_phi_est', ], values=[ cirq_google.api.v2.metrics_pb2.Value( str_val='0_0'), cirq_google.api.v2.metrics_pb2.Value( str_val='0_1'), cirq_google.api.v2.metrics_pb2.Value( double_val=0.1), cirq_google.api.v2.metrics_pb2.Value( double_val=0.2), cirq_google.api.v2.metrics_pb2.Value( double_val=0.3), cirq_google.api.v2.metrics_pb2.Value( str_val='0_2'), cirq_google.api.v2.metrics_pb2.Value( str_val='0_3'), cirq_google.api.v2.metrics_pb2.Value( double_val=0.4), cirq_google.api.v2.metrics_pb2.Value( double_val=0.5), cirq_google.api.v2.metrics_pb2.Value( double_val=0.6), ], ) ])), ) ] engine = mock.MagicMock(spec=cirq_google.Engine) engine.run_calibration.return_value = job circuit_with_calibration, requests = workflow.run_floquet_characterization_for_moments( circuit, engine, 'qproc', cirq_google.FSIM_GATESET, options=options) assert requests == [ PhasedFSimCalibrationResult( parameters={ (q_00, q_01): PhasedFSimCharacterization(theta=0.1, zeta=0.2, chi=None, gamma=None, phi=0.3), (q_02, q_03): PhasedFSimCharacterization(theta=0.4, zeta=0.5, chi=None, gamma=None, phi=0.6), }, gate=gate, options=options, ) ] assert circuit_with_calibration.circuit == circuit assert circuit_with_calibration.moment_to_calibration == [0]
def test_run_characterization(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) result = cirq_google.CalibrationResult( code=cirq_google.api.v2.calibration_pb2.SUCCESS, error_message=None, token=None, valid_until=None, metrics=cirq_google.Calibration( cirq_google.api.v2.metrics_pb2.MetricsSnapshot(metrics=[ cirq_google.api.v2.metrics_pb2.Metric( name='angles', targets=[ '0_qubit_a', '0_qubit_b', '0_theta_est', '0_zeta_est', '0_phi_est', '1_qubit_a', '1_qubit_b', '1_theta_est', '1_zeta_est', '1_phi_est', ], values=[ cirq_google.api.v2.metrics_pb2.Value(str_val='0_0'), cirq_google.api.v2.metrics_pb2.Value(str_val='0_1'), cirq_google.api.v2.metrics_pb2.Value(double_val=0.1), cirq_google.api.v2.metrics_pb2.Value(double_val=0.2), cirq_google.api.v2.metrics_pb2.Value(double_val=0.3), cirq_google.api.v2.metrics_pb2.Value(str_val='0_2'), cirq_google.api.v2.metrics_pb2.Value(str_val='0_3'), cirq_google.api.v2.metrics_pb2.Value(double_val=0.4), cirq_google.api.v2.metrics_pb2.Value(double_val=0.5), cirq_google.api.v2.metrics_pb2.Value(double_val=0.6), ], ) ])), ) job = cirq_google.engine.EngineJob('', '', '', None) job._calibration_results = [result] engine = mock.MagicMock(spec=cirq_google.Engine) engine.run_calibration.return_value = job progress_calls = [] def progress(step: int, steps: int) -> None: progress_calls.append((step, steps)) actual = workflow.run_calibrations([request], engine, 'qproc', cirq_google.FSIM_GATESET, progress_func=progress) expected = [ PhasedFSimCalibrationResult( parameters={ (q_00, q_01): PhasedFSimCharacterization(theta=0.1, zeta=0.2, chi=None, gamma=None, phi=0.3), (q_02, q_03): PhasedFSimCharacterization(theta=0.4, zeta=0.5, chi=None, gamma=None, phi=0.6), }, gate=gate, options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) ] assert actual == expected assert progress_calls == [(1, 1)]
def test_floquet_parse_result(): q_00, q_01, q_02, q_03 = [cirq.GridQubit(0, index) for index in range(4)] gate = cirq.FSimGate(theta=np.pi / 4, phi=0.0) request = FloquetPhasedFSimCalibrationRequest( gate=gate, pairs=((q_00, q_01), (q_02, q_03)), options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), ) result = cirq_google.CalibrationResult( code=cirq_google.api.v2.calibration_pb2.SUCCESS, error_message=None, token=None, valid_until=None, metrics=cirq_google.Calibration( cirq_google.api.v2.metrics_pb2.MetricsSnapshot(metrics=[ cirq_google.api.v2.metrics_pb2.Metric( name='angles', targets=[ '0_qubit_a', '0_qubit_b', '0_theta_est', '0_zeta_est', '0_phi_est', '1_qubit_a', '1_qubit_b', '1_theta_est', '1_zeta_est', '1_phi_est', ], values=[ cirq_google.api.v2.metrics_pb2.Value(str_val='0_0'), cirq_google.api.v2.metrics_pb2.Value(str_val='0_1'), cirq_google.api.v2.metrics_pb2.Value(double_val=0.1), cirq_google.api.v2.metrics_pb2.Value(double_val=0.2), cirq_google.api.v2.metrics_pb2.Value(double_val=0.3), cirq_google.api.v2.metrics_pb2.Value(str_val='0_2'), cirq_google.api.v2.metrics_pb2.Value(str_val='0_3'), cirq_google.api.v2.metrics_pb2.Value(double_val=0.4), cirq_google.api.v2.metrics_pb2.Value(double_val=0.5), cirq_google.api.v2.metrics_pb2.Value(double_val=0.6), ], ) ])), ) assert request.parse_result(result) == PhasedFSimCalibrationResult( parameters={ (q_00, q_01): PhasedFSimCharacterization(theta=0.1, zeta=0.2, chi=None, gamma=None, phi=0.3), (q_02, q_03): PhasedFSimCharacterization(theta=0.4, zeta=0.5, chi=None, gamma=None, phi=0.6), }, gate=gate, options=FloquetPhasedFSimCalibrationOptions( characterize_theta=True, characterize_zeta=True, characterize_chi=False, characterize_gamma=False, characterize_phi=True, ), )