a
    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rd 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*ej+ej,ej-ej.ej.ej/ej0ej1ej2ej3ej4ej5dd ej6ej7ej8ej9ej:ej;ej<ej=ej=ej>ej>ej?ej@ejAeeeeeejBejBd"ZCh dZDdd ZEdZFeFD ]LZGdeG ZHdeH ZIeJe*eHeEeG eKeeIeCeH< eD-eH e%LeH qdhZMeDeMB ZNh dZOh dZPdhZQeOeQB ZRh dZSddhZTdddZUh d ZVeFD ]ZGdeG ZHeV-eH qNh d!ZWh d"ZXd#d$ ZYd%d& ZZd'd( Z[d)d* Z\d+d, Z]d-d. Z^d/d0 Z_d1d2 Z`d3d4 Zad5d6 Zbd7d8 Zcdd:d;Zdd<d= Zed>d? ZfedejAej:e\e]e^e_eee`efeYeZe[eaebd@ZgdAdB ZhdCdD ZidEdF ZjdGdH ZkdIdJ ZldKdL ZmdMdN ZndOdP ZodQdR ZpdSdT ZqdUdV ZrdWdX ZsdYdZ Zte	jue! Zvd[d\ ZweFD ]0ZGd]eG ZxeweGZyex ey_zey_!eJevexey q[y[G[xd^d_ Z{dd`daZ|dbdc Z}ddde Z~i egejej+elemeneoepeqeieje}ekej<eresete{e|e~dfZeFD ]$ZGdeG ZHeKevd]eG eeH< q*[G[H[F[vdgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv ZeeeeeedwZdxdy Zdzd{ Zd|d} Zd~d Zdd Ze D ]\ZZeee qe D ]\ZZeee qdd Ze D ]v\ZZeeOv r>eee qeeSv rVeee qeeQv sjeePv rteee 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   L/var/www/auris/lib/python3.9/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< ddddd	Zd
d dddZd ddddZddd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d9dd:d;Zd dd<d=Zd dd>d?Zdd dd@dAZ d ddBdCZ!d ddDdEZ"d ddFdGZ#d ddHdIZ$d ddJdKZ%d ddLdMZ&d ddNdOZ'd ddPdQZ(d ddRdSZ)d ddTdUZ*d ddVdWZ+d ddXdYZ,d ddZd[Z-d dd\d]Z.d dd^d_Z/d dd`daZ0d ddbdcZ1d ddddeZ2d ddfdgZ3d ddhdiZ4d ddjdkZ5d ddldmZ6d ddndoZ7d ddpdqZ8d ddrdsZ9d ddtduZ:d ddvdwZ;d ddxdyZ<d ddzd{Z=d dd|d}Z>d dd~dZ?d dddZ@d dddZAd dddZBd dddZCd dddZDdd ZEdd ZFdd ZGdd ZHdd ZId dddZJdd ZKdd ZLdd ZMd dddZNdddZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\d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_summationNz!Optional[Union[int, float, bool]])hintc                   s   | _ | _| _| _ fdd}|d urt||u s`t|t|u s`J d| dt|  jr jjr| }	||	ksJ | 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rLt|tsH |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    r/   r0   optimized_summationr"   Zcomputed_hintZtx_validation_enr   r)   r   __init__V   s0    

zSymNode.__init__r   )r%   returnc                 C  s   t | j|| j| j| j| jS r   )r   r,   r(   r.   r/   r0   )r*   r%   r   r   r   with_shape_env   s    zSymNode.with_shape_env)otherr3   c                 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.   r/   r0   r*   r5   r   r   r   	_value_eq   s    



zSymNode._value_eqr   r3   c                 C  s   t | j| j| j| j| jfS r   )hashr,   r(   r.   r/   r0   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   s    zSymNode.has_hintc                   s`   ddl m}  jd u rZ|d urL| 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?   replacementsr   rC   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*   rJ   r   r   r   maybe_as_float   s    
zSymNode.maybe_as_floatc                 C  s0   dd l }| j|ju rdS | j|ju r(dS d S d S )Nr   TF)rJ   r$   truefalserL   r   r   r   maybe_as_bool   s    zSymNode.maybe_as_boolc                 C  s
   | j tu S r   )r(   r   r)   r   r   r   is_int   s    zSymNode.is_intc                 C  s
   | j tu S r   )r(   r   r)   r   r   r   is_float   s    zSymNode.is_floatc                 C  s
   | j tu S r   )r(   r   r)   r   r   r   is_bool   s    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   rU      s
    


zSymNode.is_nested_intc                 C  s4   t |tu sJ dd l}t||| jt|||dS Nr   )r/   r0   )r-   r   rJ   r   Integerr%   r*   numrJ   r   r   r   wrap_int  s
    zSymNode.wrap_intc                 C  s4   t |tu sJ dd l}t||| jt|||dS rV   )r-   r   rJ   r   rK   r%   rX   r   r   r   
wrap_float  s
    zSymNode.wrap_floatc                 C  s:   t |tu sJ dd l}t|r$|jn|j| jt|||dS rV   )r-   r   rJ   r   rN   rO   r%   rX   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   r_   r)   r   r   r   __str__+  s    zSymNode.__str__c                 C  s   d| j  d| j d| j g}| jd ur:|d| j  | jd urV|d| j  | jd urr|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.   appendr/   r0   join)r*   repr   r   r   __repr__.  s    


zSymNode.__repr__zbuiltins.strc                 C  s   |   S r   r`   r)   r   r   r   _graph_repr:  s    zSymNode._graph_reprc                 C  s   |   S r   )_absr)   r   r   r   abs@  s    zSymNode.absc                 C  s   |   S r   )_posr)   r   r   r   posC  s    zSymNode.posc                 C  s
   |  |S r   )Z_roundr*   ndigitsr   r   r   roundF  s    zSymNode.roundc                 C  s   |   S r   )Z_truncr)   r   r   r   truncI  s    zSymNode.truncc                 C  s
   |  |S r   )Z_addr6   r   r   r   addL  s    zSymNode.addc                 C  s
   |  |S r   )Z_subr6   r   r   r   subO  s    zSymNode.subc                 C  s
   |  |S r   )Z_mulr6   r   r   r   mulR  s    zSymNode.mulc                 C  s
   |  |S r   )Z_modr6   r   r   r   modU  s    zSymNode.modc                 C  s
   |  |S r   )Z
_float_powr6   r   r   r   	float_powX  s    zSymNode.float_powc                 C  s
   |  |S r   )Z_pow_by_naturalr6   r   r   r   pow_by_natural[  s    zSymNode.pow_by_naturalc                 C  s
   |  |S r   )Z_and_r6   r   r   r   and_^  s    zSymNode.and_c                 C  s
   |  |S r   )Z_or_r6   r   r   r   or_a  s    zSymNode.or_c                 C  s
   |  |S r   )Z_float_truedivr6   r   r   r   float_truedivd  s    zSymNode.float_truedivc                 C  s
   |  |S r   )Z_int_truedivr6   r   r   r   int_truedivg  s    zSymNode.int_truedivc                 C  s
   |  |S r   )Z_int_floordivr6   r   r   r   int_floordivj  s    zSymNode.int_floordivc                 C  s
   |  |S r   )Z_lshiftr6   r   r   r   lshiftm  s    zSymNode.lshiftc                 C  s
   |  |S r   )Z_rshiftr6   r   r   r   rshiftp  s    zSymNode.rshiftc                 C  s   |   S r   )Z_sym_notr)   r   r   r   r   s  s    zSymNode.sym_notc                 C  s
   |  |S r   )_eqr6   r   r   r   eqv  s    z
SymNode.eqc                 C  s
   |  |S r   )Z_ner6   r   r   r   ney  s    z
SymNode.nec                 C  s
   |  |S r   )Z_gtr6   r   r   r   gt|  s    z
SymNode.gtc                 C  s
   |  |S r   )Z_ltr6   r   r   r   lt  s    z
SymNode.ltc                 C  s
   |  |S r   )Z_ler6   r   r   r   le  s    z
SymNode.lec                 C  s
   |  |S r   )Z_ger6   r   r   r   ge  s    z
SymNode.gec                 C  s   |   S r   )_floorr)   r   r   r   floor  s    zSymNode.floorc                 C  s   |   S r   )Z_is_integerr)   r   r   r   
is_integer  s    zSymNode.is_integerc                 C  s   |   S r   )Z
_sym_floatr)   r   r   r   r     s    zSymNode.sym_floatc                 C  s   |   S r   )Z_sym_intr)   r   r   r   sym_int  s    zSymNode.sym_intc                 C  s   |   S r   )_ceilr)   r   r   r   ceil  s    zSymNode.ceilc                 C  s   |   S r   )Z_negr)   r   r   r   neg  s    zSymNode.negc                 C  s
   |  |S r   )Z_sym_minr6   r   r   r   r     s    zSymNode.sym_minc                 C  s
   |  |S r   )Z_sym_maxr6   r   r   r   r
     s    zSymNode.sym_maxc                 C  s   |  ||S r   )Z_sym_ite)r*   then_valelse_valr   r   r   r	     s    zSymNode.sym_itec                 C  s   |  ||S r   )Z_is_contiguousr*   sizesstridesr   r   r   is_contiguous  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_2d  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_3d  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_indicator  s    z.SymNode.is_non_overlapping_and_dense_indicatorc                 C  s
   |  |S r   )rv   r6   r   r   r   sym_or  s    zSymNode.sym_orc                 C  s
   |  |S r   )ru   r6   r   r   r   sym_and  s    zSymNode.sym_andc                 C  s
   |  |S r   )_bitwise_andr6   r   r   r   bitwise_and  s    zSymNode.bitwise_andc                 C  s
   |  |S r   )_bitwise_orr6   r   r   r   
bitwise_or  s    zSymNode.bitwise_orc                 C  s
   |  |S r   )rw   r6   r   r   r   truediv  s    zSymNode.truedivc                 C  s
   |  |S r   )ry   r6   r   r   r   floordiv  s    zSymNode.floordivc                 C  s
   |  |S r   )rs   r6   r   r   r   pow  s    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  s   |  ddS N r   )	guard_intr)   r   r   r   int_  s    zSymNode.int_c                 C  s   dd l }ddlm}m} | rBt| |tjtdd |D fi S dd |D }|j| }g }d }|D ]}	|	j	d u rx q|
|	j	 qft|}| 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rA   ar   r   r   	<genexpr>      z"SymNode.sym_sum.<locals>.<genexpr>c                 S  s   g | ]
}|j qS r   r^   r   r   r   r   
<listcomp>  r   z#SymNode.sym_sum.<locals>.<listcomp>c                 s  s   | ]}|j V  qd S r   r0   r   r   r   r   r     r   r   )rJ   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr    rb   sumr%   _create_fx_call_functionr   r   )r*   argsrJ   r   r   exprsout
size_hintsout_hintr   r0   _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  s8   |   }z
t|W S  ty2   td|  Y n0 d S )NzFailed to convert to int: %s)r   r   	Exceptionlogwarningr*   filelinerr   r   r   r     s    
zSymNode.guard_intc                 C  s8   |   }z
t|W S  ty2   td|  Y n0 d S )NzFailed to convert to float: %s)r   r   r   r   r   r   r   r   r   guard_float  s    
zSymNode.guard_floatc                 C  s8   |   }z
t|W S  ty2   td|  Y n0 d S )NFailed to convert to bool: %s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   r>   :r   )	r#   r?   r=   r$   r%   Z+prefer_deferred_runtime_asserts_over_guardsr   Zguard_or_defer_runtime_assertr0   )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   rZ   r   r=   r   )r*   r   r   r   br   r   r   r   expect_size3  s    zSymNode.expect_sizec                 C  s$   ddl m} |  sJ |t| S )Nr   )statically_known_true)r#   r   rS   r   )r*   r   r   r   r   r   r   r   A  s    zSymNode.statically_known_truec                 C  s<   | j dd}z
t|W S  ty6   td|  Y n0 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   r   Nr   r   r   r   r   guard_size_obliviousG  s    
zSymNode.guard_size_obliviousc                 C  s$   ddl m} |  sJ |t| S )Nr   )guard_or_false)r#   r   rS   r   )r*   r   r   r   r   r   r   r   [  s    zSymNode.guard_or_falsec                 C  s$   ddl m} |  sJ |t| S )Nr   )guard_or_true)r#   r   rS   r   )r*   r   r   r   r   r   r   r   a  s    zSymNode.guard_or_truec                 C  s   |  ddS r   )r   r)   r   r   r   bool_g  s    zSymNode.bool_c                 C  s   dS )NTr   r)   r   r   r   is_symbolicj  s    zSymNode.is_symbolicc                 C  s   d S r   r   r)   r   r   r   
nested_intm  s    zSymNode.nested_intc                 C  s   dS )NFr   r)   r   r   r   is_constantp  s    zSymNode.is_constant)NNF)N)N)F)]__name__
__module____qualname____doc__r   __annotations__r2   r4   r7   r:   propertyr$   r    r=   rG   rH   rM   rP   rQ   rR   rS   rU   rZ   r[   r\   r]   r_   ra   re   rf   rh   rj   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   G   s   
   R




%



r   c                 C  s   |   S r   )r   xr   r   r   <lambda>  r   r   )"rj   rh   ro   andr   r   r}   r   rn   ry   r   r   r   r   rz   r   rr   rq   r~   r   orr   rs   rt   rm   r{   rp   r   r	   r
   r   r   rw   rx   >	   rn   rh   r   r   r   r   rj   r   r   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log2sym_r   r   >   r   r   r	   r   >   rq   rp   ro   r}   >   r   r   rm   Zsym_log2r   r   )r   r   >   rx   rs   r   rw   >   rt   rn   r   r   >   r   r   r   r~   r   r   r   r   r   r}   r   c                 C  s   ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsr   )r   r   r   r   r   r   _sympy_float_truediv  s    r   c                 C  s   ddl m} || |S )Nr   )
IntTrueDiv)r   r   )r   r   r   r   r   r   _sympy_int_truediv   s    r   c                 C  s   ddl m} || |S )Nr   )FloorDiv)r   r   )r   r   r   r   r   r   _sympy_floordiv  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_mod  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 rI   )rJ   Andr   r   rJ   r   r   r   
_sympy_and!  s    r  c                 C  s   dd l }|| |S rI   )rJ   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_rshift3  s    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r|| d }|| | |}|dkrdS |dk r|d }qp|d }qp| || | 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highZmidZcompare_resultr   r   r   _binary_search_insert_arg9  s$    



r  Fc           
        st  ddl  ddlm}  fdd}ddlm} ||| O }|||O }|r|r|| jd ||jd k rx|| j|j S || jd ||jd kr||j| j S t| jdkrt|jdkrt| j}|jD ]}t||}|du r qq|dur||S |r,|j	r,tt| j|}|dur,||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$   | d usJ  j | ddi}d|fS )Nr   FT)r   )r  resultrJ   r   r   make_optimizedk  s    z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationr  r  )rJ   r  r  r   r  _argsr  listr  Z	is_symbolr   )
lhsrhsZlhs_is_optimized_summationZrhs_is_optimized_summationZsortkeyr  r  new_argsr   r  r   r  r   _optimized_add[  s:    




r#  c                 C  s   ddl m} || |S )Nr   )BitwiseFn_bitwise_and)r   r$  )r   r   r$  r   r   r   r     s    r   c                 C  s   ddl m} || |S )Nr   )BitwiseFn_bitwise_or)r   r%  )r   r   r%  r   r   r   r     s    r   )ro   rp   rq   rr   rt   rs   r   r   r   r   rw   rx   ry   rz   r{   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  r   )rJ   r&   ZMulr   r  rK   r   rW   )r   r   rJ   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 rI   )rJ   Eqr  r   r   r   	_sympy_eq  s    r.  c                 C  s   dd l }|| |S rI   )rJ   Ner  r   r   r   	_sympy_ne  s    r0  c                 C  s   dd l }|| |S rI   )rJ   Gtr  r   r   r   	_sympy_gt  s    r2  c                 C  s   dd l }|| |S rI   )rJ   Ltr  r   r   r   	_sympy_lt  s    r4  c                 C  s   dd l }|| |S rI   )rJ   ZLer  r   r   r   	_sympy_le  s    r5  c                 C  s   dd l }|| |S rI   )rJ   ZGer  r   r   r   	_sympy_ge  s    r6  c                 C  s   ddl m} || |S )Nr   )Min)r   r7  )r   r   r7  r   r   r   
_sympy_min  s    r8  c                 C  s   ddl m} || |S )Nr   Max)r   r:  )r   r   r:  r   r   r   
_sympy_max	  s    r;  c                 C  s   dd l }||| f|dfS )Nr   T)rJ   Z	Piecewise)r   r   frJ   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   r   r   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 rI   )rJ   ZAbsr   rJ   r   r   r   
_sympy_abs*  s    rA  c                 C  s.   ddl m}m} |d u r || S || |S d S )Nr   )RoundDecimal
RoundToInt)r   rB  rC  )numberrl   rB  rC  r   r   r   _sympy_round0  s    rE  c                 C  s   ddl m} || S Nr   )ToFloat)r   rG  )r   rG  r   r   r   _sympy_sym_float9  s    rH  c                 C  s*   dd l }ddlm} |||| | S rF  )rJ   r   rG  r-  r   )r   rJ   rG  r   r   r   _sympy_is_integerA  s    rI  )r   rj   r}   r~   r   r   r   r   r   rn   r   r   r   r   r
   r	   rh   rm   r   c                 C  s$   t | }t| |tt|d ddS )Nr   r  )r  sympy_is_contiguous_genericr  range)r   r   dimr   r   r   sympy_is_contiguoush  s    rM  c                 C  s   dd l }t| }t||kr"|jS |j}|jj}|D ]8}||| | |jj||| |B M }|| | 9 }q4t|D ]}||| | |jjO }qv|S rI   )	rJ   r  rO   rN   SZOner-  rK  Zero)r   r   	dim_orderrJ   rL  r   zdr   r   r   rJ  m  s    (rJ  c                 C  s   t | |g dS N)r      r  r   rJ  r   r   r   r   r   $sympy_is_channels_last_contiguous_2d  s    rW  c                 C  s   t | |g dS N)r      rT  r  r   rU  rV  r   r   r   $sympy_is_channels_last_contiguous_3d  s    rZ  c           	      C  s   dd l }ddlm} t| }|t|kr.|jS |jj}|j}|||d dM }|D ]V}||| | d|| |k@ M }|dkr||||d M }|| || | d }qT|S )Nr   r9  r   )	rJ   r   r:  r  rO   rN  rO  rN   r/  )	r   r   rP  rJ   r:  rL  mr   rR  r   r   r   &sympy_is_channels_last_strides_generic  s     	r\  c                 C  s   t | |g dS rS  r\  rV  r   r   r   !sympy_is_channels_last_strides_2d  s    r^  c                 C  s   t | |g dS rX  r]  rV  r   r   r   !sympy_is_channels_last_strides_3d  s    r_  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    ra  )r   r   r   r   r   r   c                 C  sZ   t |tr|jS t|tu r&| |S t|tu r<| |S t|tu rR| 	|S t
S d S r   )r&   r'   rT   r-   r   r\   r   rZ   r   r[   NotImplemented)r*   rY   r   r   r   r     s    



r   c                 C  s\   t | tr| jd ur| jS |  r*t| S |  r:t| S |  rJt| S t	d|  d S )Nzunrecognized return type )
r&   r   r/   rQ   r   rR   r   rS   r   AssertionErrorr   r   r   r   r     s    r   c                 C  s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r   r     s    r   c           	        s   t d  tv r  d}n}dddd}fdd}| fd	d
}| fdd}tv 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   zset[str]r8   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)rA   r[  r   r   r   	<setcomp>  r   z@_make_node_magic.<locals>.uninteresting_files.<locals>.<setcomp>z<string>)
r   Z_dynamoZ
eval_framer>  ZfxZexperimentalr   Ztorch._dynamo.guardsZguardsuninteresting_files)r   Zmodsr   r   r   rk    s    
z-_make_node_magic.<locals>.uninteresting_filesc                   s   t  d fdd	}|S )Nc                   sn   |d u r| n
| |t jjjrj|d ur8| |g n| g ddfddtd fddd S )	NzOptional[int]r8   c                   s`   dd l }| jd urd S t| t kr*d S t| j|j|jfrBd S | j|j|jfv rXd S t| S rI   )	rJ   r/   idr&   r$   rW   rK   rN   rO   )r   rJ   )r  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  s   g | ]}t |qS r   r`   r   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   )rA   i)rm  r   r   r   +  s   rT  )rf  r  Z	result_id	argumentsZargument_idsZ
user_stackstack)r_   rl  
structuredZget_user_stackZget_framework_stackr   )ro  rm  rf  r  r   r   r   &  s    
zO_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>)Zmetadata_fn)r   _logging	_internalZGET_DTRACE_STRUCTUREDr   r6   )r   rf  )ro  rm  r  r   wrapper
  s    



z=_make_node_magic.<locals>.capture_provenance.<locals>.wrapper)N)	functoolswraps)r   rt  re  )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}| rbt| ||t| t|fi S t|tspJ d}zdkrd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}
n4dkr | j|j| j|j\}}
n | j|j}
W n* tyH   td| j|j  Y n0 td| j|j|
 tv rpt}n4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   Frr   r   ro   failed to eval %s(%s, %s)z%s %s %s -> %s)r0   r1   )r   r   r   r   r    r   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   r0   )r*   r5   r   r   opr   r1   r   r   r%   r   r(   r0   r   r  funcrf  r   r   binary_magic_impl7  s~    

	

z+_make_node_magic.<locals>.binary_magic_implc           
        s
  ddl m}m} t}| r6t| ||t| fi S | j}dksLdkrX| j|}z |}W n" t	y   t
d|  Y n0 td || d }| jd ur|| j}tv rt}n"tv rt}ntv rt}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   rz  r{  r    always_int_magic_methodsr   r}  r   r|  r   r(   r   r0   r   )
r*   r   r   r~  r$   r   r   r(   r0   r   r  r   r   unary_magic_impl  s2    

z*_make_node_magic.<locals>.unary_magic_implr	   c           	   
     s   ddl m}m} | jr|jn|j}| rLt| |tt| t|t|fi S z | j|j|j}W n, ty   t	
d| j|j|j  Y n0 | 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   r0   r   r(   )		pred_node	then_node	else_noder   r   r   r   r0   r   r  r   r   sym_ite_impl  s>    z&_make_node_magic.<locals>.sym_ite_implrm   c              	     s   ddl m}m} tj}| r6t| ||t| |fi S | j}z ||}W n$ tyn   t	
d||  Y n0 |d u r~t}n| j}d }| jd ur|| j|}| jg}	|d ur|	| | j|t|	\}
}t|| j|||
dS )Nr   r   z!failed to eval %s(%s, ndigits=%s)r   )r   r   r   builtinsrm   r   r   r$   r   r   r   r   r(   r    r0   rb   r%   r   r   r   )r*   rl   r   r   r~  r$   r   r(   r   r   r0   r   r  r   r   
round_impl  s.    
	
z$_make_node_magic.<locals>.round_impl)N)r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )	rf  r  method_attrrk  rw  r  r  r  r  r   r  r   _make_node_magic  s&    .Z$()r  c                   sT    fdd}t td |  fdd}ttjt sPt tjt | d S )Nc              	     s$  ddl m}m} ttjt }| rPt| ||dd |D dd |D fi S dd |D }dd |D }z ||}W n$ ty   t	
d||  Y n0 g }	d }
|D ]}|jd u r q|	|j qg }|D ]}|jd u r q||j q||	|}
drt}nt}t|| j||
S )	Nr   r   c                 S  s   g | ]}t |qS r   r   r@   r   r   r   r   #  r   zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r   r^   r@   r   r   r   r   '  r   c                 S  s   g | ]
}|j qS r   r^   r@   r   r   r   r   (  r   rx  Z
_indicator)r   r   r   r   sysmodulesr   r   r   r   r   r    rb   endswithr   r   r   r%   )r*   r   r   r   r   r~  Z
size_exprsZstride_exprsr   r   r   rB   Zstride_hintsr(   r  r   r   sizes_strides_impl  sD    


z4_make_node_sizes_strides.<locals>.sizes_strides_implr   c                   s   dd l ddlm} t| |D ]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   rT   rA   r   r   r   r   r   W  r   zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                   s   g | ]}t  j|qS r   r  r  r  r   r   r   X  r   r   c                   s   g | ]}  |qS r   Zsympifyr   r  r   r   r   a  r   c                   s   g | ]}  |qS r   r  r   r  r   r   r   b  r   )rJ   r#   r  	itertoolschainr&   r   r   r   rT   r   )r   r   r  r  r@  r   sizes_strides_userL  s$    



z4_make_node_sizes_strides.<locals>.sizes_strides_user)r  r   hasattrr  r  r   )rf  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d tv r@dd	 nd
d	 fdd fdd} fdd} fdd}tv rt|d d| nΈtv rt|}t|t|| ndkr fdd}t|d d| nzdkr8d fdd	}t|d d| nH}tv rNt }t|d| d| tv rt|d| d| d S )Nr   z2Union[SymInt, int, SymFloat, float, SymBool, bool]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   rT   r   rc  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   rT   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   rT   rZ   r   r   r   r   r   promote  s    
z!_make_user_magic.<locals>.promotec                 S  s   | S r   r   r   r   r   r   r    s    c                   s\    dvr| |fS t | ttjf}t |ttjf}|s8|rT|sFt| } |sTt|}| |fS )N)ro   rp   rq   rr   rs   rw   ry   r   r
   r}   r~   r   r   r   r   )r&   r   r   r   r   )r*   r5   f_selfZf_otherre  r   r   promote2  s    

z"_make_user_magic.<locals>.promote2c                   s2   | } | r t  | S tt| j S r   )r   r   r   rT   r)   )r  r   rf  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| | | } |}| |\} }| rbt
 | |S |rr |}t| j|}|tu rtS tt| j|}|r |S |S )NzMAGIC %s %s %s)r&   r   r   r   r   r   r   rb  rz  r{  r   r   rT   r   r   r*   r5   Z
other_noderetr  r   rf  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 | } |}| |\} }| rRt | |S |rb |}t	| j
|}|tu rztS tt|| j
}|r |S |S r   )r&   r   r   r   r   r   r   rb  r   r   rT   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rNt|trN|j|jksRJ tt| j ||}|j  rz |S |S r   )	rT   r   rb  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_implrm   c                   s,   | rt  | |S tt| j|S r   )r  rm   r   r   rT   rk   )r  r   rf  r   r   round_magic_impl  s    z*_make_user_magic.<locals>.round_magic_implZ__r)N)	r  bool_becomes_int_magic_methodsunary_magic_methodsr  unary_nonmagic_methodsr   r   bitwise_opsreflectable_magic_methods)	rf  Z	user_typer  r  r  origr  r  method_namer   r  r   _make_user_magicr  s:    !
*




r  )FF)N)
__future__r   r  ru  rh  r  loggingmathoperatorr  r   r   typingr   r   r   r   Ztorch._logging.structuredrr  rq  r   r	   r
   r   r   r   r   r   Ztorch._loggingr   r#   r   	getLoggerr   r   ZgetArtifactLoggerrz  __all__Ztorch.typesr   r'   r   r   rj   rh   ro   ru   r   r}   r   rn   r   r   r   r   rz   r   rr   rq   r~   r   rv   r   rm   r{   rp   r   rd  r  r   Zmath_op_namesr   Zsym_nameZpriv_sym_namer  r   rb   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  r  r#  r   r   r  r&  r(  r*  r,  r.  r0  r2  r4  r5  r6  r8  r;  r=  r  Zcurrent_moduler?  Zpriv_sympy_namer   r   rA  rE  rH  rI  invertr   rM  rJ  rW  rZ  r\  r^  r_  ra  Zsizes_strides_methodsr   r   r   r  r  itemsrf  r  r  r   r   r   r   <module>   s  (

    3%



	# 
?
	

	
(	  &W 8






