Qiskit / qiskit

Qiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
https://www.ibm.com/quantum/qiskit
Apache License 2.0
5.1k stars 2.34k forks source link

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

Open Zhuravlev-A-E opened 4 years ago

Zhuravlev-A-E commented 4 years ago

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

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

scottwn commented 4 years ago

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

scottwn commented 4 years ago

@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 commented 4 years ago

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 .

Zhuravlev-A-E commented 4 years ago

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

Zhuravlev-A-E commented 4 years ago

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 commented 4 years ago

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?