-
Notifications
You must be signed in to change notification settings - Fork 2.4k
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
Fix QPY serialisation of ControlledGate with open controls #8571
Fix QPY serialisation of ControlledGate with open controls #8571
Conversation
Previously, an incorrect definition and name would be re-instated on QPY deserialisation of a `ControlledGate` instance with open controls. The base name would include the dynamic `_o{ctrl_state}` suffix, causing the suffix to later be duplicated, and the definition would duplicate the logic that added the open controls. This fixes both by stripping the suffix on re-read before it is assigned, and serialising only the "11...1" state definition, since this is what is required and stored by `ControlledGate`.
Thank you for opening a new pull request. Before your PR can be merged it will first need to pass continuous integration tests and be reviewed. Sometimes the review process can be slow, so please be patient. While you're waiting, please feel free to review other open PRs. While only a subset of people are authorized to approve pull requests for merging, everyone is encouraged to review open pull requests. Doing reviews helps reduce the burden on the core team and helps make the project's code better for everyone. One or more of the the following people are requested to review this:
|
Pull Request Test Coverage Report for Build 2882009479
💛 - Coveralls |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, do you want to add a backwards compat test for this case too? I'm thinking it might be a good idea since the upgrade path on this seems a bit nuanced so we probably don't want it to regress moving forward.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, the backwards compatibility test sounds good - added in this commit. There's already a test of ctrl_state=0
, but unfortunately it's on a CX gate, which doesn't have the same issues because it's a known gate.
@@ -525,6 +549,8 @@ def generate_circuits(version_str=None): | |||
output_circuits["controlled_gates.qpy"] = generate_controlled_gates() | |||
output_circuits["schedule_blocks.qpy"] = generate_schedule_blocks() | |||
output_circuits["pulse_gates.qpy"] = generate_calibrated_circuits() | |||
if version_parts >= (0, 21, 2): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've made this 0.21.2 assuming we might throw this in the backports, but if we're leaving it for 0.22.0, feel free to just modify this line.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that's fine I probably would have just done > (0.21.1)
to cover either case but this works fine as I was intending to tag this as stable backport potential
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for adding the backwards compat test
* Fix QPY serialisation of ControlledGate with open controls Previously, an incorrect definition and name would be re-instated on QPY deserialisation of a `ControlledGate` instance with open controls. The base name would include the dynamic `_o{ctrl_state}` suffix, causing the suffix to later be duplicated, and the definition would duplicate the logic that added the open controls. This fixes both by stripping the suffix on re-read before it is assigned, and serialising only the "11...1" state definition, since this is what is required and stored by `ControlledGate`. * Add QPY backwards compatibility test Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit a0964c1)
…8578) * Fix QPY serialisation of ControlledGate with open controls Previously, an incorrect definition and name would be re-instated on QPY deserialisation of a `ControlledGate` instance with open controls. The base name would include the dynamic `_o{ctrl_state}` suffix, causing the suffix to later be duplicated, and the definition would duplicate the logic that added the open controls. This fixes both by stripping the suffix on re-read before it is assigned, and serialising only the "11...1" state definition, since this is what is required and stored by `ControlledGate`. * Add QPY backwards compatibility test Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit a0964c1) Co-authored-by: Jake Lishman <jake.lishman@ibm.com>
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In Qiskit#8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes Qiskit#8794
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In Qiskit#8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes Qiskit#8794
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In #8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes #8794 Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In #8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes #8794 Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit 3fb8939)
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In Qiskit#8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes Qiskit#8794 Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit fixes a bug in the QPY serialization of ControlledGate subclasses that defined custom _define() methods. The _define() method is the typical way to provide a custom definition in Gate classes. While ControlledGate class provides an alternative interface that handles custom control states at initialization, but the _define() interface is still valid even if it doesn't account for this. In #8571 we updated the QPY serialization code to use the _definition() method directly to correctly handle the open control case. But this fix neglected the case where people were providing definitions via the mechanism from Gate. This commit fixes this assumption by ensuring we load the definition that comes from _define() which will fix the serialization of these custom subclasses. Fixes #8794 Co-authored-by: Jake Lishman <jake.lishman@ibm.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> (cherry picked from commit 3fb8939) Co-authored-by: Matthew Treinish <mtreinish@kortar.org> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Summary
Previously, an incorrect definition and name would be re-instated on
QPY deserialisation of a
ControlledGate
instance with open controls.The base name would include the dynamic
_o{ctrl_state}
suffix, causingthe suffix to later be duplicated, and the definition would duplicate
the logic that added the open controls. This fixes both by stripping
the suffix on re-read before it is assigned, and serialising only the
"11...1" state definition, since this is what is required and stored by
ControlledGate
.Details and comments
Fix #8549.
This is technically a breaking change in the behaviour of QPY (it changes how something is serialised and deserialised), but it is not a format change. A file created with the previous serialisation behaviour will still load with this new logic, and an older Qiskit will be able to deserialise a circuit dumped with this logic, but in both cases, a
ControlledGate
with open controls will not be restored to the expected name/definition. There will be no exception, it'll just produce the wrong result, as it did before this patch.