def test_measurement_add(): gate = gates.M(0, 2) assert gate.target_qubits == (0, 2) assert gate.bitflip_map == 2 * ({0: 0, 2: 0},) gate.add(gates.M(1, 3, p0=0.3, p1=0.0)) assert gate.target_qubits == (0, 2, 1, 3) assert gate.bitflip_map == ({0: 0, 1: 0.3, 2: 0, 3: 0.3}, {0: 0, 1: 0, 2: 0, 3: 0})
def test_circuit_copy_with_measurements(): c1 = Circuit(4) c1.add([gates.H(0), gates.H(3), gates.CNOT(0, 2)]) c1.add(gates.M(0, 1, register_name="a")) c1.add(gates.M(3, register_name="b")) c2 = c1.copy() assert c2.measurement_gate is c1.measurement_gate assert c2.measurement_tuples == {"a": (0, 1), "b": (3, )}
def test_add_measurement(): c = Circuit(5) g1 = gates.M(0, 2, register_name="a") g2 = gates.M(3, register_name="b") c.add([g1, g2]) assert c.measurement_gate is g1 assert c.measurement_tuples == {"a": (0, 2), "b": (3, )} assert g1.target_qubits == (0, 2, 3) assert g2.target_qubits == (3, ) with pytest.raises(KeyError): c.add(gates.M(4, register_name="b"))
def test_circuit_draw_line_wrap(): """Test circuit text draw with line wrap.""" ref_line_wrap_50 = \ 'q0: ─H─U1─U1─U1─U1───────────────────────────x───I───f ...\n' \ 'q1: ───o──|──|──|──H─U1─U1─U1────────────────|─x─I───| ...\n' \ 'q2: ──────o──|──|────o──|──|──H─U1─U1────────|─|─────| ...\n' \ 'q3: ─────────o──|───────o──|────o──|──H─U1───|─x───M─| ...\n' \ 'q4: ────────────o──────────o───────o────o──H─x───────f ...\n' \ '\n' \ 'q0: ... ─o────gf───M─\n' \ 'q1: ... ─U3───|──o─M─\n' \ 'q2: ... ────X─gf─o─M─\n' \ 'q3: ... ────o────o───\n' \ 'q4: ... ────o────X───' ref_line_wrap_30 = \ 'q0: ─H─U1─U1─U1─U1──────────────── ...\n' \ 'q1: ───o──|──|──|──H─U1─U1─U1───── ...\n' \ 'q2: ──────o──|──|────o──|──|──H─U1 ...\n' \ 'q3: ─────────o──|───────o──|────o─ ...\n' \ 'q4: ────────────o──────────o────── ...\n' \ '\n' \ 'q0: ... ───────────x───I───f─o────gf── ...\n' \ 'q1: ... ───────────|─x─I───|─U3───|──o ...\n' \ 'q2: ... ─U1────────|─|─────|────X─gf─o ...\n' \ 'q3: ... ─|──H─U1───|─x───M─|────o────o ...\n' \ 'q4: ... ─o────o──H─x───────f────o────X ...\n' \ '\n' \ 'q0: ... ─M─\n' \ 'q1: ... ─M─\n' \ 'q2: ... ─M─\n' \ 'q3: ... ───\n' \ 'q4: ... ───' import numpy as np circuit = Circuit(5) for i1 in range(5): circuit.add(gates.H(i1)) for i2 in range(i1 + 1, 5): circuit.add(gates.CU1(i2, i1, theta=0)) circuit.add(gates.SWAP(0, 4)) circuit.add(gates.SWAP(1, 3)) circuit.add(gates.I(*range(2))) circuit.add(gates.M(3, collapse=True)) circuit.add(gates.fSim(0, 4, 0, 0)) circuit.add(gates.CU3(0, 1, 0, 0, 0)) circuit.add(gates.TOFFOLI(4, 3, 2)) circuit.add(gates.GeneralizedfSim(0, 2, np.eye(2), 0)) circuit.add(gates.X(4).controlled_by(1, 2, 3)) circuit.add(gates.M(*range(3))) assert circuit.draw(line_wrap=50) == ref_line_wrap_50 assert circuit.draw(line_wrap=30) == ref_line_wrap_30
def test_measurement_init(targets, p0, p1): # also tests `_get_bitflip_map` gate = gates.M(*targets, p0=p0, p1=p1) assert gate.target_qubits == targets p0map = {q: 0 if p0 is None else p0 for q in targets} p1map = {q: 0 if p1 is None else p1 for q in targets} assert gate.bitflip_map == (p0map, p1map)
def test_multiple_measurements(): c = Circuit(5) c.add(gates.M(0, 2, 4, register_name="a")) c.add(gates.M(1, 3, register_name="b")) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[5]; creg a[3]; creg b[2]; measure q[0] -> a[0]; measure q[2] -> a[1]; measure q[4] -> a[2]; measure q[1] -> b[0]; measure q[3] -> b[1];""" assert_strings_equal(c.to_qasm(), target)
def test_circuit_addition(measurements): c1 = Circuit(2) g1, g2 = gates.H(0), gates.CNOT(0, 1) c1.add(g1) c1.add(g2) if measurements: c1.add(gates.M(0, register_name="a")) c2 = Circuit(2) g3 = gates.H(1) c2.add(g3) if measurements: c2.add(gates.M(1, register_name="b")) c3 = c1 + c2 assert c3.depth == 3 assert list(c3.queue) == [g1, g2, g3] if measurements: assert c3.measurement_tuples == {"a": (0, ), "b": (1, )} assert c3.measurement_gate.target_qubits == (0, 1)
def test_measurements(): c = Circuit(2) c.add(gates.X(0)) c.add(gates.Y(1)) c.add(gates.M(0, 1)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg register0[2]; x q[0]; y q[1]; measure q[0] -> register0[0]; measure q[1] -> register0[1];""" assert_strings_equal(c.to_qasm(), target)
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_with_noise(measurements, noise_map): c = Circuit(2) c.add([gates.H(0), gates.H(1), gates.CNOT(0, 1)]) if measurements: c.add(gates.M(0, 1)) noisyc = c.with_noise(noise_map) if not isinstance(noise_map, dict): noise_map = {0: noise_map, 1: noise_map} targetc = Circuit(2) targetc.add(gates.H(0)) targetc.add(gates.PauliNoiseChannel(0, *noise_map[0])) targetc.add(gates.H(1)) targetc.add(gates.PauliNoiseChannel(1, *noise_map[1])) targetc.add(gates.CNOT(0, 1)) targetc.add(gates.PauliNoiseChannel(0, *noise_map[0])) targetc.add(gates.PauliNoiseChannel(1, *noise_map[1])) for g1, g2 in zip(noisyc.queue, targetc.queue): assert isinstance(g1, g2.__class__) assert g1.target_qubits == g2.target_qubits assert g1.control_qubits == g2.control_qubits if measurements: assert noisyc.measurement_gate.target_qubits == (0, 1) assert noisyc.measurement_tuples == {"register0": (0, 1)}
def test_measurement_errors(): gate = gates.M(0) with pytest.raises(NotImplementedError): gate.controlled_by(1)
def test_capital_in_register_name_error(): """Check that using capital letter in register name raises error.""" c = Circuit(2) c.add(gates.M(0, 1, register_name="Abc")) with pytest.raises(NameError): c.to_qasm()