Example #1
0
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()
    with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset",
                                        deadline='v1.0'):
        cgoc.ConvertToSqrtIswapGates().optimize_circuit(converted_circuit)
    converted_circuit_iswap_inv = cirq.optimize_for_target_gateset(
        original_circuit,
        gateset=cirq.SqrtIswapTargetGateset(use_sqrt_iswap_inv=True))
    converted_circuit_iswap = cirq.optimize_for_target_gateset(
        original_circuit, gateset=cirq.SqrtIswapTargetGateset())
    assert len(converted_circuit) <= expected_length
    assert (len(converted_circuit_iswap) <= expected_length
            or len(converted_circuit_iswap_inv) <= 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}),
        )
        assert _unitaries_allclose(
            cirq.resolve_parameters(original_circuit, {'t': val}),
            cirq.resolve_parameters(converted_circuit_iswap, {'t': val}),
        )
        assert _unitaries_allclose(
            cirq.resolve_parameters(original_circuit, {'t': val}),
            cirq.resolve_parameters(converted_circuit_iswap_inv, {'t': val}),
        )
Example #2
0
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()
        with cirq.testing.assert_deprecated(
                "Use cirq.optimize_for_target_gateset", deadline='v1.0'):
            cgoc.ConvertToSqrtIswapGates().optimize_circuit(test_program)
        converted_circuit_iswap_inv = cirq.optimize_for_target_gateset(
            test_program,
            gateset=cirq.SqrtIswapTargetGateset(use_sqrt_iswap_inv=True))
        converted_circuit_iswap = cirq.optimize_for_target_gateset(
            test_program, gateset=cirq.SqrtIswapTargetGateset())
        for circuit in [
                test_program, converted_circuit_iswap_inv,
                converted_circuit_iswap
        ]:
            circuit.append(cirq.IdentityGate(2).on(*qubits))
            test_unitary = cirq.unitary(circuit)
            np.testing.assert_allclose(
                4,
                np.abs(
                    np.trace(
                        np.conjugate(np.transpose(test_unitary)) @ unitary)))
Example #3
0
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()
    converted_circuit_iswap_inv = cirq.optimize_for_target_gateset(
        original_circuit,
        gateset=cirq.SqrtIswapTargetGateset(use_sqrt_iswap_inv=True))
    converted_circuit_iswap = cirq.optimize_for_target_gateset(
        original_circuit, gateset=cirq.SqrtIswapTargetGateset())
    with cirq.testing.assert_deprecated("Use cirq.optimize_for_target_gateset",
                                        deadline='v1.0'):
        cgoc.ConvertToSqrtIswapGates().optimize_circuit(converted_circuit)
    cig.SQRT_ISWAP_GATESET.serialize(converted_circuit)
    cig.SQRT_ISWAP_GATESET.serialize(converted_circuit_iswap)
    cig.SQRT_ISWAP_GATESET.serialize(converted_circuit_iswap_inv)
    assert len(converted_circuit) <= expected_length
    assert (len(converted_circuit_iswap) <= expected_length
            or len(converted_circuit_iswap_inv) <= expected_length)
    assert _unitaries_allclose(original_circuit, converted_circuit)
    assert _unitaries_allclose(original_circuit, converted_circuit_iswap)
    assert _unitaries_allclose(original_circuit, converted_circuit_iswap_inv)
Example #4
0
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.ConvertToSqrtIswapGates().optimize_circuit(circuit)
Example #5
0
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)
Example #6
0
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.ConvertToSqrtIswapGates().optimize_circuit(circuit)
Example #7
0
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)))
Example #8
0
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}),
        )