o
    Zh                     @  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   M/var/www/auris/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_envZ_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   Z_translation_validation_enabledr%   _hintconstantfx_node)r+   r%   r&   r)   r    r0   r1   optimized_summationr#   Zcomputed_hintZ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)   r/   r0   r1   )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)   r/   r0   r1   r+   r6   r   r   r   	_value_eq   s   



zSymNode._value_eqr   c                 C  s   t | j| j| j| j| jfS r   )hashr-   r)   r/   r0   r1   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   r/   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&   Z
var_to_val.0sr+   Zunbacked_symbolsr   r   
<dictcomp>   s    z(SymNode.require_hint.<locals>.<dictcomp>)r$   r@   r/   r%   Zfree_symbolsZxreplacer&   Z	size_hint)r+   fallbackr@   Zreplacementsr   rD   r   require_hint   s   


zSymNode.require_hintc                 C  s   | j jr	t| j S d S r   )r%   Z	is_numberr   r*   r   r   r   maybe_as_int   s   
zSymNode.maybe_as_intc                 C  s$   dd l }t| j|jrt| jS d S Nr   )sympyr'   r%   Floatr   r+   rJ   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)rJ   r%   truefalserL   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   r>   zSymNode.is_intc                 C  rQ   r   )r)   r   r*   r   r   r   is_float   r>   zSymNode.is_floatc                 C  rQ   r   )r)   r   r*   r   r   r   is_bool   r>   zSymNode.is_boolc                 C  s"   | j d uot| j to| j j S r   )r/   r'   r   nodeis_nested_intr*   r   r   r   rV      s
   


zSymNode.is_nested_intc                 C  4   t |tu sJ dd l}t||| jt|||dS Nr   )r0   r1   )r.   r   rJ   r   Integerr&   r+   numrJ   r   r   r   wrap_int  
   zSymNode.wrap_intc                 C  rW   rX   )r.   r   rJ   r   rK   r&   rZ   r   r   r   
wrap_float  r]   zSymNode.wrap_floatc                 C  s:   t |tu sJ dd l}t|r|jn|j| jt|||dS rX   )r.   r   rJ   r   rN   rO   r&   rZ   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   rd   r*   r   r   r   __str__+  re   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)   r/   appendr0   r1   join)r+   repr   r   r   __repr__.  s   


zSymNode.__repr__builtins.strc                 C  rf   r   rg   r*   r   r   r   _graph_repr:  s   zSymNode._graph_reprc                 C  rf   r   )_absr*   r   r   r   abs@  re   zSymNode.absc                 C  rf   r   )_posr*   r   r   r   posC  re   zSymNode.posc                 C  
   |  |S r   )Z_roundr+   ndigitsr   r   r   roundF  r>   zSymNode.roundc                 C  rf   r   )Z_truncr*   r   r   r   truncI  re   zSymNode.truncc                 C  rs   r   )_addr7   r   r   r   addL  r>   zSymNode.addc                 C  rs   r   )_subr7   r   r   r   subO  r>   zSymNode.subc                 C  rs   r   )_mulr7   r   r   r   mulR  r>   zSymNode.mulc                 C  rs   r   )_modr7   r   r   r   modU  r>   zSymNode.modc                 C  rs   r   )Z
_float_powr7   r   r   r   	float_powX  r>   zSymNode.float_powc                 C  rs   r   )Z_pow_by_naturalr7   r   r   r   pow_by_natural[  r>   zSymNode.pow_by_naturalc                 C  rs   r   )Z_and_r7   r   r   r   and_^  r>   zSymNode.and_c                 C  rs   r   )Z_or_r7   r   r   r   or_a  r>   zSymNode.or_c                 C  rs   r   )Z_float_truedivr7   r   r   r   float_truedivd  r>   zSymNode.float_truedivc                 C  rs   r   )Z_int_truedivr7   r   r   r   int_truedivg  r>   zSymNode.int_truedivc                 C  rs   r   )Z_int_floordivr7   r   r   r   int_floordivj  r>   zSymNode.int_floordivc                 C  rs   r   )Z_lshiftr7   r   r   r   lshiftm  r>   zSymNode.lshiftc                 C  rs   r   )Z_rshiftr7   r   r   r   rshiftp  r>   zSymNode.rshiftc                 C  rf   r   )Z_sym_notr*   r   r   r   r   s  re   zSymNode.sym_notc                 C  rs   r   )_eqr7   r   r   r   eqv  r>   z
SymNode.eqc                 C  rs   r   )Z_ner7   r   r   r   ney  r>   z
SymNode.nec                 C  rs   r   )Z_gtr7   r   r   r   gt|  r>   z
SymNode.gtc                 C  rs   r   )Z_ltr7   r   r   r   lt  r>   z
SymNode.ltc                 C  rs   r   )Z_ler7   r   r   r   le  r>   z
SymNode.lec                 C  rs   r   )Z_ger7   r   r   r   ge  r>   z
SymNode.gec                 C  rf   r   )_floorr*   r   r   r   floor  re   zSymNode.floorc                 C  rf   r   )Z_is_integerr*   r   r   r   
is_integer  re   zSymNode.is_integerc                 C  rf   r   )Z
_sym_floatr*   r   r   r   r     re   zSymNode.sym_floatc                 C  rf   r   )Z_sym_intr*   r   r   r   sym_int  re   zSymNode.sym_intc                 C  rf   r   )_ceilr*   r   r   r   ceil  re   zSymNode.ceilc                 C  rf   r   )Z_negr*   r   r   r   neg  re   zSymNode.negc                 C  rs   r   )Z_sym_minr7   r   r   r   r     r>   zSymNode.sym_minc                 C  rs   r   )Z_sym_maxr7   r   r   r   r
     r>   zSymNode.sym_maxc                 C     |  ||S r   )Z_sym_ite)r+   then_valelse_valr   r   r   r	        zSymNode.sym_itec                 C  r   r   )Z_is_contiguousr+   sizesstridesr   r   r   is_contiguous  r   zSymNode.is_contiguousc                 C  r   r   )Z_is_channels_last_contiguous_2dr   r   r   r   is_channels_last_contiguous_2d  r   z&SymNode.is_channels_last_contiguous_2dc                 C  r   r   )Z_is_channels_last_contiguous_3dr   r   r   r   is_channels_last_contiguous_3d  r   z&SymNode.is_channels_last_contiguous_3dc                 C  r   r   )Z_is_channels_last_strides_2dr   r   r   r   is_channels_last_strides_2d  r   z#SymNode.is_channels_last_strides_2dc                 C  r   r   )Z_is_channels_last_strides_3dr   r   r   r   is_channels_last_strides_3d  r   z#SymNode.is_channels_last_strides_3dc                 C  r   r   )Z'_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  rs   r   )r   r7   r   r   r   sym_or  r>   zSymNode.sym_orc                 C  rs   r   )r   r7   r   r   r   sym_and  r>   zSymNode.sym_andc                 C  rs   r   )_bitwise_andr7   r   r   r   bitwise_and  r>   zSymNode.bitwise_andc                 C  rs   r   )_bitwise_orr7   r   r   r   
bitwise_or  r>   zSymNode.bitwise_orc                 C  rs   r   )r   r7   r   r   r   truediv  r>   zSymNode.truedivc                 C  rs   r   )r   r7   r   r   r   floordiv  r>   zSymNode.floordivc                 C  rs   r   )r   r7   r   r   r   pow  r>   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rB   ar   r   r   	<genexpr>  s    z"SymNode.sym_sum.<locals>.<genexpr>c                 S     g | ]}|j qS r   rc   r   r   r   r   
<listcomp>      z#SymNode.sym_sum.<locals>.<listcomp>c                 s  s    | ]}|j V  qd S r   r1   r   r   r   r   r     s    r   )rJ   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr    ri   sumr&   _create_fx_call_functionr   r   )r+   argsrJ   r   r   exprsout
size_hintsout_hintr   r1   _r   r   r   r     s0   

zSymNode.sym_sumc                 C  s   | j | |S r   )r&   Z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   r?   :r   )	r$   r@   r=   r%   r&   Z+prefer_deferred_runtime_asserts_over_guardsr   Zdefer_runtime_assertr1   )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   r\   r   r=   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  rb   zSymNode.is_symbolicc                 C  s   d S r   r   r*   r   r   r   
nested_intY  rb   zSymNode.nested_intc                 C  r   )NFr   r*   r   r   r   is_constant\  rb   zSymNode.is_constant)NNF)r    r!   )r&   r   r4   r   )r6   r   r4   r   )r4   r   r   )r4   rm   )r4   r   )F)Z__name__
__module____qualname____doc__r   __annotations__r3   r5   r8   r:   propertyr%   r    r=   rG   rH   rM   rP   rR   rS   rT   rV   r\   r^   r_   ra   rd   rh   rl   rn   rp   rr   rv   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   G   s   
 
R
















































%


r   rr   rp   ry   andr   r   r   r   rw   r   r   r   r   c                 C  rf   r   )r   xr   r   r   <lambda>n  s    r   r   r   r   r   r}   r   r   orr   r   r   rv   r   r{   r   r	   r
   r   r   r   r   >	   r   r   rp   r   r   r   rr   r   rw   c                       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log2sym_r   >   r   r   r   r	   >   r}   ry   r{   >   r   rv   Zsym_log2r   )r   r   >   r   r   r   r   >   r   r   r   rw   >   r   r   r   r   r   r   r   r   r   r   r   c                 C     ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsr  )r   r   r  r   r   r   _sympy_float_truediv     
r	  c                 C  r  )Nr   )
IntTrueDiv)r  r  )r   r   r  r   r   r   _sympy_int_truediv  r
  r  c                 C  r  )Nr   )FloorDiv)r  r  )r   r   r  r   r   r   _sympy_floordiv  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_mod  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 rI   )rJ   Andr   r   rJ   r   r   r   
_sympy_and     r  c                 C  r  rI   )rJ   Orr  r   r   r   	_sympy_or  r  r  c                 C  r  )Nr   )LShift)r  r  )r   r   r  r   r   r   _sympy_lshift  r
  r   c                 C  r  )Nr   )RShift)r  r!  )r   r   r!  r   r   r   _sympy_rshift  r
  r"  c                 C  s   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.basicr#  r$  compareinsert)ordered_argsZnew_argsort_keyr$  lowhighmidZcompare_resultr   r   r   _binary_search_insert_arg%  s&   



r0  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)r#  c                   s    j | ddi}d|fS )Nr   FT)r   )r+  resultrJ   r   r   make_optimizedW  s   z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationr%  )
rJ   r(  r#  r  r4  _argsZ	is_symbolr0  listr   )	lhsrhsZlhs_is_optimized_summationZrhs_is_optimized_summationZsortkeyr3  r4  new_argsr1  r   r2  r   _optimized_addG  s*   

r:  c                 C  r  )Nr   )BitwiseFn_bitwise_and)r  r;  )r   r   r;  r   r   r   r   x  r
  r   c                 C  r  )Nr   )BitwiseFn_bitwise_or)r  r<  )r   r   r<  r   r   r   r   ~  r
  r   )ry   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   r&  r   )rJ   r'   ZMulr   r'  rK   r   rY   )r   r   rJ   ZaaZ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  rB  )r   rB  r   r   r   _sympy_trunc  rA  rC  c                 C  r>  )Nr   )	CeilToInt)r  rD  )r   rD  r   r   r   _sympy_ceil  rA  rE  c                 C  r  rI   )rJ   Eqr  r   r   r   	_sympy_eq  r  rG  c                 C  r  rI   )rJ   Ner  r   r   r   	_sympy_ne  r  rI  c                 C  r  rI   )rJ   Gtr  r   r   r   	_sympy_gt  r  rK  c                 C  r  rI   )rJ   Ltr  r   r   r   	_sympy_lt  r  rM  c                 C  r  rI   )rJ   ZLer  r   r   r   	_sympy_le  r  rN  c                 C  r  rI   )rJ   ZGer  r   r   r   	_sympy_ge  r  rO  c                 C  r  )Nr   )Min)r  rP  )r   r   rP  r   r   r   
_sympy_min  r
  rQ  c                 C  r  )Nr   Max)r  rS  )r   r   rS  r   r   r   
_sympy_max  r
  rT  c                 C  s   dd l }||| f|dfS )Nr   T)rJ   Z	Piecewise)r   r   frJ   r   r   r   
_sympy_ite  s   rV  c                   r   )Nc                   s"   dd l }t|jjjd  | S )Nr   ZOpaqueUnaryFn_)r  r   utilsZ_sympyZ	functions)r   r   r   r   r   r     s   z_get_sym_math_fn.<locals>.fnr   r   r   r   r   _get_sym_math_fn  s   rX  Z_sympy_c                 C  s   dd l }|| S rI   )rJ   ZAbsr   rJ   r   r   r   
_sympy_abs  s   
rZ  c                 C  s*   ddl m}m} |d u r|| S || |S )Nr   )RoundDecimal
RoundToInt)r  r[  r\  )numberru   r[  r\  r   r   r   _sympy_round  s   
r^  c                 C  r>  Nr   )ToFloat)r  r`  )r   r`  r   r   r   _sympy_sym_float  s   ra  c                 C  s*   dd l }ddlm} |||| | S r_  )rJ   r  r`  rF  r   )r   rJ   r`  r   r   r   _sympy_is_integer  s   rb  )rv   r   c                 C  s$   t | }t| |tt|d ddS )Nr   r%  )r'  sympy_is_contiguous_genericr6  range)r   r   dimr   r   r   sympy_is_contiguousF  s   rf  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 rI   )	rJ   r'  rO   rN   SZOnerF  rd  Zero)r   r   	dim_orderrJ   re  r   zdr   r   r   rc  K  s   (rc  c                 C     t | |g dS N)r      r&  r   rc  r   r   r   r   r   $sympy_is_channels_last_contiguous_2dc     rq  c                 C  rl  N)r      rn  r&  r   ro  rp  r   r   r   $sympy_is_channels_last_contiguous_3dg  rr  ru  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   rR  r   )	rJ   r  rS  r'  rO   rg  rh  rN   rH  )	r   r   ri  rJ   rS  re  mr   rk  r   r   r   &sympy_is_channels_last_strides_generick  s    	rw  c                 C  rl  rm  rw  rp  r   r   r   !sympy_is_channels_last_strides_2d  rr  ry  c                 C  rl  rs  rx  rp  r   r   r   !sympy_is_channels_last_strides_3d  rr  rz  c                 C  s   ddl m} |g | |R  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  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(   rU   r.   r   r_   r   r\   r   r^   NotImplemented)r+   r[   r   r   r   r     s   



r   c                 C  sX   t | tr| jd ur| jS |  rt| S |  rt| S |  r%t| S t	d|  )Nzunrecognized return type )
r'   r   r0   rR   r   rS   r   rT   r   AssertionErrorr   r   r   r   r     s   r   c                 C  s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r   r     re   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   r4   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)rB   rv  r   r   r   	<setcomp>      z@_make_node_magic.<locals>.uninteresting_files.<locals>.<setcomp>z<string>)
r   Z_dynamoZ
eval_framerW  ZfxZexperimentalr   Ztorch._dynamo.guardsZ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 )
Nr4   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 rI   )	rJ   r0   idr'   r%   rY   rK   rN   rO   )r   rJ   )r1  r   r   get_id  s   
zM_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.get_idZ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   rg   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   )rB   i)r  r   r   r     s    rn  )r  r1  Z	result_id	argumentsZargument_idsZ
user_stackstack)rd   r  
structuredZget_user_stackZget_framework_stackr   )r  r  r  r1  r   r   r   	  s   
zO_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>)Zmetadata_fn)r4   r  )r   _logging	_internalZGET_DTRACE_STRUCTUREDr   r7   )r   r  )r  r  r1  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  ry   failed to eval %s(%s, %s)z%s %s %s -> %s)r1   r2   )!r   r   r   r   r     alternate_impl_if_hinted_methodsgetr   r   r'   r   r  r  r  r&   r%   r  Zbound_sympylowerr   r   r   r   sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r)   r(   r   r1   )r+   r6   r   r   opr   Zalternate_implr2   r  r  r&   r   r)   r1   r   r1  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   Zceilingzfailed to eval %s(%s)z%s %s -> %sr   )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   r1   r   )
r+   r   r   r  r%   r   r   r)   r1   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   r1   r   r)   )		pred_node	then_node	else_noder   r   r   r   r1   r   r  r   r   sym_ite_impl  s@   
z&_make_node_magic.<locals>.sym_ite_implrv   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   builtinsrv   r   r   r%   r   r   r   r   r)   r    r1   ri   r&   r   r   r   )r+   ru   r   r   r  r%   r   r)   r   r   r1   r   r  r   r   
round_impl  s0   
	
z$_make_node_magic.<locals>.round_impl)r4   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   rA   r   r   r   r   
  r  zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  r   r   rc   rA   r   r   r   r     r   c                 S  r   r   rc   rA   r   r   r   r     r   r  Z
_indicator)r   r   r   r   sysmodulesr   r   r   r   r   r    ri   endswithr   r   r   r&   )r+   r   r   r   r   r  Z
size_exprsZstride_exprsr   r   r   rC   Z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   rU   rB   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   Zsympifyr   r2  r   r   r   H  r  c                   r  r   r  r   r2  r   r   r   I  r  )rJ   r$   r  	itertoolschainr'   r   r   r   rU   r   )r   r   r  r  rY  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 )Nr  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   rU   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   rU   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   rU   r\   r   r   r   r   r   promote  s   
z!_make_user_magic.<locals>.promotec                 S  r`   r   r   r   r   r   r   r    rb   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)ry   r{   r}   r   r   r   r   r   r
   r   r   r   r   r   r   )r'   r   r   r   r   )r+   r6   f_selfZf_otherr  r   r   promote2  s   

z"_make_user_magic.<locals>.promote2c                   s2   | } | rt  | S tt| j S r   )r   r   r   rU   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   rU   r   r   r+   r6   Z
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   rU   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   )	rU   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_implrv   c                   s,   | rt  | |S tt| j|S r   )r  rv   r   r   rU   rt   )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  Z	user_typer  r  r  origr  r  method_namer   r  r   _make_user_magicY  s<   
!
*
r  )FFr   )
__future__r   r  r  r  r  loggingmathoperatorr  r   r   typingr   r   r   r   Ztorch._logging.structuredr  r  r   r	   r
   r   r   r   r   r   Ztorch._loggingr   r$   r   	getLoggerr   r   ZgetArtifactLoggerr  __all__Ztorch.typesr   r(   r   r   rr   rp   ry   r   r   r   r   rw   r   r   r   r   r   r   r   r}   r   r   r   r   rv   r   r{   r   r  r  r   Zmath_op_namesr   Zsym_nameZpriv_sym_namer  r   ri   r  r  Zonly_bool_magic_methodsr  Zalso_bool_magic_methodsZbool_magic_methodsZonly_float_magic_methodsr  r  r  r  r  r	  r  r  r  r  r  r  r  r   r"  r0  r:  r   r   r  r=  r@  rC  rE  rG  rI  rK  rM  rN  rO  rQ  rT  rV  r  Zcurrent_modulerX  Zpriv_sympy_namer   r   rZ  r^  ra  rb  invertr   rf  rc  rq  ru  rw  ry  rz  r|  Zsizes_strides_methodsminmaxr  r   r   r   r  r  itemsr  r  r  r   r   r   r   <module>   s  (

    	
 !"%



	#
1
	

		

(	  *W 8







