Skip to content

Conversation

@alexreinking
Copy link
Member

This enables inference of units (and types) for pure definitions in reduction-y update stages.

Fixes #8661

@alexreinking alexreinking added release_notes For changes that may warrant a note in README for official releases. python Issues related to Halide/Python interop labels Jul 10, 2025
@alexreinking alexreinking changed the title python/implicit-pure-def Bind in-place update operators (e.g. +=) in Python Jul 10, 2025
@alexreinking alexreinking marked this pull request as draft July 10, 2025 07:38
@alexreinking
Copy link
Member Author

Converting to draft as my attempted workaround for the double-updates issue broke something else. Python __iadd__ is weird. This will require a little extra thought.

@alexreinking alexreinking marked this pull request as ready for review July 10, 2025 15:21
@alexreinking
Copy link
Member Author

Looks like upstream LLVM broke... something. Seeing the same errors in #8684

@alexreinking
Copy link
Member Author

alexreinking commented Jul 20, 2025

During the dev meeting, we discussed an alternative implementation strategy where operator+ with a left hand side as an undefined FuncRef should return a special object that __setitem__ converts to a +=. If anything else is done with it (meaning all operators must be defined), it becomes an Expr.

@alexreinking alexreinking force-pushed the python/implicit-pure-def branch from d54ff7d to f0f7baf Compare July 20, 2025 16:32
@alexreinking
Copy link
Member Author

I attempted the alternate implementation and it seems to work, perhaps even more cleanly than before!

@alexreinking
Copy link
Member Author

MSVC doesn't like a template... diagnosing

@alexreinking alexreinking force-pushed the python/implicit-pure-def branch from 85a8132 to d2be2ee Compare July 23, 2025 05:39
src/Func.h Outdated
}

/** What are the arguments to the function? */
const std::vector<Expr> &get_args() const {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two thoughts:

  • Our getters don't normally have get_
  • This should be explicit about not expanding implicit vars. Here's a test case: f[_] += g[x, y] I think it probably works because _ will be unexpanded on both sides for the check.

So maybe rename the member to args_, the method to args(), and add a note to the comment that any implicit vars aren't expanded? Or maybe it would be better to rename the method to unexpanded_args, or raw_args or something like that. There should be something to make sure callers stop and think about implicit vars for a second.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, the get_ prefix was to avoid renaming the member. If I use the raw_args name, I should kill two birds with one stone. I'll add the test case, too.

@alexreinking alexreinking merged commit f6c939f into main Jul 24, 2025
14 of 18 checks passed
@alexreinking alexreinking deleted the python/implicit-pure-def branch July 24, 2025 03:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

python Issues related to Halide/Python interop release_notes For changes that may warrant a note in README for official releases.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Missing implicit pure definition of Func in Python API when using RDom

4 participants