From 7ef9f4fe5b85c9d284452a5a2e956460594e8690 Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Tue, 25 Apr 2017 18:01:58 -0700 Subject: [PATCH 1/3] Support Qureg.__int__ for multiple bits (little-endian) --- projectq/types/_qubit.py | 6 +----- projectq/types/_qubit_test.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/projectq/types/_qubit.py b/projectq/types/_qubit.py index fe93357ba..1a391dcf6 100755 --- a/projectq/types/_qubit.py +++ b/projectq/types/_qubit.py @@ -187,11 +187,7 @@ def __int__(self): Exception if more than 1 qubit resides in this register (then you need to specify which value to get using qureg[???]) """ - if len(self) == 1: - return int(self[0]) - else: - raise Exception("__int__(qureg): Quantum register contains more " - "than 1 qubit. Use __bool__(qureg[idx]) instead.") + return sum(1 << i if bool(self[i]) else 0 for i in range(len(self))) def __nonzero__(self): """ diff --git a/projectq/types/_qubit_test.py b/projectq/types/_qubit_test.py index e32dca79f..a70d48fd9 100755 --- a/projectq/types/_qubit_test.py +++ b/projectq/types/_qubit_test.py @@ -154,6 +154,32 @@ def test_qureg_measure_if_qubit(): assert qureg1.__nonzero__() +def test_qureg_measure_multi_qubit_int(): + eng = MainEngine(backend=DummyEngine(), engine_list=[DummyEngine()]) + a = eng.allocate_qureg(4) + + eng.set_measurement_result(a[3], False) + eng.set_measurement_result(a[2], True) + eng.set_measurement_result(a[1], False) + eng.set_measurement_result(a[0], True) + assert int(a) == 0b0101 + assert int(_qubit.Qureg(reversed(a))) == 0b1010 + assert int(_qubit.Qureg([a[0], a[2], a[1], a[3]])) == 0b0011 + assert int(_qubit.Qureg([a[0], a[1]])) == 0b01 + + eng.set_measurement_result(a[3], True) + eng.set_measurement_result(a[2], True) + eng.set_measurement_result(a[1], True) + eng.set_measurement_result(a[0], True) + assert int(a) == 15 + + eng.set_measurement_result(a[3], False) + eng.set_measurement_result(a[2], False) + eng.set_measurement_result(a[1], False) + eng.set_measurement_result(a[0], True) + assert int(a) == 1 + + def test_qureg_measure_exception(): eng = MainEngine(backend=DummyEngine(), engine_list=[DummyEngine()]) qureg = _qubit.Qureg() From c0dbbf05f9ff5b6a299df467a70a742367fc5dee Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Tue, 25 Apr 2017 18:11:45 -0700 Subject: [PATCH 2/3] empty case --- projectq/types/_qubit_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projectq/types/_qubit_test.py b/projectq/types/_qubit_test.py index a70d48fd9..0237c9d94 100755 --- a/projectq/types/_qubit_test.py +++ b/projectq/types/_qubit_test.py @@ -158,6 +158,8 @@ def test_qureg_measure_multi_qubit_int(): eng = MainEngine(backend=DummyEngine(), engine_list=[DummyEngine()]) a = eng.allocate_qureg(4) + assert int(_qubit.Qureg([])) == 0 + eng.set_measurement_result(a[3], False) eng.set_measurement_result(a[2], True) eng.set_measurement_result(a[1], False) From c518203f93e2fa2f5461db56d581292cdf3e137b Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Tue, 25 Apr 2017 18:15:09 -0700 Subject: [PATCH 3/3] doc --- projectq/types/_qubit.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/projectq/types/_qubit.py b/projectq/types/_qubit.py index 1a391dcf6..a1d67b837 100755 --- a/projectq/types/_qubit.py +++ b/projectq/types/_qubit.py @@ -181,11 +181,10 @@ def __bool__(self): def __int__(self): """ - Return measured value if Qureg consists of 1 qubit only. + Return the measured little-endian integer in the quregister. Raises: - Exception if more than 1 qubit resides in this register (then you - need to specify which value to get using qureg[???]) + NotYetMeasuredError if any of the qubits isn't measured. """ return sum(1 << i if bool(self[i]) else 0 for i in range(len(self)))