@@ -766,7 +766,7 @@ def _tuple_int(
766766 yield rewrite (TupleInt .fn (i2 , idx_fn )[i ]).to (idx_fn (check_index (i , i2 )))
767767
768768 yield rewrite (TupleInt (vs ).length ()).to (Int (vs .length ()))
769- yield rewrite (TupleInt (vs )[Int (k )]).to (vs [k ])
769+ yield rewrite (TupleInt (vs )[Int (k )]).to (vs [k ], k >= 0 , k < vs . length () )
770770
771771 yield rewrite (TupleInt .fn (Int (k ), idx_fn ), subsume = True ).to (TupleInt (k .range ().map (lambda i : idx_fn (Int (i )))))
772772
@@ -872,7 +872,7 @@ def _tuple_tuple_int(
872872 yield rewrite (TupleTupleInt .fn (i2 , idx_fn )[i ]).to (idx_fn (check_index (i , i2 )))
873873
874874 yield rewrite (TupleTupleInt (vs ).length ()).to (Int (vs .length ()))
875- yield rewrite (TupleTupleInt (vs )[Int (k )]).to (vs [k ])
875+ yield rewrite (TupleTupleInt (vs )[Int (k )]).to (vs [k ], k >= 0 , k < vs . length () )
876876
877877 yield rewrite (TupleTupleInt .fn (Int (k ), idx_fn ), subsume = True ).to (
878878 TupleTupleInt (k .range ().map (lambda i : idx_fn (Int (i ))))
@@ -1221,7 +1221,7 @@ def _tuple_value(
12211221 yield rewrite (TupleValue .fn (i2 , idx_fn )[i ]).to (idx_fn (check_index (i , i2 )))
12221222
12231223 yield rewrite (TupleValue (vs ).length ()).to (Int (vs .length ()))
1224- yield rewrite (TupleValue (vs )[Int (k )]).to (vs [k ])
1224+ yield rewrite (TupleValue (vs )[Int (k )]).to (vs [k ], k >= 0 , k < vs . length () )
12251225
12261226 yield rewrite (TupleValue .fn (Int (k ), idx_fn ), subsume = True ).to (TupleValue (k .range ().map (lambda i : idx_fn (Int (i )))))
12271227
@@ -1266,7 +1266,7 @@ def _tuple_tuple_value(
12661266 yield rewrite (TupleTupleValue .fn (i2 , idx_fn )[i ]).to (idx_fn (check_index (i , i2 )))
12671267
12681268 yield rewrite (TupleTupleValue (vs ).length ()).to (Int (vs .length ()))
1269- yield rewrite (TupleTupleValue (vs )[Int (k )]).to (vs [k ])
1269+ yield rewrite (TupleTupleValue (vs )[Int (k )]).to (vs [k ], k >= 0 , k < vs . length () )
12701270
12711271 yield rewrite (TupleTupleValue .fn (Int (k ), idx_fn ), subsume = True ).to (
12721272 TupleTupleValue (k .range ().map (lambda i : idx_fn (Int (i ))))
@@ -1741,7 +1741,7 @@ def _tuple_ndarray(
17411741 yield rewrite (TupleNDArray .fn (i2 , idx_fn )[i ]).to (idx_fn (check_index (i , i2 )))
17421742
17431743 yield rewrite (TupleNDArray (vs ).length ()).to (Int (vs .length ()))
1744- yield rewrite (TupleNDArray (vs )[Int (k )]).to (vs [k ])
1744+ yield rewrite (TupleNDArray (vs )[Int (k )]).to (vs [k ], k >= 0 , k < vs . length () )
17451745
17461746 yield rewrite (TupleNDArray .fn (Int (k ), idx_fn ), subsume = True ).to (
17471747 TupleNDArray (k .range ().map (lambda i : idx_fn (Int (i ))))
@@ -2486,8 +2486,11 @@ def _get_current_egraph() -> EGraph:
24862486
24872487def try_evaling (egraph : EGraph , schedule : Schedule , expr : Expr , prim_expr : BuiltinExpr ) -> Any :
24882488 """
2489- Try evaling the expression that will result in a primitive expression being fill.
2490- if it fails, display the egraph and raise an error.
2489+ Try evaluating an expression that should produce a primitive (e.g., Bool/i64).
2490+ If extraction fails, register the expr, run the schedule, and retry.
2491+ On egglog panics we dump the .egg program for debugging.
2492+ A common failure mode is that no rule ever sets the primitive output
2493+ (e.g., `Boolean.to_bool` / `Int.to_i64`), so extraction fails.
24912494 """
24922495 try :
24932496 return egraph .extract (prim_expr ).value # type: ignore[attr-defined]
0 commit comments