Register size type error (and casting when possible) (#2288)

*  not isinstance(size, int) or size <= 0

* lint

* lint

* change the strategy, cast first

* docstring

* lint
This commit is contained in:
Luciano 2019-05-04 08:51:27 -04:00 committed by Jay Gambetta
parent a59a4d6d15
commit 9612b3f66f
2 changed files with 41 additions and 13 deletions

View File

@ -36,21 +36,29 @@ class Register:
"""Create a new generic register.
"""
# validate (or cast) size
try:
size = int(size)
except Exception:
raise QiskitError("size needs to be castable to an int")
if size <= 0:
raise QiskitError("register size must be positive")
# validate (or cast) name
if name is None:
name = '%s%i' % (self.prefix, next(self.instances_counter))
if not isinstance(name, str):
raise QiskitError("The circuit name should be a string "
"(or None for autogenerate a name).")
test = re.compile('[a-z][a-zA-Z0-9_]*')
if test.match(name) is None:
raise QiskitError("%s is an invalid OPENQASM register name." % name)
else:
try:
name = str(name)
except Exception:
raise QiskitError("The circuit name should be castable to a string "
"(or None for autogenerate a name).")
name_format = re.compile('[a-z][a-zA-Z0-9_]*')
if name_format.match(name) is None:
raise QiskitError("%s is an invalid OPENQASM register name." % name)
self.name = name
self.size = size
if size <= 0:
raise QiskitError("register size must be positive")
def __repr__(self):
"""Return the official string representing the register."""
@ -106,7 +114,7 @@ class Register:
iterator: an iterator over the bits/qubits of the register, in the
form `tuple (Register, int)`.
"""
return zip([self]*self.size, range(self.size))
return zip([self] * self.size, range(self.size))
def __eq__(self, other):
"""Two Registers are the same if they are of the same type

View File

@ -19,6 +19,7 @@
import os
import tempfile
import unittest
import numpy as np
import qiskit.extensions.simulator
from qiskit import BasicAer
@ -48,6 +49,25 @@ class TestCircuitRegisters(QiskitTestCase):
self.assertEqual(cr1.size, 10)
self.assertEqual(type(cr1), ClassicalRegister)
def test_qarg_negative_size(self):
"""Test attempt to create a negative size QuantumRegister.
"""
self.assertRaises(qiskit.exceptions.QiskitError, QuantumRegister, -1)
def test_qarg_string_size(self):
"""Test attempt to create a non-integer size QuantumRegister.
"""
self.assertRaises(qiskit.exceptions.QiskitError, QuantumRegister, 'string')
def test_qarg_numpy_int_size(self):
"""Test castable to integer size QuantumRegister.
"""
np_int = np.dtype('int').type(10)
qr1 = QuantumRegister(np_int, "q")
self.assertEqual(qr1.name, "q")
self.assertEqual(qr1.size, 10)
self.assertEqual(type(qr1), QuantumRegister)
def test_negative_index(self):
"""Test indexing from the back
"""
@ -175,8 +195,8 @@ class TestCircuitRegisters(QiskitTestCase):
for i, ictl, (gate, qargs, _) in zip(range(len(qc.data)), range(0, 10, 2), qc.data):
self.assertEqual(gate.name, 'ccx')
self.assertEqual(len(qargs), 3)
self.assertIn(qargs[0][1], [ictl, ictl+1])
self.assertIn(qargs[1][1], [ictl, ictl+1])
self.assertIn(qargs[0][1], [ictl, ictl + 1])
self.assertIn(qargs[1][1], [ictl, ictl + 1])
self.assertEqual(qargs[2][1], i)
# test decrementing slice
qc = QuantumCircuit(qcontrol, qtarget)