def test_circuit_set_parameters_ungates(backend, accelerators, trainable): """Check updating parameters of circuit with list.""" original_backend = qibo.get_backend() qibo.set_backend(backend) params = [0.1, 0.2, 0.3, (0.4, 0.5), (0.6, 0.7, 0.8)] if trainable: trainable_params = list(params) else: trainable_params = [0.1, 0.3, (0.4, 0.5)] c = Circuit(3, accelerators) c.add(gates.RX(0, theta=0)) if trainable: c.add(gates.CRY(0, 1, theta=0, trainable=trainable)) else: c.add(gates.CRY(0, 1, theta=params[1], trainable=trainable)) c.add(gates.CZ(1, 2)) c.add(gates.U1(2, theta=0)) c.add(gates.CU2(0, 2, phi=0, lam=0)) if trainable: c.add(gates.U3(1, theta=0, phi=0, lam=0, trainable=trainable)) else: c.add(gates.U3(1, *params[4], trainable=trainable)) # execute once final_state = c() target_c = Circuit(3) target_c.add(gates.RX(0, theta=params[0])) target_c.add(gates.CRY(0, 1, theta=params[1])) target_c.add(gates.CZ(1, 2)) target_c.add(gates.U1(2, theta=params[2])) target_c.add(gates.CU2(0, 2, *params[3])) target_c.add(gates.U3(1, *params[4])) c.set_parameters(trainable_params) np.testing.assert_allclose(c(), target_c()) # Attempt using a flat list npparams = np.random.random(8) if trainable: trainable_params = np.copy(npparams) else: npparams[1] = params[1] npparams[5:] = params[4] trainable_params = np.delete(npparams, [1, 5, 6, 7]) target_c = Circuit(3) target_c.add(gates.RX(0, theta=npparams[0])) target_c.add(gates.CRY(0, 1, theta=npparams[1])) target_c.add(gates.CZ(1, 2)) target_c.add(gates.U1(2, theta=npparams[2])) target_c.add(gates.CU2(0, 2, *npparams[3:5])) target_c.add(gates.U3(1, *npparams[5:])) c.set_parameters(trainable_params) np.testing.assert_allclose(c(), target_c()) qibo.set_backend(original_backend)
def test_controlled_u3(backend): theta, phi, lam = 0.1, 0.1234, 0.4321 initial_state = random_state(2) c = Circuit(2) c.add(gates.U3(1, theta, phi, lam).controlled_by(0)) final_state = c(np.copy(initial_state)) assert c.queue[0].__class__.__name__ == "CU3" c = Circuit(2) c.add(gates.CU3(0, 1, theta, phi, lam)) target_state = c(np.copy(initial_state)) K.assert_allclose(final_state, target_state) # for coverage gate = gates.U3(0, theta, phi, lam) assert gate.parameters == (theta, phi, lam)
def test_controlled_u3(backend): """Check controlled U3 fall backs to CU3.""" original_backend = qibo.get_backend() qibo.set_backend(backend) theta = 0.1 phi = 0.1234 lam = 0.4321 initial_state = utils.random_numpy_state(2) c = Circuit(2) c.add(gates.U3(1, theta, phi, lam).controlled_by(0)) final_state = c(np.copy(initial_state)) assert c.queue[0].__class__.__name__ == "CU3" c = Circuit(2) c.add(gates.CU3(0, 1, theta, phi, lam)) target_state = c(np.copy(initial_state)) np.testing.assert_allclose(final_state, target_state) # for coverage gate = gates.U3(0, theta, phi, lam) assert gate.parameter == (theta, phi, lam)
def test_circuit_set_parameters_ungates(backend, accelerators): """Check updating parameters of circuit with list.""" original_backend = qibo.get_backend() qibo.set_backend(backend) c = Circuit(3, accelerators) c.add(gates.RX(0, theta=0)) c.add(gates.CRY(0, 1, theta=0)) c.add(gates.CZ(1, 2)) c.add(gates.U1(2, theta=0)) c.add(gates.CU2(0, 2, phi=0, lam=0)) c.add(gates.U3(1, theta=0, phi=0, lam=0)) # execute once final_state = c() params = [0.1, 0.2, 0.3, (0.4, 0.5), (0.6, 0.7, 0.8)] target_c = Circuit(3) target_c.add(gates.RX(0, theta=params[0])) target_c.add(gates.CRY(0, 1, theta=params[1])) target_c.add(gates.CZ(1, 2)) target_c.add(gates.U1(2, theta=params[2])) target_c.add(gates.CU2(0, 2, *params[3])) target_c.add(gates.U3(1, *params[4])) c.set_parameters(params) np.testing.assert_allclose(c(), target_c()) # Attempt using a flat list params = np.random.random(8) target_c = Circuit(3) target_c.add(gates.RX(0, theta=params[0])) target_c.add(gates.CRY(0, 1, theta=params[1])) target_c.add(gates.CZ(1, 2)) target_c.add(gates.U1(2, theta=params[2])) target_c.add(gates.CU2(0, 2, *params[3:5])) target_c.add(gates.U3(1, *params[5:])) c.set_parameters(params) np.testing.assert_allclose(c(), target_c()) qibo.set_backend(original_backend)
def test_u3(backend): theta = 0.1111 phi = 0.1234 lam = 0.4321 initial_state = random_state(1) final_state = apply_gates([gates.U3(0, theta, phi, lam)], initial_state=initial_state) cost, sint = np.cos(theta / 2), np.sin(theta / 2) ep = np.exp(1j * (phi + lam) / 2) em = np.exp(1j * (phi - lam) / 2) matrix = np.array([[ep.conj() * cost, -em.conj() * sint], [em * sint, ep * cost]]) target_state = matrix.dot(initial_state) K.assert_allclose(final_state, target_state)
def test_from_qasm_ugates(): import numpy as np target = """OPENQASM 2.0; qreg q[2]; u1(0.1) q[0]; u2(0.2,0.6) q[1]; cu3(0.3,0.4,0.5) q[0],q[1];""" c = Circuit.from_qasm(target) assert c.depth == 2 assert isinstance(c.queue[0], gates.U1) assert isinstance(c.queue[1], gates.U2) assert isinstance(c.queue[2], gates.CU3) c2 = Circuit(2) c2.add([gates.U1(0, 0.1), gates.U2(1, 0.2, 0.6)]) c2.add(gates.U3(1, 0.3, 0.4, 0.5).controlled_by(0)) np.testing.assert_allclose(c2().numpy(), c().numpy())
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_u3(backend): """Check U3 gate on random state.""" original_backend = qibo.get_backend() qibo.set_backend(backend) theta = 0.1111 phi = 0.1234 lam = 0.4321 initial_state = utils.random_numpy_state(1) c = Circuit(1) c.add(gates.U3(0, theta, phi, lam)) final_state = c(np.copy(initial_state)) cost, sint = np.cos(theta / 2), np.sin(theta / 2) ep = np.exp(1j * (phi + lam) / 2) em = np.exp(1j * (phi - lam) / 2) matrix = np.array([[ep.conj() * cost, - em.conj() * sint], [em * sint, ep * cost]]) target_state = matrix.dot(initial_state) np.testing.assert_allclose(final_state, target_state) qibo.set_backend(original_backend)