Thanks for the comments. Here are a short summary of supporting check
using pattern language based on my POC (https://gist.github.com/comaniac/1f399dfdfee05a2f7a087c65c21f550c):
A. Callback
The check
logic is used in callbacks to determine if this subgraph really matches the pattern. If matching, the callback needs to create a composite function as the POC I provided.
- User API would be similar as now. Specifically, user provides the following inputs to
PatternCallback
:- A pattern.
- A map of check functions for this pattern (e.g.,
{'nn.conv2d': lambda ...: true}
).
- A redundant visit to the matched subgraph in order to create the composite function seems inevitable.
B. A More Powerful but Complex Pattern Logic
The check
logic is implemented along with the pattern using AttrPattern
.
- User API would be just a pattern.
- We can use
pattern.partition()
to easily create composite functions. - The logic of implementing a pattern might be more complex, implying a more steep learning curve.
Here are my two cents. Since we already have pattern.partition()
, it seems not practical to improve the rewriter API to make the partition efficient. As a result, I prefer solution B. On the other hand, I am not sure how complex this logic would be and if it’s reasonable for 3rd-party backend developers to learn and implement. It would be great if @mbrookhart you could provide an illustration or even an RFC to give us a more concrete idea