def test_random_rotations_between_grid_interaction_layers():
    # Staggered pattern
    qubits = set(cirq.GridQubit.rect(4, 3))
    depth = 20
    pattern = cirq.experiments.GRID_STAGGERED_PATTERN
    circuit = random_rotations_between_grid_interaction_layers_circuit(
        qubits, depth, seed=1234)

    assert len(circuit) == 2 * depth + 1
    _validate_single_qubit_layers(qubits, circuit[::2])
    _validate_two_qubit_layers(qubits, circuit[1::2], pattern)

    # Aligned pattern
    qubits = set(cirq.GridQubit.rect(4, 5))
    depth = 21
    pattern = cirq.experiments.GRID_ALIGNED_PATTERN
    circuit = random_rotations_between_grid_interaction_layers_circuit(
        qubits, depth, pattern=pattern, seed=1234)

    assert len(circuit) == 2 * depth + 1
    _validate_single_qubit_layers(qubits, circuit[::2])
    _validate_two_qubit_layers(qubits, circuit[1::2], pattern)

    # Staggered pattern with two qubit operation factory
    qubits = set(cirq.GridQubit.rect(5, 4))
    depth = 22
    pattern = cirq.experiments.GRID_STAGGERED_PATTERN

    def two_qubit_op_factory(a, b, prng):
        z_exponents = [prng.uniform(0, 1) for _ in range(4)]
        yield cirq.Z(a)**z_exponents[0]
        yield cirq.Z(b)**z_exponents[1]
        yield cirq.google.SYC(a, b)
        yield cirq.Z(a)**z_exponents[2]
        yield cirq.Z(b)**z_exponents[3]

    circuit = random_rotations_between_grid_interaction_layers_circuit(
        qubits, depth, two_qubit_op_factory=two_qubit_op_factory, seed=1234)

    assert len(circuit) == 4 * depth + 1
    _validate_single_qubit_layers(qubits, circuit[::4])
    _validate_two_qubit_layers(qubits, circuit[2::4], pattern)

    # Aligned pattern omitting final single qubit layer
    qubits = set(cirq.GridQubit.rect(4, 5))
    depth = 23
    pattern = cirq.experiments.GRID_ALIGNED_PATTERN
    circuit = random_rotations_between_grid_interaction_layers_circuit(
        qubits,
        depth,
        pattern=pattern,
        add_final_single_qubit_layer=False,
        seed=1234)

    assert len(circuit) == 2 * depth
    _validate_single_qubit_layers(qubits, circuit[::2])
    _validate_two_qubit_layers(qubits, circuit[1::2], pattern)
def test_random_rotations_between_grid_interaction_layers(
    qubits: Iterable[cirq.GridQubit],
    depth: int,
    two_qubit_op_factory: Callable[
        [cirq.GridQubit, cirq.GridQubit, np.random.RandomState], cirq.OP_TREE],
    pattern: Sequence[GridInteractionLayer],
    single_qubit_gates: Sequence[cirq.Gate],
    add_final_single_qubit_layer: bool,
    seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE',
    expected_circuit_length: int,
    single_qubit_layers_slice: slice,
    two_qubit_layers_slice: slice,
):
    qubits = set(qubits)
    circuit = random_rotations_between_grid_interaction_layers_circuit(
        qubits,
        depth,
        two_qubit_op_factory=two_qubit_op_factory,
        pattern=pattern,
        single_qubit_gates=single_qubit_gates,
        add_final_single_qubit_layer=add_final_single_qubit_layer,
        seed=seed,
    )

    assert len(circuit) == expected_circuit_length
    _validate_single_qubit_layers(
        qubits,
        cast(Sequence[cirq.Moment], circuit[single_qubit_layers_slice]),
        non_repeating_layers=len(set(single_qubit_gates)) > 1,
    )
    _validate_two_qubit_layers(
        qubits, cast(Sequence[cirq.Moment], circuit[two_qubit_layers_slice]),
        pattern)
Esempio n. 3
0
def test_run_calibration(monkeypatch):
    monkeypatch.setattr('cirq.experiments.xeb_fitting.scipy.optimize.minimize', _minimize_patch)
    monkeypatch.setattr(
        'cirq_google.calibration.xeb_wrapper.xebf.benchmark_2q_xeb_fidelities', _benchmark_patch
    )
    qubit_indices = [
        (0, 5),
        (0, 6),
        (1, 6),
        (2, 6),
    ]
    qubits = [cirq.GridQubit(*idx) for idx in qubit_indices]
    sampler = cirq.ZerosSampler()

    circuits = [
        random_rotations_between_grid_interaction_layers_circuit(
            qubits,
            depth=depth,
            two_qubit_op_factory=lambda a, b, _: SQRT_ISWAP.on(a, b),
            pattern=cirq.experiments.GRID_ALIGNED_PATTERN,
            seed=10,
        )
        for depth in [5, 10]
    ]

    options = LocalXEBPhasedFSimCalibrationOptions(
        fsim_options=XEBPhasedFSimCharacterizationOptions(
            characterize_zeta=True,
            characterize_gamma=True,
            characterize_chi=True,
            characterize_theta=False,
            characterize_phi=False,
            theta_default=np.pi / 4,
        ),
        n_processes=1,
    )

    characterization_requests = []
    for circuit in circuits:
        _, characterization_requests = cg.prepare_characterization_for_moments(
            circuit, options=options, initial=characterization_requests
        )
    assert len(characterization_requests) == 2
    for cr in characterization_requests:
        assert isinstance(cr, LocalXEBPhasedFSimCalibrationRequest)

    characterizations = [
        run_local_xeb_calibration(request, sampler) for request in characterization_requests
    ]

    final_params = dict()
    for c in characterizations:
        final_params.update(c.parameters)
    assert len(final_params) == 3  # pairs
Esempio n. 4
0
def test_run_calibration(monkeypatch, fsim_options, x0_should_be):
    def _minimize_patch_2(*args, **kwargs):
        return _minimize_patch(*args, **kwargs, x0_should_be=x0_should_be)

    monkeypatch.setattr('scipy.optimize.minimize', _minimize_patch_2)
    monkeypatch.setattr(
        'cirq_google.calibration.xeb_wrapper.xebf.benchmark_2q_xeb_fidelities',
        _benchmark_patch)
    qubit_indices = [(0, 5), (0, 6), (1, 6), (2, 6)]
    qubits = [cirq.GridQubit(*idx) for idx in qubit_indices]
    sampler = cirq.ZerosSampler()

    circuits = [
        random_rotations_between_grid_interaction_layers_circuit(
            qubits,
            depth=depth,
            two_qubit_op_factory=lambda a, b, _:
            (cirq.SQRT_ISWAP_INV.on(a, b)),
            pattern=cirq.experiments.GRID_ALIGNED_PATTERN,
            seed=10,
        ) for depth in [5, 10]
    ]

    options = LocalXEBPhasedFSimCalibrationOptions(fsim_options=fsim_options,
                                                   n_processes=1)

    characterization_requests = []
    for circuit in circuits:
        _, characterization_requests = cg.prepare_characterization_for_moments(
            circuit, options=options, initial=characterization_requests)
    assert len(characterization_requests) == 2
    for cr in characterization_requests:
        assert isinstance(cr, LocalXEBPhasedFSimCalibrationRequest)

    characterizations = [
        run_local_xeb_calibration(request, sampler)
        for request in characterization_requests
    ]

    final_params = dict()
    for c in characterizations:
        final_params.update(c.parameters)
    assert len(final_params) == 3  # pairs