-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Open
Labels
Description
Information
- Qiskit Terra version: main @ f0492b1
- Python version: 3.6
- Operating system: osx 10.15.7
What is the current behavior?
The QuantumCircuit.{q,c}regs
attributes can be set, but doing so will not update the corresponding QuantumCircuit.{qu,cl}bits
list, leaving the the circuit in an inconsistent state. (All bits in each register attached to a circuit should also be included in that circuit). This was likely introduced as part of #4766 .
Steps to reproduce the problem
>>> qc = qk.QuantumCircuit(3,1)
>>> print(qc.qregs); print(qc.cregs); print(qc.qubits); print(qc.clbits)
[QuantumRegister(3, 'q')]
[ClassicalRegister(1, 'c')]
[
Qubit(QuantumRegister(3, 'q'), 0),
Qubit(QuantumRegister(3, 'q'), 1),
Qubit(QuantumRegister(3, 'q'), 2)
]
[Clbit(ClassicalRegister(1, 'c'), 0)]
>>> qr_foo = qk.QuantumRegister(2, 'foo')
>>> qc.add_register(qr_foo) # Adding a register via add_register correctly updates .qubits
>>> print(qc.qregs); print(qc.cregs); print(qc.qubits); print(qc.clbits)
[QuantumRegister(3, 'q'), QuantumRegister(2, 'foo')]
[ClassicalRegister(1, 'c')]
[
Qubit(QuantumRegister(3, 'q'), 0),
Qubit(QuantumRegister(3, 'q'), 1),
Qubit(QuantumRegister(3, 'q'), 2),
Qubit(QuantumRegister(2, 'foo'), 0),
Qubit(QuantumRegister(2, 'foo'), 1)
]
[Clbit(ClassicalRegister(1, 'c'), 0)]
>>> qr_bar = qk.QuantumRegister(4, 'bar')
>>> qc.qregs += [qr_bar] # Adding a register via += does not update .qubits
[QuantumRegister(3, 'q'), QuantumRegister(2, 'foo'), QuantumRegister(4, 'bar')]
[ClassicalRegister(1, 'c')]
[
Qubit(QuantumRegister(3, 'q'), 0),
Qubit(QuantumRegister(3, 'q'), 1),
Qubit(QuantumRegister(3, 'q'), 2),
Qubit(QuantumRegister(2, 'foo'), 0),
Qubit(QuantumRegister(2, 'foo'), 1)
]
[Clbit(ClassicalRegister(1, 'c'), 0)]
>>> qc.qregs = [qr_bar] # Setting the list of registers via qc.qregs = does not update .qubits
>>> print(qc.qregs); print(qc.cregs); print(qc.qubits); print(qc.clbits)
[QuantumRegister(4, 'bar')]
[ClassicalRegister(1, 'c')]
[
Qubit(QuantumRegister(3, 'q'), 0),
Qubit(QuantumRegister(3, 'q'), 1),
Qubit(QuantumRegister(3, 'q'), 2),
Qubit(QuantumRegister(2, 'foo'), 0),
Qubit(QuantumRegister(2, 'foo'), 1)
]
[Clbit(ClassicalRegister(1, 'c'), 0)]
What is the expected behavior?
Either these attributes should be make ~read-only (an @property
without a corresponding setter) or should be make to correspondingly update QuantumCircuit.{qu,cl}bits
. (Some effort was put into the latter when #6621 uncovered a failing test, and is currently WIP at #7008 ).