def test_fused_gate(): gate = gates.FusedGate(0, 1) gate.append(gates.H(0)) gate.append(gates.CNOT(0, 1)) assert len(gate.gates) == 2 gate.prepend(gates.TOFFOLI(0, 1, 2)) assert gate.qubits == (0, 1, 2) assert len(gate.gates) == 3 assert isinstance(gate.gates[0], gates.TOFFOLI)
def test_toffoli(): c = Circuit(3) c.add(gates.Y(0)) c.add(gates.TOFFOLI(0, 1, 2)) c.add(gates.X(1)) c.add(gates.TOFFOLI(0, 2, 1)) c.add(gates.Z(2)) c.add(gates.TOFFOLI(1, 2, 0)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[3]; y q[0]; ccx q[0],q[1],q[2]; x q[1]; ccx q[0],q[2],q[1]; z q[2]; ccx q[1],q[2],q[0];""" assert_strings_equal(c.to_qasm(), target)
def test_gate_types(): import collections c = Circuit(3) c.add(gates.H(0)) c.add(gates.H(1)) c.add(gates.X(2)) c.add(gates.CNOT(0, 2)) c.add(gates.CNOT(1, 2)) c.add(gates.TOFFOLI(0, 1, 2)) target_counter = collections.Counter({"h": 2, "x": 1, "cx": 2, "ccx": 1}) assert c.ngates == 6 assert c.gate_types == target_counter
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_summary(): c = Circuit(3) c.add(gates.H(0)) c.add(gates.H(1)) c.add(gates.CNOT(0, 2)) c.add(gates.CNOT(1, 2)) c.add(gates.TOFFOLI(0, 1, 2)) c.add(gates.H(2)) target_summary = "\n".join([ "Circuit depth = 5", "Total number of gates = 6", "Number of qubits = 3", "Most common gates:", "h: 3", "cx: 2", "ccx: 1" ]) assert c.summary() == target_summary
def test_gates_of_type(): c = Circuit(3) c.add(gates.H(0)) c.add(gates.H(1)) c.add(gates.CNOT(0, 2)) c.add(gates.X(1)) c.add(gates.CNOT(1, 2)) c.add(gates.TOFFOLI(0, 1, 2)) c.add(gates.H(2)) h_gates = c.gates_of_type(gates.H) cx_gates = c.gates_of_type("cx") assert h_gates == [(0, c.queue[0]), (1, c.queue[1]), (6, c.queue[6])] assert cx_gates == [(2, c.queue[2]), (4, c.queue[4])] with pytest.raises(TypeError): c.gates_of_type(5)
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_toffoli_init(): gate = gates.TOFFOLI(0, 2, 1) assert gate.target_qubits == (1,) assert gate.control_qubits == (0, 2)