Skip to content

feat: Introduce new enum for constant folding; deprecate Value::Function #2060

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

Draft
wants to merge 28 commits into
base: release-rs-v0.16.0
Choose a base branch
from

Conversation

acl-cqc
Copy link
Contributor

@acl-cqc acl-cqc commented Apr 4, 2025

We've been using ops::Value for constant-folding, which is a bit of a shortcut but leads to significant problems: the result of LoadFunction cannot fit into a Value (you'd need to copy all other external functions used by the loaded one inside it, or something - not really practical, and you've lost the understanding that you were calling another function in the same Hugr, too). #2059 solved this inside dataflow analysis, but this extends the approach to constant folding, by allowing to feeding "function pointers" (from LoadFunction) into constant-folding.

The "solution" of extending Value to allow a reference to a node in the containing Hugr was considered in #1856 and was roundly rejected. Instead, this PR adds a separate enum FoldVal that looks quite similar to Value but adds those references/function-pointers.

I've taken the liberty of not including nested Hugrs in FoldVal, but rather deprecating Value::Function in favour of getting front-ends to lift these into their own FuncDefn's in the Hugr. I could be persuaded not to, and add a nested-Hugr variant to FoldVal, if we really want, but it does seem like probably more effort than it's worth - does anyone really have a good use case for Value::Function ?

I've also deprecated the old constant_fold and fold routines in favour of the new ones, which are currently called fold2. Better naming suggestions are welcome....(an alternative might be to define a new version of the ConstantFolder trait with only the new method, make OpDef store one of those, deprecate the old trait, and then impl<T:ConstantFolder> NewConstantFolder for T ?)

NOTE/TODO: implementing the deprecated fn fold does not trigger a deprecation warning (!), only calling it

Also note: this is not intended to be part of the v0.16.0 release; it can be a non-breaking followup, but I'm targetting the release branch just because this depends on things in that release.

closes: #2087, #1856

Base automatically changed from acl/dataflow_call_indirect to release-rs-v0.16.0 April 16, 2025 10:11
Copy link

codecov bot commented Apr 23, 2025

Codecov Report

Attention: Patch coverage is 87.26115% with 20 lines in your changes missing coverage. Please review.

Project coverage is 83.28%. Comparing base (d8a5d67) to head (e147cbe).

Files with missing lines Patch % Lines
hugr-passes/src/const_fold/value_handle.rs 56.00% 11 Missing ⚠️
hugr-core/src/extension/const_fold.rs 94.52% 3 Missing and 1 partial ⚠️
hugr-core/src/extension/op_def.rs 75.00% 3 Missing ⚠️
hugr-core/src/ops/custom.rs 75.00% 1 Missing ⚠️
hugr-passes/src/const_fold.rs 97.14% 1 Missing ⚠️
Additional details and impacted files
@@                  Coverage Diff                   @@
##           release-rs-v0.16.0    #2060      +/-   ##
======================================================
- Coverage               83.33%   83.28%   -0.06%     
======================================================
  Files                     219      218       -1     
  Lines                   42205    42223      +18     
  Branches                38307    38428     +121     
======================================================
- Hits                    35173    35164       -9     
- Misses                   5221     5248      +27     
  Partials                 1811     1811              
Flag Coverage Δ
python 85.42% <ø> (-0.31%) ⬇️
rust 83.06% <87.26%> (-0.03%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant