@@ -160,10 +160,14 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
160
160
continue ;
161
161
}
162
162
// Skip transformation rules when budget is used
163
- if self . optimizer . ctx . logical_budget_used && !rule. is_impl_rule ( ) {
163
+ if ( self . optimizer . ctx . logical_budget_used || self . optimizer . ctx . all_budget_used )
164
+ && !rule. is_impl_rule ( )
165
+ {
164
166
continue ;
165
167
}
166
- if self . optimizer . ctx . all_budget_used {
168
+ if self . optimizer . ctx . all_budget_used
169
+ && self . optimizer . get_group_winner ( group_id) . has_full_winner ( )
170
+ {
167
171
break ;
168
172
}
169
173
if top_matches ( rule. matcher ( ) , expr. typ . clone ( ) ) {
@@ -246,7 +250,8 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
246
250
let rule = self . optimizer . rules ( ) [ rule_id] . clone ( ) ;
247
251
248
252
let binding_exprs = match_and_pick_expr ( rule. matcher ( ) , expr_id, self . optimizer ) ;
249
- if binding_exprs. len ( ) >= 100 {
253
+ const BINDING_EXPR_WARNING_THRESHOLD : usize = 200 ;
254
+ if binding_exprs. len ( ) >= BINDING_EXPR_WARNING_THRESHOLD {
250
255
tracing:: warn!(
251
256
event = "rule_application" ,
252
257
task = "apply_rule" ,
@@ -302,12 +307,16 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
302
307
}
303
308
}
304
309
305
- if self . optimizer . ctx . all_budget_used {
306
- break ;
307
- }
308
- if self . optimizer . ctx . logical_budget_used && !rule. is_impl_rule ( ) {
310
+ if ( self . optimizer . ctx . logical_budget_used || self . optimizer . ctx . all_budget_used )
311
+ && !rule. is_impl_rule ( )
312
+ {
309
313
continue ;
310
314
}
315
+ if self . optimizer . ctx . all_budget_used
316
+ && self . optimizer . get_group_winner ( group_id) . has_full_winner ( )
317
+ {
318
+ break ;
319
+ }
311
320
312
321
trace ! ( event = "before_apply_rule" , task = "apply_rule" , input_binding=%binding) ;
313
322
let applied = rule. apply ( self . optimizer , binding) ;
@@ -540,7 +549,7 @@ impl<'a, T: NodeType, M: Memo<T>> TaskContext<'a, T, M> {
540
549
541
550
fn on_task_start ( & self ) {
542
551
if ( self . optimizer . ctx . all_budget_used || self . optimizer . ctx . logical_budget_used )
543
- && self . steps % 100 == 0
552
+ && self . steps % 100000 == 0
544
553
{
545
554
println ! ( "out of budget, dumping info" ) ;
546
555
println ! ( "step={}" , self . steps) ;
0 commit comments