Exemplo n.º 1
0
def test_circuit_add_sampling(backend):
    """Check measurements when simulating added circuits with noise"""
    # Create random noisy circuit and add noiseless inverted circuit
    gates_set = [
        gates.X, gates.Y, gates.Z, gates.H, gates.S, gates.SDG, gates.I
    ]
    circ = Circuit(1)
    circ_no_noise = Circuit(1)

    for _ in range(10):
        new_gate = np.random.choice(gates_set)(0)
        circ.add(gates.PauliNoiseChannel(0, pz=0.01))
        circ.add(new_gate)
        circ_no_noise.add(new_gate)

    circ.add(gates.PauliNoiseChannel(0, pz=0.01))
    circ += circ_no_noise.invert()
    circ.add(gates.M(0))

    # Sampling using 10 shots
    np.random.seed(123)
    K.set_seed(123)
    samples = circ(nshots=10).samples()

    # Sampling using 1 shot in for loop
    target_samples = []
    K.set_seed(123)
    np.random.seed(123)
    for _ in range(10):
        target_samples.append(circ(nshots=1).samples())

    target_samples = np.stack(target_samples)

    K.assert_allclose(samples, target_samples[:, 0])
Exemplo n.º 2
0
def test_circuit_invert_and_addition_execution(backend, accelerators):
    subroutine = Circuit(6)
    subroutine.add([gates.RX(i, theta=0.1) for i in range(5)])
    subroutine.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    middle = Circuit(6)
    middle.add([gates.CU2(i, i + 1, phi=0.1, lam=0.2) for i in range(0, 5, 2)])
    circuit = subroutine + middle + subroutine.invert()

    c = Circuit(6)
    c.add([gates.RX(i, theta=0.1) for i in range(5)])
    c.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    c.add([gates.CU2(i, i + 1, phi=0.1, lam=0.2) for i in range(0, 5, 2)])
    c.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    c.add([gates.RX(i, theta=-0.1) for i in range(5)])

    assert c.depth == circuit.depth
    K.assert_allclose(circuit(), c())
Exemplo n.º 3
0
def test_inverse_circuit_execution(backend, accelerators, fuse):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    c = Circuit(4, accelerators)
    c.add(gates.RX(0, theta=0.1))
    c.add(gates.U2(1, phi=0.2, lam=0.3))
    c.add(gates.U3(2, theta=0.1, phi=0.3, lam=0.2))
    c.add(gates.CNOT(0, 1))
    c.add(gates.CZ(1, 2))
    c.add(gates.fSim(0, 2, theta=0.1, phi=0.3))
    c.add(gates.CU2(0, 1, phi=0.1, lam=0.1))
    if fuse:
        c = c.fuse()
    invc = c.invert()
    target_state = np.ones(2 ** 4) / 4
    final_state = invc(c(np.copy(target_state)))
    np.testing.assert_allclose(final_state, target_state)
    qibo.set_backend(original_backend)
Exemplo n.º 4
0
def test_inverse_circuit_execution(backend, accelerators, fuse):
    c = Circuit(4, accelerators)
    c.add(gates.RX(0, theta=0.1))
    c.add(gates.U2(1, phi=0.2, lam=0.3))
    c.add(gates.U3(2, theta=0.1, phi=0.3, lam=0.2))
    c.add(gates.CNOT(0, 1))
    c.add(gates.CZ(1, 2))
    c.add(gates.fSim(0, 2, theta=0.1, phi=0.3))
    c.add(gates.CU2(0, 1, phi=0.1, lam=0.1))
    if fuse:
        if accelerators:
            with pytest.raises(NotImplementedError):
                c = c.fuse()
        else:
            c = c.fuse()
    invc = c.invert()
    target_state = np.ones(2**4) / 4
    final_state = invc(c(np.copy(target_state)))
    K.assert_allclose(final_state, target_state)
Exemplo n.º 5
0
def test_circuit_invert_with_addition(backend, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)

    subroutine = Circuit(6)
    subroutine.add([gates.RX(i, theta=0.1) for i in range(5)])
    subroutine.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    middle = Circuit(6)
    middle.add([gates.CU2(i, i + 1, phi=0.1, lam=0.2) for i in range(0, 5, 2)])
    circuit = subroutine + middle + subroutine.invert()

    c = Circuit(6)
    c.add([gates.RX(i, theta=0.1) for i in range(5)])
    c.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    c.add([gates.CU2(i, i + 1, phi=0.1, lam=0.2) for i in range(0, 5, 2)])
    c.add([gates.CZ(i, i + 1) for i in range(0, 5, 2)])
    c.add([gates.RX(i, theta=-0.1) for i in range(5)])

    assert c.depth == circuit.depth
    np.testing.assert_allclose(circuit(), c())
    qibo.set_backend(original_backend)
Exemplo n.º 6
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