o
    H&iΎ                     @   sP  d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZmZ erRddlmZ eeZg dZ eeefZ!d	d
 Z"G dd dZ#i dej$dej%dej&dej'dej(dej)dej*dej+dej,dej-dej.dej/dej0dej1dej2dej3dej4ej5ej6ej7eeeeeeej8d
Z9h dZ:h d Z;h d!Z<dhZ=e;e=B Z>ddhZ?h d"Z@ddhZAh d#ZBd$d% ZCd&d' ZDd(d) ZEd*d+ ZFd,d- ZGd.d/ ZHd0d1 ZId2d3 ZJd4d5 d6d5 d7d5 eEeFeGeHeCeDeIeJd8ZKd9d: ZLd;d< ZMd=d> ZNd?d@ ZOdAdB ZPdCdD ZQdEdF ZRdGdH ZSdIdJ ZTdKdL ZUdMdN ZVdOdP ZWdQdR ZXdSdT ZYdUdV ZZi eKi dWdXd5 deOdePdeQdeRdeSdeTdeMdYeZdeNddZd5 d[eUd\eVd]eWd^eXdeYZ[d_d` Z\dadb Z]dcdd Z^dedf Z_dgdh Z`didj Zadkdl Zbdmdn Zce\e^e_eaebecdoZdejeejfdpZgdqdr Zhdsdt Zidudv Zjdwdx Zkdydz Zle[m D ]
\ZnZoekeneo qedm D ]
\ZnZoeleneo qd{d| Zpe[m D ]*\ZnZoene;v r	epene qene=v sene<v repene epene epene q[n[odS )}ae  
This file does three things:
- Contains the definition of SymNode
- Installs all the magic methods into SymBool, SymFloat, SymFloat at import time
- Does not depend on sympy at import time

As this file is imported from within torch/__init__.py we do not want it to depend on SymPy
to avoid having to load SymPy at import time, as doing so is *very* slow.
    N)	lru_cache)OptionalTypeTYPE_CHECKINGUnion)		sym_floatsym_itesym_maxsym_minsym_notsym_sqrtSymBoolSymFloatSymInt)handle_sym_dispatchsym_function_mode)ShapeEnv)SymNodemethod_to_operatormagic_methodsr   c                 C   s(   | t u rtS | tu rtS | tu rtS | S N)boolr   intr   floatr   )t r   IC:\wamp64\www\opt\env\Lib\site-packages\torch/fx/experimental/sym_node.py_to_symtype2   s   r   c                   @   s  e Zd ZdZ		ddeeeeef  fddZ	dd	d
Z
edd Zdd Zedd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zdd+d,Zdd-d.Zdd/d0Zdd1d2Zdd3d4Z dd5d6Z!dd7d8Z"dd9d:Z#dd;d<Z$dd=d>Z%dd?d@Z&ddAdBZ'ddCdDZ(ddEdFZ)ddGdHZ*ddIdJZ+ddKdLZ,ddMdNZ-ddOdPZ.ddQdRZ/ddSdTZ0ddUdVZ1ddWdXZ2ddYdZZ3dd[d\Z4dd]d^Z5dd_d`Z6ddadbZ7ddcddZ8ddedfZ9ddgdhZ:ddidjZ;ddkdlZ<ddmdnZ=dodp Z>dqdr Z?dsdt Z@dudv ZAdwdx ZBdydz ZCd{d| ZDd}d~ ZEdd ZFdd ZGdd ZHdd ZIdd ZJdS )r   z
    This is a type erased SymInt/SymFloat which we use to do actual operations.
    End users don't touch this.  Magic methods are NOT defined on this object.
    Nhintc                 C   sv   || _ || _|| _|d ur't||u s't|t|u s'J d| dt| || _|| _| jjr6|| _d S d | _d S )NzCannot create SymNode of type z  with incompatible hint of type )	_expr	shape_envpytypetyper   _hintconstantZ_translation_validation_enabledfx_node)selfexprr    r!   r   r$   r%   r   r   r   __init__E   s"   	
zSymNode.__init__r    r   returnc                 C   s   t | j|| j| j| j| jS r   )r   r   r!   r#   r$   r%   )r&   r    r   r   r   with_shape_envz   s   zSymNode.with_shape_envc                 C   s   | j | jS r   )r    replacer   r&   r   r   r   r'      s   zSymNode.exprc                 C   s<   | j j| jdd}|d urt|ts| |n|| _d S d S )NT)Zcompute_hint)r    Z_maybe_evaluate_staticr'   
isinstanceSymTypesr!   r#   )r&   rr   r   r   _update_hint   s   zSymNode._update_hintc                 C   s   | j d u r	|   | j S r   r#   r0   r,   r   r   r   r      s   
zSymNode.hintc                 C   s   | j d u r	|   | j d uS r   r1   r,   r   r   r   has_hint   s   

zSymNode.has_hintc                 C   s<   | j d u r	|   | j d u r|d ur|S | j| jS | j S r   )r#   r0   r    Z	size_hintr'   )r&   fallbackr   r   r   require_hint   s   

zSymNode.require_hintc                 C   s   | j jr	t| j S d S r   )r'   Z	is_numberr   r,   r   r   r   maybe_as_int   s   
zSymNode.maybe_as_intc                 C   
   | j tu S r   )r!   r   r,   r   r   r   is_int      
zSymNode.is_intc                 C   r6   r   )r!   r   r,   r   r   r   is_float   r8   zSymNode.is_floatc                 C   r6   r   )r!   r   r,   r   r   r   is_bool   r8   zSymNode.is_boolc                 C   4   t |tu sJ dd l}t||| jt|||dS Nr   )r$   r%   )r"   r   sympyr   Integerr    r&   numr=   r   r   r   wrap_int   
   zSymNode.wrap_intc                 C   r;   r<   )r"   r   r=   r   Floatr    r?   r   r   r   
wrap_float   rB   zSymNode.wrap_floatc                 C   s:   t |tu sJ dd l}t|r|jn|j| jt|||dS r<   )r"   r   r=   r   truefalser    r?   r   r   r   	wrap_bool   s   zSymNode.wrap_boolc                 C      | S r   r   r,   r   r   r   clone      zSymNode.clonec                 C   s   | j  S r   r'   r,   r   r   r   str      zSymNode.strc                 C      |   S r   rL   r,   r   r   r   __str__   rM   zSymNode.__str__c                 C   rN   r   rO   r,   r   r   r   __repr__   rM   zSymNode.__repr__c                 C   rN   r   )_absr,   r   r   r   abs   rM   zSymNode.absc                 C   
   |  |S r   )_addr&   otherr   r   r   add   r8   zSymNode.addc                 C   rT   r   )_subrV   r   r   r   sub   r8   zSymNode.subc                 C   rT   r   )_mulrV   r   r   r   mul   r8   zSymNode.mulc                 C   rT   r   )_modrV   r   r   r   mod   r8   zSymNode.modc                 C   rT   r   )Z_powrV   r   r   r   pow   r8   zSymNode.powc                 C   rT   r   )Z_and_rV   r   r   r   and_   r8   zSymNode.and_c                 C   rT   r   )Z_or_rV   r   r   r   or_   r8   zSymNode.or_c                 C   rT   r   )Z_truedivrV   r   r   r   truediv   r8   zSymNode.truedivc                 C   rT   r   )	_floordivrV   r   r   r   floordiv   r8   zSymNode.floordivc                 C   rT   r   )Z_lshiftrV   r   r   r   lshift   r8   zSymNode.lshiftc                 C   rT   r   )Z_rshiftrV   r   r   r   rshift   r8   zSymNode.rshiftc                 C   rN   r   )Z_sym_notr,   r   r   r   r      rM   zSymNode.sym_notc                 C   rT   r   )_eqrV   r   r   r   eq   r8   z
SymNode.eqc                 C   rT   r   )Z_nerV   r   r   r   ne  r8   z
SymNode.nec                 C   rT   r   )Z_gtrV   r   r   r   gt  r8   z
SymNode.gtc                 C   rT   r   )Z_ltrV   r   r   r   lt	  r8   z
SymNode.ltc                 C   rT   r   )Z_lerV   r   r   r   le  r8   z
SymNode.lec                 C   rT   r   )Z_gerV   r   r   r   ge  r8   z
SymNode.gec                 C   rN   r   )_floorr,   r   r   r   floor  rM   zSymNode.floorc                 C   rN   r   )Z
_sym_floatr,   r   r   r   r     rM   zSymNode.sym_floatc                 C   rN   r   )Z_sym_intr,   r   r   r   sym_int  rM   zSymNode.sym_intc                 C   rN   r   )_ceilr,   r   r   r   ceil  rM   zSymNode.ceilc                 C   rN   r   )Z_negr,   r   r   r   neg  rM   zSymNode.negc                 C   rT   r   )Z_sym_minrV   r   r   r   r
   !  r8   zSymNode.sym_minc                 C   rT   r   )Z_sym_maxrV   r   r   r   r	   $  r8   zSymNode.sym_maxc                 C      |  ||S r   )Z_sym_ite)r&   then_valelse_valr   r   r   r   '     zSymNode.sym_itec                 C   rN   r   )Z	_sym_sqrtr,   r   r   r   r   *  rM   zSymNode.sym_sqrtc                 C   rt   r   )Z_is_contiguousr&   sizesstridesr   r   r   is_contiguous-  rw   zSymNode.is_contiguousc                 C   rt   r   )Z_is_channels_last_contiguous_2drx   r   r   r   is_channels_last_contiguous_2d0  rw   z&SymNode.is_channels_last_contiguous_2dc                 C   rt   r   )Z_is_channels_last_contiguous_3drx   r   r   r   is_channels_last_contiguous_3d3  rw   z&SymNode.is_channels_last_contiguous_3dc                 C   rt   r   )Z_is_channels_last_strides_2drx   r   r   r   is_channels_last_strides_2d6  rw   z#SymNode.is_channels_last_strides_2dc                 C   rt   r   )Z_is_channels_last_strides_3drx   r   r   r   is_channels_last_strides_3d9  rw   z#SymNode.is_channels_last_strides_3dc                 C   rt   r   )Z'_is_non_overlapping_and_dense_indicatorrx   r   r   r   &is_non_overlapping_and_dense_indicator<  rw   z.SymNode.is_non_overlapping_and_dense_indicatorc                 C   rT   r   )ra   rV   r   r   r   sym_or@  r8   zSymNode.sym_orc                 C   rT   r   )r`   rV   r   r   r   sym_andC  r8   zSymNode.sym_andc                 C   s   |  ||t| dS )N   )r   rh   to_noderx   r   r   r   is_non_overlapping_and_denseF  s   z$SymNode.is_non_overlapping_and_densec                 C      |  ddS N r   )	guard_intr,   r   r   r   int_I  rw   zSymNode.int_c                 C   @   | j j| j| j| jd}zt|W S  ty   td|  w )Nr%   zFailed to convert to int: %s)	r    evaluate_exprr'   r   r%   r   	Exceptionlogwarningr&   fileliner/   r   r   r   r   M     
zSymNode.guard_intc                 C   sB   | j j| j| j| jdd}zt|W S  ty    td|  w )NF)r%   Zexpect_rationalzFailed to convert to float: %s)	r    r   r'   r   r%   r   r   r   r   r   r   r   r   guard_floatW  s   
zSymNode.guard_floatc                 C   r   )Nr   zFailed to convert to bool: %s)	r    r   r'   r   r%   r   r   r   r   r   r   r   r   
guard_boolc  r   zSymNode.guard_boolc                 C   s4   |   r
| ||S | jj| j| d| | jdS )N:r   )r2   r   r    Zdefer_runtime_assertr'   r%   )r&   r   r   r   r   r   expect_truem  s
   zSymNode.expect_truec                 C   sD   ddl m} | | d}|||}|r |  s |t|  |S )Nr   )_advise_is_size)%torch.fx.experimental.symbolic_shapesr   rm   rA   r   r2   r   )r&   r   r   r   br/   r   r   r   expect_sizey  s   zSymNode.expect_sizec                 C   r   r   )r   r,   r   r   r   bool_  rw   zSymNode.bool_c                 C      dS )NTr   r,   r   r   r   is_symbolic  rJ   zSymNode.is_symbolicc                 C   s   d S r   r   r,   r   r   r   singleton_int  rJ   zSymNode.singleton_intc                 C   r   )NFr   r,   r   r   r   is_constant  rJ   zSymNode.is_constant)NN)r    r   r)   r   r   )r)   r   )K__name__
__module____qualname____doc__r   r   r   r   r   r(   r*   propertyr'   r0   r   r2   r4   r5   r7   r9   r:   rA   rD   rG   rI   rL   rP   rQ   rS   rX   rZ   r\   r^   r_   r`   ra   rb   rd   re   rf   r   rh   ri   rj   rk   rl   rm   ro   r   rp   rr   rs   r
   r	   r   r   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ?   s    

5







































r   rS   rX   andrr   rh   ro   rd   rm   rj   rl   re   rk   r^   r\   ri   rs   or)
r_   rf   rZ   r   r   r	   r
   r   r   rb   >   rr   ro   r   rs   rS   r   r   >   r   r   r   r   >   r\   rZ   rX   >   r   r   rb   r_   >
   r   rm   rk   rl   rj   rh   r   r   ri   r   c                 C      ddl m} || |S )Nr   )TrueDiv)torch.utils._sympy.functionsr   )ar   r   r   r   r   _sympy_truediv     
r   c                 C   r   )Nr   )FloorDiv)r   r   )r   r   r   r   r   r   _sympy_floordiv  r   r   c                 C   r   )Nr   )Mod)r   r   )r   r   r   r   r   r   
_sympy_mod  r   r   c                 C   r   )Nr   )Pow)r   r   )r   r   r   r   r   r   
_sympy_pow  r   r   c                 C      dd l }|| |S Nr   )r=   Andr   r   r=   r   r   r   
_sympy_and     r   c                 C   r   r   )r=   Orr   r   r   r   	_sympy_or  r   r   c                 C   r   )Nr   )LShift)r   r   )r   r   r   r   r   r   _sympy_lshift   r   r   c                 C   r   )Nr   )RShift)r   r   )r   r   r   r   r   r   _sympy_rshift  r   r   c                 C   s   | | S r   r   r   r   r   r   r   <lambda>      r   c                 C   s   | | S r   r   r   r   r   r   r     r   c                 C   s   | | S r   r   r   r   r   r   r     r   )rX   rZ   r\   r^   r_   r   r   rb   rd   re   rf   c                 C   s   dd l }t| |jr3| j}t|dkr3t|d |jr3|d jr3||d }|d |kr3||d  S t| |jr@| || ksFt| |jrK|| S || S )Nr      r   )r=   r-   ZMulargslenrC   
is_integerr>   )r   fnr=   ZaaZcoefr   r   r   _floor_ceil_helper  s   &


r   c                 C      dd l }t| |jS r   )r=   r   ro   r   r=   r   r   r   _sympy_floor-  r   r   c                 C   r   r   )r=   r   ceilingr   r   r   r   _sympy_ceil3  r   r   c                 C   r   r   )r=   Eqr   r   r   r   	_sympy_eq9  r   r   c                 C   r   r   )r=   Ner   r   r   r   	_sympy_ne?  r   r   c                 C   r   r   )r=   Gtr   r   r   r   	_sympy_gtE  r   r   c                 C   r   r   )r=   Ltr   r   r   r   	_sympy_ltK  r   r   c                 C   r   r   )r=   ZLer   r   r   r   	_sympy_leQ  r   r   c                 C   r   r   )r=   ZGer   r   r   r   	_sympy_geW  r   r   c                 C   r   r   )r=   ZMinr   r   r   r   
_sympy_min]  r   r   c                 C   r   r   )r=   Maxr   r   r   r   
_sympy_maxc  r   r   c                 C   s   dd l }||| f|dfS )Nr   T)r=   Z	Piecewise)r   r   fr=   r   r   r   
_sympy_itei  s   r   c                 C      dd l }|| S r   )r=   sqrtr   r   r   r   _sympy_sqrto     
r   c                 C   r   r   )r=   ZAbsr   r   r   r   
_sympy_absu  r   r   c                 C   s   | d S )Ng      ?r   r   r   r   r   _sympy_sym_float{  s   r   r   c                 C   s   |  S r   r   r   r   r   r   r         r   c                 C   s   |  S r   r   r   r   r   r   r     r   r
   r	   r   r   c                 C   s$   t | }t| |tt|d ddS )Nr   )r   sympy_is_contiguous_genericlistrange)ry   rz   dimr   r   r   sympy_is_contiguous  s   r   c                 C   s   dd l }t| }t||kr|jS |j}|d}|D ]}||| | |d||| |B M }|| | 9 }qt|D ]}||| | |dO }q=|S Nr   r   )r=   r   rF   rE   r>   r   r   )ry   rz   	dim_orderr=   r   r{   zdr   r   r   r     s   
*r   c                 C      t | |g dS N)r      r   r   r   ry   rz   r   r   r   $sympy_is_channels_last_contiguous_2d     r   c                 C   r   N)r      r   r   r   r   r   r   r   r   $sympy_is_channels_last_contiguous_3d  r   r   c                 C   s   dd l }t| }|t|kr|jS |d}|j}|||d dM }|D ],}||| | d|| |k@ M }|dkrE||||d M }|| || | d }q%|S r   )r=   r   rF   r>   rE   r   r   )ry   rz   r   r=   r   mr/   r   r   r   r   &sympy_is_channels_last_strides_generic  s   
 	r   c                 C   r   r   r   r   r   r   r   !sympy_is_channels_last_strides_2d  r   r   c                 C   r   r   r   r   r   r   r   !sympy_is_channels_last_strides_3d  r   r   c                 C   s   ddl m} |g | |R  S )Nr   )!IsNonOverlappingAndDenseIndicator)r   r   )ry   rz   r   r   r   r   -_sympy_is_non_overlapping_and_dense_indicator  s   r   )r{   r|   r}   r~   r   r   )r
   r	   c                 C   sV   t |tr|jS t|tu r| |S t|tu r| |S t|tu r)| 	|S t
S r   )r-   r.   noder"   r   rG   r   rA   r   rD   NotImplemented)r&   r@   r   r   r   r     s   



r   c                 C   sX   t | tr| jd ur| jS |  rt| S |  rt| S |  r%t| S t	d|  )Nzunrecognized return type )
r-   r   r$   r7   r   r9   r   r:   r   AssertionErrorxr   r   r   	wrap_node  s   r  c                 C   s   t |  S r   )METHOD_TO_OPERATOR)methodr   r   r   r     rM   r   c                    s   t d  tv r d}n} fdd} fdd}tv r/ttd| | d S dkrE fdd	}ttd| | d S ttd| | d S )
N   _c           
   	      sf  ddl m} t}d }| jd ur|jd ur|| j|j}t}|r4|d ur4t| |t| t|S t rFt| t	|t| t|fi S t
|tsMJ z	 | j|j}W n tyh   td| j|j  w ||}tv rtt}ntv r{t}n| jtu s|jtu rt}n| j}|d ur|d urt
|ts||}| j|| j|jf\}}	t|| j|||dS )Nr   safe_expandfailed to eval %s(%s, %s)r   )r   r  r   r    alternate_impl_if_hinted_methodsgetr   r  r   r   r-   r   r'   r   r   r   always_float_magic_methodsr   always_bool_magic_methodsr   r!   r.   r    create_fx_call_functionr%   )
r&   rW   r  opout_hintZalternate_imploutr!   r%   r
  funcr  r   r   binary_magic_impl+  sH   
	z+_make_node_magic.<locals>.binary_magic_implc           	         s   ddl m} t}t rt| t|t| fi S | j}dks$dkr*| j	|}z |}W n t
y?   td|  w d }| jd urL|| j}||}tv rWt}n
tv r^t}n| j}| j|| jf\}}t|| j|||dS )Nr   r  ro   r   zfailed to eval %s(%s)r   )r   r  r   r   r   r   r  r'   r    Z_simplify_floor_divr   r   r   r   always_int_magic_methodsr   r  r   r!   r  r%   r   )	r&   r  r  r'   r  r  r!   r%   r
  r  r   r   unary_magic_implc  s0   

z*_make_node_magic.<locals>.unary_magic_implr   c              
      s   ddl m} | jr|jn|j}t r$t| ttt| t|t|fi S z | j|j|j}W n t	yC   t
d| j|j|j  w ||}| jt| j|j|jf\}}t|| j|j||dS )Nr   r  zfailed to eval %s(%s, %s, %s)r   )r   r  r   r   r   r   r   r  r'   r   r   r   r    r  r%   r   r!   )	pred_node	then_node	else_noder  r  r  r%   r
  r  r   r   sym_ite_impl  sB   
z&_make_node_magic.<locals>.sym_ite_impl)r   2magic_methods_on_operator_with_trailing_underscoreunary_magic_methodssetattrr   )r  r  method_attrr  r  r  r   r  r   _make_node_magic#  s   8 &r#  c                    sX    fdd}t td |  fdd}ttjt s*t tjt | d S d S )Nc              	      s  t tjt }t r t| t|dd |D dd |D fi S dd |D }dd |D }z ||}W n tyE   t	d||  w g }d }|D ]}	|	j
d u rU n ||	j
 qLg }
|D ]}	|	j
d u ri n|
|	j
 q`|||
}dr}t}nt}t|| j||S )Nc                 S   s   g | ]}t |qS r   )r  .0sr   r   r   
<listcomp>  s    zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S      g | ]}|j qS r   rK   r$  r   r   r   r'        c                 S   r(  r   rK   r$  r   r   r   r'    r)  r  Z
_indicator)getattrsysmodulesr   r   r   r   r   r   r   r   appendendswithr   r   r   r    )r&   ry   rz   r  Z
size_exprsZstride_exprsr  Z
size_hintsr  r&  Zstride_hintsr!   r  r   r   sizes_strides_impl  sD   



z4_make_node_sizes_strides.<locals>.sizes_strides_implr
  c                    s   dd l ddlm} t| |D ]" t tr2tt j	 fdd| D  fdd|D   S qdkr<|| |S t
fdd| D fdd|D S )	Nr   )!eval_is_non_overlapping_and_densec                       g | ]}t  j|qS r   r   r  r%  r   r   r   r   r'        zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                    r1  r   r2  r3  r   r   r   r'    r4  r   c                       g | ]}  |qS r   Zsympifyr%  r   r=   r   r   r'        c                    r5  r   r6  r7  r8  r   r   r'    r9  )r=   r   r0  	itertoolschainr-   r   r  r*  r  r   )ry   rz   r0  r  r   r   sizes_strides_user  s&   


z4_make_node_sizes_strides.<locals>.sizes_strides_user)r!  r   hasattrr+  r,  r   )r  r  r/  r<  r   r  r   _make_node_sizes_strides  s   +r>  c                    s  t v r
 dndtttttttf fdd dd tv r(dd nd	d  fd
d} fdd} fdd}t	v rZt
|d d| d S dkrq fdd}t
|d d| d S t
|d d| tv rt
|d d| d S d S )Nr
  r  c                 S   s4   t | tttfr
| S t | tr| jddS td)Nr   r   z*expect to be called with constant SymBools)r-   r   r   r   r   r  r   r  r  r   r   r   get_constant  s
   
z&_make_user_magic.<locals>.get_constantc                 S   s2   t | tttfr
dS t | tttfr| j S dS )NTF)	r-   r   r   r   r   r   r   r  r   r  r   r   r   r     s
   
z%_make_user_magic.<locals>.is_constantc                 S   s"   t | trt| jt| S | S )z;Implements True+True=2, which works in python but not sympy)r-   r   r   r  rA   r   r  r   r   r   promote$  s   
z!_make_user_magic.<locals>.promotec                 S   rH   r   r   r  r   r   r   r@  ,  rJ   c                    s2   | } | rt  | S tt| j S r   )r   r  r*  r  r,   r?  r   r  r"  r@  r   r   r  6  s   z*_make_user_magic.<locals>.unary_magic_implc                    sz   | } |}| rt  | |S |r |}t| j|}|tu r)tS tt| j|}|r; |S |S r   r   r   r  r  r  r*  r&   rW   Z
other_noderetrA  r   r   r  <     z+_make_user_magic.<locals>.binary_magic_implc                    sz   | } |}| rt  | |S |r |}t| j|}|tu r)tS tt|| j}|r; |S |S r   rB  rC  rA  r   r   rbinary_magic_implI  rE  z,_make_user_magic.<locals>.rbinary_magic_impl__r   c                    s~   | j }t||}t||}|tu s|tu rtS t|tr't|tr'|j|jks)J tt| j ||}|j  r= |S |S r   )	r  r   r  r-   r   r!   r  r*  r   )predru   rv   r  r  r  rD  )r?  r"  r   r   sym_ite_magic_implZ  s   

z,_make_user_magic.<locals>.sym_ite_magic_impl__r)r  r   r   r   r   r   r   r   bool_becomes_int_magic_methodsr   r!  reflectable_magic_methods)r  Z	user_typer  r  rF  rI  r   rA  r   _make_user_magic  s(   

rM  )qr   builtinsr:  loggingmathoperatorr+  	functoolsr   typingr   r   r   r   Ztorchr   r   r	   r
   r   r   r   r   r   Z(torch.fx.experimental._sym_dispatch_moder   r   r   r   	getLoggerr   r   __all__r.   r   r   rS   rX   r`   rr   rh   ro   rd   rm   rj   rl   re   rk   r^   r\   ri   rs   ra   r_   rf   rZ   rb   r  r   Zonly_bool_magic_methodsrK  Zalso_bool_magic_methodsZbool_magic_methodsr  r  r  r  r   r   r   r   r   r   r   r   rL  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsizes_strides_methodsminmaxr  r   r  r   r#  r>  itemsr  r  rM  r   r   r   r   <module>   sp   
,

  X	
	
&	 Rd



