-
Notifications
You must be signed in to change notification settings - Fork 6
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
feat: Support encoding float and sympy ops #618
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #618 +/- ##
==========================================
- Coverage 82.63% 82.13% -0.50%
==========================================
Files 48 48
Lines 6496 6550 +54
Branches 6496 6550 +54
==========================================
+ Hits 5368 5380 +12
- Misses 770 812 +42
Partials 358 358
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
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!
if let Some(s) = optype | ||
.cast::<RotationOp>() | ||
.and_then(|op| self.encode_rotation_op(&op, inputs.as_slice())) | ||
{ | ||
s | ||
} else if let Some(s) = optype | ||
.cast::<FloatOps>() | ||
.and_then(|op| self.encode_float_op(&op, inputs.as_slice())) | ||
{ | ||
s | ||
} else if let Some(s) = optype | ||
.cast::<SympyOp>() | ||
.and_then(|op| self.encode_sympy_op(&op, inputs.as_slice())) | ||
{ | ||
s | ||
} else { | ||
return Ok(false); | ||
} |
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.
Any way this could be some sort of match
statement on the optype type instead of trying each out?
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.
Each cast has a different type, so all options I tried for writing this look messy (matching on a tuple, chaining Option::or_else, ...).
## 🤖 New release * `tket2`: 0.4.0 -> 0.5.0 (⚠️ API breaking changes) * `tket2-hseries`: 0.4.0 -> 0.5.0 (⚠️ API breaking changes) ###⚠️ `tket2` breaking changes ``` --- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] --- Description: A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile. ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.35.0/src/lints/enum_marked_non_exhaustive.ron Failed in: enum InvalidPatternMatch in /tmp/.tmp7zsbCi/tket2/tket2/src/portmatching/matcher.rs:376 enum MatcherSerialisationError in /tmp/.tmp7zsbCi/tket2/tket2/src/portmatching/matcher.rs:401 enum CircuitError in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:458 enum CircuitError in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:458 enum RewriterSerialisationError in /tmp/.tmp7zsbCi/tket2/tket2/src/rewrite/ecc_rewriter.rs:209 enum PullForwardError in /tmp/.tmp7zsbCi/tket2/tket2/src/passes/commutation.rs:187 enum CircuitLoadError in /tmp/.tmp7zsbCi/tket2/tket2/src/serialize/guppy.rs:114 enum CircuitLoadError in /tmp/.tmp7zsbCi/tket2/tket2/src/serialize/guppy.rs:114 enum CircuitMutError in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:495 enum CircuitMutError in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:495 --- failure enum_tuple_variant_changed_kind: An enum tuple variant changed kind --- Description: A public enum's exhaustive tuple variant has changed to a different kind of enum variant, breaking possible instantiations and patterns. ref: https://doc.rust-lang.org/reference/items/enumerations.html impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.35.0/src/lints/enum_tuple_variant_changed_kind.ron Failed in: variant PullForwardError::NoQbInCommand in /tmp/.tmp7zsbCi/tket2/tket2/src/passes/commutation.rs:194 variant PullForwardError::NoCommandForQb in /tmp/.tmp7zsbCi/tket2/tket2/src/passes/commutation.rs:200 variant CircuitMutError::DeleteNonEmptyWire in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:504 variant CircuitMutError::InvalidPortOffset in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:512 variant CircuitMutError::DeleteNonEmptyWire in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:504 variant CircuitMutError::InvalidPortOffset in /tmp/.tmp7zsbCi/tket2/tket2/src/circuit.rs:512 ``` ###⚠️ `tket2-hseries` breaking changes ``` --- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] --- Description: A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile. ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.35.0/src/lints/enum_marked_non_exhaustive.ron Failed in: enum HSeriesPassError in /tmp/.tmp7zsbCi/tket2/tket2-hseries/src/lib.rs:38 enum LazifyMeasurePassError in /tmp/.tmp7zsbCi/tket2/tket2-hseries/src/lazify_measure.rs:45 enum LowerTk2Error in /tmp/.tmp7zsbCi/tket2/tket2-hseries/src/extension/hseries/lower.rs:41 --- failure enum_tuple_variant_changed_kind: An enum tuple variant changed kind --- Description: A public enum's exhaustive tuple variant has changed to a different kind of enum variant, breaking possible instantiations and patterns. ref: https://doc.rust-lang.org/reference/items/enumerations.html impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.35.0/src/lints/enum_tuple_variant_changed_kind.ron Failed in: variant LowerTk2Error::Unlowered in /tmp/.tmp7zsbCi/tket2/tket2-hseries/src/extension/hseries/lower.rs:57 ``` <details><summary><i><b>Changelog</b></i></summary><p> ## `tket2` <blockquote> ## [0.5.0](tket2-v0.4.0...tket2-v0.5.0) - 2024-09-30 ### Bug Fixes - Support hugr packages, fix the notebooks ([#622](#622)) ### New Features - Add an explicit struct for the tket2 sympy op ([#616](#616)) - Support encoding float and sympy ops ([#618](#618)) </blockquote> ## `tket2-hseries` <blockquote> ## [0.4.0](tket2-hseries-v0.3.0...tket2-hseries-v0.4.0) - 2024-09-16 ### New Features - [**breaking**] `HSeriesPass` lowers `Tk2Op`s into `HSeriesOp`s ([#602](#602)) - [**breaking**] simplify angle extension in to a half turns rotation type ([#611](#611)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/MarcoIeni/release-plz/).
🤖 I have created a release *beep* *boop* --- ## [0.4.0](tket2-py-v0.3.0...tket2-py-v0.4.0) (2024-10-01) ### ⚠ BREAKING CHANGES * Made all errors `non_exhaustive`, and renamed some fields for clarity. * "tket2.angle" extension replaced with "tket2.rotation" extension with rotation type and simplified set of operations. * TryFrom implementations for extension op structs removed, use `cast` ### Features * `BadgerOptimiser.load_precompiled`, `BadgerOptimiser.compile_eccs` and `passes.badger_pass` now take an optional `cost_fn` parameter to specify the cost function to minimise. Supported values are `'cx'` (default behaviour) and `'rz'`. ([83ebfcb](83ebfcb)) * simplify angle extension in to a half turns rotation type ([#611](#611)) ([0723937](0723937)) * Support encoding float and sympy ops ([#618](#618)) ([74dcbf7](74dcbf7)) * **tket2-hseries:** cli extension dumping ([#584](#584)) ([abf292f](abf292f)) ### Bug Fixes * remove TryFrom for extension ops use `cast` ([#592](#592)) ([5ca29af](5ca29af)) * Support hugr packages, fix the notebooks ([#622](#622)) ([1cf9dcb](1cf9dcb)) ### Documentation * Add tket2-py module docstring ([#539](#539)) ([8ef7a57](8ef7a57)) ### Miscellaneous Chores * Replace thiserror with derive_more 1.0 ([#624](#624)) ([2250ce7](2250ce7)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: Agustín Borgna <[email protected]> Co-authored-by: Agustín Borgna <[email protected]>
So we can encode circuits that either encode sympy expressions, or use the float extension to manipulate the rotations.
Note that this does not yet support
RotationOps::from_halfturns
, since that returns anOption<Rotation>
since unwrapping that requires control flow operations, so the parameter encoder would need to do constant propagation with parameters across control flow...drive-by: Mention that
RotationOps::from_halfturns
is fallible in its description. This required a non-breaking update to the extension'sjson
definition.