Implement E-graph based pattern matching for efficient and robust rewriting #2395
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR introduces a comprehensive e-graph (equality graph) based pattern matching system that provides significant improvements over traditional tree-based pattern matching for ONNX rewriting.
Problem
The current pattern matching approach has several limitations:
Add(a,b)
andAdd(b,a)
require separate pattern rules, leading to exponential growth (2^n rules for n commutative operations)commute=True
parameter and generates multiple pattern variations internallySolution
E-graphs solve these problems by representing equivalent expressions in equivalence classes:
Key Features
Core E-graph Infrastructure:
ENode
: Immutable operation nodes with e-class childrenEClass
: Equivalence classes with union-find operationsEGraph
: Container with hash consing and automatic mergingPattern Matching:
EGraphPatternMatcher
: E-graph based pattern matcherRewriteRule
infrastructureONNX Integration:
build_egraph_from_ir()
: Convert ONNX IR graphs to e-graphsBenefits Demonstrated
Dramatic Pattern Reduction:
Real Example:
Files Added
onnxscript/rewriter/egraph.py
- Core e-graph data structuresonnxscript/rewriter/egraph_pattern.py
- E-graph pattern matcheronnxscript/rewriter/egraph_examples.py
- Usage examples and demosonnxscript/rewriter/egraph_test.py
- Comprehensive unit testsonnxscript/rewriter/egraph_integration_test.py
- Integration testsdocs/tutorial/rewriter/egraph_pattern_matching.md
- User documentationUsage
Testing
This implementation provides a foundation for more advanced pattern matching while maintaining compatibility with existing rewriter infrastructure.
Fixes #2394.
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.