Skip to content

QuantumCircuit.{q,c}regs attributes can become out-of-sync with .{qu,cl}bits. #7009

@kdk

Description

@kdk

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

Suggested solutions

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions