+
    –°³j×5  ã                   ó²  a € R t/0 t R t^ RIt^ RIHt ^ RIHt ^ RIHtH	t	H
t
Ht ^ RIt^ RIt^ RIHtHt ^ RIHtHtHtHtHt ^ RIHtHt ^RIHt ^R	IHt ^R
IHt ^RI H!t! ]PD                  ]#,          ]$,          ]%,          t&R R lt'R R lt(] ! R R4      4       t) ! R R4      t*] ! R R4      4       t+]+],R,          ,          t-] ^ k  ! R R]4      t.R# )aV  This file implements the IndexPropagation ops handler, which wraps an
underlying handler to add a limited form of constant propagation, as well as
propagation of sympy expressions downstream of ops.index_expr calls.

For example, say we have the IR:

    tmp0 = ops.index_expr(x, torch.int32)
    tmp1 = ops.constant(2, torch.int32)
    tmp2 = ops.mul(tmp0, tmp1)
    tmp3 = ops.indirect_indexing(tmp2, x_size)
    tmp4 = ops.load("buf0", tmp3)

The underlying handler would just see:

    ops.load("buf0", x * 2)

This is limited by the set of operators handled in the sympy expression
printers.

N)ÚSequence)Ú	dataclass)ÚAnyÚLiteralÚoverloadÚ	TypeAlias)Údtype_to_typeÚis_integer_dtype)ÚFloorDivÚMaxÚMinÚModularIndexingÚWhere)Úbound_sympyÚValueRanges)ÚDefaultHandler)Ústatically_known_true)Úgenerate_assert)ÚVc                ó$   € V ^8„  d   QhR\         /# ©é   Úval©Ú	_ExprType)Úformats   "Úb/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/index_propagation.pyÚ__annotate__r   ,   s   € ÷ /ñ /”iñ /ó    c                 ó�   € \        V \        P                  4      '       d   V P                  # \        V \        \
        \        34      # ©N)Ú
isinstanceÚsympyÚBasicÚ	is_numberÚintÚfloatÚbool©r   s   &r   Ú_is_constantr)   ,   s1   € Ü�#”u—{‘{×#Ò#Ø�}‰}ÐÜ�cœC¤¬Ð-Ó.Ð.r   c                ó$   € V ^8„  d   QhR\         /# r   r   )r   s   "r   r   r   2   s   € ÷ Jñ J”Yñ Jr   c                 óp   € \        V \        P                  4      '       d   \        V 4      P                  # T # r    )r!   r"   ÚExprr   Úupperr(   s   &r   Úupper_boundr.   2   s(   € Ü%/°´U·Z±Z×%@Ò%@Œ;�sÓ×!Ñ!ÐIÀcÐIr   c                   ó<   a € ] tR t^6t o RtR tR tV 3R ltRtV t	R# )Ú	TypedExprz'A SymPy expression with associated typec                ó,   € \        V P                  4      # r    )r)   Úexpr©Úselfs   &r   Úis_constantÚTypedExpr.is_constant=   s   € Ü˜DŸI™IÓ&Ð&r   c                óv  € \        V P                  4      '       Ed   V P                  p\        V\        P                  4      '       d   VP                  R R7      p\        V P                  4      ! V4      p\        V P                  4      '       d¡   \        P                  ! V P                  4      P                  pV P                  P                  '       d   V^V^,
          ,          ,           pV^V,          ,          pV P                  P                  '       d   V^V^,
          ,          ,
          pWn        R# R# )T)ÚidentityN)r)   r2   r!   r"   r,   Úexpandr   Údtyper	   ÚtorchÚiinfoÚbitsÚ	is_signed)r4   r2   r=   s   &  r   Ú__post_init__ÚTypedExpr.__post_init__@   sÐ   € Ü˜Ÿ	™	×"Ó"Ø—9‘9ˆDÜ˜$¤§
¡
×+Ò+Ø—{‘{¨D�{Ó1�Ü  §¡Ô,¨TÓ2ˆDÜ §
¡
×+Ò+Ü—{’{ 4§:¡:Ó.×3Ñ3�Ø—:‘:×'×'Ð'Ø !¨¨q­¥/Õ1�DØ˜a �g•~�Ø—:‘:×'×'Ð'Ø !¨¨q­¥/Õ1�DØŽIñ #r   c                óF   <€ V ^8„  d   Qh/ S[ ;R&   S[P                  ;R&   # )r   r2   r:   )r   r;   r:   )r   Ú__classdict__s   "€r   r   ÚTypedExpr.__annotate__6   s"   ø‡ ‚ ñ �Oñ	 ñ
 �;‰;Ñò r   ©r2   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r5   r?   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©rB   s   @r   r0   r0   6   s   ø‡ € á1ò
'ò÷ ƒ r   r0   c                   óè  a € ] tR t^Pt o Rt]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR	 l4       t	]R$V 3R lR ll4       t
]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR l4       t]V 3R lR  l4       t]V 3R! lR" l4       tR#tV tR
# )%ÚSymPyOpsz±An ops handler where all IR values are SymPy expressions

When a value cannot be represented as a SymPy expression, the method is
either not defined, or returns NotImplemented

c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   ÚvalueÚreturn)r   )r   rB   s   "€r   r   ÚSymPyOps.__annotate__Y   s   ø€ ÷ ñ ™ð ¡ñ r   c                ó   € V # r    © )rQ   s   &r   r8   ÚSymPyOps.identityX   s   € àˆr   c                ó`   <€ V ^8„  d   QhRS[ S[,          S[,          RS[P                  RS[/# ©r   rQ   r:   rR   )r%   r&   r'   r;   r:   r0   )r   rB   s   "€r   r   rS   ]   s/   ø€ ÷ 'ñ '™™e�¡dÕ*ð '±5·;±;ð 'Á9ñ 'r   c                ó   € \        W4      # r    ©r0   ©rQ   r:   s   &&r   ÚconstantÚSymPyOps.constant\   ó   € ä˜Ó&Ð&r   c                ód   <€ V ^8„  d   QhRS[ P                  S[,          RS[P                  RS[/# rX   ©r"   r,   r%   r;   r:   r0   )r   rB   s   "€r   r   rS   a   ó/   ø€ ÷ 'ñ '™%Ÿ*™*¡sÕ*ð '±5·;±;ð 'Á9ñ 'r   c                ó   € \        W4      # r    rZ   r[   s   &&r   Ú
index_exprÚSymPyOps.index_expr`   r^   r   c                ód   <€ V ^8„  d   QhRS[ P                  S[,          RS[P                  RS[/# rX   r`   )r   rB   s   "€r   r   rS   e   ra   r   c                ó   € \        W4      # r    rZ   r[   s   &&r   Ú
value_exprÚSymPyOps.value_exprd   r^   r   Nc          
      ón   <€ V ^8„  d   QhRS[ RS[P                  RS[P                  R,          RS[RS[ /# )r   rQ   r:   Ú	src_dtypeNÚuse_compute_typesrR   )r0   r;   r:   r'   )r   rB   s   "€r   r   rS   i   sH   ø€ ÷ ,ñ ,Ùð,á�{‰{ð,ñ —;‘; Õ%ð,ñ  ð	,ñ
 
ñ,r   c                ó.   € \        V P                  V4      # r    )r0   r2   )rQ   r:   rj   rk   s   &&&&r   Úto_dtypeÚSymPyOps.to_dtypeh   s   € ô ˜Ÿ™ UÓ+Ð+r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r   ÚxrR   rZ   )r   rB   s   "€r   r   rS   r   s   ø€ ÷ /ñ /‰yð /™Yñ /r   c                óT   € \        \        V P                  4      V P                  4      # r    )r0   Úabsr2   r:   ©rq   s   &r   rs   ÚSymPyOps.absq   s   € äœ˜QŸV™V› a§g¡gÓ.Ð.r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rp   rZ   )r   rB   s   "€r   r   rS   v   s   ø€ ÷ 3ñ 3‘)ð 3¡	ñ 3r   c                ód   € \        V P                  V P                  ,          V P                  4      # r    ©r0   r2   r:   rt   s   &r   ÚsquareÚSymPyOps.squareu   s   € ä˜Ÿ™ !§&¡&�¨!¯'©'Ó2Ð2r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# ©r   rq   ÚyrR   rZ   )r   rB   s   "€r   r   rS   z   ó"   ø€ ÷ 7ñ 7‰yð 7™Yð 7©9ñ 7r   c                ó¦   € \         P                  ! V P                  VP                  4      p\        V P                  VP                  ,           V4      # r    ©r;   Úpromote_typesr:   r0   r2   ©rq   r}   Úresult_types   && r   ÚaddÚSymPyOps.addy   ó5   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ˜Ÿ™ !§&¡&�¨+Ó6Ð6r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# r|   rZ   )r   rB   s   "€r   r   rS      r~   r   c                ó¦   € \         P                  ! V P                  VP                  4      p\        V P                  VP                  ,
          V4      # r    r€   r‚   s   && r   ÚsubÚSymPyOps.sub~   r†   r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# r|   rZ   )r   rB   s   "€r   r   rS   „   r~   r   c                ó¦   € \         P                  ! V P                  VP                  4      p\        V P                  VP                  ,          V4      # r    r€   r‚   s   && r   ÚmulÚSymPyOps.mulƒ   r†   r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rp   rZ   )r   rB   s   "€r   r   rS   ‰   s   ø€ ÷ +ñ +‰yð +™Yñ +r   c                óD   € \        V P                  ) V P                  4      # r    rx   rt   s   &r   ÚnegÚSymPyOps.negˆ   s   € ä˜!Ÿ&™&˜ !§'¡'Ó*Ð*r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# r|   rZ   )r   rB   s   "€r   r   rS   �   s'   ø€ ÷ @ñ @‘Ið @¡)ð @±	ñ @r   c                óÚ   € \         P                  ! V P                  VP                  4      p\        V4      '       g   \        # \        \        V P                  VP                  4      V4      # r    )r;   r�   r:   r	   ÚNotImplementedr0   r
   r2   r‚   s   && r   ÚfloordivÚSymPyOps.floordivŒ   sI   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ ×,Ò,Ü!Ð!äœ !§&¡&¨!¯&©&Ó1°;Ó?Ð?r   c                ó:   <€ V ^8„  d   QhRS[ RS[ RS[ R,          /# ©r   rq   r}   rR   NrZ   )r   rB   s   "€r   r   rS   •   s'   ø€ ÷ 3ñ 3‰yð 3™Yð 3©9°tÕ+;ñ 3r   c                ó  € \         P                  ! V P                  VP                  4      p\        V4      '       g   \        # \        V P                  \        P                  P                  VP                  4      p\        W24      # r    )r;   r�   r:   r	   r•   r   r2   r"   ÚSÚOner0   )rq   r}   rƒ   Úresult_exprs   &&  r   ÚmodÚSymPyOps.mod”   sV   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ ×,Ò,Ü!Ð!ä% a§f¡f¬e¯g©g¯k©k¸1¿6¹6ÓBˆÜ˜Ó2Ð2r   c                ó:   <€ V ^8„  d   QhRS[ RS[ RS[ R,          /# r™   rZ   )r   rB   s   "€r   r   rS   ž   s'   ø€ ÷ ñ ‘Yð ¡9ð ±¸TÕ1Añ r   c                óì  € \         P                  ! V P                  VP                  4      p\        V4      '       g   \        # \
        P                  ! V P                  4      p\
        P                  ! VP                  4      pVP                  e`   VP                  VP                  8X  dE   \        V P                  \
        P                  P                  VP                  4      p\        WR4      # \        # r    )r;   r�   r:   r	   r•   r"   Úsympifyr2   Úis_nonnegativeÚis_positiver   r›   rœ   r0   )rq   r}   rƒ   Úx_exprÚy_exprr�   s   &&    r   Ú	remainderÚSymPyOps.remainder�   s¢   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ ×,Ò,Ü!Ð!ä—’˜qŸv™vÓ&ˆÜ—’˜qŸv™vÓ&ˆð ×!Ñ!Ò-Ø×%Ñ%¨×);Ñ);Ô;ä)¨!¯&©&´%·'±'·+±+¸q¿v¹vÓFˆKÜ˜[Ó6Ð6ÜÐr   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# r|   rZ   )r   rB   s   "€r   r   rS   °   ó"   ø€ ÷ ;ñ ;‘9ð ;¡ð ;©yñ ;r   c                óâ   € \         P                  ! V P                  VP                  4      pV\         P                  8X  d   \        # \        \        V P                  VP                  4      V4      # r    )r;   r�   r:   r'   r•   r0   r   r2   r‚   s   && r   ÚminimumÚSymPyOps.minimum¯   óJ   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆØœ%Ÿ*™*Ô$Ü!Ð!Üœ˜QŸV™V Q§V¡VÓ,¨kÓ:Ð:r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# r|   rZ   )r   rB   s   "€r   r   rS   ·   rª   r   c                óâ   € \         P                  ! V P                  VP                  4      pV\         P                  8X  d   \        # \        \        V P                  VP                  4      V4      # r    )r;   r�   r:   r'   r•   r0   r   r2   r‚   s   && r   ÚmaximumÚSymPyOps.maximum¶   r®   r   rU   )NF)rE   rF   rG   rH   rI   Ústaticmethodr8   r\   rc   rg   rm   rs   ry   r„   r‰   r�   r‘   r–   rž   r§   r¬   r±   rK   rL   rM   s   @r   rO   rO   P   sQ  ø‡ € ñð ÷ó ðð ÷'ó ð'ð ÷'ó ð'ð ÷'ó ð'ð ÷,ñ ,ó ð,ð ÷/ó ð/ð ÷3ó ð3ð ÷7ó ð7ð ÷7ó ð7ð ÷7ó ð7ð ÷+ó ð+ð ÷@ó ð@ð ÷3ó ð3ð ÷ó ðð" ÷;ó ð;ð ÷;ó ö;r   rO   c                   óR   a € ] tR t^¾t o Rt]V 3R lR l4       tR tV 3R ltRt	V t
R# )ÚIndexPropVarFc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r2   rR   rµ   rZ   )r   rB   s   "€r   r   ÚIndexPropVar.__annotate__Ä   s   ø€ ÷ 4ñ 4™9ð 4¨ñ 4r   c                ó   € \        V R R7      # )T©Úis_symbolic)rµ   rD   s   &r   Únew_symbolicÚIndexPropVar.new_symbolicÃ   s   € ä˜D¨dÔ3Ð3r   c                ó„   € V P                   '       d.   \        V P                  \        4      '       g   \	        R 4      hR# R# )z.Symbolic IndexPropVar must contain a TypedExprN)rº   r!   rQ   r0   ÚAssertionErrorr3   s   &r   r?   ÚIndexPropVar.__post_init__Ç   s3   € Ø×$×$Ð$¬
°4·:±:¼y×(IÒ(IÜ Ð!QÓRÐRñ )JÑ$r   c                ó2   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   # )r   rQ   rº   )r   r'   )r   rB   s   "€r   r   r·   ¾   s   ø‡ ‚ á�Jñ ñ Ñò r   rU   N)rE   rF   rG   rH   rº   r³   r»   r?   rJ   rK   rL   rM   s   @r   rµ   rµ   ¾   s+   ø‡ € ð €Kà÷4ó ð4òS÷ ƒ r   rµ   c                   ó  a € ] tR t^Ït o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	]
V 3R lR l4       t]
V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR ltR tRV 3R lR lltRtV tR# )ÚIndexPropagationzåOps wrapper that tries to propagate constant and index_expr values through the computation.

This aims to maximize the compile time simplification possible, and convert
indirect indexing from arange into normal static indexing.

c                ó¬   <€ V ^8„  d   QhRS[ RS[S[P                  S[P                  3,          RS[S[P                  S[P                  3,          RR/# )r   ÚinnerÚiter_rangesÚindirect_var_rangesrR   N)r   Údictr"   ÚSymbolr,   )r   rB   s   "€r   r   ÚIndexPropagation.__annotate__×   s]   ø€ ÷ Bñ BáðBñ ™%Ÿ,™,©¯
©
Ð2Õ3ðBñ "¡%§,¡,±·
±
Ð":Õ;ð	Bð
 
ñBr   c                ó„  € Wn         \        P                  P                  P                  V n        VP                  4        UUu/ uF"  w  rEV\        ^ \        V4      ^,
          4      bK$  	  ppp\        \        P                  ! V P                  P                  P                  4       VP                  4       4      4      V n        W0n        . pVP                  4        F,  w  r‰VP                  ^ V8*  4       VP                  W‰8  4       K.  	  \        V4      V P                  P                  4       ,           V n        R# u uppi ©é    N)Ú_innerr   ÚgraphÚsizevarsÚ	shape_envÚitemsr   r.   ÚtupleÚ	itertoolsÚchainÚvar_to_rangerÆ   ÚappendÚ
get_axiomsÚaxioms)
r4   rÄ   rÅ   rÆ   ÚkÚvrÕ   rØ   rq   Úss
   &&&&      r   Ú__init__ÚIndexPropagation.__init__×   sý   € ð ŒÜŸ™×)Ñ)×3Ñ3ˆŒð ?J×>OÑ>OÔ>Qô
Ù>Q±d°aˆAŒ{˜1œk¨!›n¨qÕ0Ó1Ò1Ñ>Qð 	ñ 
ô "Ü�OŠO˜DŸN™N×7Ñ7×=Ñ=Ó?À×ASÑASÓAUÓVó
ˆÔð
 $7Ô àˆØ×%Ñ%Ö'‰DˆAØ�M‰M˜!˜q™&Ô!Ø�M‰M˜!™%Ö ñ (ô ˜F“m d§n¡n×&?Ñ&?Ó&AÕAˆŽùó
s   Á(D<c                óT   <€ V ^8„  d   QhRS[ P                  RS[P                  RS[/# ©r   r2   r:   rR   )r"   r,   r;   r:   r   )r   rB   s   "€r   r   rÉ   ð   s*   ø€ ÷ 3ñ 3¡U§Z¡Zð 3¹¿¹ð 3Éñ 3r   c                ó²   € \        V4      '       d-   \        V4      ! V4      pV P                  P                  W24      # V P                  P	                  W4      # r    )r)   r   rÍ   r\   rc   )r4   r2   r:   r   s   &&& r   Úmaterialize_exprÚ!IndexPropagation.materialize_exprð   sF   € ä˜×ÒÜ Ô& tÓ,ˆCØ—;‘;×'Ñ'¨Ó3Ð3Ø�{‰{×%Ñ% dÓ2Ð2r   c                óT   <€ V ^8„  d   QhRS[ P                  RS[P                  RS[/# rß   )r"   r,   r;   r:   ÚIndexPropResult)r   rB   s   "€r   r   rÉ   ÷   s*   ø€ ÷ >ñ >™uŸz™zð >±%·+±+ð >Á/ñ >r   c                óV   € V P                  V P                  P                  W4      4      # r    )ÚwraprÍ   rg   )r4   r2   r:   s   &&&r   rg   ÚIndexPropagation.value_expr÷   s    € Ø�y‰y˜Ÿ™×/Ñ/°Ó<Ó=Ð=r   c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[ /# ©r   ÚarR   ©r   rµ   )r   rB   s   "€r   r   rÉ   ú   s    ø€ ÷ ñ ™™lÕ*ð ©sñ r   c                ó€  a € \        V\        \        34      '       d3   \        ;QJ d    . V 3R  lV 4       F  NK  	  5# ! V 3R  lV 4       4      # \        V\        4      '       g   V# VP                  '       d;   S P                  VP                  P                  VP                  P                  4      # VP                  # )c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir    )Úunwrap©Ú.0rÚ   r4   s   & €r   Ú	<genexpr>Ú*IndexPropagation.unwrap.<locals>.<genexpr>ü   s   øé € Ð3±¨A˜Ÿ™ QŸ˜³ùó   ƒ!)	r!   ÚlistrÒ   rµ   rº   rá   rQ   r2   r:   ©r4   rê   s   f&r   rî   ÚIndexPropagation.unwrapú   s   ø€ Ü�aœ$¤˜×'Ò'ß”5Ô3±Ó3—5Ð3�5Ô3±Ó3Ó3Ð3ä˜!œ\×*Ò*ØˆHð �=�=ˆ=Ø×(Ñ(¨¯©¯©°q·w±w·}±}ÓEÐEà�w‰wˆr   c                ó    <€ V ^8„  d   QhRS[ /# )r   rR   )rä   )r   rB   s   "€r   r   rÉ     s   ø€ ÷ ñ ™ñ r   c                ó¶   a € \        V\        \        34      '       d3   \        ;QJ d    . V 3R  lV 4       F  NK  	  5# ! V 3R  lV 4       4      # \        V4      # )c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir    )ræ   rï   s   & €r   rñ   Ú(IndexPropagation.wrap.<locals>.<genexpr>	  s   øé € Ð1©q¨!˜Ÿ™ 1Ÿ˜«qùró   )r!   rô   rÒ   rµ   rõ   s   f&r   ræ   ÚIndexPropagation.wrap  s@   ø€ Ü�aœ$¤˜×'Ò'ß”5Ô1©qÓ1—5Ð1�5Ô1©qÓ1Ó1Ð1Ü˜A‹Ðr   c                óf   <€ V ^8„  d   QhRS[ R,          RS[S[,          RS[S[S[3,          RS[/# )r   ÚnameÚindirect_indexingÚargsÚkwargsrR   )r   r   r   rÇ   Ústrrµ   )r   rB   s   "€r   r   rÉ     sE   ø€ ÷ ñ áÐ)Õ*ðñ ‘s�mðñ ‘S™#�X•ð	ñ
 
ñr   c                ó   € R # r    rU   ©r4   rý   rÿ   r   s   &&&&r   ÚfallbackÚIndexPropagation.fallback  s   € ñ r   c                óX   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[ S[3,          RS[/# ©r   rý   rÿ   r   rR   ©r  r   r   rÇ   rä   )r   rB   s   "€r   r   rÉ     s9   ø€ ÷ ñ ÙðÙ'©�}ðÙ6:¹3Á¸8µnðá	ñr   c                ó   € R # r    rU   r  s   &&&&r   r  r    s   € ñ r   c                óX   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[ S[3,          RS[/# r  r  )r   rB   s   "€r   r   rÉ     s?   ø€ ÷ Nñ NÙðNÙ'©�}ðNÙ6:¹3Á¸8µnðNá	ñNr   c                ó  € V Uu. uF  q@P                  V4      NK  	  ppVP                  4        UUu/ uF  w  rgW`P                  V4      bK  	  pppV P                  \        V P                  V4      ! V/ VB 4      # u upi u uppi r    )rî   rÑ   ræ   ÚgetattrrÍ   )	r4   rý   rÿ   r   rê   Únew_argsrÙ   rÚ   Ú
new_kwargss	   &&&&     r   r  r    sq   € ñ -1Ó1©D q—K‘K –N©DˆÐ1Ø4:·L±L´NÔC±N©D¨A�aŸ™ Q›Ò'±Nˆ
ÑCØ�y‰yœ §¡¨dÔ3°XÐLÀÑLÓMÐMùò 2ùÛCs
   …A=³Bc                óX   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[ S[3,          RS[/# r  r  )r   rB   s   "€r   r   rÉ   !  s9   ø€ ÷ 3ñ 3Ùð3Ù'©�}ð3Ù6:¹3Á¸8µnð3á	ñ3r   c                óü  € R  R lpV Uu. uF
  qT! V4      NK  	  ppVP                  4        UUu/ uF  w  rxWt! V4      bK  	  p	pp \        \        V4      ! V/ V	B p
T
\        J;'       d/    T
P                  4       ;'       g    T
P                  P                  pT'       g   T P                  YT4      # \        P                  T
4      # u upi u uppi   \        \        3 d    T P                  YT4      u # i ; i)c                óF   € V ^8„  d   QhR\         \        ,          R\         /# ré   rë   )r   s   "r   r   Ú6IndexPropagation.propagate_sympy.<locals>.__annotate__%  s   € ÷ 	ñ 	”cœLÕ(ð 	¬Sñ 	r   c                 óJ   € \        V \        4      '       g   V # V P                  # r    )r!   rµ   rQ   )rê   s   &r   rî   Ú0IndexPropagation.propagate_sympy.<locals>.unwrap%  s   € Ü˜a¤×.Ò.Ø�Ø—7‘7ˆNr   )rÑ   r  rO   ÚOverflowErrorÚ
ValueErrorr  r•   r5   r2   Ú
is_integerrµ   r»   )r4   rý   rÿ   r   rî   rê   r  rÙ   rÚ   r  Únew_exprÚis_valid_exprs   &&&&        r   Úpropagate_sympyÚ IndexPropagation.propagate_sympy!  sï   € õ	ñ
 (,Ó,¡t !�F˜1–I¡tˆÐ,Ø/5¯|©|¬~Ô>©~¡t q�a˜ ›’l©~ˆ
Ñ>ð	5Üœx¨Ô.°ÐG¸JÑGˆHð !¬Ð6÷ 
ð 
ð × Ñ Ó"×>Ð> h§m¡m×&>Ñ&>ð 	÷
 Ø—=‘= ¨VÓ4Ð4Ü×(Ñ(¨Ó2Ð2ùò -ùÛ>øô œzÐ*ô 	5à—=‘= ¨VÓ4Ò4ð	5ús   ‹C
°CÁC Ã#C;Ã:C;c                ó\   <€ V ^8„  d   QhRS[ RS[S[R3,          RS[S[ S[3,          RS[/# )r   rý   rÿ   .r   rR   )r  rÒ   r   rÇ   )r   rB   s   "€r   r   rÉ   :  s:   ø€ ÷ 8ñ 8™Sð 8©©c°3¨h­ð 8ÁÁcÉ3ÀhÅð 8ÑTWñ 8r   c                ó®  € \        \        V4      '       g   V P                  WV4      # \        P                  ! W#P                  4       4       Uu. uF  p\        V\        4      '       g   K  VNK  	  pp\        ;QJ d    R  V 4       F  '       d   K   RM	  RM! R  V 4       4      '       g   V P                  WV4      # V P                  WV4      # u upi )c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir    r¹   )rð   rÚ   s   & r   rñ   Ú,IndexPropagation._default.<locals>.<genexpr>C  s   é € Ð8©- Q—=–=«-ùs   ‚FT)
ÚhasattrrO   r  rÓ   rÔ   Úvaluesr!   rµ   Úallr  )r4   rý   rÿ   r   rê   Úvar_argumentss   &&&&  r   Ú_defaultÚIndexPropagation._default:  s©   € Ü”x ×&Ò&Ø—=‘= ¨VÓ4Ð4ô —_’_ T¯=©=«?Ô;ó
á;�Ü˜!œ\×*÷ ˆAÙ;ð 	ð 
÷
 ‹sÑ8©-Ó8�s�sŠsÑ8©-Ó8×8Ò8Ø—=‘= ¨VÓ4Ð4à×#Ñ# D°Ó7Ð7ùò
s   ÁCÁ,Cc                ó¤   € . V P                   OR V P                  P                  4        4       O5p\        V P                  WP
                  V4      # )ai  
Given some iter_ranges, return a function that given an expression, returns whether
it is true or false using value ranges, guard knowledge and runtime_asserts.

FIXME I think this may not be entirely right, as we may not be able to use all runtime_asserts
      If this is an issue, just use guards in `self.axioms`.

      The proper way of handling this would be to have a global shape_env that adds
      runtime_asserts as they happen in the code. Then, it should be used in SimplifyIndexing
      to perform wrap_expr and in CSEProxy.check_bounds to elide upper / lower bounds also
      for indirect_indexing
c              3   ób   "  € T F%  w  rV\        ^ \        V4      ^,
          4      3x € K'  	  R# 5irË   )r   r.   )rð   rÙ   rÚ   s   &  r   rñ   Ú3IndexPropagation.statically_true.<locals>.<genexpr>W  s.   é € ð á<‘D�Að ”K ¤;¨q£>°AÕ#5Ó6Õ7Û<ùs   ‚-/)rÕ   rÆ   rÑ   r   rÐ   rØ   )r4   ÚerÕ   s   && r   Ústatically_trueÚ IndexPropagation.statically_trueH  sQ   € ð
Ø×Ñð
ñà ×4Ñ4×:Ñ:Ô<óñ
ˆô % T§^¡^°Q¿¹À\ÓRÐRr   c                óB   <€ V ^8„  d   QhRS[ S[,          RS[ RS[RS[ /# )r   ÚindexÚsizeÚcheckrR   )r   rµ   r'   )r   rB   s   "€r   r   rÉ   _  s8   ø€ ÷ +ñ +á‘\Õ!ð+ñ ð+ñ ð	+ñ 
ñ+r   c           	     ó4  a a€ \        V\        4      '       dà   VP                  '       dÎ   \        P                  ! VP
                  P                  4      pV V3R  lpS P                  ^ V8*  4      ;'       g     T;'       d    S P                  S) V8*  4      pS P                  VS8  4      pV'       d	   V! V4      p\        V4      '       d+   S P                  RVS3\        V'       * V'       * R7      4       V# S P                  RVSW43/ 4      P
                  p	V	# )c                 ó°   <€ SP                  ^ V 8*  4      '       d   V # SP                  V ^ 8  4      '       d
   V S,           # \        V ^ 8  V S,           V 4      # )rÌ   )r*  r   )r2   r4   r.  s   &€€r   Ú	wrap_exprÚ5IndexPropagation.indirect_indexing.<locals>.wrap_expro  sS   ø€ à×'Ñ'¨¨T©	×2Ò2Ø�KØ×)Ñ)¨$°©(×3Ò3Ø $�;Ð&ä  ¨¡¨4°$­;¸Ó=Ð=r   Úcheck_bounds)Úlowerr-   rþ   )r!   rµ   rº   r"   r¢   rQ   r2   r*  r   r  rÇ   )
r4   r-  r.  r/  Úwrap_negr2   r2  Úcan_prove_lowerÚcan_prove_upperÚindirect_vars
   f&f&&     r   rþ   Ú"IndexPropagation.indirect_indexing_  s  ù€ ô �eœ\×*Ò*¨u×/@×/@Ð/@ô —=’= §¡×!1Ñ!1Ó2ˆDö>ð #×2Ñ2°1¸±9Ó=÷ ð Ø×@Ð@˜T×1Ñ1°4°%¸4±-Ó@ð ð #×2Ñ2°4¸$±;Ó?ˆOßÙ  “�Ü˜u×%Ò%Ø—‘Ø"Ø˜4�LÜ ?Ô2¸oÔ:MÔNôð
 ˆKà—}‘}Ø %¨¨uÐ!?Àó
ç
‰%ð 	ð Ðr   )rÍ   rØ   rÆ   rÐ   rÕ   N)TT)rE   rF   rG   rH   rI   rÜ   rá   rg   rî   ræ   r   r  r  r$  r*  rþ   rK   rL   rM   s   @r   rÂ   rÂ   Ï   s›   ø‡ € ñ÷Bð B÷23ð 3÷>ð >÷ð ÷ð ð
 ÷ó ðð ÷ó ð÷Nð N÷3ð 3÷28ð 8òS÷.+÷ +ð +r   rÂ   c                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r   rä   )Ú__conditional_annotations__r   )r   s   "r   r   r      s!   € ÷ ñ ÷T JÒ I”Ñ IòUr   )rä   .)0r<  rI   rÓ   Úcollections.abcr   Údataclassesr   Útypingr   r   r   r   r"   r;   Útorch._prims_commonr   r	   Útorch.utils._sympy.functionsr
   r   r   r   r   Útorch.utils._sympy.value_rangesr   r   Úops_handlerr   rÏ   r   Úutilsr   Úvirtualizedr   r,   r&   r%   r'   r   r)   r.   r0   rO   rµ   rÒ   rä   rÂ   r   )r<  s   @r   Ú<module>rF     sÄ   øðöó* Ý $Ý !ß 4Ó 4ã ã ß ?ß SÕ Sß Då 'Ý +Ý "Ý ð �J‰J˜Õ Õ$ tÕ+€	õ/õJð ÷ð ó ð÷2k;ñ k;ð\ ÷
Sð 
Só ð
Sð *¨EÐ2HÕ,IÕI€Ó Iô{�~ö {r   