Qiskit-terra: qasm() don't work with gate added by squ()

Created on 14 May 2020  Β·  6Comments  Β·  Source: Qiskit/qiskit-terra


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

bug qasm

All 6 comments

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

@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];

Hi Scott!

Thank you very much for the answer!

I think yes, it will look quite normal.

Best regards,
Zhuravlev-A-E

сб, 16 мая 2020 г. в 07:58, Scott Wyman Neagle notifications@github.com:

@Zhuravlev-A-E https://github.com/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];

β€”
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/Qiskit/qiskit-terra/issues/4447#issuecomment-629553687,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ANGQDJL2WIJVCSOCJQI6E5LRRXJLPANCNFSM4NAMSD2A
.

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

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

The fix suggested in https://github.com/Qiskit/qiskit-terra/pull/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?

Was this page helpful?
0 / 5 - 0 ratings