ó
    Eñi!4  ã                   ó„  • % S r SSKrSSKJr  SSKJr  SSKJrJrJ	r	J
r
JrJr  SSKrSSKrSSKJrJr  SSKJrJrJr  SSKJrJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJ r   \\RB                  \"\#\$4   r%S\%4S jr&S\%4S jr'\ " S S5      5       r( " S S5      r)\ " S S5      5       r*\\*\+S   4   r,\\-S'    " S S\5      r.g)aÝ  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. So simple operations like minimum and maximum cannot be translated to
SymPy expressions yet, despite sympy.Min and sympy.Max existing.

é    N)ÚSequence)Ú	dataclass)ÚAnyÚLiteralÚOptionalÚoverloadÚ	TypeAliasÚUnion)Údtype_to_typeÚis_integer_dtype)ÚFloorDivÚModularIndexingÚWhere)Úbound_sympyÚValueRangesé   )ÚDefaultHandler)Ústatically_known_true)Úgenerate_assert)ÚVÚvalc                 óŽ   • [        U [        R                  5      (       a  U R                  $ [        U [        [
        [        45      $ ©N)Ú
isinstanceÚsympyÚBasicÚ	is_numberÚintÚfloatÚbool©r   s    Ú^/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/index_propagation.pyÚ_is_constantr#   -   s1   € Ü�#”u—{‘{×#Ñ#Ø�}‰}ÐÜ�cœC¤¬Ð-Ó.Ð.ó    c                 ón   • [        U [        R                  5      (       a  [        U 5      R                  $ U $ r   )r   r   ÚExprr   Úupperr!   s    r"   Úupper_boundr(   3   s(   € Ü%/°´U·Z±Z×%@Ñ%@Œ;�sÓ×!Ñ!ÐIÀcÐIr$   c                   óN   • \ rS rSr% Sr\\S'   \R                  \S'   S r	S r
Srg)	Ú	TypedExpré7   z'A SymPy expression with associated typeÚexprÚdtypec                 ó,   • [        U R                  5      $ r   )r#   r,   ©Úselfs    r"   Úis_constantÚTypedExpr.is_constant>   s   € Ü˜DŸI™IÓ&Ð&r$   c                 ó   • [        U R                  5      (       aô  U R                  n[        U[        R                  5      (       a  UR                  SS9n[        U R                  5      " U5      n[        U R                  5      (       a~  [        R                  " U R                  5      R                  nU R                  R                  (       a  USUS-
  -  -   nUSU-  -  nU R                  R                  (       a  USUS-
  -  -
  nXl        g g )NT)Úidentityé   r   )r#   r,   r   r   r&   Úexpandr   r-   r   ÚtorchÚiinfoÚbitsÚ	is_signed)r0   r,   r9   s      r"   Ú__post_init__ÚTypedExpr.__post_init__A   sÊ   € Ü˜Ÿ	™	×"Ñ"Ø—9‘9ˆDÜ˜$¤§
¡
×+Ñ+Ø—{‘{¨D�{Ð1�Ü  §¡Ô,¨TÓ2ˆDÜ §
¡
×+Ñ+Ü—{’{ 4§:¡:Ó.×3Ñ3�Ø—:‘:×'×'Ø !¨¨q©¡/Ñ1�DØ˜a ™g‘~�Ø—:‘:×'×'Ø !¨¨q©¡/Ñ1�DØ�Ið #r$   ©r,   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	_ExprTypeÚ__annotations__r7   r-   r1   r;   Ú__static_attributes__© r$   r"   r*   r*   7   s   ‡ á1à
ƒOØ�;‰;Óò'õr$   r*   c                   ó„  • \ rS rSrSr\S\S\4S j5       r\S\\	\
\4   S\R                  S\4S j5       r\S\\R"                  \	4   S\R                  S\4S j5       r\  SS\S\R                  S
\\R                     S\S\4
S jj5       r\S\S\4S j5       r\S\S\4S j5       r\S\S\S\4S j5       r\S\S\S\4S j5       r\S\S\S\4S j5       r\S\S\4S j5       r\S\S\S\4S j5       r\S\S\S\\   4S j5       r\S\S\S\\   4S j5       r\S\S\S\4S j5       r\S\S\S\4S j5       rSr g	)ÚSymPyOpséQ   z±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

ÚvalueÚreturnc                 ó   • U $ r   rF   )rJ   s    r"   r4   ÚSymPyOps.identityY   s   € àˆr$   r-   c                 ó   • [        X5      $ r   ©r*   ©rJ   r-   s     r"   ÚconstantÚSymPyOps.constant]   ó   € ä˜Ó&Ð&r$   c                 ó   • [        X5      $ r   rO   rP   s     r"   Ú
index_exprÚSymPyOps.index_expra   rS   r$   NÚ	src_dtypeÚuse_compute_typesc                 ó.   • [        U R                  U5      $ r   )r*   r,   )rJ   r-   rW   rX   s       r"   Úto_dtypeÚSymPyOps.to_dtypee   s   € ô ˜Ÿ™ UÓ+Ð+r$   Úxc                 óT   • [        [        U R                  5      U R                  5      $ r   )r*   Úabsr,   r-   ©r\   s    r"   r^   ÚSymPyOps.absn   s   € äœ˜QŸV™V› a§g¡gÓ.Ð.r$   c                 ó\   • [        U R                  U R                  -  U R                  5      $ r   ©r*   r,   r-   r_   s    r"   ÚsquareÚSymPyOps.squarer   s   € ä˜Ÿ™ !§&¡&™¨!¯'©'Ó2Ð2r$   Úyc                 óž   • [         R                  " U R                  UR                  5      n[        U R                  UR                  -   U5      $ r   ©r7   Úpromote_typesr-   r*   r,   ©r\   re   Úresult_types      r"   ÚaddÚSymPyOps.addv   ó5   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ˜Ÿ™ !§&¡&™¨+Ó6Ð6r$   c                 óž   • [         R                  " U R                  UR                  5      n[        U R                  UR                  -
  U5      $ r   rg   ri   s      r"   ÚsubÚSymPyOps.sub{   rm   r$   c                 óž   • [         R                  " U R                  UR                  5      n[        U R                  UR                  -  U5      $ r   rg   ri   s      r"   ÚmulÚSymPyOps.mul€   rm   r$   c                 óD   • [        U R                  * U R                  5      $ r   rb   r_   s    r"   ÚnegÚSymPyOps.neg…   s   € ä˜!Ÿ&™&˜ !§'¡'Ó*Ð*r$   c                 óØ   • [         R                  " U R                  UR                  5      n[        U5      (       d  [        $ [        [        U R                  UR                  5      U5      $ r   )r7   rh   r-   r   ÚNotImplementedr*   r   r,   ri   s      r"   ÚfloordivÚSymPyOps.floordiv‰   sI   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜ ×,Ñ,Ü!Ð!äœ !§&¡&¨!¯&©&Ó1°;Ó?Ð?r$   c                 ó  • [         R                  " U R                  UR                  5      n[        U5      (       d  [        $ [        U R                  [        R                  R                  UR                  5      n[        X25      $ r   )r7   rh   r-   r   rx   r   r,   r   ÚSÚOner*   )r\   re   rj   Ú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                 óæ  • [         R                  " U R                  UR                  5      n[        U5      (       d  [        $ [
        R                  " U R                  5      n[
        R                  " UR                  5      nUR                  b^  UR                  UR                  :X  aD  [        U R                  [
        R                  R                  UR                  5      n[        XR5      $ [        $ r   )r7   rh   r-   r   rx   r   Úsympifyr,   Úis_nonnegativeÚis_positiver   r|   r}   r*   )r\   re   rj   Ú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                 óÂ   • [         R                  " U R                  UR                  5      n[        [        R
                  " U R                  UR                  5      U5      $ r   )r7   rh   r-   r*   r   ÚMinr,   ri   s      r"   ÚminimumÚSymPyOps.minimum¬   ó<   € ä×)Ò)¨!¯'©'°1·7±7Ó;ˆÜœŸš 1§6¡6¨1¯6©6Ó2°KÓ@Ð@r$   c                 óÂ   • [         R                  " U R                  UR                  5      n[        [        R
                  " U R                  UR                  5      U5      $ r   )r7   rh   r-   r*   r   ÚMaxr,   ri   s      r"   ÚmaximumÚSymPyOps.maximum±   r�   r$   rF   )NF)!r>   r?   r@   rA   rB   Ústaticmethodr   r4   r
   r   r   r    r7   r-   r*   rQ   r   r&   rU   r   rZ   r^   rc   rk   ro   rr   ru   ry   r   r‡   r‹   r�   rE   rF   r$   r"   rH   rH   Q   sº  † ñð ð˜ð  ó ó ðð ð'˜˜c 5¨$Ð.Ñ/ð '¸¿¹ð 'È	ó 'ó ð'ð ð'˜% §
¡
¨C Ñ0ð '¸¿¹ð 'Èó 'ó ð'ð ð ,0Ø"'ñ	,Øð,à�{‰{ð,ð ˜EŸK™KÑ(ð,ð  ð	,ð
 
ô,ó ð,ð ð/ˆyð /˜Yó /ó ð/ð ð3�)ð 3 	ó 3ó ð3ð ð7ˆyð 7˜Yð 7¨9ó 7ó ð7ð ð7ˆyð 7˜Yð 7¨9ó 7ó ð7ð ð7ˆyð 7˜Yð 7¨9ó 7ó ð7ð ð+ˆyð +˜Yó +ó ð+ð ð@�Ið @ )ð @°	ó @ó ð@ð ð3ˆyð 3˜Yð 3¨8°IÑ+>ó 3ó ð3ð ð�Yð  9ð °¸)Ñ1Dó ó ðð" ðA�9ð A ð A¨yó Aó ðAð ðA�9ð A ð A¨yó Aó óAr$   rH   c                   óP   • \ rS rSr% \\S'   Sr\\S'   \S\	SS 4S j5       r
S rS	rg
)ÚIndexPropVaré·   rJ   FÚis_symbolicr,   rK   c                 ó   • [        U SS9$ )NT©r–   )r”   r=   s    r"   Únew_symbolicÚIndexPropVar.new_symbolic¼   s   € ä˜D¨dÑ3Ð3r$   c                 ót   • U R                   (       a'  [        U R                  [        5      (       d   S5       eg g )Nz.Symbolic IndexPropVar must contain a TypedExpr)r–   r   rJ   r*   r/   s    r"   r;   ÚIndexPropVar.__post_init__À   s1   € Ø×#×#¤z°$·*±*¼i×'HÑ'Hð 	
Ø<ó	
ÐHÐ'HÐ#r$   rF   N)r>   r?   r@   rA   r   rD   r–   r    r’   r*   r™   r;   rE   rF   r$   r"   r”   r”   ·   s6   ‡ àƒJØ€K�Óàð4˜9ð 4¨ó 4ó ð4õ
r$   r”   )ÚIndexPropResult.r�   c            	       ó   • \ rS rSrSrS\S\\R                  \R                  4   S\\R                  \R                  4   SS4S jr
S	\R                  S
\R                  S\4S jrS\\\4   S\4S jrS\4S jr\S\S   S\\   S\\\4   S\4S j5       r\S\S\\   S\\\4   S\4S j5       rS\S\\   S\\\4   S\4S jrS\S\\   S\\\4   S\4S jrS\S\\S4   S\\\4   S\4S jrS r  SS\\\4   S\S\S\4S jjrSrg) ÚIndexPropagationéÉ   zå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.

ÚinnerÚiter_rangesÚindirect_var_rangesrK   Nc                 ót  • Xl         [        R                  R                  R                  U l        UR                  5        VVs0 s H  u  pEU[        S[        U5      S-
  5      _M      nnn[        [        R                  " U R                  R                  R                  5       UR                  5       5      5      U l        X0l        / nUR                  5        H,  u  p‰UR                  SU:*  5        UR                  X‰:  5        M.     [        U5      U R                  R                  5       -   U l        g s  snnf )Nr   r   )Ú_innerr   ÚgraphÚsizevarsÚ	shape_envÚitemsr   r(   ÚtupleÚ	itertoolsÚchainÚvar_to_ranger£   ÚappendÚ
get_axiomsÚaxioms)
r0   r¡   r¢   r£   ÚkÚvr­   r°   r\   Ú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   Á%D4r,   r-   c                 ó°   • [        U5      (       a,  [        U5      " U5      nU R                  R                  X25      $ U R                  R	                  X5      $ r   )r#   r   r¥   rQ   rU   )r0   r,   r-   r   s       r"   Úmaterialize_exprÚ!IndexPropagation.materialize_exprê   sF   € ä˜×ÑÜ Ô& tÓ,ˆCØ—;‘;×'Ñ'¨Ó3Ð3Ø�{‰{×%Ñ% dÓ2Ð2r$   Úac                 ó@  ^ • [        U[        [        45      (       a  [        U 4S jU 5       5      $ [        U[        5      (       d  U$ UR                  (       a:  T R                  UR                  R                  UR                  R                  5      $ UR                  $ )Nc              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr   )Úunwrap©Ú.0r²   r0   s     €r"   Ú	<genexpr>Ú*IndexPropagation.unwrap.<locals>.<genexpr>ó   s   øé € Ð3²¨A˜Ÿ™ QŸ˜²ùó   ƒ!)	r   Úlistrª   r”   r–   r·   rJ   r,   r-   ©r0   r¹   s   ` r"   r¼   ÚIndexPropagation.unwrapñ   sl   ø€ Ü�aœ$¤˜×'Ñ'ÜÔ3±Ó3Ó3Ð3ä˜!œ\×*Ñ*ØˆHð �=�=Ø×(Ñ(¨¯©¯©°q·w±w·}±}ÓEÐEà�w‰wˆr$   c                 óz   ^ • [        U[        [        45      (       a  [        U 4S jU 5       5      $ [        U5      $ )Nc              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr   )Úwrapr½   s     €r"   r¿   Ú(IndexPropagation.wrap.<locals>.<genexpr>   s   øé € Ð1ªq¨!˜Ÿ™ 1Ÿ˜ªqùrÁ   )r   rÂ   rª   r”   rÃ   s   ` r"   rÇ   ÚIndexPropagation.wrapþ   s/   ø€ Ü�aœ$¤˜×'Ñ'ÜÔ1©qÓ1Ó1Ð1Ü˜A‹Ðr$   ÚnameÚindirect_indexingÚargsÚkwargsc                 ó   • g r   rF   ©r0   rÊ   rÌ   rÍ   s       r"   ÚfallbackÚIndexPropagation.fallback  s   € ð r$   c                 ó   • g r   rF   rÏ   s       r"   rÐ   rÑ     s   € ð r$   c                 ó  • U Vs/ s H  o@R                  U5      PM     nnUR                  5        VVs0 s H  u  pgX`R                  U5      _M     nnnU R                  [        U R                  U5      " U0 UD65      $ s  snf s  snnf r   )r¼   r©   rÇ   Úgetattrr¥   )	r0   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                 óÖ  • S[         [        [        4   S[        4S jnU Vs/ s H
  oT" U5      PM     nnUR                  5        VVs0 s H  u  pxXt" U5      _M     n	nn[	        [
        U5      " U0 U	D6n
U
[        L=(       a-    U
R                  5       =(       d    U
R                  R                  nU(       d  U R                  XU5      $ [        R                  U
5      $ s  snf s  snnf )Nr¹   rK   c                 óH   • [        U [        5      (       d  U $ U R                  $ r   )r   r”   rJ   )r¹   s    r"   r¼   Ú0IndexPropagation.propagate_sympy.<locals>.unwrap  s   € Ü˜a¤×.Ñ.Ø�Ø—7‘7ˆNr$   )r
   r   r”   r©   rÔ   rH   rx   r1   r,   Ú
is_integerrÐ   r™   )r0   rÊ   rÌ   rÍ   r¼   r¹   rÕ   r±   r²   rÖ   Únew_exprÚis_valid_exprs               r"   Úpropagate_sympyÚ IndexPropagation.propagate_sympy  sÑ   € ð	”eœC¤Ð-Ñ.ð 	´3ô 	ñ
 (,Ó,¢t !�F˜1–I¡tˆÐ,Ø/5¯|©|¬~Ô>ª~¡t q�a˜ ›’l©~ˆ
Ñ>Üœ8 TÔ*¨HÐC¸
ÑCˆØ ¬Ð6÷ 
ð × Ñ Ó"×> h§m¡m×&>Ñ&>ð 	ö
 Ø—=‘= ¨VÓ4Ð4Ü×(Ñ(¨Ó2Ð2ùò -ùÛ>s   £C Á	C%.c                 óf  • [        [        U5      (       d  U R                  XU5      $ [        R                  " X#R                  5       5       Vs/ s H  n[        U[        5      (       d  M  UPM     nn[        S U 5       5      (       d  U R                  XU5      $ U R                  XU5      $ s  snf )Nc              3   ó8   #   • U  H  oR                   v •  M     g 7fr   r˜   )r¾   r²   s     r"   r¿   Ú,IndexPropagation._default.<locals>.<genexpr>6  s   é € Ð8ª- Q—=–=ª-ùs   ‚)
ÚhasattrrH   rÐ   r«   r¬   Úvaluesr   r”   ÚallrÝ   )r0   rÊ   rÌ   rÍ   r¹   Úvar_argumentss         r"   Ú_defaultÚIndexPropagation._default-  s—   € Ü”x ×&Ñ&Ø—=‘= ¨VÓ4Ð4ô —_’_ T¯=©=«?Ô;ó
â;�Ü˜!œ\×*÷ Ù;ð 	ð 
ô
 Ñ8©-Ó8×8Ñ8Ø—=‘= ¨VÓ4Ð4à×#Ñ# D°Ó7Ð7ùò
s   ÁB.Á+B.c                 ó¤   • / U R                   QS U R                  R                  5        5       Q7n[        U R                  XR
                  U5      $ )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   óZ   #   • U  H!  u  pU[        S [        U5      S-
  5      4v •  M#     g7f)r   r   N)r   r(   )r¾   r±   r²   s      r"   r¿   Ú3IndexPropagation.statically_true.<locals>.<genexpr>J  s.   é € ð â<‘D�Að ”K ¤;¨q£>°AÑ#5Ó6Õ7Ú<ùs   ‚)+)r­   r£   r©   r   r¨   r°   )r0   Úer­   s      r"   Ústatically_trueÚ IndexPropagation.statically_true;  sQ   € ð
Ø×Ñð
ñà ×4Ñ4×:Ñ:Ô<óñ
ˆô % T§^¡^°Q¿¹À\ÓRÐRr$   ÚindexÚsizeÚcheckc           	      ó  ^ ^• [        U[        5      (       aÎ  UR                  (       a½  [        R                  " UR
                  R                  5      nU U4S jnT R                  SU:*  5      =(       d    T R                  T* U:*  5      nT R                  UT:  5      nU(       a  U" U5      n[        U5      (       a'  T R                  SUT4[        U(       + U(       + S95        U$ T R                  SUTX440 5      R
                  n	U	$ )Nc                 óœ   >• TR                  SU :*  5      (       a  U $ TR                  U S:  5      (       a  U T-   $ [        U S:  U T-   U 5      $ )Nr   )rì   r   )r,   r0   rï   s    €€r"   Ú	wrap_exprÚ5IndexPropagation.indirect_indexing.<locals>.wrap_exprb  sS   ø€ à×'Ñ'¨¨T©	×2Ñ2Ø�KØ×)Ñ)¨$°©(×3Ñ3Ø $™;Ð&ä  ¨¡¨4°$©;¸Ó=Ð=r$   r   Úcheck_bounds)Úlowerr'   rË   )r   r”   r–   r   r‚   rJ   r,   rì   r   rÐ   Údict)
r0   rî   rï   rð   Úwrap_negr,   ró   Úcan_prove_lowerÚcan_prove_upperÚindirect_vars
   ` `       r"   rË   Ú"IndexPropagation.indirect_indexingR  sñ   ù€ ô �eœ\×*Ñ*¨u×/@×/@ô —=’= §¡×!1Ñ!1Ó2ˆDö>ð #×2Ñ2°1¸±9Ó=÷ À×AUÑAUØ�˜‘óBˆOð #×2Ñ2°4¸$±;Ó?ˆOÞÙ  “�Ü˜u×%Ñ%Ø—‘Ø"Ø˜4�LÜ ?Ô2¸oÔ:MÑNôð
 ˆKà—}‘}Ø %¨¨uÐ!?Àó
ç
‰%ð 	ð Ðr$   )r¥   r°   r£   r¨   r­   )TT)r>   r?   r@   rA   rB   r   r÷   r   ÚSymbolr&   r´   r7   r-   r·   r
   r”   r¼   r�   rÇ   r   r   r   ÚstrrÐ   rÝ   rª   ræ   rì   r    rË   rE   rF   r$   r"   rŸ   rŸ   É   s  † ñðBàðBð ˜%Ÿ,™,¨¯
©
Ð2Ñ3ðBð " %§,¡,°·
±
Ð":Ñ;ð	Bð
 
ôBð23 U§Z¡Zð 3¸¿¹ð 3Èô 3ð˜˜c <Ð/Ñ0ð °Sô ð˜ô ð
 ðàÐ)Ñ*ðð �s‰mðð �S˜#�X‘ð	ð
 
óó ðð ðØðØ'¨™}ðØ6:¸3À¸8±nðà	óó ððNØðNØ'¨™}ðNØ6:¸3À¸8±nðNà	ôNð3Øð3Ø'¨™}ð3Ø6:¸3À¸8±nð3à	ô3ð*8˜Sð 8¨¨c°3¨h©ð 8ÀÀcÈ3ÀhÁð 8ÐTWô 8òSð6 Øñ+à�S˜,Ð&Ñ'ð+ð ð+ð ð	+ð 
÷+ð +r$   rŸ   )/rB   r«   Úcollections.abcr   Údataclassesr   Útypingr   r   r   r   r	   r
   r   r7   Útorch._prims_commonr   r   Útorch.utils._sympy.functionsr   r   r   Útorch.utils._sympy.value_rangesr   r   Úops_handlerr   r§   r   Úutilsr   Úvirtualizedr   r&   r   r   r    rC   r#   r(   r*   rH   r”   rª   r�   rD   rŸ   rF   r$   r"   Ú<module>r     s×   ðòó, Ý $Ý !ß E× Eã ã ß ?ß IÑ Iß Då 'Ý +Ý "Ý ð �%—*‘*˜e S¨$Ð.Ñ/€	ð/�iô /ðJ�Yô Jð ÷ð ó ð÷2cAñ cAðL ÷
ð 
ó ð
ð # <°Ð7MÑ1NÐ#NÑO€�Ó Oôt�~õ tr$   