def test_convert_to_sycamore_gates_fsim(): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit(cirq.FSimGate(theta=np.pi / 2, phi=np.pi / 6)(q0, q1)) compiled_circuit = circuit.copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates()(compiled_circuit) cirq.testing.assert_same_circuits(circuit, compiled_circuit)
def test_convert_to_sycamore_equivalent_unitaries(gate): qubits = [cirq.NamedQubit('a'), cirq.NamedQubit('b')] operation = gate.on(qubits[0], qubits[1]) with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): converted = cgoc.ConvertToSycamoreGates().convert(operation) u1 = cirq.unitary(cirq.Circuit(converted)) u2 = cirq.unitary(operation) cirq.testing.assert_allclose_up_to_global_phase(u1, u2, atol=1e-8)
def test_sycamore_invalid_tabulation(): # An object other than a tabulation. sycamore_tabulation = {} with pytest.raises(ValueError): with cirq.testing.assert_deprecated( "Use cirq.optimize_for_target_gateset", deadline='v1.0' ): cgoc.ConvertToSycamoreGates(sycamore_tabulation)
def test_convert_to_sycamore_gates_fsim(): q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit( cirq.FSimGate(theta=np.pi / 2, phi=np.pi / 6)(q0, q1)) compiled_circuit = circuit.copy() cgoc.ConvertToSycamoreGates()(compiled_circuit) cirq.testing.assert_same_circuits(circuit, compiled_circuit)
def test_unsupported_gate(): class UnknownGate(cirq.testing.TwoQubitGate): pass q0 = cirq.LineQubit(0) q1 = cirq.LineQubit(1) circuit = cirq.Circuit(UnknownGate()(q0, q1)) with pytest.raises(ValueError, match='Unrecognized gate: '): cgoc.ConvertToSycamoreGates().optimize_circuit(circuit)
def test_circuit_operation_conversion(): q0, q1 = cirq.LineQubit.range(2) subcircuit = cirq.FrozenCircuit(cirq.X(q0), cirq.SWAP(q0, q1)) circuit = cirq.Circuit(cirq.CircuitOperation(subcircuit)) converted_circuit = circuit.copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) # 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. reconverted_subcircuit = ops[0].circuit.unfreeze().copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(reconverted_subcircuit) assert ops[0].circuit == reconverted_subcircuit cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( circuit, converted_circuit, atol=1e-8 )
def test_single_qubit_gate_phased_xz(): q = cirq.LineQubit(0) gate = cirq.PhasedXZGate(axis_phase_exponent=0.2, x_exponent=0.3, z_exponent=0.4) circuit = cirq.Circuit(gate(q)) converted_circuit = circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) ops = list(converted_circuit.all_operations()) assert len(ops) == 1 assert ops[0].gate == gate
def test_single_qubit_gate_phased_xz(): q = cirq.LineQubit(0) gate = cirq.PhasedXZGate(axis_phase_exponent=0.2, x_exponent=0.3, z_exponent=0.4) circuit = cirq.Circuit(gate(q)) converted_circuit = circuit.copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) ops = list(converted_circuit.all_operations()) assert len(ops) == 1 assert ops[0].gate == gate
def test_unsupported_gate(): class UnknownGate(cirq.testing.TwoQubitGate): pass q0, q1 = cirq.LineQubit.range(2) circuit = cirq.Circuit(UnknownGate()(q0, q1)) with pytest.raises(TypeError, match='gate with a known unitary'): with cirq.testing.assert_deprecated( "Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(circuit)
def test_three_qubit_gate(): class ThreeQubitGate(cirq.testing.ThreeQubitGate): pass q0 = cirq.LineQubit(0) q1 = cirq.LineQubit(1) q2 = cirq.LineQubit(2) circuit = cirq.Circuit(ThreeQubitGate()(q0, q1, q2)) with pytest.raises(TypeError): cgoc.ConvertToSycamoreGates().optimize_circuit(circuit)
def test_unsupported_phased_iswap(): """Tests that a Phased ISwap with a provided phase_exponent and exponent is not supported.""" q0 = cirq.LineQubit(0) q1 = cirq.LineQubit(1) circuit = cirq.Circuit( cirq.PhasedISwapPowGate(exponent=0.5, phase_exponent=0.33)(q0, q1)) with pytest.raises(ValueError, match='phase_exponent of .25 OR an exponent of 1'): cgoc.ConvertToSycamoreGates().optimize_circuit(circuit)
def test_unsupported_phased_iswap(): """Tests that a Phased ISwap with a provided phase_exponent and exponent is not supported.""" q0 = cirq.LineQubit(0) q1 = cirq.LineQubit(1) circuit = cirq.Circuit(cirq.PhasedISwapPowGate(exponent=0.5, phase_exponent=0.33)(q0, q1)) converted_circuit = circuit.copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( circuit, converted_circuit, atol=1e-8 )
def test_three_qubit_gate(): class ThreeQubitGate(cirq.testing.ThreeQubitGate): pass q0 = cirq.LineQubit(0) q1 = cirq.LineQubit(1) q2 = cirq.LineQubit(2) circuit = cirq.Circuit(ThreeQubitGate()(q0, q1, q2)) with pytest.raises(TypeError): with cirq.testing.assert_deprecated( "Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(circuit)
def test_single_qubit_gate(): q = cirq.LineQubit(0) mat = cirq.testing.random_unitary(2) gate = cirq.MatrixGate(mat, qid_shape=(2, )) circuit = cirq.Circuit(gate(q)) converted_circuit = circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) ops = list(converted_circuit.all_operations()) assert len(ops) == 1 assert isinstance(ops[0].gate, cirq.PhasedXZGate) cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( circuit, converted_circuit, atol=1e-8)
def test_convert_to_sycamore_tabulation(): # A tabulation for the sycamore gate with an infidelity of .1. sycamore_tabulation = gate_product_tabulation( cirq.unitary(cirq_google.SYC), 0.1, random_state=_rng ) qubits = [cirq.NamedQubit('a'), cirq.NamedQubit('b')] operation = cirq.MatrixGate(cirq.unitary(cirq.CX), qid_shape=(2, 2)).on(qubits[0], qubits[1]) converted = cgoc.ConvertToSycamoreGates(sycamore_tabulation).convert(operation) u1 = cirq.unitary(cirq.Circuit(converted)) u2 = cirq.unitary(operation) overlap = abs(np.trace(u1.conj().T @ u2)) assert np.isclose(overlap, 4.0, 0.1)
def test_zztheta_zzpow_unsorted_qubits(): qubits = cirq.LineQubit(1), cirq.LineQubit(0) exponent = 0.06366197723675814 expected_circuit = cirq.Circuit( cirq.ZZPowGate(exponent=exponent, global_shift=-0.5).on(qubits[0], qubits[1]), ) actual_circuit = expected_circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(actual_circuit) cirq.testing.assert_allclose_up_to_global_phase( cirq.unitary(expected_circuit), cirq.unitary(actual_circuit), atol=1e-7 )
def test_swap_zztheta(): """Construct a Ising gate followed by a swap using a sycamore.""" qubits = cirq.LineQubit.range(2) a, b = qubits for theta in np.linspace(0, 2 * np.pi, 10): expected_circuit = cirq.Circuit( cirq.SWAP(a, b), cirq.ZZPowGate(exponent=2 * theta / np.pi, global_shift=-0.5).on(a, b) ) expected_unitary = cirq.unitary(expected_circuit) actual_circuit = expected_circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(actual_circuit) actual_unitary = cirq.unitary(actual_circuit) cirq.testing.assert_allclose_up_to_global_phase(actual_unitary, expected_unitary, atol=1e-7)
def test_zztheta_qaoa_like(): qubits = cirq.LineQubit.range(4) for exponent in np.linspace(-1, 1, 10): cirq_circuit = cirq.Circuit([ cirq.H.on_each(qubits), cirq.ZZPowGate(exponent=exponent)(qubits[0], qubits[1]), cirq.ZZPowGate(exponent=exponent)(qubits[2], qubits[3]), cirq.rx(0.123).on_each(qubits), ]) syc_circuit = cirq_circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(syc_circuit) cirq.testing.assert_allclose_up_to_global_phase( cirq.unitary(cirq_circuit), cirq.unitary(syc_circuit), atol=1e-7)
def test_known_two_q_operations_to_sycamore_operations_cnot(): a, b = cirq.LineQubit.range(2) op = cirq.CNOT(a, b) decomposed = cirq.Circuit(cgoc.ConvertToSycamoreGates().convert(op)) # Should be equivalent. cirq.testing.assert_allclose_up_to_global_phase( cirq.unitary(op), cirq.unitary(decomposed), atol=1e-8 ) # Should have decomposed into two Sycamores. multi_qubit_ops = [e for e in decomposed.all_operations() if len(e.qubits) > 1] assert len(multi_qubit_ops) == 2 assert all(isinstance(e.gate, cirq_google.SycamoreGate) for e in multi_qubit_ops)
def test_non_gate_operation(): class UnknownOperation(cirq.Operation): def __init__(self, qubits): self._qubits = qubits @property def qubits(self): return self._qubits def with_qubits(self, *new_qubits): # coverage: ignore return UnknownOperation(self._qubits) q0 = cirq.LineQubit(0) circuit = cirq.Circuit(UnknownOperation([q0])) converted_circuit = circuit.copy() cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) assert circuit == converted_circuit
def test_non_gate_operation(): class UnknownOperation(cirq.Operation): def __init__(self, qubits): self._qubits = qubits @property def qubits(self): return self._qubits def with_qubits(self, *new_qubits): # coverage: ignore return UnknownOperation(self._qubits) q0 = cirq.LineQubit(0) circuit = cirq.Circuit(UnknownOperation([q0])) converted_circuit = circuit.copy() with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset", deadline='v1.0'): cgoc.ConvertToSycamoreGates().optimize_circuit(converted_circuit) assert circuit == converted_circuit
def test_sycamore_invalid_tabulation(): # An object other than a tabulation. sycamore_tabulation = {} with pytest.raises(ValueError): cgoc.ConvertToSycamoreGates(sycamore_tabulation)