From e867bb59b73d8b26fb1d85d3bedc521e3326b076 Mon Sep 17 00:00:00 2001 From: Aaron Helsinger Date: Fri, 11 Oct 2019 12:08:09 -0400 Subject: [PATCH] Working on issue #32; add some unit tests and make QReference hashable. But sets still fail --- src/python/pyqgl2/qreg.py | 17 +++++++++++++++-- test/test_qregister.py | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/python/pyqgl2/qreg.py b/src/python/pyqgl2/qreg.py index b9a7cfe..44a1075 100644 --- a/src/python/pyqgl2/qreg.py +++ b/src/python/pyqgl2/qreg.py @@ -106,7 +106,13 @@ def addArg(self, x, args): # FIXME: Print warning? pass elif isinstance(x, QReference): - self.addArg(x.ref[x.idx], args) + self.addArg(x.ref.qubits[x.idx], args) + elif isinstance(x, int): + if x not in self.qubits: + self.qubits.append(x) + else: + # duplicate - skip + pass else: raise NameError(f"Invalid QRegister constructor 'QRegister({args})'; arg {x} unknown.") @@ -206,7 +212,14 @@ def __eq__(self, other): return (self.ref == other.ref) and (self.idx == other.idx) def __len__(self): - return len(self.ref.qubits[self.idx]) + x = self.ref.qubits[self.idx] + if isinstance(x, int): + return 1 + else: + return len(x) + + def __hash__(self): + return hash(self.ref) + hash(self.idx) def use_name(self): return self.ref.use_name() diff --git a/test/test_qregister.py b/test/test_qregister.py index 7d3e72a..82668be 100644 --- a/test/test_qregister.py +++ b/test/test_qregister.py @@ -2,6 +2,7 @@ import ast from pyqgl2.qreg import QRegister, QReference +from test.helpers import channel_setup class TestQRegister(unittest.TestCase): def setUp(self): @@ -37,6 +38,24 @@ def test_qref(self): self.assertEqual(b.ref, a) self.assertEqual(b.idx, 2) + # Supplying qubit of same name/index multiple times is no-op; remove duplicates + # Can use lists and tuples too; sets don't work yet + def test_unique(self): + a = QRegister(3) + b = QRegister('q3') + c = QRegister(QRegister(a)) + d = QRegister(a,[b,a],(c,a)) + self.assertEqual(a,d) + + # QRegister from Qubit produces QRegister of same name + def test_qreg_from_qubit(self): + from QGL import QubitFactory + channel_setup() + a = QRegister(1) + bq = QubitFactory('q1') + c = QRegister((bq,)) + self.assertEqual(a, c) + def test_factory(self): node = ast.parse("a = QRegister('q1', 'q5')").body[0] a = QRegister.factory(node, {})