Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support manual variables QuantumCircuit copy methods #10963

Closed
wants to merge 4 commits into from

Conversation

jakelishman
Copy link
Member

Summary

This commit adds support to the QuantumCircuit methods copy and copy_empty_like for manual variables. This involves the non-trivial extension to the original RFC1 that variables can now be uninitialised; this is somewhat required for the logic of how the Store instruction works and the existence of QuantumCircuit.copy_empty_like; a variable could be initialised with the result of a measure that no longer exists, therefore it must be possible for variables to be uninitialised.

This was not originally intended to be possible in the design document, but is somewhat required for logical consistency. A method add_uninitialized_var is added, so that the behaviour of copy_empty_like is not an awkward special case only possible through that method, but instead a complete part of the data model that must be reasoned about. The method however is deliberately a bit less ergononmic to type and to use, because really users should use add_var in almost all circumstances.

Details and comments

Depends on #10962.

Close #10959.

Footnotes

  1. https://github.com/Qiskit/RFCs/pull/50

@jakelishman jakelishman added Changelog: New Feature Include in the "Added" section of the changelog mod: circuit Related to the core of the `QuantumCircuit` class or the circuit library labels Oct 3, 2023
@jakelishman jakelishman added this to the 0.45.0 milestone Oct 3, 2023
@jakelishman jakelishman requested a review from a team as a code owner October 3, 2023 23:08
@qiskit-bot
Copy link
Collaborator

One or more of the the following people are requested to review this:

  • @Qiskit/terra-core

@coveralls
Copy link

coveralls commented Oct 3, 2023

Pull Request Test Coverage Report for Build 6989302088

  • 200 of 215 (93.02%) changed or added relevant lines in 10 files are covered.
  • 10 unchanged lines in 3 files lost coverage.
  • Overall coverage increased (+0.01%) to 87.076%

Changes Missing Coverage Covered Lines Changed/Added Lines %
qiskit/circuit/classical/types/ordering.py 18 19 94.74%
qiskit/circuit/classical/expr/constructors.py 5 7 71.43%
qiskit/circuit/store.py 33 35 94.29%
qiskit/circuit/classical/expr/expr.py 31 35 88.57%
qiskit/circuit/quantumcircuit.py 91 97 93.81%
Files with Coverage Reduction New Missed Lines %
crates/qasm2/src/expr.rs 1 93.76%
crates/qasm2/src/lex.rs 3 90.91%
crates/qasm2/src/parse.rs 6 96.67%
Totals Coverage Status
Change from base Build 6985085373: 0.01%
Covered Lines: 60962
Relevant Lines: 70010

💛 - Coveralls

This adds the representation of `expr.Var` nodes that own their own
storage locations, and consequently are not backed by existing Qiskit
objects (`Clbit` or `ClassicalRegister`).  This is the base of the
ability for Qiskit to represent manual classical-value storage in
`QuantumCircuit`, and the base for how manual storage will be
implemented.
This does not yet add the implementation of `QuantumCircuit.store`,
which will come later as part of expanding the full API of
`QuantumCircuit` to be able to support these runtime variables.

The `is_lvalue` helper is added generally to the `classical.expr` module
because it's generally useful, while `types.cast_kind` is moved from
being a private method in `expr` to a public-API function so `Store` can
use it.  These now come with associated unit tests.
This adds all the new `QuantumCircuit` methods discussed in the
variable-declaration RFC[^1], and threads the support for them through
the methods that are called in turn, such as `QuantumCircuit.append`.
It does yet not add support to methods such as `copy` or `compose`,
which will be done in a follow-up.

The APIs discussed in the RFC necessitated making `Var` nodes hashable.
This is done in this commit, as it is logically connected.  These nodes
now have enforced immutability, which is technically a minor breaking
change, but in practice required for the properties of such expressions
to be tracked correctly through circuits.

A helper attribute `Var.standalone` is added to unify the handling of
whether a variable is an old-style existing-memory wrapper, or a new
"proper" variable with its own memory.

[^1]: Qiskit/RFCs#50
This commit adds support to the `QuantumCircuit` methods `copy` and
`copy_empty_like` for manual variables.  This involves the non-trivial
extension to the original RFC[^1] that variables can now be
uninitialised; this is somewhat required for the logic of how the
`Store` instruction works and the existence of
`QuantumCircuit.copy_empty_like`; a variable could be initialised with
the result of a `measure` that no longer exists, therefore it must be
possible for variables to be uninitialised.

This was not originally intended to be possible in the design document,
but is somewhat required for logical consistency.  A method
`add_uninitialized_var` is added, so that the behaviour of
`copy_empty_like` is not an awkward special case only possible through
that method, but instead a complete part of the data model that must be
reasoned about.  The method however is deliberately a bit less
ergononmic to type and to use, because really users _should_ use
`add_var` in almost all circumstances.

[^1]: Qiskit/RFCs#50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changelog: New Feature Include in the "Added" section of the changelog mod: circuit Related to the core of the `QuantumCircuit` class or the circuit library
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support classical variables in QuantumCircuit.copy and copy_empty_like
3 participants