U
    yhڹ                  !   @   sv  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rddlmZ eeZej !edZ"d	d
dgZ#eeefZ$dd Z%G dd	 d	Z&ej'ej(ej)ej*ej+ej,ej-ej.ej/ej0ej1dd ej2ej3ej4ej5ej6ej7ej8ej9ej:ej:ej;ej<ej=eeeeeej>ej>d Z?dddddddddh	Z@dd ZAdZBeBD ]LZCdeC ZDdeD ZEeFe&eDeAeC eGeeEe?eD< e@)eD e#HeD qd hZIe@eIB ZJd!d"dd#hZKd$d%d&hZLd'hZMeKeMB ZNd d(dhZOd!d"hZPd)d*dd+hZQeBD ]ZCdeC ZDeQ)eD q4dddd,hZRd'd-d.d/d0d1d!d"dd2d hZSd3d4 ZTd5d6 ZUd7d8 ZVd9d: ZWd;d< ZXd=d> ZYd?d@ ZZdAdB Z[dCdD Z\dEdF Z]ej)ej=ej6eWeXeYeZe[eTeUeVe\e]dGZ^dHdI Z_dJdK Z`dLdM ZadNdO ZbdPdQ ZcdRdS ZddTdU ZedVdW ZfdXdY ZgdZd[ Zhd\d] Zid^d_ Zjd`da Zkejle Zmdbdc ZneBD ]0ZCddeC ZoeneCZpeo ep_qep_eFemeoep qj[p[C[odedf ZrddgdhZsdidj Ztdkdl Zue^ejvej'ecedeeefegehe`eaetebej8eiejekereseudmZweBD ]$ZCdeC ZDeGemddeC eweD< q[C[D[B[mdndo Zxdpdq Zydrds Zzdtdu Z{dvdw Z|dxdy Z}dzd{ 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 ]l\ZZeeKkr eee q eeOkr8eee q eeMksLeeLkrVeee 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)ShapeEnvZsym_nodeSymNodemethod_to_operatormagic_methodsc                 C   s(   | t krtS | tkrtS | tkr$tS | S N)boolr   intr   floatr   )t r   P/var/www/html/venv/lib/python3.8/site-packages/torch/fx/experimental/sym_node.py_to_symtype5   s    r   c                   @   s  e Zd ZdZdeeeeef  dddZ	dd dd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.d/ Zd d0d1d2Zd d0d3d4Z dd d0d5d6Z!d d0d7d8Z"d d0d9d:Z#d d0d;d<Z$d d0d=d>Z%d d0d?d@Z&d d0dAdBZ'd d0dCdDZ(d d0dEdFZ)d d0dGdHZ*d d0dIdJZ+d d0dKdLZ,d d0dMdNZ-d d0dOdPZ.d d0dQdRZ/d d0dSdTZ0d d0dUdVZ1d d0dWdXZ2d d0dYdZZ3d d0d[d\Z4d d0d]d^Z5d d0d_d`Z6d d0dadbZ7d d0dcddZ8d d0dedfZ9d d0dgdhZ:d d0didjZ;d d0dkdlZ<d d0dmdnZ=d d0dodpZ>d d0dqdrZ?d d0dsdtZ@d d0dudvZAd d0dwdxZBd d0dydzZCd d0d{d|ZDd d0d}d~ZEdd ZFdd ZGdd ZHd d0dd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   sp   || _ || _|| _|d k	rNt||ksNt|t|ksNtd| dt| || _|| _| jjrf|nd | _	d S )NzCannot create SymNode of type z  with incompatible hint of type )
_expr	shape_envpytypetyper   AssertionError_hintconstantZ_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   s8   | j j| jdd}|d k	r4t|ts.| |n|| _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 kr|   | j S r   r$   r1   r-   r   r   r   r      s    
zSymNode.hintc                 C   s   | j d kr|   | j d k	S r   r2   r-   r   r   r   has_hint   s    
zSymNode.has_hintc                 C   s<   | j d kr|   | j d kr6|d k	r(|S | j| jS | j S r   )r$   r1   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 d S r   )r(   Z	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 d S Nr   )sympyr.   r(   Floatr   r'   r8   r   r   r   maybe_as_float   s    
zSymNode.maybe_as_floatc                 C   s0   dd l }| j|jkrdS | j|jkr(dS d S d S )Nr   TF)r8   r(   truefalser:   r   r   r   maybe_as_bool   s    zSymNode.maybe_as_boolc                 C   s
   | j tkS r   )r!   r   r-   r   r   r   is_int   s    zSymNode.is_intc                 C   s
   | j tkS r   )r!   r   r-   r   r   r   is_float   s    zSymNode.is_floatc                 C   s
   | j tkS r   )r!   r   r-   r   r   r   is_bool   s    zSymNode.is_boolc                 C   s"   | j d k	o t| j to | j j S r   )r$   r.   r   nodeis_nested_intr-   r   r   r   rC      s
    


zSymNode.is_nested_intc                 C   s4   t |tkstdd l}t||| jt|||dS Nr   )r%   r&   )r"   r   r#   r8   r   Integerr    r'   numr8   r   r   r   wrap_int   s         zSymNode.wrap_intc                 C   s4   t |tkstdd l}t||| jt|||dS rD   )r"   r   r#   r8   r   r9   r    rF   r   r   r   
wrap_float   s         zSymNode.wrap_floatc                 C   s:   t |tkstdd l}t|r$|jn|j| jt|||dS rD   )r"   r   r#   r8   r   r<   r=   r    rF   r   r   r   	wrap_bool   s    zSymNode.wrap_boolc                 C   s   | S r   r   r-   r   r   r   clone   s    zSymNode.clonec                 C   s   | j  S r   r(   r-   r   r   r   str   s    zSymNode.strc                 C   s   |   S r   rM   r-   r   r   r   __str__   s    zSymNode.__str__c                 C   s   |   S r   rN   r-   r   r   r   __repr__   s    zSymNode.__repr__)r*   c                 C   s   |   S r   )_absr-   r   r   r   abs   s    zSymNode.absc                 C   s   |   S r   )_posr-   r   r   r   pos   s    zSymNode.posc                 C   s
   |  |S r   )Z_roundr'   ndigitsr   r   r   round   s    zSymNode.roundc                 C   s   |   S r   )Z_truncr-   r   r   r   trunc   s    zSymNode.truncc                 C   s
   |  |S r   )_addr'   otherr   r   r   add  s    zSymNode.addc                 C   s
   |  |S r   )_subrZ   r   r   r   sub  s    zSymNode.subc                 C   s
   |  |S r   )_mulrZ   r   r   r   mul	  s    zSymNode.mulc                 C   s
   |  |S r   )_modrZ   r   r   r   mod  s    zSymNode.modc                 C   s
   |  |S r   )Z
_float_powrZ   r   r   r   	float_pow  s    zSymNode.float_powc                 C   s
   |  |S r   )Z_pow_by_naturalrZ   r   r   r   pow_by_natural  s    zSymNode.pow_by_naturalc                 C   s
   |  |S r   )Z_and_rZ   r   r   r   and_  s    zSymNode.and_c                 C   s
   |  |S r   )Z_or_rZ   r   r   r   or_  s    zSymNode.or_c                 C   s
   |  |S r   )Z_float_truedivrZ   r   r   r   float_truediv  s    zSymNode.float_truedivc                 C   s
   |  |S r   )Z_int_truedivrZ   r   r   r   int_truediv  s    zSymNode.int_truedivc                 C   s
   |  |S r   )Z_int_floordivrZ   r   r   r   int_floordiv!  s    zSymNode.int_floordivc                 C   s
   |  |S r   )Z_lshiftrZ   r   r   r   lshift$  s    zSymNode.lshiftc                 C   s
   |  |S r   )Z_rshiftrZ   r   r   r   rshift'  s    zSymNode.rshiftc                 C   s   |   S r   )Z_sym_notr-   r   r   r   r   *  s    zSymNode.sym_notc                 C   s
   |  |S r   )_eqrZ   r   r   r   eq-  s    z
SymNode.eqc                 C   s
   |  |S r   )Z_nerZ   r   r   r   ne0  s    z
SymNode.nec                 C   s
   |  |S r   )Z_gtrZ   r   r   r   gt3  s    z
SymNode.gtc                 C   s
   |  |S r   )Z_ltrZ   r   r   r   lt6  s    z
SymNode.ltc                 C   s
   |  |S r   )Z_lerZ   r   r   r   le9  s    z
SymNode.lec                 C   s
   |  |S r   )Z_gerZ   r   r   r   ge<  s    z
SymNode.gec                 C   s   |   S r   )Z_floorr-   r   r   r   floor?  s    zSymNode.floorc                 C   s   |   S r   )Z_is_integerr-   r   r   r   
is_integerB  s    zSymNode.is_integerc                 C   s   |   S r   )Z
_sym_floatr-   r   r   r   r   E  s    zSymNode.sym_floatc                 C   s   |   S r   )Z_sym_intr-   r   r   r   sym_intH  s    zSymNode.sym_intc                 C   s   |   S r   )_ceilr-   r   r   r   ceilK  s    zSymNode.ceilc                 C   s   |   S r   )Z_negr-   r   r   r   negN  s    zSymNode.negc                 C   s
   |  |S r   )Z_sym_minrZ   r   r   r   r   Q  s    zSymNode.sym_minc                 C   s
   |  |S r   )Z_sym_maxrZ   r   r   r   r
   T  s    zSymNode.sym_maxc                 C   s   |  ||S r   )Z_sym_ite)r'   then_valelse_valr   r   r   r	   W  s    zSymNode.sym_itec                 C   s   |  ||S r   )Z_is_contiguousr'   sizesstridesr   r   r   is_contiguousZ  s    zSymNode.is_contiguousc                 C   s   |  ||S r   )Z_is_channels_last_contiguous_2dr{   r   r   r   is_channels_last_contiguous_2d]  s    z&SymNode.is_channels_last_contiguous_2dc                 C   s   |  ||S r   )Z_is_channels_last_contiguous_3dr{   r   r   r   is_channels_last_contiguous_3d`  s    z&SymNode.is_channels_last_contiguous_3dc                 C   s   |  ||S r   )Z_is_channels_last_strides_2dr{   r   r   r   is_channels_last_strides_2dc  s    z#SymNode.is_channels_last_strides_2dc                 C   s   |  ||S r   )Z_is_channels_last_strides_3dr{   r   r   r   is_channels_last_strides_3df  s    z#SymNode.is_channels_last_strides_3dc                 C   s   |  ||S r   )Z'_is_non_overlapping_and_dense_indicatorr{   r   r   r   &is_non_overlapping_and_dense_indicatori  s    z.SymNode.is_non_overlapping_and_dense_indicatorc                 C   s
   |  |S r   )rf   rZ   r   r   r   sym_orm  s    zSymNode.sym_orc                 C   s
   |  |S r   )re   rZ   r   r   r   sym_andp  s    zSymNode.sym_andc                 C   s
   |  |S r   )rg   rZ   r   r   r   truedivt  s    zSymNode.truedivc                 C   s
   |  |S r   )ri   rZ   r   r   r   floordivw  s    zSymNode.floordivc                 C   s
   |  |S r   )rc   rZ   r   r   r   pow{  s    zSymNode.powc                 C   s   |  ||t| dS )N   )r   rm   to_noder{   r   r   r   is_non_overlapping_and_dense~  s    z$SymNode.is_non_overlapping_and_densec                 C   s   |  ddS N r   )	guard_intr-   r   r   r   int_  s    zSymNode.int_c                 C   sJ   | j j| j| j| jd}z
t|W S  tk
rD   td|  Y nX d S )Nr&   zFailed to convert to int: %s)	r    evaluate_exprr(   r   r&   r   	Exceptionlogwarningr'   fileliner0   r   r   r   r     s    
zSymNode.guard_intc                 C   sL   | j j| j| j| jdd}z
t|W S  tk
rF   td|  Y nX d S )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_float  s       
zSymNode.guard_floatc                 C   sJ   | j j| j| j| jd}z
t|W S  tk
rD   td|  Y nX d S )Nr   Failed to convert to bool: %s	r    r   r(   r   r&   r   r   r   r   r   r   r   r   
guard_bool  s    
zSymNode.guard_boolc                 C   sR   ddl m} |  r2|| js2| jjs2| ||S | jj| j| d| | jdS )Nr   )free_unbacked_symbols:r   )	%torch.fx.experimental.symbolic_shapesr   r3   r(   r    Z+prefer_deferred_runtime_asserts_over_guardsr   Z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   rr   rH   r   r3   r   )r'   r   r   r   br0   r   r   r   expect_size  s    zSymNode.expect_sizec                 C   sL   | j j| j| j| jdd}z
t|W S  tk
rF   td|  Y nX dS )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&   Zsize_obliviousr   Nr   r   r   r   r   guard_size_oblivious  s       
zSymNode.guard_size_obliviousc                 C   s   |  ddS r   )r   r-   r   r   r   bool_  s    zSymNode.bool_c                 C   s   dS )NTr   r-   r   r   r   is_symbolic  s    zSymNode.is_symbolicc                 C   s   d S r   r   r-   r   r   r   
nested_int  s    zSymNode.nested_intc                 C   s   dS )NFr   r-   r   r   r   is_constant  s    zSymNode.is_constant)NN)N)N)W__name__
__module____qualname____doc__r   r   r   r   r   r)   r+   propertyr(   r1   r   r3   r5   r6   r;   r>   r?   r@   rA   rC   rH   rI   rJ   rK   rM   rO   rP   rR   rT   rW   rX   r\   r^   r`   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   r   rm   rn   ro   rp   rq   rr   rs   rt   r   ru   rw   rx   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






c                 C   s   |   S r   )rt   xr   r   r   <lambda>      r   ) rT   rR   r\   andrw   rm   rs   rX   ri   rr   ro   rt   rq   rj   rp   rb   r`   rn   rx   orrc   rd   rW   rk   r^   r   r	   r
   r   r   rg   rh   rR   r   ru   rw   rs   rx   r   rT   rX   c                    s    fdd}|S )Nc                    s   t | d   S )NZ_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__rt   r   r   r	   r\   r^   r`   rm   rW   rh   rg   rc   rd   rn   ro   rp   rq   rr   r   c                 C   s   ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsr   )ar   r   r   r   r   _sympy_float_truedivf  s    r   c                 C   s   ddl m} || |S )Nr   )
IntTrueDiv)r   r   )r   r   r   r   r   r   _sympy_int_truedivl  s    r   c                 C   s   ddl m} || |S )Nr   )FloorDiv)r   r   )r   r   r   r   r   r   _sympy_floordivr  s    r   c                 C   s4   ddl m}m} | jr&|jr&|| |S || |S d S )Nr   Mod	PythonMod)r   r   r   is_nonnegative)r   r   r   r   r   r   r   
_sympy_modx  s    
r   c                 C   s   ddl m} || |S )Nr   )PowByNatural)r   r   )r   r   r   r   r   r   _sympy_pow_by_natural  s    r   c                 C   s   ddl m} || |S )Nr   )FloatPow)r   r   )r   r   r   r   r   r   _sympy_float_pow  s    r   c                 C   s   dd l }|| |S r7   )r8   Andr   r   r8   r   r   r   
_sympy_and  s    r   c                 C   s   dd l }|| |S r7   )r8   Orr   r   r   r   	_sympy_or  s    r   c                 C   s   ddl m} || |S )Nr   )LShift)r   r   )r   r   r   r   r   r   _sympy_lshift  s    r   c                 C   s   ddl m} || |S )Nr   )RShift)r   r   )r   r   r   r   r   r   _sympy_rshift  s    r   )r\   r^   r`   rb   rd   rc   r   r   rg   rh   ri   rj   rk   c                 C   s   dd l }t| |jrf| j}t|dkrft|d |jrf|d jrf||d }|d |krf||d  S t| |jr| || kst| |jr|| S || S )Nr      r   )r8   r.   ZMulargslenr9   rt   rE   )r   r   r8   ZaaZcoefr   r   r   _floor_ceil_helper  s    &


r   c                 C   s   ddl m} || S )Nr   )
FloorToInt)r   r   )r   r   r   r   r   _sympy_floor  s    r   c                 C   s   ddl m} || S )Nr   )
TruncToInt)r   r   )r   r   r   r   r   _sympy_trunc  s    r   c                 C   s   ddl m} || S )Nr   )	CeilToInt)r   r   )r   r   r   r   r   _sympy_ceil  s    r   c                 C   s   dd l }|| |S r7   )r8   Eqr   r   r   r   	_sympy_eq  s    r   c                 C   s   dd l }|| |S r7   )r8   Ner   r   r   r   	_sympy_ne  s    r   c                 C   s   dd l }|| |S r7   )r8   Gtr   r   r   r   	_sympy_gt  s    r   c                 C   s   dd l }|| |S r7   )r8   Ltr   r   r   r   	_sympy_lt  s    r   c                 C   s   dd l }|| |S r7   )r8   ZLer   r   r   r   	_sympy_le  s    r   c                 C   s   dd l }|| |S r7   )r8   ZGer   r   r   r   	_sympy_ge  s    r   c                 C   s   dd l }|| |S r7   )r8   ZMinr   r   r   r   
_sympy_min   s    r   c                 C   s   dd l }|| |S r7   )r8   Maxr   r   r   r   
_sympy_max  s    r   c                 C   s   dd l }||| f|dfS )Nr   T)r8   Z	Piecewise)r   r   fr8   r   r   r   
_sympy_ite  s    r   c                    s    fdd}|S )Nc                    s"   dd l }t|jjjd  | S )Nr   ZOpaqueUnaryFn_)r   r   utilsZ_sympyZ	functions)r   torchr   r   r   r     s    z_get_sym_math_fn.<locals>.fnr   r   r   r   r   _get_sym_math_fn  s    r   Z_sympy_c                 C   s   dd l }|| S r7   )r8   ZAbsr   r8   r   r   r   
_sympy_abs'  s    r   c                 C   s.   ddl m}m} |d kr || S || |S d S )Nr   )RoundDecimal
RoundToInt)r   r   r   )numberrV   r   r   r   r   r   _sympy_round-  s    r   c                 C   s   ddl m} || S Nr   )ToFloat)r   r  )r   r  r   r   r   _sympy_sym_float6  s    r  c                 C   s*   dd l }ddlm} |||| | S r  )r8   r   r  r   rs   )r   r8   r  r   r   r   _sympy_is_integer>  s    r  )r   rT   rm   rn   ro   rp   rq   rr   rs   rX   r   rw   rx   r   r
   r	   rR   rW   rt   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    r
  c                 C   s   dd l }t| }t||kr"|jS |j}|d}|D ]:}||| | |d||| |B M }|| | 9 }q6t|D ]}||| | |dO }qz|S Nr   r   )r8   r   r=   r<   rE   r   r  )r|   r}   	dim_orderr8   r	  r~   zdr   r   r   r  j  s    
*r  c                 C   s   t | |ddddgS Nr      r   r   r  r|   r}   r   r   r   $sympy_is_channels_last_contiguous_2d  s    r  c                 C   s   t | |dddddgS Nr      r  r   r   r  r  r   r   r   $sympy_is_channels_last_contiguous_3d  s    r  c                 C   s   dd l }t| }|t|kr"|jS |d}|j}|||d dM }|D ]X}||| | d|| |k@ M }|dkr||||d M }|| || | d }qJ|S r  )r8   r   r=   rE   r<   r   r   )r|   r}   r  r8   r	  mr0   r  r   r   r   &sympy_is_channels_last_strides_generic  s    
 	r  c                 C   s   t | |ddddgS r  r  r  r   r   r   !sympy_is_channels_last_strides_2d  s    r  c                 C   s   t | |dddddgS r  r  r  r   r   r   !sympy_is_channels_last_strides_3d  s    r  c                 C   s   ddl m} || | S )Nr   )!IsNonOverlappingAndDenseIndicator)r   r  )r|   r}   r  r   r   r   -_sympy_is_non_overlapping_and_dense_indicator  s    r  )r~   r   r   r   r   r   )r   r
   c                 C   sZ   t |tr|jS t|tkr&| |S t|tkr<| |S t|tkrR| 	|S t
S d S r   )r.   r/   rB   r"   r   rJ   r   rH   r   rI   NotImplemented)r'   rG   r   r   r   r     s    



r   c                 C   s\   t | tr| jd k	r| jS |  r*t| S |  r:t| S |  rJt| S t	d|  d S )Nzunrecognized return type )
r.   r   r%   r?   r   r@   r   rA   r   r#   r   r   r   r   	wrap_node  s    r  c                 C   s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r   r     s    c                    s   t d  tkr  d}n} fdd} fdd}tkr\ttd| | nhdkr fdd	}ttd| | n>d
krd fdd	}ttd| | nttd| | d S )N   r   c              	      s
  ddl m} t}d }| jd k	r:|jd k	r:|| j|j}t}|rh|d k	rht| |t| t|S t rt| t	|t| t|fi S t
|tstzdkrddlm}m} | j}| jjs|| jjdkr|jjs||jjdkr|| j|j}	n|| j|j}	n | j|j}	W n, tk
rP   td| j|j  Y nX ||	}	td | j|j|	 tkrt}
n4tkrt}
n$| jtks|jtkrt}
n| j}
|
d k	r|d k	rt
|ts|
|}| j || j!|j!f\}}t|	| j|
||dS )Nr   safe_expandrb   r   failed to eval %s(%s, %s)z%s %s %s -> %sr   )"r   r%  r   r    alternate_impl_if_hinted_methodsgetr   r  r   r   r.   r   r#   r   r   r   r    r(   r   Zbound_sympylowerr   r   r   sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r!   r/   _create_fx_call_functionr&   )r'   r[   r%  opout_hintZalternate_implr   r   r    outr!   r&   r   funcr"  r   r   binary_magic_impl  sj    
 
	

 
z+_make_node_magic.<locals>.binary_magic_implc           	         s  ddl m} t}t r2t| t|t| fi S | j}dksHdkrT| j	|}z |}W n$ t
k
r   td|  Y nX td || d }| jd k	r|| j}||}tkrt}n"tkrt}ntkrt}n| j}| j|| jf\}}t|| j|||dS )Nr   r$  rs   Zceilingzfailed to eval %s(%s)z%s %s -> %sr   )r   r%  r   r   r   r   r  r(   r    Z_simplify_floor_divr   r   r   r*  r+  r   always_int_magic_methodsr   r-  r   r,  r   r!   r.  r&   r   )	r'   r%  r/  r(   r1  r0  r!   r&   r   r2  r   r   unary_magic_implB  s4    

z*_make_node_magic.<locals>.unary_magic_implr	   c              
      s   ddl m} | jr|jn|j}t rHt| ttt| t|t|fi S z | j|j|j}W n. t	k
r   t
d| j|j|j  Y nX ||}| 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%  r0  r1  r&   r   r2  r   r   sym_ite_implh  sJ         z&_make_node_magic.<locals>.sym_ite_implrW   c              	      s   ddl m} tj}t r2t| t|t| |fi S | j}z ||}W n& t	k
rl   t
d||  Y nX ||}|d krt}n| j}d }| jd k	r|| j|}| jg}|d k	r|| | j|t|\}	}
t|| j|||	dS )Nr   r$  z!failed to eval %s(%s, ndigits=%s)r   )r   r%  builtinsrW   r   r   r   r  r(   r   r   r   r   r!   r   r&   appendr    r.  tupler   )r'   rV   r%  r/  r(   r1  r!   r0  r   r&   r   r2  r   r   
round_impl  s2     
	
z$_make_node_magic.<locals>.round_impl)N)r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )r"  r3  method_attrr4  r6  r:  r>  r   r2  r   _make_node_magic  s    J"&(rC  c                    sT    fdd}t td |  fdd}ttjt sPt tjt | 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k
r   t	d||  Y nX g }d }|D ]}	|	j
d kr q||	j
 qg }
|D ]}	|	j
d kr q|
|	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   s   g | ]
}|j qS r   rL   rD  r   r   r   rG    s     c                 S   s   g | ]
}|j qS r   rL   rD  r   r   r   rG    s     r&  Z
_indicator)r   sysmodulesr   r   r   r   r   r   r   r   r<  endswithr   r   r   r    )r'   r|   r}   r/  Z
size_exprsZstride_exprsr1  Z
size_hintsr0  rF  Zstride_hintsr!   r2  r   r   sizes_strides_impl  sB    


z4_make_node_sizes_strides.<locals>.sizes_strides_implr   c                    s   dd l ddlm} t| |D ]D t tr tt j	 fdd| D  fdd|D   S q dkrx|| |S t
fdd| D fdd|D S d S )	Nr   )!eval_is_non_overlapping_and_densec                    s   g | ]}t  j|qS r   r   rB   rE  r   r   r   r   rG    s     zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                    s   g | ]}t  j|qS r   rM  rN  rO  r   r   rG    s     r   c                    s   g | ]}  |qS r   ZsympifyrE  r   r8   r   r   rG    s     c                    s   g | ]}  |qS r   rP  rQ  rR  r   r   rG    s     )r8   r   rL  	itertoolschainr.   r   r  r   rB   r   )r|   r}   rL  r2  r   r   sizes_strides_user  s$    



z4_make_node_sizes_strides.<locals>.sizes_strides_user)rA  r   hasattrrH  rI  r   )r"  r3  rK  rU  r   r2  r   _make_node_sizes_strides  s
    +rW  c                    s~  t krd ntttttttf ddd dd tkrPdd nd	d fd
d fdd} fdd} fdd}t	krt
|d d| ntkrt|}t
|t|| ndkr fdd}t
|d d| nddkrHd fdd	}t
|d d| n2t
|d d| tkrzt
|d d| d S )Nr   r   c                 S   s8   t | tttfr| S t | tr,| jddS tdd S )Nr   r   z*expect to be called with constant SymBools)r.   r   r   r   r   rB   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   rB   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   rB   rH   r   r   r   r   r   promoteJ  s    
z!_make_user_magic.<locals>.promotec                 S   s   | S r   r   r   r   r   r   rY  R  s    c                    s\    dkr| |fS t | ttjf}t |ttjf}|s8|rT|sFt| } |sTt|}| |fS )N)r\   r^   r`   rb   rc   rg   ri   r   r
   rm   rn   ro   rp   rq   rr   )r.   r   r   r   r   )r'   r[   Zf_selfZf_otherr!  r   r   promote2U  s    

z"_make_user_magic.<locals>.promote2c                    s2   | } | r t  | S tt| j S r   )r   r  r   rB   r-   )rX  r   r"  rB  rY  r   r   r6    s    z*_make_user_magic.<locals>.unary_magic_implc                    s   t |ttttttfstS t	d| | | } |}| |\} }| rbt
 | |S |rr |}t| j|}|tkrtS tt| j|}|r |S |S )NzMAGIC %s %s %s)r.   r   r   r   r   r   r   r  r*  r+  r   r   rB   r  r   r'   r[   Z
other_noderetrX  r   r"  rB  rY  rZ  r   r   r4    s    z+_make_user_magic.<locals>.binary_magic_implc                    s   t |ttttttfstS | } |}| |\} }| rRt | |S |rb |}t	| j
|}|tkrztS tt|| j
}|r |S |S r   )r.   r   r   r   r   r   r   r  r   r   rB   r  r   r[  r]  r   r   rbinary_magic_impl  s    z,_make_user_magic.<locals>.rbinary_magic_impl__r	   c                    s~   | j }t||}t||}|tks*|tkr.tS t|trNt|trN|j|jksRttt| j ||}|j 	 rz |S |S r   )
rB   r   r  r.   r   r!   r#   r  r   r   )predry   rz   r7  r8  r9  r\  )rX  rB  r   r   sym_ite_magic_impl  s    


z,_make_user_magic.<locals>.sym_ite_magic_implrW   c                    s,   | rt  | |S tt| j|S r   )r;  rW   r  r   rB   rU   )rX  r   r"  r   r   round_magic_impl  s    z*_make_user_magic.<locals>.round_magic_impl__r)N)r?  r   r   r   r   r   r   r   bool_becomes_int_magic_methodsunary_magic_methodsrA  unary_nonmagic_methodsr   r   reflectable_magic_methods)r"  Z	user_typer6  r4  r^  origra  rb  r   r]  r   _make_user_magic  s4    !
*



ri  )N)r   r;  rS  loggingmathoperatorrH  	functoolsr   r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   Z(torch.fx.experimental._sym_dispatch_moder   r   r   r   	getLoggerr   r   Z_loggingZgetArtifactLoggerr*  __all__r/   r   r   rT   rR   r\   re   rw   rm   rs   rX   r   rr   ro   rq   rj   rp   rb   r`   rn   rx   rf   r   rW   rk   r^   r   r   re  r   Zmath_op_namesr   Zsym_nameZpriv_sym_namerA  r   r<  rf  r@  Zonly_bool_magic_methodsrd  Zalso_bool_magic_methodsZbool_magic_methodsZonly_float_magic_methodsr?  r,  r5  r-  r   r   r   r   r   r   r   r   r   r   rg  r   r   r   r   r   r   r   r   r   r   r   r   r   rI  Zcurrent_moduler   Zpriv_sympy_namer   r   r   r   r  r  invertr   r
  r  r  r  r  r  r  r  Zsizes_strides_methodsminmaxr'  r   r  r   rC  rW  itemsr"  r3  ri  r   r   r   r   <module>   s  
(


   +$





	
	

		
&	 OR 5





