def test_circuit_set_parameters_errors(): """Check updating parameters errors.""" c = Circuit(2) c.add(gates.RX(0, theta=0.789)) c.add(gates.RX(1, theta=0.789)) c.add(gates.fSim(0, 1, theta=0.123, phi=0.456)) with pytest.raises(KeyError): c.set_parameters({gates.RX(0, theta=1.0): 0.568}) with pytest.raises(ValueError): c.set_parameters([0.12586]) with pytest.raises(TypeError): c.set_parameters({0.3568}) with pytest.raises(ValueError): c.queue[2].parameters = [0.1234, 0.4321, 0.156]
def test_parametrizedgates_class(): from qibo.abstractions.circuit import _ParametrizedGates paramgates = _ParametrizedGates() paramgates.append(gates.RX(0, 0.1234)) paramgates.append(gates.fSim(0, 1, 0.1234, 0.4321)) assert len(paramgates.set) == 2 assert paramgates.nparams == 3
def test_circuit_set_parameters_with_list(trainable): """Check updating parameters of circuit with list.""" params = [0.123, 0.456, (0.789, 0.321)] c = Circuit(3) if trainable: c.add(gates.RX(0, theta=0, trainable=trainable)) else: c.add(gates.RX(0, theta=params[0], trainable=trainable)) c.add(gates.RY(1, theta=0)) c.add(gates.CZ(1, 2)) c.add(gates.fSim(0, 2, theta=0, phi=0)) c.add(gates.H(2)) if trainable: c.set_parameters(params) assert c.queue[0].parameters == params[0] else: c.set_parameters(params[1:]) assert c.queue[1].parameters == params[1] assert c.queue[3].parameters == params[2]
def test_cu1(): c = Circuit(2) c.add(gates.RX(0, 0.1234)) c.add(gates.RZ(1, 0.4321)) c.add(gates.CU1(0, 1, 0.567)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; rx(0.1234) q[0]; rz(0.4321) q[1]; cu1(0.567) q[0],q[1];""" assert_strings_equal(c.to_qasm(), target)
def test_controlled_by(): gate = gates.RX(0, 0.1234).controlled_by(1, 2, 3) assert gate.target_qubits == (0,) assert gate.control_qubits == (1, 2, 3) assert gate.is_controlled_by assert isinstance(gate, gates.RX) with pytest.raises(RuntimeError): gate = gates.CNOT(0, 1).controlled_by(2) gate = gates.RY(0, 0.1234) gate.nqubits = 5 with pytest.raises(RuntimeError): gate = gate.controlled_by(2)
def test_circuit_light_cone_controlled_by(): c = Circuit(4) c.add(gates.RY(2, theta=0).controlled_by(0, 1)) c.add(gates.RX(3, theta=0)) sc, qubit_map = c.light_cone(3) assert qubit_map == {3: 0} assert sc.nqubits == 1 assert len(sc.queue) == 1 assert isinstance(sc.queue[0], gates.RX) sc, qubit_map = c.light_cone(2) assert qubit_map == {0: 0, 1: 1, 2: 2} assert sc.nqubits == 3 assert len(sc.queue) == 1 assert isinstance(sc.queue[0], gates.RY)
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_get_parameters(trainable, include_not_trainable, format): import numpy as np matrix = np.random.random((2, 2)) c = Circuit(3) c.add(gates.RX(0, theta=0.123)) c.add(gates.RY(1, theta=0.456, trainable=trainable)) c.add(gates.CZ(1, 2)) c.add(gates.Unitary(matrix, 2)) c.add(gates.fSim(0, 2, theta=0.789, phi=0.987, trainable=trainable)) c.add(gates.H(2)) c.param_tensor_types = (np.ndarray, ) params = c.get_parameters(format, include_not_trainable) if trainable or include_not_trainable: target_params = { "list": [0.123, 0.456, (0.789, 0.987)], "dict": { c.queue[0]: 0.123, c.queue[1]: 0.456, c.queue[4]: (0.789, 0.987) }, "flatlist": [0.123, 0.456] } target_params["flatlist"].extend(list(matrix.ravel())) target_params["flatlist"].extend([0.789, 0.987]) else: target_params = { "list": [0.123], "dict": { c.queue[0]: 0.123 }, "flatlist": [0.123] } target_params["flatlist"].extend(list(matrix.ravel())) if format == "list": i = len(target_params["list"]) // 2 + 1 np.testing.assert_allclose(params.pop(i), matrix) elif format == "dict": np.testing.assert_allclose(params.pop(c.queue[3]), matrix) assert params == target_params[format] with pytest.raises(ValueError): c.get_parameters("test")
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()