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])
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())
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)
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)
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)
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