Ë
    ÄÓ^j|4  ã                   ó€  — U d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlZddlZddlmZmZ ddlmZmZmZmZmZ ddlmZmZ d	d
lmZ d	dlmZ d	dlmZ d	dlm Z  ejB                  e"z  e#z  e$z  Z%de%fd„Z&de%fd„Z'e G d„ d«      «       Z( G d„ d«      Z)e G d„ d«      «       Z*e*e+d   z  Z,e
e-d<    G d„ de«      Z.y)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)ÚVÚvalc                 ó„   — t        | t        j                  «      r| j                  S t        | t        t
        t        f«      S ©N)Ú
isinstanceÚsympyÚBasicÚ	is_numberÚintÚfloatÚbool©r   s    úl/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/index_propagation.pyÚ_is_constantr#   ,   s.   € Ü�#”u—{‘{Ô#Ø�}‰}ÐÜ�cœC¤¬Ð-Ó.Ð.ó    c                 ód   — t        | t        j                  «      rt        | «      j                  S | S r   )r   r   ÚExprr   Úupperr!   s    r"   Úupper_boundr(   2   s%   € Ü%/°´U·Z±ZÔ%@Œ;�sÓ×!Ñ!ÐIÀcÐIr$   c                   óF   — e Zd ZU dZeed<   ej                  ed<   d„ Zd„ Z	y)Ú	TypedExprz'A SymPy expression with associated typeÚexprÚdtypec                 ó,   — t        | j                  «      S r   )r#   r+   ©Úselfs    r"   Úis_constantzTypedExpr.is_constant=   s   € Ü˜DŸI™IÓ&Ð&r$   c                 óô  — t        | j                  «      rã| j                  }t        |t        j                  «      r|j                  d¬«      } t        | j                  «      |«      }t        | j                  «      rst        j                  | j                  «      j                  }| j                  j                  r|d|dz
  z  z   }|d|z  z  }| j                  j                  r|d|dz
  z  z
  }|| _        y y )NT)Úidentityé   r   )r#   r+   r   r   r&   Úexpandr	   r,   r
   ÚtorchÚiinfoÚbitsÚ	is_signed)r/   r+   r7   s      r"   Ú__post_init__zTypedExpr.__post_init__@   sÅ   € Ü˜Ÿ	™	Ô"Ø—9‘9ˆDÜ˜$¤§
¡
Ô+Ø—{‘{¨D�{Ó1�Ø,”= §¡Ó,¨TÓ2ˆDÜ §
¡
Ô+Ü—{‘{ 4§:¡:Ó.×3Ñ3�Ø—:‘:×'Ò'Ø !¨¨q©¡/Ñ1�DØ˜a ™g‘~�Ø—:‘:×'Ò'Ø !¨¨q©¡/Ñ1�DØˆD�Ið #r$   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	_ExprTypeÚ__annotations__r5   r,   r0   r9   © r$   r"   r*   r*   6   s   … á1à
ƒOØ�;‰;Óò'ór$   r*   c                   ó¤  — e Zd ZdZededefd„«       Zedeez  e	z  de
j                  defd„«       Zedej                  ez  de
j                  defd„«       Zedej                  ez  de
j                  defd„«       Ze	 	 ddede
j                  d
e
j                  d	z  de	def
d„«       Zededefd„«       Zededefd„«       Zedededefd„«       Zedededefd„«       Zedededefd„«       Zededefd„«       Zedededefd„«       Zedededed	z  fd„«       Zedededed	z  fd„«       Zedededefd„«       Zedededefd„«       Zy	)Ú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

    ÚvalueÚreturnc                 ó   — | S r   r@   )rC   s    r"   r2   zSymPyOps.identityX   s   € àˆr$   r,   c                 ó   — t        | |«      S r   ©r*   ©rC   r,   s     r"   ÚconstantzSymPyOps.constant\   ó   € ä˜ Ó&Ð&r$   c                 ó   — t        | |«      S r   rG   rH   s     r"   Ú
index_exprzSymPyOps.index_expr`   rJ   r$   c                 ó   — t        | |«      S r   rG   rH   s     r"   Ú
value_exprzSymPyOps.value_exprd   rJ   r$   NÚ	src_dtypeÚuse_compute_typesc                 ó.   — t        | j                  |«      S r   )r*   r+   )rC   r,   rO   rP   s       r"   Úto_dtypezSymPyOps.to_dtypeh   s   € ô ˜Ÿ™ UÓ+Ð+r$   Úxc                 óT   — t        t        | j                  «      | j                  «      S r   )r*   Úabsr+   r,   ©rS   s    r"   rU   zSymPyOps.absq   s   € äœ˜QŸV™V› a§g¡gÓ.Ð.r$   c                 ó\   — t        | j                  | j                  z  | j                  «      S r   ©r*   r+   r,   rV   s    r"   ÚsquarezSymPyOps.squareu   s   € ä˜Ÿ™ !§&¡&™¨!¯'©'Ó2Ð2r$   Úyc                 óœ   — t        j                  | j                  |j                  «      }t        | j                  |j                  z   |«      S r   ©r5   Úpromote_typesr,   r*   r+   ©rS   rZ   Úresult_types      r"   ÚaddzSymPyOps.addy   ó5   € ä×)Ñ)¨!¯'©'°1·7±7Ó;ˆÜ˜Ÿ™ !§&¡&™¨+Ó6Ð6r$   c                 óœ   — t        j                  | j                  |j                  «      }t        | j                  |j                  z
  |«      S r   r\   r^   s      r"   ÚsubzSymPyOps.sub~   ra   r$   c                 óœ   — t        j                  | j                  |j                  «      }t        | j                  |j                  z  |«      S r   r\   r^   s      r"   ÚmulzSymPyOps.mulƒ   ra   r$   c                 óD   — t        | j                   | j                  «      S r   rX   rV   s    r"   ÚnegzSymPyOps.negˆ   s   € ä˜!Ÿ&™&˜ !§'¡'Ó*Ð*r$   c                 óÌ   — t        j                  | j                  |j                  «      }t        |«      st        S t        t        | j                  |j                  «      |«      S r   )r5   r]   r,   r
   ÚNotImplementedr*   r   r+   r^   s      r"   ÚfloordivzSymPyOps.floordivŒ   sF   € ä×)Ñ)¨!¯'©'°1·7±7Ó;ˆÜ Ô,Ü!Ð!äœ !§&¡&¨!¯&©&Ó1°;Ó?Ð?r$   c                 ó  — t        j                  | j                  |j                  «      }t        |«      st        S t        | j                  t        j                  j                  |j                  «      }t        ||«      S r   )r5   r]   r,   r
   ri   r   r+   r   ÚSÚOner*   )rS   rZ   r_   Úresult_exprs       r"   ÚmodzSymPyOps.mod”   sU   € ä×)Ñ)¨!¯'©'°1·7±7Ó;ˆÜ Ô,Ü!Ð!ä% a§f¡f¬e¯g©g¯k©k¸1¿6¹6ÓBˆÜ˜ kÓ2Ð2r$   c                 óÔ  — t        j                  | j                  |j                  «      }t        |«      st        S t        j                  | j                  «      }t        j                  |j                  «      }|j                  �^|j                  |j                  k(  rEt        | j                  t
        j                  j                  |j                  «      }t        ||«      S t        S r   )r5   r]   r,   r
   ri   r   Úsympifyr+   Úis_nonnegativeÚis_positiver   rl   rm   r*   )rS   rZ   r_   Úx_exprÚy_exprrn   s         r"   Ú	remainderzSymPyOps.remainder�   s¡   € ä×)Ñ)¨!¯'©'°1·7±7Ó;ˆÜ Ô,Ü!Ð!ä—‘˜qŸv™vÓ&ˆÜ—‘˜qŸv™vÓ&ˆð ×!Ñ!Ð-Ø×%Ñ%¨×);Ñ);Ò;ä)¨!¯&©&´%·'±'·+±+¸q¿v¹vÓFˆKÜ˜[¨+Ó6Ð6ÜÐr$   c                 óª   — t        j                  | j                  |j                  «      }t        t	        | j
                  |j
                  «      |«      S r   )r5   r]   r,   r*   r   r+   r^   s      r"   ÚminimumzSymPyOps.minimum¯   ó8   € ä×)Ñ)¨!¯'©'°1·7±7Ó;ˆÜœ˜QŸV™V Q§V¡VÓ,¨kÓ:Ð:r$   c                 óª   — t        j                  | j                  |j                  «      }t        t	        | j
                  |j
                  «      |«      S r   )r5   r]   r,   r*   r   r+   r^   s      r"   ÚmaximumzSymPyOps.maximum´   ry   r$   )NF)r:   r;   r<   r=   Ústaticmethodr   r2   r   r   r    r5   r,   r*   rI   r   r&   rL   rN   rR   rU   rY   r`   rc   re   rg   rj   ro   rv   rx   r{   r@   r$   r"   rB   rB   P   sß  „ ñð ð˜ð  ò ó ðð ð'˜˜e™ dÑ*ð '°5·;±;ð 'À9ò 'ó ð'ð ð'˜%Ÿ*™* sÑ*ð '°5·;±;ð 'À9ò 'ó ð'ð ð'˜%Ÿ*™* sÑ*ð '°5·;±;ð 'À9ò 'ó ð'ð ð )-Ø"'ñ	,Øð,à�{‰{ð,ð —;‘; Ñ%ð,ð  ð	,ð
 
ò,ó ð,ð ð/ˆ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¨9°tÑ+;ò 3ó ð3ð ð�Yð  9ð °¸TÑ1Aò ó ðð" ð;�9ð ; ð ;¨yò ;ó ð;ð ð;�9ð ; ð ;¨yò ;ó ñ;r$   rB   c                   óF   — e Zd ZU eed<   dZeed<   ededd fd„«       Z	d„ Z
y)	ÚIndexPropVarrC   FÚis_symbolicr+   rD   c                 ó   — t        | d¬«      S )NT©r   )r~   )r+   s    r"   Únew_symboliczIndexPropVar.new_symbolic¿   s   € ä˜D¨dÔ3Ð3r$   c                 ó`   — | j                   r"t        | j                  t        «      sJ d«       ‚y y )Nz.Symbolic IndexPropVar must contain a TypedExpr)r   r   rC   r*   r.   s    r"   r9   zIndexPropVar.__post_init__Ã   s.   € Ø×#Ò#¤z°$·*±*¼iÔ'Hð 	
Ø<ó	
ÐHÐ'HÐ#r$   N)r:   r;   r<   r   r?   r   r    r|   r*   r‚   r9   r@   r$   r"   r~   r~   º   s6   … àƒJØ€K�Óàð4˜9ð 4¨ò 4ó ð4ó
r$   r~   )ÚIndexPropResult.r„   c            	       ó6  — e Zd ZdZdedeej                  ej                  f   deej                  ej                  f   ddfd„Z	dej                  d	e
j                  defd
„Zdej                  d	e
j                  defd„Zdeez  defd„Zdefd„Zeded   dee   deeef   defd„«       Zededee   deeef   defd„«       Zdedee   deeef   defd„Zdedee   deeef   defd„Zdedeedf   deeef   defd„Zd„ Z	 	 ddeez  dededefd„Zy)Ú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.

    ÚinnerÚiter_rangesÚindirect_var_rangesrD   Nc                 ór  — || _         t        j                  j                  j                  | _        |j                  «       D ��ci c]  \  }}|t        dt        |«      dz
  «      “Œ  }}}t        t        j                  | j                  j                  j                  «       |j                  «       «      «      | _        || _        g }|j                  «       D ]-  \  }}	|j                  d|k  «       |j                  ||	k  «       Œ/ t        |«      | j                  j                  «       z   | _        y c c}}w )Nr   r   )Ú_innerr   ÚgraphÚsizevarsÚ	shape_envÚitemsr   r(   ÚtupleÚ	itertoolsÚchainÚvar_to_ranger‰   ÚappendÚ
get_axiomsÚaxioms)
r/   r‡   rˆ   r‰   ÚkÚvr“   r–   rS   Úss
             r"   Ú__init__zIndexPropagation.__init__Ô   s	  € ð ˆŒÜŸ™×)Ñ)×3Ñ3ˆŒð ?J×>OÑ>OÓ>Q÷
Ù6:°a¸ˆAŒ{˜1œk¨!›n¨qÑ0Ó1Ñ1ð
ˆñ 
ô "Ü�O‰O˜DŸN™N×7Ñ7×=Ñ=Ó?À×ASÑASÓAUÓVó
ˆÔð
 $7ˆÔ àˆØ×%Ñ%Ó'ò 	!‰DˆAˆqØ�M‰M˜!˜q™&Ô!Ø�M‰M˜!˜a™%Õ ð	!ô ˜F“m d§n¡n×&?Ñ&?Ó&AÑAˆ�ùó
s   Á#D3r+   r,   c                 óª   — t        |«      r- t        |«      |«      }| j                  j                  ||«      S | j                  j	                  ||«      S r   )r#   r	   r‹   rI   rL   )r/   r+   r,   r   s       r"   Úmaterialize_exprz!IndexPropagation.materialize_exprí   sI   € ä˜ÔØ&”- Ó& tÓ,ˆCØ—;‘;×'Ñ'¨¨UÓ3Ð3Ø�{‰{×%Ñ% d¨EÓ2Ð2r$   c                 óX   — | j                  | j                  j                  ||«      «      S r   )Úwrapr‹   rN   )r/   r+   r,   s      r"   rN   zIndexPropagation.value_exprô   s"   € Ø�y‰y˜Ÿ™×/Ñ/°°eÓ<Ó=Ð=r$   Úac                 ó   ‡ — t        |t        t        f«      rt        ˆ fd„|D «       «      S t        |t        «      s|S |j                  r:‰ j                  |j                  j                  |j                  j                  «      S |j                  S )Nc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Úunwrap©Ú.0r˜   r/   s     €r"   ú	<genexpr>z*IndexPropagation.unwrap.<locals>.<genexpr>ù   s   øè ø€ Ò3¨A˜Ÿ™ QŸÑ3ùó   ƒ)	r   Úlistr�   r~   r   rœ   rC   r+   r,   ©r/   rŸ   s   ` r"   r¢   zIndexPropagation.unwrap÷   sf   ø€ Ü�aœ$¤˜Ô'ÜÓ3°Ô3Ó3Ð3ä˜!œ\Ô*ØˆHð �=Š=Ø×(Ñ(¨¯©¯©°q·w±w·}±}ÓEÐEà�w‰wˆr$   c                 ón   ‡ — t        |t        t        f«      rt        ˆ fd„|D «       «      S t        |«      S )Nc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )rž   r£   s     €r"   r¥   z(IndexPropagation.wrap.<locals>.<genexpr>  s   øè ø€ Ò1¨!˜Ÿ™ 1ŸÑ1ùr¦   )r   r§   r�   r~   r¨   s   ` r"   rž   zIndexPropagation.wrap  s,   ø€ Ü�aœ$¤˜Ô'ÜÓ1¨qÔ1Ó1Ð1Ü˜A‹Ðr$   ÚnameÚindirect_indexingÚargsÚkwargsc                  ó   — y r   r@   ©r/   r«   r­   r®   s       r"   ÚfallbackzIndexPropagation.fallback	  s   € ð r$   c                  ó   — y r   r@   r°   s       r"   r±   zIndexPropagation.fallback  s   € ð r$   c                 ó  — |D �cg c]  }| j                  |«      ‘Œ }}|j                  «       D ��ci c]  \  }}|| j                  |«      “Œ }}}| j                   t        | j                  |«      |i |¤Ž«      S c c}w c c}}w r   )r¢   r�   rž   Úgetattrr‹   )	r/   r«   r­   r®   rŸ   Únew_argsr—   r˜   Ú
new_kwargss	            r"   r±   zIndexPropagation.fallback  sx   € ð -1Ö1 q�D—K‘K •NÐ1ˆÐ1Ø4:·L±L³N×C©D¨A¨q�a˜Ÿ™ Q›Ñ'ÐCˆ
ÑCØ�y‰yÐ3œ §¡¨dÓ3°XÐLÀÑLÓMÐMùò 2ùÛCs
   …A<²Bc                 ó¦  — dt         t        z  dt         fd„}|D �cg c]
  } ||«      ‘Œ }}|j                  «       D ��ci c]  \  }}| ||«      “Œ }	}} t        t        |«      |i |	¤Ž}
|
t
        uxr( |
j                  «       xs |
j                  j                  }|s| j                  |||«      S t        j                  |
«      S c c}w c c}}w )NrŸ   rD   c                 ó>   — t        | t        «      s| S | j                  S r   )r   r~   rC   )rŸ   s    r"   r¢   z0IndexPropagation.propagate_sympy.<locals>.unwrap"  s   € Ü˜a¤Ô.Ø�Ø—7‘7ˆNr$   )r   r~   r�   r´   rB   ri   r0   r+   Ú
is_integerr±   r‚   )r/   r«   r­   r®   r¢   rŸ   rµ   r—   r˜   r¶   Únew_exprÚis_valid_exprs               r"   Úpropagate_sympyz IndexPropagation.propagate_sympy  sÐ   € ð	”cœLÑ(ð 	¬Só 	ð
 (,Ö, !‘F˜1•IÐ,ˆÐ,Ø/5¯|©|«~×>¡t q¨!�a™ ›‘lÐ>ˆ
Ñ>Ø*”7œ8 TÓ*¨HÐC¸
ÑCˆØ ¬Ð6ò 
ð × Ñ Ó"Ò> h§m¡m×&>Ñ&>ð 	ñ
 Ø—=‘=  t¨VÓ4Ð4Ü×(Ñ(¨Ó2Ð2ùò -ùÛ>s   œCÁ C.c                 óD  — t        t        |«      s| j                  |||«      S t        j                  ||j                  «       «      D �cg c]  }t        |t        «      r|‘Œ }}t        d„ |D «       «      s| j                  |||«      S | j                  |||«      S c c}w )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   r�   )r¤   r˜   s     r"   r¥   z,IndexPropagation._default.<locals>.<genexpr><  s   è ø€ Ò8 Q�1—=•=Ñ8ùs   ‚)
ÚhasattrrB   r±   r‘   r’   Úvaluesr   r~   Úallr¼   )r/   r«   r­   r®   rŸ   Úvar_argumentss         r"   Ú_defaultzIndexPropagation._default3  s–   € Ü”x Ô&Ø—=‘=  t¨VÓ4Ð4ô —_‘_ T¨6¯=©=«?Ó;ö
àÜ˜!œ\Ô*ò ð
ˆð 
ô
 Ñ8¨-Ô8Ô8Ø—=‘=  t¨VÓ4Ð4à×#Ñ# D¨$°Ó7Ð7ùò
s   Á
Bc                 ó¦   — g | j                   ¢d„ | j                  j                  «       D «       ¢­}t        | j                  || j
                  |«      S )a±  
        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   óV   K  — | ]!  \  }}|t        d t        |«      dz
  «      f–— Œ# y­w)r   r   N)r   r(   )r¤   r—   r˜   s      r"   r¥   z3IndexPropagation.statically_true.<locals>.<genexpr>P  s1   è ø€ ò á�A�qð ”K ¤;¨q£>°AÑ#5Ó6Ô7ñùs   ‚'))r“   r‰   r�   r   rŽ   r–   )r/   Úer“   s      r"   Ústatically_truez IndexPropagation.statically_trueA  sS   € ð
Ø×Ñð
ñà ×4Ñ4×:Ñ:Ó<ôñ
ˆô % T§^¡^°Q¸¿¹À\ÓRÐRr$   ÚindexÚsizeÚcheckc                 óÚ  ‡ ‡— t        |t        «      r·|j                  r«t        j                  |j
                  j                  «      }ˆ ˆfd„}‰ j                  d|k  «      xs |xr ‰ j                  ‰ |k  «      }‰ j                  |‰k  «      }|r ||«      }t        |«      r"‰ j                  d|‰ft        | | ¬«      «       |S ‰ j                  d|‰||fi «      j
                  }	|	S )Nc                 óˆ   •— ‰j                  d| k  «      r| S ‰j                  | dk  «      r| ‰z   S t        | dk  | ‰z   | «      S )Nr   )rÇ   r   )r+   r/   rÉ   s    €€r"   Ú	wrap_exprz5IndexPropagation.indirect_indexing.<locals>.wrap_exprh  sM   ø€ à×'Ñ'¨¨T©	Ô2Ø�KØ×)Ñ)¨$°©(Ô3Ø $™;Ð&ä  ¨¡¨4°$©;¸Ó=Ð=r$   r   Úcheck_bounds)Úlowerr'   r¬   )r   r~   r   r   rq   rC   r+   rÇ   r   r±   Údict)
r/   rÈ   rÉ   rÊ   Úwrap_negr+   rÍ   Úcan_prove_lowerÚcan_prove_upperÚindirect_vars
   ` `       r"   r¬   z"IndexPropagation.indirect_indexingX  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°hÐ!?Àó
ç
‰%ð 	ð Ðr$   )TT)r:   r;   r<   r=   r   rÐ   r   ÚSymbolr&   rš   r5   r,   rœ   r„   rN   r~   r¢   rž   r   r   r   Ústrr±   r¼   r�   rÃ   rÇ   r    r¬   r@   r$   r"   r†   r†   Ì   s&  „ ñðBàðBð ˜%Ÿ,™,¨¯
©
Ð2Ñ3ðBð " %§,¡,°·
±
Ð":Ñ;ð	Bð
 
óBð23 U§Z¡Zð 3¸¿¹ð 3Èó 3ð>˜uŸz™zð >°%·+±+ð >À/ó >ð˜˜lÑ*ð ¨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 Øñ+à�\Ñ!ð+ð ð+ð ð	+ð 
ô+r$   r†   )/r=   r‘   Úcollections.abcr   Údataclassesr   Útypingr   r   r   r   r   r5   Ú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(   r*   rB   r~   r�   r„   r?   r†   r@   r$   r"   ú<module>rà      sÑ   ðòó* Ý $Ý !ß 4Ó 4ã ã ß ?ß SÕ Sß Då 'Ý +Ý "Ý ð �J‰J˜Ñ Ñ$ tÑ+€	ð/�ió /ðJ�Yó Jð ÷ð ó ð÷2g;ñ g;ðT ÷
ð 
ó ð
ð *¨EÐ2HÑ,IÑI€�Ó Iôw�~õ wr$   