Example #1
0
def test_floquet_get_calibrations() -> None:

    parameters_ab = cirq_google.PhasedFSimCharacterization(
        theta=0.6, zeta=0.5, chi=0.4, gamma=0.3, phi=0.2
    )
    parameters_bc = cirq_google.PhasedFSimCharacterization(
        theta=0.8, zeta=-0.5, chi=-0.4, gamma=-0.3, phi=-0.2
    )
    parameters_cd_dict = {'theta': 0.1, 'zeta': 0.2, 'chi': 0.3, 'gamma': 0.4, 'phi': 0.5}
    parameters_cd = cirq_google.PhasedFSimCharacterization(**parameters_cd_dict)

    a, b, c, d = cirq.LineQubit.range(4)
    engine_simulator = PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={(a, b): parameters_ab, (b, c): parameters_bc, (c, d): parameters_cd_dict}
    )

    requests = [_create_sqrt_iswap_request([(a, b), (c, d)]), _create_sqrt_iswap_request([(b, c)])]

    results = engine_simulator.get_calibrations(requests)

    assert results == [
        cirq_google.PhasedFSimCalibrationResult(
            gate=cirq.FSimGate(np.pi / 4, 0.0),
            parameters={(a, b): parameters_ab, (c, d): parameters_cd},
            options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
        ),
        cirq_google.PhasedFSimCalibrationResult(
            gate=cirq.FSimGate(np.pi / 4, 0.0),
            parameters={(b, c): parameters_bc},
            options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
        ),
    ]
Example #2
0
def test_from_characterizations_sqrt_iswap_simulates_correctly():
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=0.6,
                                                           zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3,
                                                           phi=0.2)
    parameters_bc = cirq_google.PhasedFSimCharacterization(theta=0.8,
                                                           zeta=-0.5,
                                                           chi=-0.4,
                                                           gamma=-0.3,
                                                           phi=-0.2)
    parameters_cd = cirq_google.PhasedFSimCharacterization(theta=0.1,
                                                           zeta=0.2,
                                                           chi=0.3,
                                                           gamma=0.4,
                                                           phi=0.5)

    a, b, c, d = cirq.LineQubit.range(4)
    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [
            cirq.FSimGate(np.pi / 4, 0.0).on(a, b),
            cirq.FSimGate(np.pi / 4, 0.0).on(c, d)
        ],
        [cirq.FSimGate(np.pi / 4, 0.0).on(c, b)],
    ])
    expected_circuit = cirq.Circuit([
        [cirq.X(a), cirq.X(c)],
        [
            cirq.PhasedFSimGate(**parameters_ab.asdict()).on(a, b),
            cirq.PhasedFSimGate(**parameters_cd.asdict()).on(c, d),
        ],
        [cirq.PhasedFSimGate(**parameters_bc.asdict()).on(b, c)],
    ])

    engine_simulator = PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
        characterizations=[
            cirq_google.PhasedFSimCalibrationResult(
                gate=cirq.FSimGate(np.pi / 4, 0.0),
                parameters={
                    (a, b): parameters_ab,
                    (c, d): parameters_cd
                },
                options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
            ),
            cirq_google.PhasedFSimCalibrationResult(
                gate=cirq.FSimGate(np.pi / 4, 0.0),
                parameters={
                    (c, b): parameters_bc.parameters_for_qubits_swapped()
                },
                options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
            ),
        ])

    actual = engine_simulator.final_state_vector(circuit)
    expected = cirq.final_state_vector(expected_circuit)

    assert cirq.allclose_up_to_global_phase(actual, expected)
Example #3
0
def test_from_characterizations_sqrt_iswap_when_invalid_arguments_fails():
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=0.6,
                                                           zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3,
                                                           phi=0.2)
    parameters_bc = cirq_google.PhasedFSimCharacterization(theta=0.8,
                                                           zeta=-0.5,
                                                           chi=-0.4,
                                                           gamma=-0.3,
                                                           phi=-0.2)

    a, b = cirq.LineQubit.range(2)

    with pytest.raises(ValueError, match="multiple moments"):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.0),
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                ),
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.0),
                    parameters={(a, b): parameters_bc},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                ),
            ])

    with pytest.raises(AssertionError, match="Expected ISWA"):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.2),
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                )
            ])

    with pytest.raises(ValueError, match="unparameterized"):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, sympy.Symbol("a")),
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                )
            ])

    with pytest.raises(AssertionError, match="Expected FSimGate"):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.CNOT,
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                )
            ])
Example #4
0
def test_from_dictionary_sqrt_iswap_simulates_correctly():
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=0.6,
                                                           zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3,
                                                           phi=0.2)
    parameters_bc = cirq_google.PhasedFSimCharacterization(theta=0.8,
                                                           zeta=-0.5,
                                                           chi=-0.4,
                                                           gamma=-0.3,
                                                           phi=-0.2)
    parameters_cd_dict = {
        'theta': 0.1,
        'zeta': 0.2,
        'chi': 0.3,
        'gamma': 0.4,
        'phi': 0.5
    }

    a, b, c, d = cirq.LineQubit.range(4)
    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [
            cirq.FSimGate(np.pi / 4, 0.0).on(a, b),
            cirq.FSimGate(np.pi / 4, 0.0).on(d, c)
        ],
        [cirq.FSimGate(np.pi / 4, 0.0).on(b, c)],
        [
            cirq.FSimGate(np.pi / 4, 0.0).on(a, b),
            cirq.FSimGate(np.pi / 4, 0.0).on(c, d)
        ],
    ])
    expected_circuit = cirq.Circuit([
        [cirq.X(a), cirq.X(c)],
        [
            cirq.PhasedFSimGate(**parameters_ab.asdict()).on(a, b),
            cirq.PhasedFSimGate(**parameters_cd_dict).on(c, d),
        ],
        [cirq.PhasedFSimGate(**parameters_bc.asdict()).on(b, c)],
        [
            cirq.PhasedFSimGate(**parameters_ab.asdict()).on(a, b),
            cirq.PhasedFSimGate(**parameters_cd_dict).on(c, d),
        ],
    ])

    engine_simulator = PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={
            (a, b): parameters_ab,
            (b, c): parameters_bc,
            (c, d): parameters_cd_dict
        })

    actual = engine_simulator.final_state_vector(circuit)
    expected = cirq.final_state_vector(expected_circuit)

    assert cirq.allclose_up_to_global_phase(actual, expected)
Example #5
0
def test_make_zeta_chi_gamma_compensation_for_operations():
    a, b, c, d = cirq.LineQubit.range(4)
    parameters_ab = cirq_google.PhasedFSimCharacterization(zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3)
    parameters_bc = cirq_google.PhasedFSimCharacterization(zeta=-0.5,
                                                           chi=-0.4,
                                                           gamma=-0.3)
    parameters_cd = cirq_google.PhasedFSimCharacterization(zeta=0.2,
                                                           chi=0.3,
                                                           gamma=0.4)

    parameters_dict = {
        (a, b): parameters_ab,
        (b, c): parameters_bc,
        (c, d): parameters_cd
    }

    engine_simulator = cirq_google.PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={
            pair: parameters.merge_with(SQRT_ISWAP_PARAMETERS)
            for pair, parameters in parameters_dict.items()
        })

    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [SQRT_ISWAP_GATE.on(a, b),
         SQRT_ISWAP_GATE.on(c, d)],
        [SQRT_ISWAP_GATE.on(b, c)],
    ])

    options = cirq_google.FloquetPhasedFSimCalibrationOptions(
        characterize_theta=False,
        characterize_zeta=True,
        characterize_chi=True,
        characterize_gamma=True,
        characterize_phi=False,
    )

    characterizations = [
        PhasedFSimCalibrationResult(parameters={pair: parameters},
                                    gate=SQRT_ISWAP_GATE,
                                    options=options)
        for pair, parameters in parameters_dict.items()
    ]

    calibrated_circuit = workflow.make_zeta_chi_gamma_compensation_for_operations(
        circuit,
        characterizations,
    )

    assert cirq.allclose_up_to_global_phase(
        engine_simulator.final_state_vector(calibrated_circuit),
        cirq.final_state_vector(circuit),
    )
Example #6
0
def test_floquet_get_calibrations_when_invalid_request_fails() -> None:

    parameters_ab = cirq_google.PhasedFSimCharacterization(
        theta=0.6, zeta=0.5, chi=0.4, gamma=0.3, phi=0.2
    )

    a, b = cirq.LineQubit.range(2)
    engine_simulator = PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={(a, b): parameters_ab}
    )

    with pytest.raises(ValueError):
        engine_simulator.get_calibrations(
            [
                FloquetPhasedFSimCalibrationRequest(
                    gate=cirq.FSimGate(np.pi / 4, 0.5),
                    pairs=((a, b),),
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                )
            ]
        )

    with pytest.raises(ValueError):
        engine_simulator.get_calibrations(
            [
                TestPhasedFSimCalibrationRequest(
                    gate=cirq.FSimGate(np.pi / 4, 0.5),
                    pairs=((a, b),),
                )
            ]
        )
Example #7
0
def test_phase_corrected_fsim_operations_with_phase_exponent(
        theta: float, zeta: float, chi: float, gamma: float,
        phi: float) -> None:
    a, b = cirq.LineQubit.range(2)

    phase_exponent = 0.5

    # Theta is negated to match the phase exponent of 0.5.
    expected_gate = cirq.PhasedFSimGate(theta=-theta,
                                        zeta=-zeta,
                                        chi=-chi,
                                        gamma=-gamma,
                                        phi=phi)
    expected = cirq.unitary(expected_gate)

    corrected = workflow.FSimPhaseCorrections.from_characterization(
        (a, b),
        PhaseCalibratedFSimGate(cirq.FSimGate(theta=theta, phi=phi),
                                phase_exponent),
        cirq_google.PhasedFSimCharacterization(theta=theta,
                                               zeta=zeta,
                                               chi=chi,
                                               gamma=gamma,
                                               phi=phi),
        characterization_index=5,
    )
    actual = cirq.unitary(corrected.as_circuit())

    assert cirq.equal_up_to_global_phase(actual, expected)
    assert corrected.moment_to_calibration == [None, 5, None]
Example #8
0
def test_from_dictionary_sqrt_iswap_ideal_when_missing_simulates_correctly():
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=0.6,
                                                           zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3,
                                                           phi=0.2)
    parameters_bc = cirq_google.PhasedFSimCharacterization(theta=0.8,
                                                           zeta=-0.5,
                                                           chi=-0.4)

    a, b, c, d = cirq.LineQubit.range(4)
    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [
            cirq.FSimGate(np.pi / 4, 0.0).on(a, b),
            cirq.FSimGate(np.pi / 4, 0.0).on(c, d)
        ],
        [cirq.FSimGate(np.pi / 4, 0.0).on(b, c)],
    ])
    expected_circuit = cirq.Circuit([
        [cirq.X(a), cirq.X(c)],
        [
            cirq.PhasedFSimGate(**parameters_ab.asdict()).on(a, b),
            cirq.PhasedFSimGate(**SQRT_ISWAP_INV_PARAMETERS.asdict()).on(c, d),
        ],
        [
            cirq.PhasedFSimGate(**parameters_bc.merge_with(
                SQRT_ISWAP_INV_PARAMETERS).asdict()).on(b, c)
        ],
    ])

    engine_simulator = PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={
            (a, b): parameters_ab,
            (b, c): parameters_bc
        },
        ideal_when_missing_parameter=True,
        ideal_when_missing_gate=True,
    )

    actual = engine_simulator.final_state_vector(circuit)
    expected = cirq.final_state_vector(expected_circuit)

    assert cirq.allclose_up_to_global_phase(actual, expected)
Example #9
0
def test_from_dictionary_sqrt_iswap_fails_when_invalid_parameters() -> None:
    a, b = cirq.LineQubit.range(2)
    parameters_ab = cirq_google.PhasedFSimCharacterization(
        theta=0.6, zeta=0.5, chi=0.4, gamma=0.3, phi=0.2
    )

    with pytest.raises(ValueError):
        PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
            parameters={(b, a): parameters_ab}
        )
Example #10
0
def test_from_dictionary_sqrt_iswap_ideal_when_missing_parameter_fails() -> None:
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=0.8, zeta=-0.5, chi=-0.4)

    a, b = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(cirq.FSimGate(np.pi / 4, 0.0).on(a, b))

    engine_simulator = PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={(a, b): parameters_ab},
    )

    with pytest.raises(ValueError):
        engine_simulator.final_state_vector(circuit)
Example #11
0
def test_run_zeta_chi_gamma_calibration_for_moments_no_chi() -> None:
    parameters_ab = cirq_google.PhasedFSimCharacterization(theta=np.pi / 4,
                                                           zeta=0.5,
                                                           gamma=0.3)
    parameters_bc = cirq_google.PhasedFSimCharacterization(theta=np.pi / 4,
                                                           zeta=-0.5,
                                                           gamma=-0.3)
    parameters_cd = cirq_google.PhasedFSimCharacterization(theta=np.pi / 4,
                                                           zeta=0.2,
                                                           gamma=0.4)

    a, b, c, d = cirq.LineQubit.range(4)
    engine_simulator = cirq_google.PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={
            (a, b): parameters_ab,
            (b, c): parameters_bc,
            (c, d): parameters_cd
        },
        ideal_when_missing_parameter=True,
    )

    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [SQRT_ISWAP_GATE.on(a, b),
         SQRT_ISWAP_GATE.on(c, d)],
        [SQRT_ISWAP_GATE.on(b, c)],
    ])

    calibrated_circuit, *_ = workflow.run_zeta_chi_gamma_compensation_for_moments(
        circuit,
        engine_simulator,
        processor_id=None,
        gate_set=cirq_google.SQRT_ISWAP_GATESET)

    assert cirq.allclose_up_to_global_phase(
        engine_simulator.final_state_vector(calibrated_circuit.circuit),
        cirq.final_state_vector(circuit),
    )
Example #12
0
def test_from_characterizations_sqrt_iswap_when_invalid_arguments_fails() -> None:
    parameters_ab = cirq_google.PhasedFSimCharacterization(
        theta=0.6, zeta=0.5, chi=0.4, gamma=0.3, phi=0.2
    )
    parameters_bc = cirq_google.PhasedFSimCharacterization(
        theta=0.8, zeta=-0.5, chi=-0.4, gamma=-0.3, phi=-0.2
    )

    a, b = cirq.LineQubit.range(2)

    with pytest.raises(ValueError):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.0),
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                ),
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.0),
                    parameters={(a, b): parameters_bc},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                ),
            ]
        )

    with pytest.raises(ValueError):
        PhasedFSimEngineSimulator.create_from_characterizations_sqrt_iswap(
            characterizations=[
                cirq_google.PhasedFSimCalibrationResult(
                    gate=cirq.FSimGate(np.pi / 4, 0.2),
                    parameters={(a, b): parameters_ab},
                    options=ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
                )
            ]
        )
Example #13
0
def test_run_zeta_chi_gamma_calibration_for_moments() -> None:
    parameters_ab = cirq_google.PhasedFSimCharacterization(zeta=0.5,
                                                           chi=0.4,
                                                           gamma=0.3)
    parameters_bc = cirq_google.PhasedFSimCharacterization(zeta=-0.5,
                                                           chi=-0.4,
                                                           gamma=-0.3)
    parameters_cd = cirq_google.PhasedFSimCharacterization(zeta=0.2,
                                                           chi=0.3,
                                                           gamma=0.4)

    a, b, c, d = cirq.LineQubit.range(4)
    engine_simulator = cirq_google.PhasedFSimEngineSimulator.create_from_dictionary_sqrt_iswap(
        parameters={
            (a, b): parameters_ab.merge_with(SQRT_ISWAP_PARAMETERS),
            (b, c): parameters_bc.merge_with(SQRT_ISWAP_PARAMETERS),
            (c, d): parameters_cd.merge_with(SQRT_ISWAP_PARAMETERS),
        })

    circuit = cirq.Circuit([
        [cirq.X(a), cirq.Y(c)],
        [SQRT_ISWAP_GATE.on(a, b),
         SQRT_ISWAP_GATE.on(c, d)],
        [SQRT_ISWAP_GATE.on(b, c)],
    ])

    options = cirq_google.FloquetPhasedFSimCalibrationOptions(
        characterize_theta=False,
        characterize_zeta=True,
        characterize_chi=True,
        characterize_gamma=True,
        characterize_phi=False,
    )

    calibrated_circuit, calibrations = workflow.run_zeta_chi_gamma_compensation_for_moments(
        circuit,
        engine_simulator,
        processor_id=None,
        gate_set=cirq_google.SQRT_ISWAP_GATESET,
        options=options,
    )

    assert cirq.allclose_up_to_global_phase(
        engine_simulator.final_state_vector(calibrated_circuit.circuit),
        cirq.final_state_vector(circuit),
    )
    assert calibrations == [
        cirq_google.PhasedFSimCalibrationResult(
            gate=SQRT_ISWAP_GATE,
            parameters={
                (a, b): parameters_ab,
                (c, d): parameters_cd
            },
            options=options,
        ),
        cirq_google.PhasedFSimCalibrationResult(gate=SQRT_ISWAP_GATE,
                                                parameters={
                                                    (b, c): parameters_bc
                                                },
                                                options=options),
    ]
    assert calibrated_circuit.moment_to_calibration == [
        None, None, 0, None, None, 1, None
    ]
Example #14
0
import cirq_google.calibration.workflow as workflow

from cirq_google.calibration.engine_simulator import PhasedFSimEngineSimulator
from cirq_google.calibration.phased_fsim import (
    ALL_ANGLES_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
    FloquetPhasedFSimCalibrationOptions,
    FloquetPhasedFSimCalibrationRequest,
    PhaseCalibratedFSimGate,
    PhasedFSimCharacterization,
    PhasedFSimCalibrationResult,
    WITHOUT_CHI_FLOQUET_PHASED_FSIM_CHARACTERIZATION,
)

SQRT_ISWAP_PARAMETERS = cirq_google.PhasedFSimCharacterization(theta=np.pi / 4,
                                                               zeta=0.0,
                                                               chi=0.0,
                                                               gamma=0.0,
                                                               phi=0.0)
SQRT_ISWAP_GATE = cirq.FSimGate(np.pi / 4, 0.0)


def _fsim_identity_converter(
        gate: cirq.Gate) -> Optional[PhaseCalibratedFSimGate]:
    if isinstance(gate, cirq.FSimGate):
        return PhaseCalibratedFSimGate(gate, 0.0)
    return None


def test_make_floquet_request_for_moment_none_for_measurements() -> None:
    a, b, c, d = cirq.LineQubit.range(4)
    moment = cirq.Moment(cirq.measure(a, b, c, d))