grove
grove copied to clipboard
Deutsch-Josza broken for two-qubit case
The following example breaks Deutsch-Josza for two-qubit case with error:
Traceback (most recent call last):
File "./deutsch-josza.py", line 15, in <module>
is_constant = dj.is_constant(qvm,qubit_bitmap)
File "/Users/ruslan/anaconda3/envs/pyquil/lib/python3.6/site-packages/grove/deutsch_jozsa/deutsch_jozsa.py", line 59, in is_constant
constant = all([bit == 0 for bit in bitstring])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Code producing the error:
import numpy as np
import pyquil.api as api
import pyquil.quil as pq
from pyquil.gates import X, H, CNOT
from grove.deutsch_jozsa.deutsch_jozsa import DeutschJosza, ORACLE_GATE_NAME
qvm = api.QVMConnection()
qubit_bitmap = {"00": "1", "01" : "1", "10" : "1", "11": "1"}
dj = DeutschJosza()
is_constant = dj.is_constant(qvm,qubit_bitmap)
print(is_constant)
Is fixable by changing the offending line to:
constant = all([bit == 0 for bit in bitstring][0])
but I'm not sure if that's the most elegant solution.
You might also want to consider adding it to tests (they lack working 2-qubit mapping examples, only the ones that are invalid).
See also PR #146
Hey @amyfbrown
Was there a fix for this? I'm unable to make DJ algorithm run for 1+ qubit.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-459d38310220> in <module>
19
20 dj = DeutschJosza()
---> 21 is_constant = dj.is_constant(qvm,qubit_bitmap)
22 print(is_constant)
~/opt/anaconda3/envs/QUANTUM/lib/python3.9/site-packages/grove/deutsch_jozsa/deutsch_jozsa.py in is_constant(self, cxn, bitstring_map)
57 # We are only running a single shot, so we are only interested in the first element.
58 bitstring = np.array(returned_bitstring, dtype=int)
---> 59 constant = all([bit == 0 for bit in bitstring])
60 return constant
61
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()