def test_circuit_on_qubits_double_execution(backend, accelerators, distribute_small):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    if distribute_small:
        smallc = Circuit(3, accelerators=accelerators)
    else:
        smallc = Circuit(3)
    smallc.add((gates.RX(i, theta=i + 0.1) for i in range(3)))
    smallc.add((gates.CNOT(0, 1), gates.CZ(1, 2)))
    # execute the small circuit before adding it to the large one
    _ = smallc()

    largec = Circuit(6, accelerators=accelerators)
    largec.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
    if distribute_small and accelerators is not None:
        with pytest.raises(RuntimeError):
            largec.add(smallc.on_qubits(1, 3, 5))
    else:
        largec.add(smallc.on_qubits(1, 3, 5))
        targetc = Circuit(6)
        targetc.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
        targetc.add((gates.RX(i, theta=i // 2 + 0.1) for i in range(1, 6, 2)))
        targetc.add((gates.CNOT(1, 3), gates.CZ(3, 5)))
        assert largec.depth == targetc.depth
        np.testing.assert_allclose(largec(), targetc())
    qibo.set_backend(original_backend)
def test_circuit_on_qubits_with_varlayer_execution(backend, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    thetas = np.random.random([2, 4])
    smallc = Circuit(4)
    smallc.add(gates.VariationalLayer(range(4), [(0, 1), (2, 3)],
                                      gates.RX, gates.CNOT,
                                      thetas[0]))

    largec = Circuit(8, accelerators=accelerators)
    largec.add(smallc.on_qubits(*range(0, 8, 2)))
    largec.add(gates.VariationalLayer(range(1, 8, 2), [(1, 3), (5, 7)],
                                      gates.RY, gates.CZ,
                                      thetas[1]))

    targetc = Circuit(8)
    targetc.add(gates.VariationalLayer(range(0, 8, 2), [(0, 2), (4, 6)],
                                       gates.RX, gates.CNOT,
                                       thetas[0]))
    targetc.add(gates.VariationalLayer(range(1, 8, 2), [(1, 3), (5, 7)],
                                       gates.RY, gates.CZ,
                                       thetas[1]))
    assert largec.depth == targetc.depth
    np.testing.assert_allclose(largec(), targetc())
    qibo.set_backend(original_backend)
Beispiel #3
0
def test_circuit_on_qubits_with_unitary_execution(backend, accelerators,
                                                  controlled):
    unitaries = np.random.random((2, 2, 2))
    smallc = Circuit(2)
    if controlled:
        smallc.add(gates.Unitary(unitaries[0], 0).controlled_by(1))
        smallc.add(gates.Unitary(unitaries[1], 1).controlled_by(0))
    else:
        smallc.add(gates.Unitary(unitaries[0], 0))
        smallc.add(gates.Unitary(unitaries[1], 1))
    smallc.add(gates.CNOT(0, 1))

    largec = Circuit(4, accelerators=accelerators)
    largec.add(gates.RY(0, theta=0.1))
    largec.add(gates.RY(1, theta=0.2))
    largec.add(gates.RY(2, theta=0.3))
    largec.add(gates.RY(3, theta=0.2))
    largec.add(smallc.on_qubits(3, 0))

    targetc = Circuit(4)
    targetc.add(gates.RY(0, theta=0.1))
    targetc.add(gates.RY(1, theta=0.2))
    targetc.add(gates.RY(2, theta=0.3))
    targetc.add(gates.RY(3, theta=0.2))
    if controlled:
        targetc.add(gates.Unitary(unitaries[0], 3).controlled_by(0))
        targetc.add(gates.Unitary(unitaries[1], 0).controlled_by(3))
    else:
        targetc.add(gates.Unitary(unitaries[0], 3))
        targetc.add(gates.Unitary(unitaries[1], 0))
    targetc.add(gates.CNOT(3, 0))
    assert largec.depth == targetc.depth
    K.assert_allclose(largec(), targetc())
Beispiel #4
0
def test_circuit_gate_generator_errors(backend, accelerators):
    from qibo import callbacks
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    smallc = Circuit(2, accelerators=accelerators)
    smallc.add((gates.H(i) for i in range(2)))
    with pytest.raises(ValueError):
        next(smallc.on_qubits(0, 1, 2))

    smallc = Circuit(2, accelerators=accelerators)
    smallc.add(gates.Flatten(np.ones(4) / np.sqrt(2)))
    with pytest.raises(NotImplementedError):
        next(smallc.on_qubits(0, 1))

    smallc = Circuit(4, accelerators=accelerators)
    smallc.add(gates.CallbackGate(callbacks.EntanglementEntropy([0, 1])))
    with pytest.raises(NotImplementedError):
        next(smallc.on_qubits(0, 1, 2, 3))
    qibo.set_backend(original_backend)
Beispiel #5
0
def test_circuit_on_qubits_execution(backend, accelerators, distribute_small):
    if distribute_small:
        smallc = Circuit(3, accelerators=accelerators)
    else:
        smallc = Circuit(3)
    smallc.add((gates.RX(i, theta=i + 0.1) for i in range(3)))
    smallc.add((gates.CNOT(0, 1), gates.CZ(1, 2)))

    largec = Circuit(6, accelerators=accelerators)
    largec.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
    largec.add(smallc.on_qubits(1, 3, 5))

    targetc = Circuit(6)
    targetc.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
    targetc.add((gates.RX(i, theta=i // 2 + 0.1) for i in range(1, 6, 2)))
    targetc.add((gates.CNOT(1, 3), gates.CZ(3, 5)))
    assert largec.depth == targetc.depth
    K.assert_allclose(largec(), targetc())
Beispiel #6
0
def test_circuit_on_qubits_controlled_by_execution(backend, accelerators):
    smallc = Circuit(3)
    smallc.add(gates.RX(0, theta=0.1).controlled_by(1, 2))
    smallc.add(gates.RY(1, theta=0.2).controlled_by(0))
    smallc.add(gates.RX(2, theta=0.3).controlled_by(1, 0))
    smallc.add(gates.RZ(1, theta=0.4).controlled_by(0, 2))

    largec = Circuit(6, accelerators=accelerators)
    largec.add(gates.H(i) for i in range(6))
    largec.add(smallc.on_qubits(1, 4, 3))

    targetc = Circuit(6)
    targetc.add(gates.H(i) for i in range(6))
    targetc.add(gates.RX(1, theta=0.1).controlled_by(3, 4))
    targetc.add(gates.RY(4, theta=0.2).controlled_by(1))
    targetc.add(gates.RX(3, theta=0.3).controlled_by(1, 4))
    targetc.add(gates.RZ(4, theta=0.4).controlled_by(1, 3))

    assert largec.depth == targetc.depth
    K.assert_allclose(largec(), targetc())
Beispiel #7
0
def oracle(n, s):
    """Oracle checks whether the first s terms are 1.
    """
    if s > 2:
        n_anc = s - 2
        oracle = Circuit(n + n_anc + 1)
        oracle_1 = Circuit(n + n_anc + 1)
        oracle_1.add(gates.X(n + 1).controlled_by(*(0, 1)))
        for q in range(2, s - 1):
            oracle_1.add(gates.X(n + q).controlled_by(*(q, n + q - 1)))

        oracle.add(oracle_1.on_qubits(*(range(n + n_anc + 1))))
        oracle.add(gates.X(n).controlled_by(*(s - 1, n + n_anc)))
        oracle.add(oracle_1.invert().on_qubits(*(range(n + n_anc + 1))))

        return oracle

    else:
        oracle = Circuit(n + int(np.ceil(np.log2(s + 1))) + 1)
        oracle.add(gates.X(n).controlled_by(*range(s)))

        return oracle
Beispiel #8
0
def test_circuit_gate_generator(backend, accelerators, distsmall):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    if distsmall:
        smallc = Circuit(3, accelerators=accelerators)
    else:
        smallc = Circuit(3)
    smallc.add((gates.RX(i, theta=i + 0.1) for i in range(3)))
    smallc.add((gates.CNOT(0, 1), gates.CZ(1, 2)))

    largec = Circuit(6, accelerators=accelerators)
    largec.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
    largec.add(smallc.on_qubits(1, 3, 5))

    targetc = Circuit(6)
    targetc.add((gates.RY(i, theta=i + 0.2) for i in range(0, 6, 2)))
    targetc.add((gates.RX(i, theta=i // 2 + 0.1) for i in range(1, 6, 2)))
    targetc.add((gates.CNOT(1, 3), gates.CZ(3, 5)))
    assert largec.depth == targetc.depth
    np.testing.assert_allclose(largec(), targetc())
    qibo.set_backend(original_backend)
Beispiel #9
0
def test_circuit_gate_generator_with_unitary(backend, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    unitaries = np.random.random((2, 2, 2))
    smallc = Circuit(2)
    smallc.add((gates.Unitary(u, i) for i, u in enumerate(unitaries)))
    smallc.add(gates.CNOT(0, 1))

    largec = Circuit(4, accelerators=accelerators)
    largec.add(gates.RY(1, theta=0.1))
    largec.add(gates.RY(2, theta=0.2))
    largec.add(smallc.on_qubits(0, 3))

    targetc = Circuit(4)
    targetc.add(gates.RY(1, theta=0.1))
    targetc.add(gates.RY(2, theta=0.2))
    targetc.add(gates.Unitary(unitaries[0], 0))
    targetc.add(gates.Unitary(unitaries[1], 3))
    targetc.add(gates.CNOT(0, 3))
    assert largec.depth == targetc.depth
    np.testing.assert_allclose(largec(), targetc())
    qibo.set_backend(original_backend)