def test_circuit_light_cone(): from qibo import __version__ nqubits = 10 c = Circuit(nqubits) c.add(gates.RY(i, theta=0) for i in range(nqubits)) c.add(gates.CZ(i, i + 1) for i in range(0, nqubits - 1, 2)) c.add(gates.RY(i, theta=0) for i in range(nqubits)) c.add(gates.CZ(i, i + 1) for i in range(1, nqubits - 1, 2)) c.add(gates.CZ(0, nqubits - 1)) sc, qubit_map = c.light_cone(4, 5) target_qasm = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[6]; ry(0) q[0]; ry(0) q[1]; ry(0) q[2]; ry(0) q[3]; ry(0) q[4]; ry(0) q[5]; cz q[0],q[1]; cz q[2],q[3]; cz q[4],q[5]; ry(0) q[1]; ry(0) q[2]; ry(0) q[3]; ry(0) q[4]; cz q[1],q[2]; cz q[3],q[4];""" assert qubit_map == {2: 0, 3: 1, 4: 2, 5: 3, 6: 4, 7: 5} assert sc.to_qasm() == target_qasm
def test_cnot_and_cz_init(): gate = gates.CNOT(0, 1) assert gate.target_qubits == (1,) assert gate.control_qubits == (0,) gate = gates.CZ(3, 2) assert gate.target_qubits == (2,) assert gate.control_qubits == (3,)
def test_circuit_set_parameters_with_dictionary(trainable): """Check updating parameters of circuit with list.""" params = [0.123, 0.456, 0.789] c1 = Circuit(3) c1.add(gates.X(0)) c1.add(gates.X(2)) if trainable: c1.add(gates.U1(0, theta=0, trainable=trainable)) else: c1.add(gates.U1(0, theta=params[0], trainable=trainable)) c2 = Circuit(3) c2.add(gates.RZ(1, theta=0)) c2.add(gates.CZ(1, 2)) c2.add(gates.CU1(0, 2, theta=0)) c2.add(gates.H(2)) c = c1 + c2 if trainable: params_dict = {c.queue[i]: p for i, p in zip([2, 3, 5], params)} c.set_parameters(params_dict) assert c.queue[2].parameters == params[0] else: params_dict = {c.queue[3]: params[1], c.queue[5]: params[2]} c.set_parameters(params_dict) assert c.queue[3].parameters == params[1] assert c.queue[5].parameters == params[2] # test not passing all parametrized gates c.set_parameters({c.queue[5]: 0.7891}) if trainable: assert c.queue[2].parameters == params[0] assert c.queue[3].parameters == params[1] assert c.queue[5].parameters == 0.7891
def test_circuit_on_qubits(): c = Circuit(3) c.add([gates.H(0), gates.X(1), gates.Y(2)]) c.add([gates.CNOT(0, 1), gates.CZ(1, 2)]) c.add(gates.H(1).controlled_by(0, 2)) new_gates = list(c.on_qubits(2, 5, 4)) assert new_gates[0].target_qubits == (2, ) assert new_gates[1].target_qubits == (5, ) assert new_gates[2].target_qubits == (4, ) assert new_gates[3].target_qubits == (5, ) assert new_gates[3].control_qubits == (2, ) assert new_gates[4].target_qubits == (4, ) assert new_gates[4].control_qubits == (5, ) assert new_gates[5].target_qubits == (5, ) assert new_gates[5].control_qubits == (2, 4)
def test_circuit_invert(measurements): c = Circuit(3) gatelist = [gates.H(0), gates.X(1), gates.Y(2), gates.CNOT(0, 1), gates.CZ(1, 2)] c.add(gatelist) if measurements: c.add(gates.M(0, 2)) invc = c.invert() for g1, g2 in zip(invc.queue, gatelist[::-1]): g2 = g2.dagger() assert isinstance(g1, g2.__class__) assert g1.target_qubits == g2.target_qubits assert g1.control_qubits == g2.control_qubits if measurements: assert invc.measurement_gate.target_qubits == (0, 2) assert invc.measurement_tuples == {"register0": (0, 2)}
def test_circuit_decompose(measurements): c = Circuit(4) c.add([gates.H(0), gates.X(1), gates.Y(2)]) c.add([gates.CZ(0, 1), gates.CNOT(2, 3), gates.TOFFOLI(0, 1, 3)]) if measurements: c.add(gates.M(0, 2)) decompc = c.decompose() dgates = [] for gate in c.queue: dgates.extend(gate.decompose()) for g1, g2 in zip(decompc.queue, dgates): assert isinstance(g1, g2.__class__) assert g1.target_qubits == g2.target_qubits assert g1.control_qubits == g2.control_qubits if measurements: assert decompc.measurement_gate.target_qubits == (0, 2) assert decompc.measurement_tuples == {"register0": (0, 2)}
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_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_fused_gate(): gate = gates.FusedGate(0, 1) gate.add(gates.H(0)) gate.add(gates.CNOT(0, 1)) with pytest.raises(ValueError): gate.add(gates.CZ(1, 2))