def test_three_qubit_gate(): class ThreeQubitGate(cirq.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.ConvertToSqrtIswapGates().optimize_circuit(circuit)
def test_two_qubit_gates(gate: cirq.Gate, expected_length: int): """Tests that two qubit gates decompose to an equivalent and serializable circuit with the expected length (or less). """ q0 = cirq.GridQubit(5, 3) q1 = cirq.GridQubit(5, 4) original_circuit = cirq.Circuit(gate(q0, q1)) converted_circuit = original_circuit.copy() cgoc.ConvertToSqrtIswapGates().optimize_circuit(converted_circuit) cig.SQRT_ISWAP_GATESET.serialize(converted_circuit) assert len(converted_circuit) <= expected_length assert _unitaries_allclose(original_circuit, converted_circuit)
def test_givens_rotation(): """Test if the sqrt_iswap synthesis for a givens rotation is correct""" thetas = np.linspace(0, 2 * np.pi, 100) qubits = [cirq.NamedQubit('a'), cirq.NamedQubit('b')] for theta in thetas: program = cirq.Circuit(cirq.givens(theta).on(qubits[0], qubits[1])) unitary = cirq.unitary(program) test_program = program.copy() cgoc.ConvertToSqrtIswapGates().optimize_circuit(test_program) test_unitary = cirq.unitary(test_program) np.testing.assert_allclose( 4, np.abs(np.trace(np.conjugate(np.transpose(test_unitary)) @ unitary)) )
def test_two_qubit_gates_with_symbols(gate: cirq.Gate, expected_length: int): """Tests that the gates with symbols decompose without error into a circuit that has an equivalent unitary form. """ q0 = cirq.GridQubit(5, 3) q1 = cirq.GridQubit(5, 4) original_circuit = cirq.Circuit(gate(q0, q1)) converted_circuit = original_circuit.copy() cgoc.ConvertToSqrtIswapGates().optimize_circuit(converted_circuit) assert len(converted_circuit) <= expected_length # Check if unitaries are the same for val in np.linspace(0, 2 * np.pi, 12): assert _unitaries_allclose( cirq.resolve_parameters(original_circuit, {'t': val}), cirq.resolve_parameters(converted_circuit, {'t': val}))