Skip to content

Circuits obtained from initialize cannot be combined #433

@rraymondhp

Description

@rraymondhp

Circuits obtained by initialize cannot be combined.

Expected Behavior

Circuits generated by initialize() should behave the same with those created manually.
Circuits constructed manually can be combined with + as below:

qp = QuantumProgram()
q = qp.create_quantum_register("q", 1)
c = qp.create_classical_register("c", 1)
qc1 = qp.create_circuit("H1", [q], [c])
qc1.h(q)

qc2 = qp.create_circuit("H2", [q], [c])
qc2.x(q)
qc2.h(q)

qp.add_circuit("H1_and_H2", qc1 + qc2) 
circuit_drawer(qp.get_circuit("H1_and_H2"))

This will create a concatenated circuit as in the image below:
image

Current Behavior

The following code generates error:

qp = QuantumProgram()
q = qp.create_quantum_register("q", 1)
c = qp.create_classical_register("c", 1)
qc1Error = qp.create_circuit("H1", [q], [c])
qc1Error.initialize([1.0/np.sqrt(2), 1.0/np.sqrt(2)], [ q[0] ])

qc2Error = qp.create_circuit("H2", [q], [c])
qc2Error.initialize([1.0/np.sqrt(2), -1.0/np.sqrt(2)], [ q[0] ])

qp.add_circuit("H1_and_H2", qc1Error + qc2Error) 

Note that qc1Error and qc2Error are essentially "H" and "X H" as below:
image
image

Possible Solution

No Idea. Here is the error message:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-515dca717837> in <module>()
     10 qc2Error.initialize([1.0/np.sqrt(2), -1.0/np.sqrt(2)], [ q[0] ])
     11 
---> 12 qp.add_circuit("H1_and_H2", qc1Error + qc2Error)
     13 
     14 

~/miniconda3/envs/QISKitenv/lib/python3.6/site-packages/qiskit/_quantumcircuit.py in __add__(self, rhs)
    142     def __add__(self, rhs):
    143         """Overload + to implement self.concatenate."""
--> 144         return self.combine(rhs)
    145 
    146     def __iadd__(self, rhs):

~/miniconda3/envs/QISKitenv/lib/python3.6/site-packages/qiskit/_quantumcircuit.py in combine(self, rhs)
    114         circuit = QuantumCircuit(*combined_registers)
    115         for gate in itertools.chain(self.data, rhs.data):
--> 116             gate.reapply(circuit)
    117         return circuit
    118 

~/miniconda3/envs/QISKitenv/lib/python3.6/site-packages/qiskit/extensions/quantum_initializer/_initializer.py in reapply(self, circ)
    101     def reapply(self, circ):
    102         """Reapply this gate to the corresponding qubits in circ."""
--> 103         self._modifiers(circ.initialize(self.name, self.param, self.arg))
    104 
    105     def gates_to_uncompute(self):

TypeError: initialize() takes 3 positional arguments but 4 were given

Steps to Reproduce (for bugs)

Context

Your Environment

  • Version used:
  • Environment name and version (e.g. Python 3.6.1):
  • Operating System and version:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions