o
    #iڹ                     @   s  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m	Z	 ddl
mZmZmZmZ ddlZddlmZmZmZmZmZmZmZmZ ddlmZmZ erVddlmZ eeZej !ed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j0dej1ddd dej2dej3dej4dej5d ej6ej7ej8ej9ej:ej:ej;ej<ej=eeeeeej>ej>d!Z?h d"Z@d#d$ ZAd%ZBeBD ]%ZCd&eC ZDd'eD ZEeFe&eDeAeC eGeeEe?eD< e@)eD e#HeD qdhZIe@eIB ZJh d(ZKh d)ZLdhZMeKeMB ZNh d*ZOdd+hZPh d,ZQeBD ]ZCd&eC ZDeQ)eD q/h d-ZRh d.ZSd/d0 ZTd1d2 ZUd3d4 ZVd5d6 ZWd7d8 ZXd9d: ZYd;d< ZZd=d> Z[d?d@ Z\dAdB Z]ej)ej=ej6eWeXeYeZe[eTeUeVe\e]dCZ^dDdE Z_dFdG Z`dHdI ZadJdK ZbdLdM ZcdNdO ZddPdQ ZedRdS ZfdTdU ZgdVdW ZhdXdY ZidZd[ Zjd\d] Zkejle Zmd^d_ ZneBD ]ZCd`eC ZoeneCZpeo ep_qep_eFemeoep q[p[C[odadb ZrddcddZsdedf Ztdgdh Zui e^i diejvdej'decdjeddeedefdegdehde`deadketdebdlej8dmeidnejdoekdereseudpZweBD ]ZCd&eC ZDeGemd`eC eweD< q/[C[D[B[mdqdr Zxdsdt Zydudv Zzdwdx Z{dydz Z|d{d| Z}d}d~ Z~dd Zexeze{e}e~edZejejdZdd Zdd Zdd Zdd Zdd Zew D ]
\ZZeee qe D ]
\ZZeee qdd Zew D ]6\ZZeeKv reee qeeOv reee qeeMv seeLv reee eee eee q[[d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update_wrapper)OptionalTypeTYPE_CHECKINGUnion)	sym_floatsym_itesym_maxsym_minsym_notSymBoolSymFloatSymInt)handle_sym_dispatchsym_function_mode)ShapeEnvsym_node)SymNodemethod_to_operatormagic_methodsc                 C   s(   | t u rtS | tu rtS | tu rtS | S N)boolr   intr   floatr   )t r   \/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/fx/experimental/sym_node.py_to_symtype5   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d+d, Zd-d. Zd/d0 Zdd1d2Zdd3d4Z ddd5d6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=ddodpZ>ddqdrZ?ddsdtZ@ddudvZAddwdxZBddydzZCdd{d|ZDdd}d~ZEdd ZFdd ZGdd ZHdddZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVd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constant_translation_validation_enabledfx_node)selfexprr!   r"   r   r%   r'   r   r   r   __init__H   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_env}   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)compute_hint)r!   _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$   r4   r.   r   r   r   r      s   
zSymNode.hintc                 C   s   | j d u r	|   | j d uS r   r5   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$   r4   r!   	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)   	is_numberr   r.   r   r   r   maybe_as_int   s   
zSymNode.maybe_as_intc                 C   s$   dd l }t| j|jrt| jS d S Nr   )sympyr1   r)   Floatr   r(   r=   r   r   r   maybe_as_float   s   
zSymNode.maybe_as_floatc                 C   s,   dd l }| j|ju rdS | j|ju rdS d S )Nr   TF)r=   r)   truefalser?   r   r   r   maybe_as_bool   s   zSymNode.maybe_as_boolc                 C   
   | j tu S r   )r"   r   r.   r   r   r   is_int      
zSymNode.is_intc                 C   rD   r   )r"   r   r.   r   r   r   is_float   rF   zSymNode.is_floatc                 C   rD   r   )r"   r   r.   r   r   r   is_bool   rF   zSymNode.is_boolc                 C   s"   | j d uot| j to| j j S r   )r$   r1   r   nodeis_nested_intr.   r   r   r   rJ      s
   


zSymNode.is_nested_intc                 C   4   t |tu sJ dd l}t||| jt|||dS Nr   )r%   r'   )r#   r   r=   r   Integerr!   r(   numr=   r   r   r   wrap_int   
   zSymNode.wrap_intc                 C   rK   rL   )r#   r   r=   r   r>   r!   rN   r   r   r   
wrap_float   rQ   zSymNode.wrap_floatc                 C   s:   t |tu sJ dd l}t|r|jn|j| jt|||dS rL   )r#   r   r=   r   rA   rB   r!   rN   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   rX   r.   r   r   r   __str__   rY   zSymNode.__str__c                 C   rZ   r   r[   r.   r   r   r   __repr__   rY   zSymNode.__repr__c                 C   rZ   r   )_absr.   r   r   r   abs   rY   zSymNode.absc                 C   rZ   r   )_posr.   r   r   r   pos   rY   zSymNode.posc                 C   
   |  |S r   )_roundr(   ndigitsr   r   r   round   rF   zSymNode.roundc                 C   rZ   r   )_truncr.   r   r   r   trunc   rY   zSymNode.truncc                 C   rb   r   )_addr(   otherr   r   r   add  rF   zSymNode.addc                 C   rb   r   )_subrj   r   r   r   sub  rF   zSymNode.subc                 C   rb   r   )_mulrj   r   r   r   mul	  rF   zSymNode.mulc                 C   rb   r   )_modrj   r   r   r   mod  rF   zSymNode.modc                 C   rb   r   )
_float_powrj   r   r   r   	float_pow  rF   zSymNode.float_powc                 C   rb   r   )_pow_by_naturalrj   r   r   r   pow_by_natural  rF   zSymNode.pow_by_naturalc                 C   rb   r   )_and_rj   r   r   r   and_  rF   zSymNode.and_c                 C   rb   r   )_or_rj   r   r   r   or_  rF   zSymNode.or_c                 C   rb   r   )_float_truedivrj   r   r   r   float_truediv  rF   zSymNode.float_truedivc                 C   rb   r   )_int_truedivrj   r   r   r   int_truediv  rF   zSymNode.int_truedivc                 C   rb   r   )_int_floordivrj   r   r   r   int_floordiv!  rF   zSymNode.int_floordivc                 C   rb   r   )_lshiftrj   r   r   r   lshift$  rF   zSymNode.lshiftc                 C   rb   r   )_rshiftrj   r   r   r   rshift'  rF   zSymNode.rshiftc                 C   rZ   r   )_sym_notr.   r   r   r   r   *  rY   zSymNode.sym_notc                 C   rb   r   )_eqrj   r   r   r   eq-  rF   z
SymNode.eqc                 C   rb   r   )_nerj   r   r   r   ne0  rF   z
SymNode.nec                 C   rb   r   )_gtrj   r   r   r   gt3  rF   z
SymNode.gtc                 C   rb   r   )_ltrj   r   r   r   lt6  rF   z
SymNode.ltc                 C   rb   r   )_lerj   r   r   r   le9  rF   z
SymNode.lec                 C   rb   r   )_gerj   r   r   r   ge<  rF   z
SymNode.gec                 C   rZ   r   )_floorr.   r   r   r   floor?  rY   zSymNode.floorc                 C   rZ   r   )_is_integerr.   r   r   r   
is_integerB  rY   zSymNode.is_integerc                 C   rZ   r   )
_sym_floatr.   r   r   r   r   E  rY   zSymNode.sym_floatc                 C   rZ   r   )_sym_intr.   r   r   r   sym_intH  rY   zSymNode.sym_intc                 C   rZ   r   )_ceilr.   r   r   r   ceilK  rY   zSymNode.ceilc                 C   rZ   r   )_negr.   r   r   r   negN  rY   zSymNode.negc                 C   rb   r   )_sym_minrj   r   r   r   r   Q  rF   zSymNode.sym_minc                 C   rb   r   )_sym_maxrj   r   r   r   r
   T  rF   zSymNode.sym_maxc                 C      |  ||S r   )_sym_ite)r(   then_valelse_valr   r   r   r	   W     zSymNode.sym_itec                 C   r   r   )_is_contiguousr(   sizesstridesr   r   r   is_contiguousZ  r   zSymNode.is_contiguousc                 C   r   r   )_is_channels_last_contiguous_2dr   r   r   r   is_channels_last_contiguous_2d]  r   z&SymNode.is_channels_last_contiguous_2dc                 C   r   r   )_is_channels_last_contiguous_3dr   r   r   r   is_channels_last_contiguous_3d`  r   z&SymNode.is_channels_last_contiguous_3dc                 C   r   r   )_is_channels_last_strides_2dr   r   r   r   is_channels_last_strides_2dc  r   z#SymNode.is_channels_last_strides_2dc                 C   r   r   )_is_channels_last_strides_3dr   r   r   r   is_channels_last_strides_3df  r   z#SymNode.is_channels_last_strides_3dc                 C   r   r   )'_is_non_overlapping_and_dense_indicatorr   r   r   r   &is_non_overlapping_and_dense_indicatori  r   z.SymNode.is_non_overlapping_and_dense_indicatorc                 C   rb   r   )rz   rj   r   r   r   sym_orm  rF   zSymNode.sym_orc                 C   rb   r   )rx   rj   r   r   r   sym_andp  rF   zSymNode.sym_andc                 C   rb   r   )r|   rj   r   r   r   truedivt  rF   zSymNode.truedivc                 C   rb   r   )r   rj   r   r   r   floordivw  rF   zSymNode.floordivc                 C   rb   r   )rt   rj   r   r   r   pow{  rF   zSymNode.powc                 C   s   |  ||t| dS )N   )r   r   to_noder   r   r   r   is_non_overlapping_and_dense~  s   z$SymNode.is_non_overlapping_and_densec                 C      |  ddS N r   )	guard_intr.   r   r   r   int_  r   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liner3   r   r   r   r        
zSymNode.guard_intc                 C   B   | j j| j| j| jdd}zt|W S  ty    td|  w )NF)r'   expect_rationalzFailed to convert to float: %s)	r!   r   r)   r   r'   r   r   r   r   r   r   r   r   guard_float  s   
zSymNode.guard_floatc                 C   r   )Nr   Failed to convert to bool: %s	r!   r   r)   r   r'   r   r   r   r   r   r   r   r   
guard_bool  r   zSymNode.guard_boolc                 C   sR   ddl m} |  r|| js| jjs| ||S | jj| j| d| | jdS )Nr   )free_unbacked_symbols:r   )	%torch.fx.experimental.symbolic_shapesr   r6   r)   r!   +prefer_deferred_runtime_asserts_over_guardsr   defer_runtime_assertr'   )r(   r   r   r   r   r   r   expect_true  s   zSymNode.expect_truec                 C   sD   ddl m} | | d}|||}|r |  s |t|  |S )Nr   )_advise_is_size)r   r   r   rP   r   r6   r   )r(   r   r   r   br3   r   r   r   expect_size  s   zSymNode.expect_sizec                 C   r   )aN  
        Like guard_bool, but if we encounter unbacked symbols, if those symbols
        are size-like, we will treat them as >= 2 for the purposes of the analysis.

        This CHANGES the runtime semantics, but all size-oblivious sites have been
        audited to ensure that the runtime semantics don't change in a material way.
        Acceptable runtime semantic changes are, e.g., squeeze() no longer dropping
        an unbacked one size, or a tensor reporting as non-contiguous even if it's
        contiguous if it would have been reported contiguous due to being empty.
        T)r'   size_obliviousr   r   r   r   r   r   guard_size_oblivious  s   
zSymNode.guard_size_obliviousc                 C   r   r   )r   r.   r   r   r   bool_  r   zSymNode.bool_c                 C      dS )NTr   r.   r   r   r   is_symbolic  rV   zSymNode.is_symbolicc                 C   s   d S r   r   r.   r   r   r   
nested_int  rV   zSymNode.nested_intc                 C   r   )NFr   r.   r   r   r   is_constant  rV   zSymNode.is_constant)NN)r!   r   r+   r   r   )r+   r   )W__name__
__module____qualname____doc__r   r   r   r   r   r*   r,   propertyr)   r4   r   r6   r9   r;   r@   rC   rE   rG   rH   rJ   rP   rR   rS   rU   rX   r\   r]   r_   ra   rf   rh   rl   rn   rp   rr   rt   rv   rx   rz   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   B   s    

5













































r   ra   r_   rl   andr   r   r   rh   r   r   r   r   c                 C   rZ   r   )r   xr   r   r   <lambda>  s    r   r   r   r   rr   rp   )r   r   orrt   rv   rf   r   rn   r   r	   r
   r   r   r|   r~   >	   r_   r   ra   r   r   rh   r   r   r   c                        fdd}|S )Nc                    s   t | d   S )N_sym_)getattrr.   namer   r   fn  s   z_get_sym_node_fn.<locals>.fnr   r   r   r   r   r   _get_sym_node_fn  s   r   )
sqrtcoscoshsinsinhtantanhasinacosatansym__>   r   r   r	   r   >   rl   rp   rn   >   rf   r   r   r   >   rt   r   r~   r|   >   r   r   rh   rv   >   r   r   r   r   r   r   r   r   r   r   r   c                 C      ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsr   )ar   r   r   r   r   _sympy_float_truedivf     
r  c                 C   r   )Nr   )
IntTrueDiv)r   r  )r  r   r  r   r   r   _sympy_int_truedivl  r  r  c                 C   r   )Nr   )FloorDiv)r   r  )r  r   r  r   r   r   _sympy_floordivr  r  r  c                 C   s0   ddl m}m} | jr|jr|| |S || |S )Nr   Mod	PythonMod)r   r	  r
  is_nonnegative)r  r   r	  r
  r   r   r   
_sympy_modx  s   

r  c                 C   r   )Nr   )PowByNatural)r   r  )r  r   r  r   r   r   _sympy_pow_by_natural  r  r  c                 C   r   )Nr   )FloatPow)r   r  )r  r   r  r   r   r   _sympy_float_pow  r  r  c                 C      dd l }|| |S r<   )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  )rl   rn   rp   rr   rv   rt   r   r   r|   r~   r   r   r   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=   r1   Mulargslenr>   r   rM   )r  r   r=   aacoefr   r   r   _floor_ceil_helper  s   &


r"  c                 C      ddl m} || S )Nr   )
FloorToInt)r   r$  )r  r$  r   r   r   _sympy_floor     r%  c                 C   r#  )Nr   )
TruncToInt)r   r'  )r  r'  r   r   r   _sympy_trunc  r&  r(  c                 C   r#  )Nr   )	CeilToInt)r   r)  )r  r)  r   r   r   _sympy_ceil  r&  r*  c                 C   r  r<   )r=   Eqr  r   r   r   	_sympy_eq  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_gt  r  r0  c                 C   r  r<   )r=   Ltr  r   r   r   	_sympy_lt  r  r2  c                 C   r  r<   )r=   Ler  r   r   r   	_sympy_le  r  r4  c                 C   r  r<   )r=   Ger  r   r   r   	_sympy_ge  r  r6  c                 C   r  r<   )r=   Minr  r   r   r   
_sympy_min   r  r8  c                 C   r  r<   )r=   Maxr  r   r   r   
_sympy_max  r  r:  c                 C   s   dd l }||| f|dfS )Nr   T)r=   	Piecewise)r  r   fr=   r   r   r   
_sympy_ite  s   r=  c                    r   )Nc                    s"   dd l }t|jjjd  | S )Nr   OpaqueUnaryFn_)r   r   utils_sympy	functions)r  torchr   r   r   r     s   z_get_sym_math_fn.<locals>.fnr   r   r   r   r   _get_sym_math_fn  s   rC  _sympy_c                 C   s   dd l }|| S r<   )r=   Absr  r=   r   r   r   
_sympy_abs'  s   
rG  c                 C   s*   ddl m}m} |d u r|| S || |S )Nr   )RoundDecimal
RoundToInt)r   rH  rI  )numberre   rH  rI  r   r   r   _sympy_round-  s   
rK  c                 C   r#  Nr   )ToFloat)r   rM  )r  rM  r   r   r   _sympy_sym_float6  s   rN  c                 C   s*   dd l }ddlm} |||| | S rL  )r=   r   rM  r+  r   )r  r=   rM  r   r   r   _sympy_is_integer>  s   rO  r   r   r   r   r   r
   r	   )rf   r   c                 C   s$   t | }t| |tt|d ddS )Nr   )r  sympy_is_contiguous_genericlistrange)r   r   dimr   r   r   sympy_is_contiguouse  s   rU  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  rB   rA   rM   r+  rS  )r   r   	dim_orderr=   rT  r   zdr   r   r   rQ  j  s   
*rQ  c                 C      t | |g dS N)r      r  r   rQ  r   r   r   r   r   $sympy_is_channels_last_contiguous_2d     r_  c                 C   rZ  N)r      r\  r  r   r]  r^  r   r   r   $sympy_is_channels_last_contiguous_3d  r`  rc  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 rV  )r=   r  rB   rM   rA   r-  r9  )r   r   rW  r=   rT  mr3   rY  r   r   r   &sympy_is_channels_last_strides_generic  s   
 	re  c                 C   rZ  r[  re  r^  r   r   r   !sympy_is_channels_last_strides_2d  r`  rg  c                 C   rZ  ra  rf  r^  r   r   r   !sympy_is_channels_last_strides_3d  r`  rh  c                 C   s   ddl m} |g | |R  S )Nr   )!IsNonOverlappingAndDenseIndicator)r   ri  )r   r   ri  r   r   r   -_sympy_is_non_overlapping_and_dense_indicator  s   rj  )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   )r1   r2   rI   r#   r   rS   r   rP   r   rR   NotImplemented)r(   rO   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 )
r1   r   r%   rE   r   rG   r   rH   r   AssertionErrorr   r   r   r   	wrap_node  s   rm  c                 C   s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r   r     rY   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 d
kr\d fdd	}ttd| | d S ttd| | d S )N   r   c              	      s  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 zBdkrddlm}m} | j}| jjsj|| jjdkr|jjsw||jjdkr|| j|j}	n|| j|j}	n | j|j}	W n ty   td| j|j  w ||	}	td | j|j|	 tv rt}
ntv rt}
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_expandrr   r  failed to eval %s(%s, %s)z%s %s %s -> %sr   )!r   rs  r   r    alternate_impl_if_hinted_methodsgetr   rm  r   r   r1   r   r   r	  r
  r!   r)   r  bound_sympylowerr   r   r   sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r"   r2   _create_fx_call_functionr'   )r(   rk   rs  opout_hintalternate_implr	  r
  r!   outr"   r'   r   funcrp  r   r   binary_magic_impl  sb   
	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 td || d }| jd urT|| j}||}tv r_t}ntv rft}n
tv rmt}n| j}| j|| jf\}}t|| j|||dS )Nr   rr  r   ceilingzfailed to eval %s(%s)z%s %s -> %sr   )r   rs  r   r   r   r   rm  r)   r!   _simplify_floor_divr   r   r   ry  rz  r   always_int_magic_methodsr   r|  r   r{  r   r"   r}  r'   r   )	r(   rs  r~  r)   r  r  r"   r'   r   r  r   r   unary_magic_implB  s6   

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   rr  zfailed to eval %s(%s, %s, %s)r   )r   rs  r   r   r   r   r	   rm  r)   r   r   r   r!   r}  r'   r   r"   )	pred_node	then_node	else_noders  r  r  r'   r   r  r   r   sym_ite_implh  sB   
z&_make_node_magic.<locals>.sym_ite_implrf   c              	      s   ddl m} tj}t rt| t|t| |fi S | j}z ||}W n t	y3   t
d||  w ||}|d u r?t}n| j}d }| jd urO|| j|}| jg}|d ur\|| | j|t|\}	}
t|| j|||	dS )Nr   rr  z!failed to eval %s(%s, ndigits=%s)r   )r   rs  builtinsrf   r   r   r   rm  r)   r   r   r   r   r"   r   r'   appendr!   r}  tupler   )r(   re   rs  r~  r)   r  r"   r  r  r'   r   r  r   r   
round_impl  s2   
	
z$_make_node_magic.<locals>.round_implr   )r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )rp  r  method_attrr  r  r  r  r   r  r   _make_node_magic  s   J"&(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   )rm  .0sr   r   r   
<listcomp>  s    zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S      g | ]}|j qS r   rW   r  r   r   r   r        c                 S   r  r   rW   r  r   r   r   r    r  rt  
_indicator)r   sysmodulesr   r   r   r   r   r   r   r   r  endswithr   r   r   r!   )r(   r   r   r~  
size_exprsstride_exprsr  
size_hintsr  r  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   rI   r  r   r  r   r   r        zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                    r  r   r  r  r  r   r   r    r  r   c                       g | ]}  |qS r   sympifyr  r  r=   r   r   r        c                    r  r   r  r  r  r   r   r    r  )r=   r   r  	itertoolschainr1   r   rm  r   rI   r   )r   r   r  r  rF  r   sizes_strides_user  s&   


z4_make_node_sizes_strides.<locals>.sizes_strides_user)r  r   hasattrr  r  r   )rp  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} fdd}t	v rbt
|d d| d S tv rvt|}t
|t|| d S dkr fdd}t
|d d| d S dkrd 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)r1   r   r   r   r   rI   r   rl  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)	r1   r   r   r   r   r   r   rI   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)r1   r   r   rI   rP   r   r   r   r   r   promoteJ  s   
z!_make_user_magic.<locals>.promotec                 S   rT   r   r   r   r   r   r   r  R  rV   c                    s\    dvr| |fS t | ttjf}t |ttjf}|s|r*|s#t| } |s*t|}| |fS )N)rl   rn   rp   rr   rt   r|   r   r   r
   r   r   r   r   r   r   )r1   r   rB  r   r   )r(   rk   f_selff_otherro  r   r   promote2U  s   

z"_make_user_magic.<locals>.promote2c                    s2   | } | rt  | S tt| j S r   )r   rm  r   rI   r.   )r  r   rp  r  r  r   r   r    s   z*_make_user_magic.<locals>.unary_magic_implc                    s   t |ttttttfstS t	d| | | } |}| |\} }| r1t
 | |S |r9 |}t| j|}|tu rEtS tt| j|}|rW |S |S )NzMAGIC %s %s %s)r1   r   r   r   r   r   r   rk  ry  rz  r   r   rI   rm  r   r(   rk   
other_noderetr  r   rp  r  r  r  r   r   r    s   z+_make_user_magic.<locals>.binary_magic_implc                    s   t |ttttttfstS | } |}| |\} }| r)t | |S |r1 |}t	| j
|}|tu r=tS tt|| j
}|rO |S |S r   )r1   r   r   r   r   r   r   rk  r   r   rI   rm  r   r  r  r   r   rbinary_magic_impl  s   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   )	rI   r   rk  r1   r   r"   rm  r   r   )predr   r   r  r  r  r  )r  r  r   r   sym_ite_magic_impl  s   

z,_make_user_magic.<locals>.sym_ite_magic_implrf   c                    s,   | rt  | |S tt| j|S r   )r  rf   rm  r   rI   rd   )r  r   rp  r   r   round_magic_impl  s   z*_make_user_magic.<locals>.round_magic_impl__rr   )r  r   r   r   r   r   r   r   bool_becomes_int_magic_methodsunary_magic_methodsr  unary_nonmagic_methodsr   r   reflectable_magic_methods)rp  	user_typer  r  r  origr  r  r   r  r   _make_user_magic  s6   !
*
r  r   )r   r  r  loggingmathoperatorr  	functoolsr   r   typingr   r   r   r   rB  r   r	   r
   r   r   r   r   r   (torch.fx.experimental._sym_dispatch_moder   r   r   r   	getLoggerr   r   _logginggetArtifactLoggerry  __all__r2   r   r   ra   r_   rl   rx   r   r   r   rh   r   r   r   r   r   r   rr   rp   r   r   rz   r   rf   r   rn   r   rn  r  r   math_op_namesr   sym_namepriv_sym_namer  r   r  r  r  only_bool_magic_methodsr  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr  r{  r  r|  r  r  r  r  r  r  r  r  r  r  r  r"  r%  r(  r*  r,  r.  r0  r2  r4  r6  r8  r:  r=  r  current_modulerC  priv_sympy_namer   r   rG  rK  rN  rO  invertr   rU  rQ  r_  rc  re  rg  rh  rj  sizes_strides_methodsminmaxru  r   rm  r   r  r  itemsrp  r  r  r   r   r   r   <module>   s  
(

   *	
#



	
	

		

&	 OR 5





