|
95 | 95 | (define result-thunk |
96 | 96 | (with-egraph |
97 | 97 | (λ (egg-graph) |
98 | | - (egraph-add-exprs |
99 | | - egg-graph |
100 | | - exprs |
101 | | - (λ (node-ids) |
102 | | - (define iter-data (egg-run-rules egg-graph #:limit iter-limit (*node-limit*) irules node-ids #t)) |
103 | | - (for ([rule rules]) |
104 | | - (define count (egraph-get-times-applied egg-graph (rule-name rule))) |
105 | | - (when (> count 0) (timeline-push! 'rules (~a (rule-name rule)) count))) |
106 | | - (cond |
107 | | - [(egraph-is-unsound-detected egg-graph) |
108 | | - ; unsoundness detected, fallback |
109 | | - (match* (exprs iter-limit) |
110 | | - [((list (? list?) (? list?) (? list?) ...) #f) ; run expressions individually |
111 | | - (λ () |
112 | | - (for/list ([expr exprs] [root-loc root-locs]) |
113 | | - (timeline-push! 'method "egg-rewrite") |
114 | | - (car (loop (list expr) (list root-loc) #f))))] |
115 | | - [((list (? list?)) #f) ; run expressions with iter limit |
116 | | - (λ () |
117 | | - (let ([limit (- (length iter-data) 2)]) |
118 | | - (timeline-push! 'method "egg-rewrite-iter-limit") |
119 | | - (loop exprs root-locs limit)))] |
120 | | - [(_ (? number?)) ; give up |
121 | | - (timeline-push! 'method "egg-rewrite-fail") |
122 | | - (λ () '(()))])] |
123 | | - [else |
124 | | - (define variants |
125 | | - (for/list ([id node-ids] [expr exprs] [root-loc root-locs] [expr-repr reprs]) |
126 | | - (define egg-rule (rule "egg-rr" 'x 'x (list expr-repr) expr-repr)) |
127 | | - (define output (egraph-get-variants egg-graph id expr)) |
128 | | - (define extracted (egg-exprs->exprs output egg-graph)) |
129 | | - (for/list ([variant (remove-duplicates extracted)]) |
130 | | - (list (change egg-rule root-loc (list (cons 'x variant))))))) |
131 | | - (λ () variants)])))))) |
| 98 | + (define node-ids (map (curry egraph-add-expr egg-graph) exprs)) |
| 99 | + (define iter-data (egg-run-rules egg-graph #:limit iter-limit (*node-limit*) irules node-ids #t)) |
| 100 | + (for ([rule rules]) |
| 101 | + (define count (egraph-get-times-applied egg-graph (rule-name rule))) |
| 102 | + (when (> count 0) (timeline-push! 'rules (~a (rule-name rule)) count))) |
| 103 | + (cond |
| 104 | + [(egraph-is-unsound-detected egg-graph) |
| 105 | + ; unsoundness detected, fallback |
| 106 | + (match* (exprs iter-limit) |
| 107 | + [((list (? list?) (? list?) (? list?) ...) #f) ; run expressions individually |
| 108 | + (λ () |
| 109 | + (for/list ([expr exprs] [root-loc root-locs]) |
| 110 | + (timeline-push! 'method "egg-rewrite") |
| 111 | + (car (loop (list expr) (list root-loc) #f))))] |
| 112 | + [((list (? list?)) #f) ; run expressions with iter limit |
| 113 | + (λ () |
| 114 | + (let ([limit (- (length iter-data) 2)]) |
| 115 | + (timeline-push! 'method "egg-rewrite-iter-limit") |
| 116 | + (loop exprs root-locs limit)))] |
| 117 | + [(_ (? number?)) ; give up |
| 118 | + (timeline-push! 'method "egg-rewrite-fail") |
| 119 | + (λ () '(()))])] |
| 120 | + [else |
| 121 | + (define variants |
| 122 | + (for/list ([id node-ids] [expr exprs] [root-loc root-locs] [expr-repr reprs]) |
| 123 | + (define egg-rule (rule "egg-rr" 'x 'x (list expr-repr) expr-repr)) |
| 124 | + (define output (egraph-get-variants egg-graph id expr)) |
| 125 | + (define extracted (egg-exprs->exprs output egg-graph)) |
| 126 | + (for/list ([variant (remove-duplicates extracted)]) |
| 127 | + (list (change egg-rule root-loc (list (cons 'x variant))))))) |
| 128 | + (λ () variants)])))) |
132 | 129 | (result-thunk))) |
133 | 130 |
|
134 | 131 | ;; Recursive rewrite chooser |
|
0 commit comments