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

Add variable-handling methods to QuantumCircuit #10962

Closed
wants to merge 3 commits into from

Conversation

jakelishman
Copy link
Member

@jakelishman jakelishman commented Oct 3, 2023

Summary

This adds all the new QuantumCircuit methods discussed in the variable-declaration RFC1, 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.

Details and comments

Depends on #10946

Close #10924

Two changelog entries are added for the semi-orthogonal changes, but the main thrust will come as with most things at the end of the epic.

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 22:23
@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 6989301087

  • 194 of 209 (92.82%) changed or added relevant lines in 10 files are covered.
  • 15 unchanged lines in 2 files lost coverage.
  • Overall coverage increased (+0.03%) to 87.091%

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 85 91 93.41%
Files with Coverage Reduction New Missed Lines %
crates/qasm2/src/lex.rs 3 91.92%
crates/qasm2/src/parse.rs 12 97.13%
Totals Coverage Status
Change from base Build 6985085373: 0.03%
Covered Lines: 60967
Relevant Lines: 70004

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

Add storage locations and methods for classical variables to QuantumCircuit
3 participants