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_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_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 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_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_crotations(): c = Circuit(3) c.add(gates.RX(0, 0.1)) c.add(gates.RZ(1, 0.4)) c.add(gates.CRX(0, 2, 0.5)) c.add(gates.RY(1, 0.3).controlled_by(2)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[3]; rx(0.1) q[0]; rz(0.4) q[1]; crx(0.5) q[0],q[2]; cry(0.3) q[2],q[1];""" assert_strings_equal(c.to_qasm(), target) c = Circuit(2) c.add(gates.CU2(0, 1, 0.1, 0.2)) with pytest.raises(ValueError): target = c.to_qasm()
def test_controlled_u2(backend): phi = 0.1234 lam = 0.4321 c = Circuit(3) c.add([gates.X(0), gates.X(1)]) c.add(gates.U2(2, phi, lam).controlled_by(0, 1)) c.add([gates.X(0), gates.X(1)]) final_state = c() c = Circuit(3) c.add([gates.X(0), gates.X(1)]) c.add(gates.U2(2, phi, lam)) c.add([gates.X(0), gates.X(1)]) target_state = c() K.assert_allclose(final_state, target_state) # for coverage gate = gates.CU2(0, 1, phi, lam) assert gate.parameters == (phi, lam)
def test_ugates(): c = Circuit(3) c.add(gates.RX(0, 0.1)) c.add(gates.RZ(1, 0.4)) c.add(gates.U2(2, 0.5, 0.6)) c.add(gates.CU1(0, 1, 0.7)) c.add(gates.CU3(2, 1, 0.2, 0.3, 0.4)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[3]; rx(0.1) q[0]; rz(0.4) q[1]; u2(0.5, 0.6) q[2]; cu1(0.7) q[0],q[1]; cu3(0.2, 0.3, 0.4) q[2],q[1];""" assert_strings_equal(c.to_qasm(), target) c = Circuit(2) c.add(gates.CU2(0, 1, 0.1, 0.2)) with pytest.raises(ValueError): target = c.to_qasm()
def test_controlled_u2(backend): """Check controlled by U2.""" original_backend = qibo.get_backend() qibo.set_backend(backend) phi = 0.1234 lam = 0.4321 c = Circuit(3) c.add([gates.X(0), gates.X(1)]) c.add(gates.U2(2, phi, lam).controlled_by(0, 1)) c.add([gates.X(0), gates.X(1)]) final_state = c() c = Circuit(3) c.add([gates.X(0), gates.X(1)]) c.add(gates.U2(2, phi, lam)) c.add([gates.X(0), gates.X(1)]) target_state = c() np.testing.assert_allclose(final_state, target_state) # for coverage gate = gates.CU2(0, 1, phi, lam) assert gate.parameter == (phi, lam)