def test_circuit_operation_conversion(optimizer_type, two_qubit_gate_type): q0, q1 = cirq.LineQubit.range(2) subcircuit = cirq.FrozenCircuit(cirq.X(q0), cirq.SWAP(q0, q1)) circuit = cirq.Circuit(cirq.CircuitOperation(subcircuit)) with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=2): converted_circuit = cg.optimized_for_sycamore( circuit, optimizer_type=optimizer_type) # Verify that the CircuitOperation was preserved. ops = list(converted_circuit.all_operations()) assert isinstance(ops[0], cirq.CircuitOperation) # Verify that the contents of the CircuitOperation were optimized. converted_subcircuit = cg.optimized_for_sycamore( subcircuit.unfreeze(), optimizer_type=optimizer_type) assert len([ *converted_subcircuit.findall_operations_with_gate_type( two_qubit_gate_type) ]) == len([ *ops[0].circuit.findall_operations_with_gate_type( two_qubit_gate_type) ]) cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( ops[0].circuit, converted_subcircuit, atol=1e-8) cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( circuit, converted_circuit, atol=1e-8)
def test_tabulation(): q0, q1 = cirq.LineQubit.range(2) u = cirq.testing.random_special_unitary( 4, random_state=np.random.RandomState(52)) circuit = cirq.Circuit(cirq.MatrixGate(u).on(q0, q1)) np.testing.assert_allclose(u, cirq.unitary(circuit)) with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=2): circuit2 = cg.optimized_for_sycamore(circuit, optimizer_type='sycamore') cirq.testing.assert_allclose_up_to_global_phase(u, cirq.unitary(circuit2), atol=1e-5) assert len(circuit2) == 13 # Note this is run on every commit, so it needs to be relatively quick. # This requires us to use relatively loose tolerances circuit3 = cg.optimized_for_sycamore(circuit, optimizer_type='sycamore', tabulation_resolution=0.1) cirq.testing.assert_allclose_up_to_global_phase(u, cirq.unitary(circuit3), rtol=1e-1, atol=1e-1) assert len(circuit3) == 7
def test_one_q_matrix_gate(): u = cirq.testing.random_special_unitary(2) q = cirq.LineQubit(0) circuit0 = cirq.Circuit(cirq.MatrixGate(u).on(q)) assert len(circuit0) == 1 # Deprecations: well-known cirq_google SerializableGateSets # (e.g. cirq_google.SYC_GATESET), and # cirq_google.optimized_for_sycamore with cirq.testing.assert_deprecated( 'SerializableGateSet', 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=6): circuit_iswap = cg.optimized_for_sycamore(circuit0, optimizer_type='sqrt_iswap') assert len(circuit_iswap) == 1 for moment in circuit_iswap: for op in moment: assert cg.SQRT_ISWAP_GATESET.is_supported_operation(op) # single qubit gates shared between gatesets, so: assert cg.SYC_GATESET.is_supported_operation(op) circuit_syc = cg.optimized_for_sycamore(circuit0, optimizer_type='sycamore') assert len(circuit_syc) == 1 for moment in circuit_iswap: for op in moment: assert cg.SYC_GATESET.is_supported_operation(op) # single qubit gates shared between gatesets, so: assert cg.SQRT_ISWAP_GATESET.is_supported_operation(op)
def test_assert_new_device_deprecated(): u = cirq.testing.random_special_unitary(2) q = cirq.LineQubit(0) circuit0 = cirq.Circuit(cirq.MatrixGate(u).on(q)) _ = cg.optimized_for_sycamore(circuit0, optimizer_type='sqrt_iswap') with cirq.testing.assert_deprecated( cirq.circuits.circuit._DEVICE_DEP_MESSAGE, deadline='v0.15'): _ = cg.optimized_for_sycamore(circuit0, optimizer_type='sqrt_iswap', new_device=cg.Foxtail)
def test_invalid_input(): with pytest.raises(ValueError): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit( cirq.CZ(q0, q1), cirq.X(q0) ** 0.2, cirq.Z(q1) ** 0.2, cirq.measure(q0, q1, key='m') ) _ = cg.optimized_for_sycamore(circuit, optimizer_type='for_tis_100')
def get_compiled_3_regular_maxcut_circuit( problem: ThreeRegularProblem, device: cg.XmonDevice, gammas: Sequence[float], betas: Sequence[float], ) -> Tuple[List[cirq.Qid], cirq.Circuit, List[cirq.Qid]]: """Get a fully-compiled SK model circuit. Args: problem: A ThreeRegularProblem device: The device to target gammas: Gamma angles to use as parameters for problem unitaries betas: Beta angles to use as parameters for driver unitaries Returns: initial_qubits: The qubits in their initial order circuit: The final routed, gateset-targeted, and placed circuit with measurements. final_qubits: The qubits in their final logical order. """ # TODO: explicitly compile gates, avoid optimized_for_sycamore, make structured circuits initial_qubits, circuit, final_qubits = get_routed_3_regular_maxcut_circuit( problem_graph=problem.graph, device=device, gammas=gammas, betas=betas) circuit.append(cirq.measure(*final_qubits, key='z')) circuit = cg.optimized_for_sycamore(circuit, optimizer_type='sycamore') return initial_qubits, circuit, final_qubits
def test_optimize_large_measurement_gates(optimizer_type, gateset): qubits = cirq.LineQubit.range(53) circuit = cirq.Circuit( cirq.X.on_each(qubits), [ cirq.CZ(qubits[i], qubits[i + 1]) for i in range(0, len(qubits) - 1, 2) ], [ cirq.CZ(qubits[i], qubits[i + 1]) for i in range(1, len(qubits) - 1, 2) ], cirq.measure(*qubits, key='m'), ) with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=1): new_circuit = cg.optimized_for_sycamore(circuit, optimizer_type=optimizer_type) for moment in new_circuit: for op in moment: assert gateset.is_supported_operation(op)
def test_optimizer_output_gates_are_supported(optimizer_type, gateset): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit( cirq.CZ(q0, q1), cirq.X(q0) ** 0.2, cirq.Z(q1) ** 0.2, cirq.measure(q0, q1, key='m') ) new_circuit = cg.optimized_for_sycamore(circuit, optimizer_type=optimizer_type) for moment in new_circuit: for op in moment: assert gateset.is_supported_operation(op)
def test_one_q_matrix_gate(): u = cirq.testing.random_special_unitary(2) q = cirq.LineQubit(0) circuit0 = cirq.Circuit(cirq.MatrixGate(u).on(q)) assert len(circuit0) == 1 circuit_iswap = cg.optimized_for_sycamore(circuit0, optimizer_type='sqrt_iswap') assert len(circuit_iswap) == 1 for moment in circuit_iswap: for op in moment: assert cg.SQRT_ISWAP_GATESET.is_supported_operation(op) # single qubit gates shared between gatesets, so: assert cg.SYC_GATESET.is_supported_operation(op) circuit_syc = cg.optimized_for_sycamore(circuit0, optimizer_type='sycamore') assert len(circuit_syc) == 1 for moment in circuit_iswap: for op in moment: assert cg.SYC_GATESET.is_supported_operation(op) # single qubit gates shared between gatesets, so: assert cg.SQRT_ISWAP_GATESET.is_supported_operation(op)
def test_optimize_large_measurement_gates(optimizer_type, gateset): qubits = cirq.LineQubit.range(53) circuit = cirq.Circuit( cirq.X.on_each(qubits), [cirq.CZ(qubits[i], qubits[i + 1]) for i in range(0, len(qubits) - 1, 2)], [cirq.CZ(qubits[i], qubits[i + 1]) for i in range(1, len(qubits) - 1, 2)], cirq.measure(*qubits, key='m'), ) new_circuit = cg.optimized_for_sycamore(circuit, optimizer_type=optimizer_type) for moment in new_circuit: for op in moment: assert gateset.is_supported_operation(op)
def test_invalid_input(): with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=1): with pytest.raises(ValueError): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit(cirq.CZ(q0, q1), cirq.X(q0)**0.2, cirq.Z(q1)**0.2, cirq.measure(q0, q1, key='m')) _ = cg.optimized_for_sycamore(circuit, optimizer_type='for_tis_100')
def test_optimizer_output_gates_are_supported(optimizer_type, gateset): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit(cirq.CZ(q0, q1), cirq.X(q0)**0.2, cirq.Z(q1)**0.2, cirq.measure(q0, q1, key='m')) with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=1): new_circuit = cg.optimized_for_sycamore(circuit, optimizer_type=optimizer_type) for moment in new_circuit: for op in moment: assert gateset.is_supported_operation(op)
def test_no_tabulation(): circuit = cirq.Circuit(cirq.X(cirq.LineQubit(0))) with pytest.raises(NotImplementedError): cg.optimized_for_sycamore(circuit, optimizer_type='sqrt_iswap', tabulation_resolution=0.01) with pytest.raises(NotImplementedError): cg.optimized_for_sycamore(circuit, optimizer_type='xmon', tabulation_resolution=0.01) with pytest.raises(NotImplementedError): cg.optimized_for_sycamore( circuit, optimizer_type='xmon_partial_cz', tabulation_resolution=0.01 )
def test_no_tabulation(): circuit = cirq.Circuit(cirq.X(cirq.LineQubit(0))) with cirq.testing.assert_deprecated( 'Use `cirq.optimize_for_target_gateset', deadline='v0.16', count=3): with pytest.raises(NotImplementedError): cg.optimized_for_sycamore(circuit, optimizer_type='sqrt_iswap', tabulation_resolution=0.01) with pytest.raises(NotImplementedError): cg.optimized_for_sycamore(circuit, optimizer_type='xmon', tabulation_resolution=0.01) with pytest.raises(NotImplementedError): cg.optimized_for_sycamore(circuit, optimizer_type='xmon_partial_cz', tabulation_resolution=0.01)