Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

qasm() don't work with gate added by squ() #4447

Open
Zhuravlev-A-E opened this issue May 14, 2020 · 6 comments
Open

qasm() don't work with gate added by squ() #4447

Zhuravlev-A-E opened this issue May 14, 2020 · 6 comments
Labels
bug Something isn't working mod: qasm2 Relating to OpenQASM 2 import or export

Comments

@Zhuravlev-A-E
Copy link

In my program (see below) I use squ() to add unitary gate into my circuit, print this circuit, run it and print result.
Then I want to print this circuit as qasm-code by using qasm() but an error is occurred, see below...
Please help me to fix this error

import numpy as np
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister, execute, version
from qiskit import BasicAer

backend = BasicAer.get_backend('unitary_simulator')

qr_squ = QuantumRegister(1)
qc_squ = QuantumCircuit(qr_squ)
sqrtx_array = np.array([[0.5 + 0.5j, 0.5 - 0.5j],
                        [0.5 - 0.5j, 0.5 + 0.5j]], dtype=np.complex)
qc_squ.squ(sqrtx_array, qr_squ[0])
print(qc_squ)
job_squ = execute(qc_squ, backend)
result_squ = job_squ.result().get_unitary(qc_squ, decimals=3)
print(f'Unitary of result is: {result_squ}')
print()
print('Call qasm() raises an error:')
print(qc_squ.qasm())
  • Qiskit Terra version: 0.14.1
  • Python version: 3.8
  • Operating system: linux mint 19.3

What is the current behavior?

     ┌─────────┐
q0_0: ┤ UNITARY   ├
     └─────────┘
Unitary of result is: [[0.5+0.5j 0.5-0.5j]
 [0.5-0.5j 0.5+0.5j]]

Call qasm() raises an error:
Traceback (most recent call last):
  File "/home/za/PycharmProjects/qiskit_env/api_qasm_error.py", line 23, in <module>
    print(qc_squ.qasm())
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/quantumcircuit.py", line 739, in qasm
    string_temp += "%s %s;\n" % (instruction.qasm(),
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/instruction.py", line 314, in qasm
    [pi_check(i, ndigits=8, output='qasm') for i in self.params]))
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/instruction.py", line 314, in <listcomp>
    [pi_check(i, ndigits=8, output='qasm') for i in self.params]))
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/tools/pi_check.py", line 134, in pi_check
    complex_inpt = complex(inpt)
TypeError: only length-1 arrays can be converted to Python scalars

Process finished with exit code 1

Steps to reproduce the problem

Run this prorgam

What is the expected behavior?

qasm() should be to return qasm-code without error

Suggested solutions

I don't know exactly but may be fix the current implementation of qasm()

@Zhuravlev-A-E Zhuravlev-A-E added the bug Something isn't working label May 14, 2020
@scottwn
Copy link
Contributor

scottwn commented May 15, 2020

Hey, I'll take a crack at this this weekend

scottwn added a commit to scottwn/qiskit-terra that referenced this issue May 15, 2020
@scottwn
Copy link
Contributor

scottwn commented May 15, 2020

@Zhuravlev-A-E does this output look right to you?

      ┌─────────┐
q0_0: ┤ UNITARY ├
      └─────────┘
Unitary of result is: [[0.5+0.5j 0.5-0.5j]
 [0.5-0.5j 0.5+0.5j]]

Call qasm() raises an error:
OPENQASM 2.0;
include "qelib1.inc";
qreg q0[1];
gate unitary4818764816 p0 {
	rz(-pi/2) p0;
	ry(-pi/2) p0;
	rz(pi/2) p0;
}
unitary4818764816 q0[0];

@Zhuravlev-A-E
Copy link
Author

Zhuravlev-A-E commented May 16, 2020 via email

@Zhuravlev-A-E
Copy link
Author

I checked the new squ.py - it issued the qasm-code and worked without errors!
Thank you very much!!!

@Zhuravlev-A-E
Copy link
Author

In addition:
Unfortunately, the same error occurs when qasm () is called for circuit with the addition of the iso() gate:

ru_8 = random_unitary(8)
circ_iso = QuantumCircuit(3)
circ_iso.iso(ru_8.data, [0, 1, 2], [])
print(circ_iso.qasm())

Traceback (most recent call last):
  File "/home/za/PycharmProjects/qiskit_env/try_unitary_to_instruction.py", line 40, in <module>
    print(circ_iso.qasm())
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/quantumcircuit.py", line 739, in qasm
    string_temp += "%s %s;\n" % (instruction.qasm(),
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/instruction.py", line 314, in qasm
    [pi_check(i, ndigits=8, output='qasm') for i in self.params]))
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/instruction.py", line 314, in <listcomp>
    [pi_check(i, ndigits=8, output='qasm') for i in self.params]))
  File "/home/za/anaconda3/envs/qiskit_env/lib/python3.8/site-packages/qiskit/circuit/tools/pi_check.py", line 134, in pi_check
    complex_inpt = complex(inpt)
TypeError: only length-1 arrays can be converted to Python scalars

@1ucian0
Copy link
Member

1ucian0 commented Sep 1, 2020

The fix suggested in #4469 changes the class hierarchy and that sparked a small discussion on the nature/location of Unitary gates. I created #5011 to follow that discussion there.

Is it possible to fix this issue without changing the class hierarchy?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working mod: qasm2 Relating to OpenQASM 2 import or export
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants