Skip to content

Commit

Permalink
Merge branch 'fix/qreg-set'
Browse files Browse the repository at this point in the history
-- adding qregister unit tests in particular. But not done.
  • Loading branch information
ahelsing committed Oct 11, 2019
2 parents 923e2a2 + e867bb5 commit 3f8436b
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
17 changes: 15 additions & 2 deletions src/python/pyqgl2/qreg.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.")

Expand Down Expand Up @@ -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()
Expand Down
19 changes: 19 additions & 0 deletions test/test_qregister.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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, {})
Expand Down

0 comments on commit 3f8436b

Please sign in to comment.