o
    Hh                     @  s  d dl m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Zd dl	Z	d dlm
Z
mZ d dlmZmZmZ d dlZd dlm  m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 erhd dlmZ e e!Z"ej#e!dZ$g d	Z%d d
l&m'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j0dej1dej2dej3dej4dej5ddd dej6dej7d ej8d!ej9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jAd,ed-ed.ed/ed0ed1ejBd2ejBZCh d3ZDd4d5 ZEd6ZFeFD ]&ZGd7eG ZHd8eH ZIeJe*eHeEeG eKeeIeCeH< eD-eH e%LeH qdhZMeDeMB ZNh d9ZOh d:ZPdhZQeOeQB ZRh d;ZSdd%hZTdd%d<ZUh d=ZVeFD ]ZGd7eG ZHeV-eH qmh d>ZWh d?ZXd@dA ZYdBdC ZZdDdE Z[dFdG Z\dHdI Z]dJdK Z^dLdM Z_dNdO Z`dPdQ ZadRdS ZbdTdU Zc	VddWdXZddYdZ Zed[d\ ZfedejAej:e\e]e^e_eee`efeYeZe[eaebd]Zgd^d_ Zhd`da Zidbdc Zjddde Zkdfdg Zldhdi Zmdjdk Zndldm Zodndo Zpdpdq Zqdrds Zrdtdu Zsdvdw Zte	jue! Zvdxdy ZweFD ]ZGdzeG ZxeweGZyex ey_zey_!eJevexey q[y[G[xd{d| Z{dd}d~Z|dd Z}dd Z~i egi d0ejdej+deld#emdend eodepdeqdeidejd,e}dekd$ej<d/erd.esd-etde{e|e~dZeFD ]ZGd7eG ZHeKevdzeG eeH< q[G[H[F[vdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeeeeeedZejejdZdd Zdd Zdd Zdd Zdd Ze D ]
\ZZeee qe D ]
\ZZeee qdd Ze D ];\ZZeeOv reee qeeSv reee qeeQv s'eePv r,eee eee eeUvr;eee q[[dS )    )annotationsN)	lru_cacheupdate_wrapper)OptionalTYPE_CHECKINGUnion)	sym_floatsym_itesym_maxsym_minsym_notSymBoolSymFloatSymInt)dtrace_structured)ShapeEnvsym_node)SymNodemethod_to_operatormagic_methods)py_sym_typesc                 C  s(   | t u rtS | tu rtS | tu rtS | S N)boolr   intr   floatr   )t r   R/var/www/vscode/kcb/lib/python3.10/site-packages/torch/fx/experimental/sym_node.py_to_symtype:   s   r   c                   @  s(  e Zd ZU dZdZded< 			dddd	ZdddZdddZdddZ	e
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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zdd:d;Zdd<d=Zdd>d?Zddd@dAZ ddBdCZ!ddDdEZ"ddFdGZ#ddHdIZ$ddJdKZ%ddLdMZ&ddNdOZ'ddPdQZ(ddRdSZ)ddTdUZ*ddVdWZ+ddXdYZ,ddZd[Z-dd\d]Z.dd^d_Z/dd`daZ0ddbdcZ1ddddeZ2ddfdgZ3ddhdiZ4ddjdkZ5ddldmZ6ddndoZ7ddpdqZ8ddrdsZ9ddtduZ:ddvdwZ;ddxdyZ<ddzd{Z=dd|d}Z>dd~dZ?dddZ@dddZAdddZBdddZCdddZDdd ZEdd ZFdd ZGdd ZHdd ZIdddZJdd ZKdd ZLdd ZMdddZNdddZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYd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.
    Fr   _optimized_summationNhint!Optional[Union[int, float, bool]]c                   s   | _ | _| _| _ fdd}|d urMt||u s0t|t|u s0J d| dt|  jrL jjrL| }	||	ksLJ | d|	 d j dn| }| _| _	 jo\ jj}
|
o`| _
d S )Nc                    sP   ddl m}  |  jrd S  jj jdd}|d ur&t|ts$ |n|}|S )Nr   )has_free_unbacked_symbolsT)compute_hint)%torch.fx.experimental.symbolic_shapesr"   expr	shape_env_maybe_evaluate_static
isinstanceSymTypespytype)r"   r    selfr   r   r#      s   
z&SymNode.__init__.<locals>.compute_hintzCannot create SymNode of type z  with incompatible hint of type z != z (for ))_exprr&   r*   r   typer   _translation_validation_enabledr%   _hintconstantfx_node)r,   r%   r&   r*   r    r2   r3   optimized_summationr#   computed_hinttx_validation_enr   r+   r   __init__V   s2   

zSymNode.__init__r&   r   returnc                 C  s   t | j|| j| j| j| jS r   )r   r.   r*   r1   r2   r3   )r,   r&   r   r   r   with_shape_env   s   zSymNode.with_shape_envotherc                 C  s<   | j |j ko| j|jko| j|jko| j|jko| j|jkS r   )r.   r*   r1   r2   r3   r,   r:   r   r   r   	_value_eq   s   



zSymNode._value_eqr   c                 C  s   t | j| j| j| j| jfS r   )hashr.   r*   r1   r2   r3   r+   r   r   r   _value_hash   s   zSymNode._value_hashc                 C  s   | j | jS r   )r&   replacer.   r+   r   r   r   r%      s   zSymNode.exprc                 C  s   | j S r   r1   r+   r   r   r   r       s   zSymNode.hintc                 C  s
   | j d uS r   r@   r+   r   r   r   has_hint      
zSymNode.has_hintc                   s`   ddl m}  jd u r-|d ur&| j fdd jjD } j|S  j jS  jS )Nr   free_unbacked_symbolsc                   s&   i | ]}||v rd n j j| qS )i   )r&   
var_to_val.0sr,   unbacked_symbolsr   r   
<dictcomp>   s    z(SymNode.require_hint.<locals>.<dictcomp>)r$   rD   r1   r%   free_symbolsxreplacer&   	size_hint)r,   fallbackrD   replacementsr   rI   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   )sympyr(   r%   Floatr   r,   rU   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)rU   r%   truefalserW   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   rB   zSymNode.is_intc                 C  r\   r   )r*   r   r+   r   r   r   is_float   rB   zSymNode.is_floatc                 C  r\   r   )r*   r   r+   r   r   r   is_bool   rB   zSymNode.is_boolc                 C  s"   | j d uot| j to| j j S r   )r1   r(   r   nodeis_nested_intr+   r   r   r   ra      s
   


zSymNode.is_nested_intc                 C  4   t |tu sJ dd l}t||| jt|||dS Nr   )r2   r3   )r/   r   rU   r   Integerr&   r,   numrU   r   r   r   wrap_int  
   zSymNode.wrap_intc                 C  rb   rc   )r/   r   rU   r   rV   r&   re   r   r   r   
wrap_float  rh   zSymNode.wrap_floatc                 C  s:   t |tu sJ dd l}t|r|jn|j| jt|||dS rc   )r/   r   rU   r   rY   rZ   r&   re   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   ro   r+   r   r   r   __str__+  rp   zSymNode.__str__c                 C  s   d| j  d| j d| j g}| jd ur|d| j  | jd ur+|d| j  | jd ur9|d| j  d|d S )	NzSymNode(z, shape_env=z	, pytype=zhint=z	constant=zfx_node=z, r-   )r.   r&   r*   r1   appendr2   r3   join)r,   repr   r   r   __repr__.  s   


zSymNode.__repr__builtins.strc                 C  rq   r   rr   r+   r   r   r   _graph_repr:  s   zSymNode._graph_reprc                 C  rq   r   )_absr+   r   r   r   abs@  rp   zSymNode.absc                 C  rq   r   )_posr+   r   r   r   posC  rp   zSymNode.posc                 C  
   |  |S r   )_roundr,   ndigitsr   r   r   roundF  rB   zSymNode.roundc                 C  rq   r   )_truncr+   r   r   r   truncI  rp   zSymNode.truncc                 C  r~   r   )_addr;   r   r   r   addL  rB   zSymNode.addc                 C  r~   r   )_subr;   r   r   r   subO  rB   zSymNode.subc                 C  r~   r   )_mulr;   r   r   r   mulR  rB   zSymNode.mulc                 C  r~   r   )_modr;   r   r   r   modU  rB   zSymNode.modc                 C  r~   r   )
_float_powr;   r   r   r   	float_powX  rB   zSymNode.float_powc                 C  r~   r   )_pow_by_naturalr;   r   r   r   pow_by_natural[  rB   zSymNode.pow_by_naturalc                 C  r~   r   )_and_r;   r   r   r   and_^  rB   zSymNode.and_c                 C  r~   r   )_or_r;   r   r   r   or_a  rB   zSymNode.or_c                 C  r~   r   )_float_truedivr;   r   r   r   float_truedivd  rB   zSymNode.float_truedivc                 C  r~   r   )_int_truedivr;   r   r   r   int_truedivg  rB   zSymNode.int_truedivc                 C  r~   r   )_int_floordivr;   r   r   r   int_floordivj  rB   zSymNode.int_floordivc                 C  r~   r   )_lshiftr;   r   r   r   lshiftm  rB   zSymNode.lshiftc                 C  r~   r   )_rshiftr;   r   r   r   rshiftp  rB   zSymNode.rshiftc                 C  rq   r   )_sym_notr+   r   r   r   r   s  rp   zSymNode.sym_notc                 C  r~   r   )_eqr;   r   r   r   eqv  rB   z
SymNode.eqc                 C  r~   r   )_ner;   r   r   r   ney  rB   z
SymNode.nec                 C  r~   r   )_gtr;   r   r   r   gt|  rB   z
SymNode.gtc                 C  r~   r   )_ltr;   r   r   r   lt  rB   z
SymNode.ltc                 C  r~   r   )_ler;   r   r   r   le  rB   z
SymNode.lec                 C  r~   r   )_ger;   r   r   r   ge  rB   z
SymNode.gec                 C  rq   r   )_floorr+   r   r   r   floor  rp   zSymNode.floorc                 C  rq   r   )_is_integerr+   r   r   r   
is_integer  rp   zSymNode.is_integerc                 C  rq   r   )
_sym_floatr+   r   r   r   r     rp   zSymNode.sym_floatc                 C  rq   r   )_sym_intr+   r   r   r   sym_int  rp   zSymNode.sym_intc                 C  rq   r   )_ceilr+   r   r   r   ceil  rp   zSymNode.ceilc                 C  rq   r   )_negr+   r   r   r   neg  rp   zSymNode.negc                 C  r~   r   )_sym_minr;   r   r   r   r     rB   zSymNode.sym_minc                 C  r~   r   )_sym_maxr;   r   r   r   r
     rB   zSymNode.sym_maxc                 C     |  ||S r   )_sym_ite)r,   then_valelse_valr   r   r   r	        zSymNode.sym_itec                 C  r   r   )_is_contiguousr,   sizesstridesr   r   r   is_contiguous  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_2d  r   z#SymNode.is_channels_last_strides_2dc                 C  r   r   )_is_channels_last_strides_3dr   r   r   r   is_channels_last_strides_3d  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_indicator  r   z.SymNode.is_non_overlapping_and_dense_indicatorc                 C  r~   r   )r   r;   r   r   r   sym_or  rB   zSymNode.sym_orc                 C  r~   r   )r   r;   r   r   r   sym_and  rB   zSymNode.sym_andc                 C  r~   r   )_bitwise_andr;   r   r   r   bitwise_and  rB   zSymNode.bitwise_andc                 C  r~   r   )_bitwise_orr;   r   r   r   
bitwise_or  rB   zSymNode.bitwise_orc                 C  r~   r   )r   r;   r   r   r   truediv  rB   zSymNode.truedivc                 C  r~   r   )r   r;   r   r   r   floordiv  rB   zSymNode.floordivc                 C  r~   r   )r   r;   r   r   r   pow  rB   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  s   dd l }ddlm}m} | r!t| |tjtdd |D fi S dd |D }|j| }g }d }|D ]}	|	j	d u r< n|
|	j	 q3t|}| jtjtdd |D f\}
}t|| jt||
dS )	Nr   get_proxy_modehandle_sym_dispatchc                 s  s    | ]}t |V  qd S r   	wrap_noderG   ar   r   r   	<genexpr>  s    z"SymNode.sym_sum.<locals>.<genexpr>c                 S     g | ]}|j qS r   rn   r   r   r   r   
<listcomp>      z#SymNode.sym_sum.<locals>.<listcomp>c                 s  s    | ]}|j V  qd S r   r3   r   r   r   r   r     s    r   )rU   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr    rt   sumr&   _create_fx_call_functionr   r   )r,   argsrU   r   r   exprsout
size_hintsout_hintr   r3   _r   r   r   r     s0   

zSymNode.sym_sumc                 C  s   | j | |S r   )r&   evaluate_sym_node)r,   size_obliviousr   r   r   evaluate  s   zSymNode.evaluatec                 C  0   |   }zt|W S  ty   td|  w )NzFailed to convert to int: %s)r   r   	Exceptionlogwarningr,   filelinerr   r   r   r        
zSymNode.guard_intc                 C  r   )NzFailed to convert to float: %s)r   r   r   r   r   r   r   r   r   guard_float  r  zSymNode.guard_floatc                 C  r   )NFailed to convert to bool: %s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   rC   :r   )	r$   rD   rA   r%   r&   +prefer_deferred_runtime_asserts_over_guardsr  defer_runtime_assertr3   )r,   r   r   rD   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   rg   r
  rA   r   )r,   r   r   r  br  r   r   r   expect_size1  s   zSymNode.expect_sizec                 C  s4   | j dd}zt|W S  ty   td|  w )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   r  r  r   r   r   r   guard_size_oblivious?  s   
zSymNode.guard_size_obliviousc                 C  r   r   )r  r+   r   r   r   bool_S  r   zSymNode.bool_c                 C     dS )NTr   r+   r   r   r   is_symbolicV  rm   zSymNode.is_symbolicc                 C  s   d S r   r   r+   r   r   r   
nested_intY  rm   zSymNode.nested_intc                 C  r  )NFr   r+   r   r   r   is_constant\  rm   zSymNode.is_constant)NNF)r    r!   )r&   r   r8   r   )r:   r   r8   r   )r8   r   r   )r8   rx   )r8   r   )F)Z__name__
__module____qualname____doc__r   __annotations__r7   r9   r<   r>   propertyr%   r    rA   rQ   rS   rX   r[   r]   r^   r_   ra   rg   ri   rj   rl   ro   rs   rw   ry   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   r   r   r  r  r
  r  r  r  r  r  r  r   r   r   r   r   G   s   
 
R
















































%


r   r}   r{   r   andr   r   r   r   r   r   r   r   r   c                 C  rq   r   )r   xr   r   r   <lambda>n  s    r  r   r   r   r   r   r   r   orr   r   r   r   r   r   r   r	   r
   r   r   r   r   >	   r{   r   r}   r   r   r   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log2sym_r   >   r  r  r	   r   >   r   r   r   >   r   r   sym_log2r   )r   r   >   r   r   r   r   >   r   r   r   r   >   r   r   r   r   r   r   r  r  r   r   r   c                 C     ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsr5  )r   r  r5  r   r   r   _sympy_float_truediv     
r7  c                 C  r4  )Nr   )
IntTrueDiv)r6  r9  )r   r  r9  r   r   r   _sympy_int_truediv  r8  r:  c                 C  r4  )Nr   )FloorDiv)r6  r;  )r   r  r;  r   r   r   _sympy_floordiv  r8  r<  c                 C  s0   ddl m}m} | jr|jr|| |S || |S )Nr   Mod	PythonMod)r6  r>  r?  is_nonnegative)r   r  r>  r?  r   r   r   
_sympy_mod  s   

rA  c                 C  r4  )Nr   )PowByNatural)r6  rB  )r   r  rB  r   r   r   _sympy_pow_by_natural  r8  rC  c                 C  r4  )Nr   )FloatPow)r6  rD  )r   r  rD  r   r   r   _sympy_float_pow  r8  rE  c                 C     dd l }|| |S rT   )rU   Andr   r  rU   r   r   r   
_sympy_and     rI  c                 C  rF  rT   )rU   OrrH  r   r   r   	_sympy_or  rJ  rL  c                 C  r4  )Nr   )LShift)r6  rM  )r   r  rM  r   r   r   _sympy_lshift  r8  rN  c                 C  r4  )Nr   )RShift)r6  rO  )r   r  rO  r   r   r   _sympy_rshift  r8  rP  c                 C  s   t | dkr	|gS ddlm}m} || d ||k r | |g S || d ||kr/|g|  S dt | d }}||kra|| d }|| | |}|dkrPdS |dk rY|d }n|d }||ks<| || | S )zs
    If new_arg is found in ordered_args None is returned, else the new
    ordered_args with new_arg inserted
    r   )_args_sortkeyBasicr      N)lensympy.core.basicrQ  rR  compareinsert)ordered_argsnew_argsort_keyrR  lowhighmidcompare_resultr   r   r   _binary_search_insert_arg%  s&   



r`  Fc           	        s  ddl  ddlm}  fdd}ddlm} ||| O }|||O }|rR|rR|| jd ||jd k r<|| j|j S || jd ||jd krR||j| j S |rg|jrgtt| j|}|durg||S |r|| jr|tt|j| }|dur|||S  	| |}|||fS )a  
    Custom optimization for Add used to optimize incremental binary summations of certain properties. The idea
    is when we know the expression is a summation of unique symbols all we need to know is the correct order of symbols,
    and no other optimizations are needed. We pass evaluate=false, with the correct order of args and save the following.
    1. Avoid running other optimizations when the Add is constructed.
    2. Manually figure out the order of the args for the new expression in log(n) comparisons instead of nLog(n)
    (comparing terms is expensive and shows in the profiles).
    The function returns a tuple of (1) a boolean that indicates whether the output is a summation of unique symbols,
    (2) the result sympy expression.
    r   N)rQ  c                   s    j | ddi}d|fS )Nr   FT)r   )rY  resultrU   r   r   make_optimizedW  s   z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationrS  )
rU   rV  rQ  r6  rd  _args	is_symbolr`  listr   )	lhsrhslhs_is_optimized_summationrhs_is_optimized_summationsortkeyrc  rd  new_argsra  r   rb  r   _optimized_addG  s*   

rn  c                 C  r4  )Nr   )BitwiseFn_bitwise_and)r6  ro  )r   r  ro  r   r   r   r   x  r8  r   c                 C  r4  )Nr   )BitwiseFn_bitwise_or)r6  rp  )r   r  rp  r   r   r   r   ~  r8  r   )r   r   r   r   r   r   r  r   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   rT  r   )rU   r(   Mulr   rU  rV   r   rd   )r   r$  rU   aacoefr   r   r   _floor_ceil_helper  s   &


rt  c                 C     ddl m} || S )Nr   )
FloorToInt)r6  rv  )r   rv  r   r   r   _sympy_floor     rw  c                 C  ru  )Nr   )
TruncToInt)r6  ry  )r   ry  r   r   r   _sympy_trunc  rx  rz  c                 C  ru  )Nr   )	CeilToInt)r6  r{  )r   r{  r   r   r   _sympy_ceil  rx  r|  c                 C  rF  rT   )rU   EqrH  r   r   r   	_sympy_eq  rJ  r~  c                 C  rF  rT   )rU   NerH  r   r   r   	_sympy_ne  rJ  r  c                 C  rF  rT   )rU   GtrH  r   r   r   	_sympy_gt  rJ  r  c                 C  rF  rT   )rU   LtrH  r   r   r   	_sympy_lt  rJ  r  c                 C  rF  rT   )rU   LerH  r   r   r   	_sympy_le  rJ  r  c                 C  rF  rT   )rU   GerH  r   r   r   	_sympy_ge  rJ  r  c                 C  r4  )Nr   )Min)r6  r  )r   r  r  r   r   r   
_sympy_min  r8  r  c                 C  r4  )Nr   Max)r6  r  )r   r  r  r   r   r   
_sympy_max  r8  r  c                 C  s   dd l }||| f|dfS )Nr   T)rU   	Piecewise)r   r   frU   r   r   r   
_sympy_ite  s   r  c                   r  )Nc                   s"   dd l }t|jjjd  | S )Nr   OpaqueUnaryFn_)r6  r!  utils_sympy	functions)r   r   r"  r   r   r$    s   z_get_sym_math_fn.<locals>.fnr   r%  r   r"  r   _get_sym_math_fn  s   r  _sympy_c                 C  s   dd l }|| S rT   )rU   Absr   rU   r   r   r   
_sympy_abs  s   
r  c                 C  s*   ddl m}m} |d u r|| S || |S )Nr   )RoundDecimal
RoundToInt)r6  r  r  )numberr   r  r  r   r   r   _sympy_round  s   
r  c                 C  ru  Nr   )ToFloat)r6  r  )r   r  r   r   r   _sympy_sym_float  s   r  c                 C  s*   dd l }ddlm} |||| | S r  )rU   r6  r  r}  r   )r   rU   r  r   r   r   _sympy_is_integer  s   r  )r   r   c                 C  s$   t | }t| |tt|d ddS )Nr   rS  )rU  sympy_is_contiguous_genericrg  range)r   r   dimr   r   r   sympy_is_contiguousF  s   r  c                 C  s   dd l }t| }t||kr|jS |j}|jj}|D ]}||| | |jj||| |B M }|| | 9 }qt|D ]}||| | |jjO }q;|S rT   )	rU   rU  rZ   rY   SOner}  r  Zero)r   r   	dim_orderrU   r  r   zdr   r   r   r  K  s   (r  c                 C     t | |g dS N)r      rT  r   r  r   r   r   r   r   $sympy_is_channels_last_contiguous_2dc     r  c                 C  r  N)r      r  rT  r   r  r  r   r   r   $sympy_is_channels_last_contiguous_3dg  r  r  c           	      C  s   dd l }ddlm} t| }|t|kr|jS |jj}|j}|||d dM }|D ]+}||| | d|| |k@ M }|dkrJ||||d M }|| || | d }q*|S )Nr   r  r   )	rU   r6  r  rU  rZ   r  r  rY   r  )	r   r   r  rU   r  r  mr  r  r   r   r   &sympy_is_channels_last_strides_generick  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)r6  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  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)   r`   r/   r   rj   r   rg   r   ri   NotImplemented)r,   rf   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   r2   r]   r   r^   r   r_   r   AssertionErrorr  r   r   r   r     s   r   c                 C  s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r   r     rp   r   c           	        s   t d  tv r d}n}ddd}fdd}| fd	d
}| fdd}tv r>ttd| | d S dkrT fdd}ttd| | d S dkrkd fdd	}ttd| | d S ttd| | d S )N   r   r8   set[str]c                  S  sJ   dd l } | jj| jj| jjj| g}dd l} dd |D | jj	 B dhB S )Nr   c                 S  s   h | ]}t |qS r   )inspectgetfile)rG   r  r   r   r   	<setcomp>      z@_make_node_magic.<locals>.uninteresting_files.<locals>.<setcomp>z<string>)
r   _dynamo
eval_framer  fxexperimentalr   torch._dynamo.guardsguardsuninteresting_files)r   modsr   r   r   r    s   
z-_make_node_magic.<locals>.uninteresting_filesc                   s   t  d fdd	}|S )Nc                   sj   |d u r	| n| |t jjjr3|d ur| |g n| g d	fddtd fddd S )
Nr8   Optional[int]c                   s`   dd l }| jd urd S t| t krd S t| j|j|jfr!d S | j|j|jfv r,d S t| S rT   )	rU   r2   idr(   r%   rd   rV   rY   rZ   )r   rU   )ra  r   r   get_id  s   
zM_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.get_idexpression_createdc                	     s@   t tdd  D fdd D tdtddS )Nc                 S     g | ]}t |qS r   rr   r   r   r   r   r         zc_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>.<locals>.<listcomp>c                   s    g | ]} |d ur |qS r   r   )rG   i)r  r   r   r     s    r  )r  ra  	result_id	argumentsargument_ids
user_stackstack)ro   r  
structuredget_user_stackget_framework_stackr   )r  r  r  ra  r   r   r  	  s   
zO_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>)metadata_fn)r8   r  )r   _logging	_internalGET_DTRACE_STRUCTUREDr   r;   )r$  r  )r  r  ra  r   wrapper  s   



z=_make_node_magic.<locals>.capture_provenance.<locals>.wrapperr   )	functoolswraps)r$  r  r  )r$  r   capture_provenance  s   *z,_make_node_magic.<locals>.capture_provenancec              	     s  ddl m}m} t}d }| jd ur|jd ur|| j|j}t}|r6|d ur6t| |t| t|S | rHt| ||t| t|fi S t	|t
sOJ d}zTdkrddlm}m}	 | j}
| jjsn|
| jjdkr|jjs{|
|jjdkr|| j|j}n!|	| j|j}ndkr | j|j| 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   r   Fr   r=  r   failed to eval %s(%s, %s)z%s %s %s -> %s)r3   r4   )!r   r   r   r   r     alternate_impl_if_hinted_methodsgetr   r   r(   r   r6  r>  r?  r&   r%   r@  bound_sympylowerr   r   r   r   sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r*   r)   r   r3   )r,   r:   r   r   opr   alternate_implr4   r>  r?  r&   r   r*   r3   r   ra  funcr  r   r   binary_magic_impl  s   

	z+_make_node_magic.<locals>.binary_magic_implc           
        s  ddl m}m} t}| rt| ||t| fi S | j}dks&dkr,| j|}z |}W n t	yA   t
d|  w td || d }| jd urV|| j}tv r]t}ntv rdt}n
tv rkt}n| j}| j|| jf\}}	t|| j|||dS )Nr   r   r   ceilingzfailed to eval %s(%s)z%s %s -> %sr   )r   r   r   r   r   r   r%   r&   _simplify_floor_divr   r   r   r  r  r    always_int_magic_methodsr   r  r   r  r   r*   r   r3   r   )
r,   r   r   r  r%   r   r   r*   r3   r   r  r   r   unary_magic_imply  s4   

z*_make_node_magic.<locals>.unary_magic_implr	   c           	   
     s   ddl m}m} | jr|jn|j}| r&t| |tt| t|t|fi S z | j|j|j}W n tyE   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   r3   r   r*   )		pred_node	then_node	else_noder   r   r   r   r3   r   r  r   r   sym_ite_impl  s@   
z&_make_node_magic.<locals>.sym_ite_implr   c              	     s   ddl m}m} tj}| rt| ||t| |fi S | j}z ||}W n ty5   t	
d||  w |d u r=t}n| j}d }| jd urM|| j|}| jg}	|d urZ|	| | j|t|	\}
}t|| j|||
dS )Nr   r   z!failed to eval %s(%s, ndigits=%s)r   )r   r   r   builtinsr   r   r   r%   r   r   r   r   r*   r    r3   rt   r&   r   r   r   )r,   r   r   r   r  r%   r   r*   r   r   r3   r   r  r   r   
round_impl  s0   
	
z$_make_node_magic.<locals>.round_impl)r8   r  r   )r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )	r  r  method_attrr  r  r  r  r  r  r   r  r   _make_node_magic  s&   
.^$()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  ddl m}m} ttjt }| r(t| ||dd |D dd |D fi S dd |D }dd |D }z ||}W n tyM   t	
d||  w g }	d }
|D ]}|jd u r] n |	|j qTg }|D ]}|jd u rq n||j qh||	|}
drt}nt}t|| j||
S )	Nr   r   c                 S  r  r   r   rF   r   r   r   r   
  r  zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  r   r   rn   rF   r   r   r   r     r   c                 S  r   r   rn   rF   r   r   r   r     r   r  
_indicator)r   r   r   r!  sysmodulesr  r   r   r   r   r    rt   endswithr   r   r   r&   )r,   r   r   r   r   r  
size_exprsstride_exprsr   r   r   rH   stride_hintsr*   r  r   r   sizes_strides_impl  sF   



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`   rG   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   sympifyr   rb  r   r   r   H  r  c                   r  r   r  r   rb  r   r   r   I  r  )rU   r$   r  	itertoolschainr(   r   r   r!  r`   r   )r   r   r  r  r  r   sizes_strides_user3  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   0r  c           	        s  t v r
d nd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 rXt|d d| d S tv rlt|}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v rt }t|d| d| tv rt|d| d| d S d S )Nr2  r  2Union[SymInt, int, SymFloat, float, SymBool, bool]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_constantb  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  i  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`   rg   r   r  r   r   r   promote  s   
z!_make_user_magic.<locals>.promotec                 S  rk   r   r   r  r   r   r   r    rm   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)r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   )r(   r   r   r   r   )r,   r:   f_selff_otherr  r   r   promote2  s   

z"_make_user_magic.<locals>.promote2c                   s2   | } | rt  | S tt| j S r   )r   r   r!  r`   r+   )r  r  r  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)r(   r   r   r   r   r   r   r  r  r  r   r   r`   r   r!  r,   r:   
other_noderetr  r  r  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   )r(   r   r   r   r   r   r   r  r   r   r`   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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  )predr   r   r  r  r  r"  )r  r  r   r   sym_ite_magic_impl  s   

z,_make_user_magic.<locals>.sym_ite_magic_implr   c                   s,   | rt  | |S tt| j|S r   )r  r   r   r!  r`   r   )r  r  r  r   r   round_magic_impl   s   z*_make_user_magic.<locals>.round_magic_impl__r)r  r  r   )	r  bool_becomes_int_magic_methodsunary_magic_methodsr  unary_nonmagic_methodsr!  r   bitwise_opsreflectable_magic_methods)	r  	user_typer  r  r$  origr'  r(  method_namer   r#  r   _make_user_magicY  s<   
!
*
r2  )FFr   )
__future__r   r  r  r  r  loggingmathoperatorr  r   r   typingr   r   r   r   torch._logging.structuredr  r  r   r	   r
   r   r   r   r   r   torch._loggingr   r$   r   	getLoggerr  r   getArtifactLoggerr  __all__torch.typesr   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&  math_op_namesr#  sym_namepriv_sym_namer  r!  rt   r,  r   only_bool_magic_methodsr*  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr  r-  r  r  r  r7  r:  r<  rA  rC  rE  rI  rL  rN  rP  r`  rn  r   r   r.  rt  rw  rz  r|  r~  r  r  r  r  r  r  r  r  r  current_moduler  priv_sympy_namer$  r  r  r  r  r  invertr   r  r  r  r  r  r  r  r  sizes_strides_methodsminmaxr  r   r   r   r  r  itemsr  r  r2  r   r   r   r   <module>   s  (

    	
 !"%



	#
1
	

		

(	  *W 8







