grove icon indicating copy to clipboard operation
grove copied to clipboard

Deutsch-Josza broken for two-qubit case

Open rsln-s opened this issue 6 years ago • 1 comments

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

rsln-s avatar May 17 '18 01:05 rsln-s

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()

jorgeviegas avatar May 19 '21 23:05 jorgeviegas