def test_gates_commute(): assert gates.H(0).commutes(gates.X(1)) assert gates.H(0).commutes(gates.H(1)) assert gates.H(0).commutes(gates.H(0)) assert not gates.H(0).commutes(gates.Y(0)) assert not gates.CNOT(0, 1).commutes(gates.SWAP(1, 2)) assert not gates.CNOT(0, 1).commutes(gates.H(1)) assert not gates.CNOT(0, 1).commutes(gates.Y(0).controlled_by(2)) assert not gates.CNOT(2, 3).commutes(gates.CNOT(3, 0)) assert gates.CNOT(0, 1).commutes(gates.Y(2).controlled_by(0))
def test_singlequbit_gates(): c = Circuit(2) c.add(gates.H(0)) c.add(gates.X(1)) c.add(gates.Y(0)) c.add(gates.Z(1)) c.add(gates.S(0)) c.add(gates.SDG(1)) c.add(gates.T(0)) c.add(gates.TDG(1)) c.add(gates.I(0)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; h q[0]; x q[1]; y q[0]; z q[1]; s q[0]; sdg q[1]; t q[0]; tdg q[1]; id q[0];""" assert_strings_equal(c.to_qasm(), target)
def test_controlled_by_error(): """Check that using `to_qasm` with controlled by gates raises error.""" c = Circuit(3) c.add(gates.H(0)) c.add(gates.Y(1).controlled_by(0, 2)) with pytest.raises(ValueError): c.to_qasm()
def test_queue_class(): from qibo.abstractions.circuit import _Queue queue = _Queue(4) gatelist = [gates.H(0), gates.H(1), gates.X(0), gates.H(2), gates.CNOT(1, 2), gates.Y(3)] for g in gatelist: queue.append(g) assert queue.moments == [[gatelist[0], gatelist[1], gatelist[3], gatelist[5]], [gatelist[2], gatelist[4], gatelist[4], None]]
def test_parametrized_gate(): c = Circuit(2) c.add(gates.Y(0)) c.add(gates.RY(1, 0.1234)) target = f"""// Generated by QIBO {__version__} OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; y q[0]; ry(0.1234) q[1];""" assert_strings_equal(c.to_qasm(), target)
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_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_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)