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)
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
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