o
    ei@                     @  s  U 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rid dlmZ e e!Z"ej#e!dZ$e% Z&d	e'd
< e(e)B e*B dB Z+g dZ,d dl-m.Z/ dd Z0G dd dZ1G dd dZ2G dd de2e*Z3i dej4dej5dej6dej7dej7dej8dej9dej:dej;dej<dej=d ej>d!d"d# d$ej?d%ej@d&ejAd'ejBi d(ejCd)ejDd*ejEd+ejFd,ejFd-ejGd.ejHd/ejHd0ejId1ejJd2ejKd3ed4ed5ed6ed7ed8ejLd9ejLiZMh d:ZNd;d< ZOd=ZPePD ]&ZQd>eQ ZRd?eR ZSeTe1eReOeQ eUeeSeMeR< eN6eR e,VeR qBd!hZWeNeWB ZXh d@ZYh dAZZdhZ[eYe[B Z\h dBZ]dd+hZ^dd+dCdDZ_h dEZ`ePD ]ZQd>eQ ZRe`6eR qh dFZah dGZbdHdI ZcdJdK ZddLdM ZedNdO ZfdPdQ ZgdRdS ZhdTdU ZidVdW ZjdXdY ZkdZd[ Zld\d] Zm	^dd_d`Zndadb Zodcdd Zpdedf Zqi dej6d2ejKd(ejCd'efd/egd.ehdeideod+ejd,epd-eqd8ecd9eddeed%ekd1elZrdgdh Zsdidj Ztdkdl Zudmdn Zvdodp Zwdqdr Zxdsdt Zydudv Zzdwdx Z{dydz Z|d{d| Z}d}d~ Z~dd Ze	je! Zdd ZePD ]ZQdeQ ZeeQZe e_e_!eTeee q[[[Q[dd ZdddZdd Zdd Zi eri d7ejdej4dewd)exd eyd&ezd$e{de|detdeud3edevd*ejEd6e}d5e~d4edeeedZePD ]ZQd>eQ ZReUedeQ eeR< q[Q[R[P[dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeeeeeedZdd Zdd Zdd Zdd Zdd Ze D ]
\ZZeee q#e D ]
\ZZeee q2dd ZeD ]9ZeeYv rQeee qCee]v r]eee qCee[v sgeeZv rleee eee ee_vr{eee qC[[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object_NO_HINT)SymNodemethod_to_operatormagic_methods
DynamicInt)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   h/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/fx/experimental/sym_node.py_to_symtypeA   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 ZIdd ZJdddZKdd ZLdd ZMdd ZNdddZOddd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_summationNhint!Optional[Union[int, float, bool]]c                   s   | _ | _| _| _ fdd}|tu rd }n>|d urTt||u s7t|t|u s7td| dt|  jrS jjrS| }	||	krSt| d|	 d j	 dn| }| _
| _ joc jj}
|
og| _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"   r   typer!   AssertionError_translation_validation_enabledr(   _hintconstantfx_node)r/   r(   r)   r-   r#   r6   r7   optimized_summationr&   computed_hinttx_validation_enr   r.   r    __init__]   s6   
zSymNode.__init__r)   r   returnc                 C  s   t | j|| j| j| j| jS r   )r   r1   r-   r5   r6   r7   )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   )r1   r-   r5   r6   r7   r/   r>   r   r   r    	_value_eq   s   



zSymNode._value_eqr   c                 C  s   t | j| j| j| j| jfS r   )hashr1   r-   r5   r6   r7   r.   r   r   r    _value_hash   s   zSymNode._value_hashc                 C  s   | j | jS r   )r)   replacer1   r.   r   r   r    r(      s   zSymNode.exprc                 C  s   | j S r   r5   r.   r   r   r    r#      s   zSymNode.hintc                 C  s
   | j d uS r   rD   r.   r   r   r    has_hint      
zSymNode.has_hintc                   sf   ddl m} jd u r0 d ur)|j fddjjD }tj|S jjS jS )Nr   free_unbacked_symbolsc                   s&   i | ]}||v r nj j| qS r   )r)   backed_var_to_val.0sfallbackr/   unbacked_symbolsr   r    
<dictcomp>   s    
z(SymNode.require_hint.<locals>.<dictcomp>)	r'   rH   r5   r(   free_symbolsr   xreplacer)   	size_hint)r/   rN   rH   replacementsr   rM   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/   rY   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)rY   r(   truefalser[   r   r   r    maybe_as_bool   s   zSymNode.maybe_as_boolc                 C  
   | j tu S r   )r-   r   r.   r   r   r    is_int  rF   zSymNode.is_intc                 C  r`   r   )r-   r   r.   r   r   r    is_float  rF   zSymNode.is_floatc                 C  r`   r   )r-   r   r.   r   r   r    is_bool	  rF   zSymNode.is_boolc                 C  s"   | j d uot| j to| j j S r   )r5   r+   r   nodeis_nested_intr.   r   r   r    re     s
   


zSymNode.is_nested_intc                 C  B   t |turtdt | dd l}t||| jt|||dS )NExpected int, got r   r6   r7   )r2   r   r3   rY   r   Integerr)   r/   numrY   r   r   r    wrap_int     zSymNode.wrap_intc                 C  rf   )NzExpected float, got r   rh   )r2   r   r3   rY   r   rZ   r)   rj   r   r   r    
wrap_float  rm   zSymNode.wrap_floatc                 C  sH   t |turtdt | dd l}t|r|jn|j| jt|||dS )NzExpected bool, got r   rh   )r2   r   r3   rY   r   r]   r^   r)   rj   r   r   r    	wrap_bool&  s   zSymNode.wrap_boolc                 C     | S r   r   r.   r   r   r    clone4     zSymNode.clonec                 C  s   | j  S r   r(   r.   r   r   r    str7     zSymNode.strc                 C     |   S r   rt   r.   r   r   r    __str__:  ru   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, r0   )r1   r)   r-   r5   appendr6   r7   join)r/   repr   r   r    __repr__=  s   


zSymNode.__repr__builtins.strc                 C  rv   r   rw   r.   r   r   r    _graph_reprI  s   zSymNode._graph_reprc                 C  rv   r   )_absr.   r   r   r    absO  ru   zSymNode.absc                 C  rv   r   )_posr.   r   r   r    posR  ru   zSymNode.posc                 C  
   |  |S r   )_roundr/   ndigitsr   r   r    roundU  rF   zSymNode.roundc                 C  rv   r   )_truncr.   r   r   r    truncX  ru   zSymNode.truncc                 C  r   r   )_addr?   r   r   r    add[  rF   zSymNode.addc                 C  r   r   )_subr?   r   r   r    sub^  rF   zSymNode.subc                 C  r   r   )_mulr?   r   r   r    mula  rF   zSymNode.mulc                 C  r   r   )_modr?   r   r   r    modd  rF   zSymNode.modc                 C  r   r   )
_float_powr?   r   r   r    	float_powg  rF   zSymNode.float_powc                 C  r   r   )_pow_by_naturalr?   r   r   r    pow_by_naturalj  rF   zSymNode.pow_by_naturalc                 C  r   r   )_and_r?   r   r   r    and_m  rF   zSymNode.and_c                 C  r   r   )_or_r?   r   r   r    or_p  rF   zSymNode.or_c                 C  r   r   )_float_truedivr?   r   r   r    float_truedivs  rF   zSymNode.float_truedivc                 C  r   r   )_int_truedivr?   r   r   r    int_truedivv  rF   zSymNode.int_truedivc                 C  r   r   )_int_floordivr?   r   r   r    int_floordivy  rF   zSymNode.int_floordivc                 C  r   r   )_lshiftr?   r   r   r    lshift|  rF   zSymNode.lshiftc                 C  r   r   )_rshiftr?   r   r   r    rshift  rF   zSymNode.rshiftc                 C  rv   r   )_sym_notr.   r   r   r    r     ru   zSymNode.sym_notc                 C  r   r   )_eqr?   r   r   r    eq  rF   z
SymNode.eqc                 C  r   r   )_ner?   r   r   r    ne  rF   z
SymNode.nec                 C  r   r   )_gtr?   r   r   r    gt  rF   z
SymNode.gtc                 C  r   r   )_ltr?   r   r   r    lt  rF   z
SymNode.ltc                 C  r   r   )_ler?   r   r   r    le  rF   z
SymNode.lec                 C  r   r   )_ger?   r   r   r    ge  rF   z
SymNode.gec                 C  rv   r   )_floorr.   r   r   r    floor  ru   zSymNode.floorc                 C  rv   r   )_is_integerr.   r   r   r    
is_integer  ru   zSymNode.is_integerc                 C  rv   r   )
_sym_floatr.   r   r   r    r     ru   zSymNode.sym_floatc                 C  rv   r   )_sym_intr.   r   r   r    sym_int  ru   zSymNode.sym_intc                 C  rv   r   )_ceilr.   r   r   r    ceil  ru   zSymNode.ceilc                 C  rv   r   )_negr.   r   r   r    neg  ru   zSymNode.negc                 C  r   r   )_sym_minr?   r   r   r    r     rF   zSymNode.sym_minc                 C  r   r   )_sym_maxr?   r   r   r    r
     rF   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  rF   zSymNode.sym_orc                 C  r   r   )r   r?   r   r   r    sym_and  rF   zSymNode.sym_andc                 C  r   r   )_bitwise_andr?   r   r   r    bitwise_and  rF   zSymNode.bitwise_andc                 C  r   r   )_bitwise_orr?   r   r   r    
bitwise_or  rF   zSymNode.bitwise_orc                 C  r   r   )_bitwise_xorr?   r   r   r    bitwise_xor  rF   zSymNode.bitwise_xorc                 C  r   r   )r   r?   r   r   r    truediv  rF   zSymNode.truedivc                 C  r   r   )r   r?   r   r   r    floordiv  rF   zSymNode.floordivc                 C  r   r   )r   r?   r   r   r    pow  rF   zSymNode.powc                 C  s   |  ||t| dS )N   )r   r   to_noder   r   r   r    is_non_overlapping_and_dense  s   z$SymNode.is_non_overlapping_and_densec                 C     |  ddS N r   )	guard_intr.   r   r   r    int_  r   zSymNode.int_c                 C  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rK   ar   r   r    	<genexpr>  s    z"SymNode.sym_sum.<locals>.<genexpr>c                 S     g | ]}|j qS r   rs   r   r   r   r    
<listcomp>      z#SymNode.sym_sum.<locals>.<listcomp>c                 s  s    | ]}|j V  qd S r   r7   r   r   r   r    r     s    r   )rY   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr#   ry   sumr)   _create_fx_call_functionr   r   )r/   argsrY   r   r   exprsout
size_hintsout_hintr   r7   _r   r   r    r     s0   

zSymNode.sym_sumc                 C  s   | j | |S r   )r)   evaluate_sym_node)r/   size_obliviousr   r   r    evaluate     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   rG   :r   )	r'   rH   rE   r(   r)   +prefer_deferred_runtime_asserts_over_guardsr  guard_or_defer_runtime_assertr7   )r/   r  r  rH   r   r   r    expect_true3  s   zSymNode.expect_truec                 C  (   ddl m} |  std|t| S )Nr   )statically_known_trueExpected bool type)r'   r  rc   r3   r   )r/   r  r  r  r   r   r    r  E     zSymNode.statically_known_truec                 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_obliviousL  s   
zSymNode.guard_size_obliviousc                 C  r  )Nr   )guard_or_falser  )r'   r  rc   r3   r   )r/   r  r  r  r   r   r    r  `  r  zSymNode.guard_or_falsec                 C  r  )Nr   )guard_or_truer  )r'   r  rc   r3   r   )r/   r  r  r  r   r   r    r  g  r  zSymNode.guard_or_truec                 C  r   r   )r  r.   r   r   r    bool_n  r   zSymNode.bool_c                 C     dS )NTr   r.   r   r   r    is_symbolicq  rr   zSymNode.is_symbolicc                 C  s   d S r   r   r.   r   r   r    
nested_intt  rr   zSymNode.nested_intc                 C  r  )NFr   r.   r   r   r    is_constantw  rr   zSymNode.is_constant)NNF)r#   r$   )r)   r   r<   r   )r>   r   r<   r   )r<   r   r   )r<   r}   )r<   r   )F)]__name__
__module____qualname____doc__r"   __annotations__r;   r=   r@   rB   propertyr(   r#   rE   rU   rW   r\   r_   ra   rb   rc   re   rl   rn   ro   rq   rt   rx   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   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   N   s   
 
U






		









































%


r   c                      s   e Zd Z fddZ  ZS )_DynamicScalarc                   s$   | t u rtdt j| g|R  S )Nz9_DynamicScalar is an abstract base class, use DynamicInt.)r%  	TypeErrorsuper__new__)clsr   	__class__r   r    r(  |  s   z_DynamicScalar.__new__)r  r   r!  r(  __classcell__r   r   r*  r    r%  {  s    r%  c                      s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   a  
    User API for marking dynamic integers in `torch.compile`.
    Intended to be compatible with both compile and eager mode.

    Example usage::

        fn = torch.compile(f)
        x = DynamicInt(4)
        fn(x)  # compiles x as a dynamic integer input; returns f(4)
    c                   s2   t |tstdt| t | t|}|S )Nrg   )r+   r   r3   r2   r'  r(  )r)  valobjr*  r   r    r(    s   
zDynamicInt.__new__c                 C  s   d| j  dS )NzDynamicInt(r0   )realr.   r   r   r    r|     r  zDynamicInt.__repr__c                 C  s   t | j| S r   r   r/  r?   r   r   r    __floordiv__  r  zDynamicInt.__floordiv__c                 C  s   t || j S r   r0  r?   r   r   r    __rfloordiv__  r  zDynamicInt.__rfloordiv__)	r  r   r!  r"  r(  r|   r1  r2  r,  r   r   r*  r    r     s    r   r   r   r   andr   r   r   r   r   r   r   r   r   c                 C  rv   r   )r   xr   r   r    <lambda>  s    r6  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   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   >   r7  r3  r	   r   >   r   r   r   >   r   r   sym_log2r   xor)r   r   r   >   r   r   r   r   >   r   r   r   r   >   r   r   r   r   r   r   r7  r3  r   r   r   c                 C     ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsrO  )r   brO  r   r   r    _sympy_float_truediv"     
rR  c                 C  rN  )Nr   )
IntTrueDiv)rP  rT  )r   rQ  rT  r   r   r    _sympy_int_truediv(  rS  rU  c                 C  rN  )Nr   )FloorDiv)rP  rV  )r   rQ  rV  r   r   r    _sympy_floordiv.  rS  rW  c                 C  s0   ddl m}m} | jr|jr|| |S || |S )Nr   Mod	PythonMod)rP  rY  rZ  is_nonnegative)r   rQ  rY  rZ  r   r   r    
_sympy_mod4  s   

r\  c                 C  rN  )Nr   )PowByNatural)rP  r]  )r   rQ  r]  r   r   r    _sympy_pow_by_natural=  rS  r^  c                 C  rN  )Nr   )FloatPow)rP  r_  )r   rQ  r_  r   r   r    _sympy_float_powC  rS  r`  c                 C     dd l }|| |S rX   )rY   Andr   rQ  rY   r   r   r    
_sympy_andI     rd  c                 C  ra  rX   )rY   Orrc  r   r   r    	_sympy_orO  re  rg  c                 C  rN  )Nr   )LShift)rP  rh  )r   rQ  rh  r   r   r    _sympy_lshiftU  rS  ri  c                 C  rN  )Nr   )RShift)rP  rj  )r   rQ  rj  r   r   r    _sympy_rshift[  rS  rk  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.basicrl  rm  compareinsert)ordered_argsnew_argsort_keyrm  lowhighmidcompare_resultr   r   r    _binary_search_insert_arga  s&   



r{  Fc           
        sh  ddl  ddlm}  fdd}ddlm} ||| O }|||O }|r~|r~|| jd ||jd k r<|| j|j S || jd ||jd krR||j| j S t| jdkr~t|jdkr~t| j}|jD ]}t||}|du ru nqh|dur~||S |r|j	rtt| j|}|dur||S |r| j	rt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)rl  c                   s(   | d u rt d jj| dd}d|fS )Nzordered_args is NoneT)is_commutative)r3   r   
_from_args)rt  resultrY   r   r    make_optimized  s   z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationrn  ro  )rY   rq  rl  rP  r  _argsrp  listr{  	is_symbolr   )
lhsrhslhs_is_optimized_summationrhs_is_optimized_summationsortkeyr  r  new_argsr   r~  r   r  r    _optimized_add  s<   





r  c                 C  rN  )Nr   )BitwiseFn_bitwise_and)rP  r  )r   rQ  r  r   r   r    r     rS  r   c                 C  rN  )Nr   )BitwiseFn_bitwise_or)rP  r  )r   rQ  r  r   r   r    r     rS  r   c                 C  rN  )Nr   )BitwiseFn_bitwise_xor)rP  r  )r   rQ  r  r   r   r    r     rS  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   ro  r   )rY   r+   Mulr   rp  rZ   r   ri   )r   r=  rY   aacoefr   r   r    _floor_ceil_helper  s   &


r  c                 C     ddl m} || S )Nr   )
FloorToInt)rP  r  )r   r  r   r   r    _sympy_floor     r  c                 C  r  )Nr   )
TruncToInt)rP  r  )r   r  r   r   r    _sympy_trunc  r  r  c                 C  r  )Nr   )	CeilToInt)rP  r  )r   r  r   r   r    _sympy_ceil  r  r  c                 C  ra  rX   )rY   Eqrc  r   r   r    	_sympy_eq  re  r  c                 C  ra  rX   )rY   Nerc  r   r   r    	_sympy_ne  re  r  c                 C  ra  rX   )rY   Gtrc  r   r   r    	_sympy_gt  re  r  c                 C  ra  rX   )rY   Ltrc  r   r   r    	_sympy_lt%  re  r  c                 C  ra  rX   )rY   Lerc  r   r   r    	_sympy_le+  re  r  c                 C  ra  rX   )rY   Gerc  r   r   r    	_sympy_ge1  re  r  c                 C  rN  )Nr   )Min)rP  r  )r   rQ  r  r   r   r    
_sympy_min7  rS  r  c                 C  rN  )Nr   Max)rP  r  )r   rQ  r  r   r   r    
_sympy_max=  rS  r  c                 C  s   dd l }||| f|dfS )Nr   T)rY   	Piecewise)r   r   frY   r   r   r    
_sympy_iteC  s   r  c                   r8  )Nc                   s"   dd l }t|jjjd  | S )Nr   OpaqueUnaryFn_)rP  r:  utils_sympy	functions)r   r   r;  r   r    r=  M  s   z_get_sym_math_fn.<locals>.fnr   r>  r   r;  r    _get_sym_math_fnL  s   r  _sympy_c                 C  s   dd l }|| S rX   )rY   Absr   rY   r   r   r    
_sympy_abs^  s   
r  c                 C  s*   ddl m}m} |d u r|| S || |S )Nr   )RoundDecimal
RoundToInt)rP  r  r  )numberr   r  r  r   r   r    _sympy_roundd  s   
r  c                 C  r  Nr   )ToFloat)rP  r  )r   r  r   r   r    _sympy_sym_floatm  s   r  c                 C  s*   dd l }ddlm} |||| | S r  )rY   rP  r  r  r   )r   rY   r  r   r   r    _sympy_is_integeru  s   r  )r   r   c                 C  s$   t | }t| |tt|d ddS )Nr   rn  )rp  sympy_is_contiguous_genericr  range)r   r   dimr   r   r    sympy_is_contiguous  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 rX   )	rY   rp  r^   r]   SOner  r  Zero)r   r   	dim_orderrY   r  r   zdr   r   r    r    s   (r  c                 C     t | |g dS N)r      ro  r   r  r   r   r   r   r    $sympy_is_channels_last_contiguous_2d     r  c                 C  r  N)r      r  ro  r   r  r  r   r   r    $sympy_is_channels_last_contiguous_3d  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   )	rY   rP  r  rp  r^   r  r  r]   r  )	r   r   r  rY   r  r  mr	  r  r   r   r    &sympy_is_channels_last_strides_generic  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)rP  r  )r   r   r  r   r   r    -_sympy_is_non_overlapping_and_dense_indicator  s   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,   rd   r2   r   ro   r   rl   r   rn   NotImplemented)r/   rk   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   r6   ra   r   rb   r   rc   r   r3   r4  r   r   r    r     s   r   c                 C  s   t |  S r   )METHOD_TO_OPERATORmethodr   r   r    r      ru   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   r<   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)rK   r  r   r   r    	<setcomp>8      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 )
Nr<   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 rX   )	rY   r6   idr+   r(   ri   rZ   r]   r^   )r   rY   )r~  r   r    get_idJ  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   rw   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   )rK   i)r  r   r    r   _  s    r  )r  r~  	result_id	argumentsargument_ids
user_stackstack)rt   r  
structuredget_user_stackget_framework_stackr   )r  r  r  r~  r   r    r6  Z  s   
zO_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>)metadata_fn)r<   r  )r   _logging	_internalGET_DTRACE_STRUCTUREDr   r?   )r=  r  )r  r  r~  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}t}| jd ur|jd ur|| j|j}| r1t| ||t| t|fi S t|t	s?t
dt| d}zdkr{ddlm}m} | j}	| jjs^|	| jjdkrs|jjsk|	|jjdkrs|| j|j}
nv|| j|j}
nndkrt| j|j| j|j\}}
n\dv rdd l}dd	lm}m} | jjo|| j|j}|jjo||j|j}|r|jjs|r| jjr|j|j|j|j |j!|j"d }|| j|jdd
}
n | j|j}
n | j|j}
W n t#y   t$%d| j|j  w t&'d| j|j|
 t(v rt)}nt*v rt+}n| j,t)u s$|j,t)u r't)}n| j,}|d urC|turC|d urCt|t-sC||}| j.|| j/|j/f\}}t	|
| j||||d}|S )Nr   r   zExpected SymNode, got Fr   rX  r   )r   r   r   r   r   r   )symbol_is_typeSymT)r   failed to eval %s(%s, %s)z%s %s %s -> %s)r7   r8   )0r   r   r   r   r   r#   r   r   r+   r   r3   r2   rP  rY  rZ  r)   r(   r[  bound_sympylowerr  r"   rY   torch.utils._sympy.symbolr  r  r  UNBACKED_INTrV   r  r  r  r  r  r  r  r  r  sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r-   r,   r   r7   )r/   r>   r   r   opr   r8   rY  rZ  r)   r   rY   r  r  lhs_is_unbackedrhs_is_unbacked	rel_classr-   r7   r   r~  funcr  r   r    binary_magic_implk  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 || t}| 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   r#   always_int_magic_methodsr   r  r   r  r   r-   r   r7   r   )
r/   r   r   r  r(   r   r   r-   r7   r   r  r   r    unary_magic_impl  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   r7   r   r-   )		pred_node	then_node	else_noder   r   r   r   r7   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#   r7   ry   r)   r   r   r   )r/   r   r   r   r  r(   r   r-   r   r   r7   r   r  r   r    
round_impl;  s0   
	
z$_make_node_magic.<locals>.round_impl)r<   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   rJ   r   r   r    r   x  r  zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  r   r   rs   rJ   r   r   r    r   |  r   c                 S  r   r   rs   rJ   r   r   r    r   }  r   r  
_indicator)r   r   r   r:  sysmodulesr  r   r  r  r  r#   ry   endswithr   r   r   r)   )r/   r   r   r   r   r  
size_exprsstride_exprsr   r   r   rL   stride_hintsr-   r  r   r    sizes_strides_impll  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   rd   rK   rQ  r   r   r    r         zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                   r.  r   r/  r0  r1  r   r    r     r2  r   c                      g | ]}  |qS r   sympifyr   r  r   r    r     r  c                   r3  r   r4  r   r  r   r    r     r  )rY   r'   r-  	itertoolschainr+   r   r   r:  rd   r   )r   r   r-  r  r  r    sizes_strides_user  s&   


z4_make_node_sizes_strides.<locals>.sizes_strides_user)r"  r   hasattrr&  r'  r  )r  r  r,  r8  r   r  r    _make_node_sizes_stridesi  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}dd }tv r\||d d| d S tv rpt|}||t|| d S dkr fdd}||d d| d S dkrd fdd	}||d d| d S }	tv rt }	||d|	 d| tv r||d|	 d| d S d S )NrK  r5  2Union[SymInt, int, SymFloat, float, SymBool, bool]c                 S  sL   t | tttfr
| S t | tr| jdd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   rd   r   r   r  r3   r4  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   rd   r  r4  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   rd   rl   r   r4  r   r   r    promote  s   
z!_make_user_magic.<locals>.promotec                 S  rp   r   r   r4  r   r   r    r=    rr   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:  rd   r.   )r<  r  r  r#  r=  r   r    r  0  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   rd   r   r:  r/   r>   
other_noderetr<  r  r  r#  r=  r@  r   r    r  6  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   rd   r   r:  rA  rD  r   r    rbinary_magic_implG  s   z,_make_user_magic.<locals>.rbinary_magic_implc                   s4   t |  |  fdd}| tu rt t | dS dS )z
        Registers the SymNode magic method on SymInt/Float/Bool,
        and optionally registers a corresponding wrapped method on DynamicInt.
        c                    s<   dd | D } t t |  }t|trt|tst|S |S )Nc                 S  s    g | ]}t |tr|jn|qS r   )r+   r   r/  )rK   r5  r   r   r    r   b  s     zP_make_user_magic.<locals>.setattrs.<locals>.dynamic_int_impl.<locals>.<listcomp>)r:  r   r+   r   r   )r   r   attrr   r    dynamic_int_impla  s
   z<_make_user_magic.<locals>.setattrs.<locals>.dynamic_int_implN)r"  r   r   )	user_typerG  symnode_implrH  r   rF  r    setattrsW  s
   z"_make_user_magic.<locals>.setattrs__r	   c                   s   | j }t||}t||}|tu s|tu rtS t|tr't|tr'|j|jks+tdtt| j ||}|j 	 r? |S |S )Nz9then_node and else_node must be SymNodes with same pytype)
rd   r   r  r+   r   r-   r3   r   r:  r  )predr   r   r  r  r  rC  )r<  r#  r   r    sym_ite_magic_implr  s   

z,_make_user_magic.<locals>.sym_ite_magic_implr   c                   s,   | rt  | |S tt| j|S r   )r  r   r   r:  rd   r   )r<  r  r  r   r    round_magic_impl  s   z*_make_user_magic.<locals>.round_magic_impl__r)r5  r;  r   )r   bool_becomes_int_magic_methodsunary_magic_methodsunary_nonmagic_methodsr:  r   bitwise_opsreflectable_magic_methods)
r  rI  r  r  rE  rK  origrN  rO  method_namer   rD  r    _make_user_magic  s>   
	!
*
rX  )FFr   )
__future__r   r  r  r  r6  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  r   r   r#  r   r   r   HintType__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   rM  r   r   r   r   r   r  rR  r?  math_op_namesr<  sym_namepriv_sym_namer"  r:  ry   rS  r!  only_bool_magic_methodsrQ  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr   rT  r  r  r  rR  rU  rW  r\  r^  r`  rd  rg  ri  rk  r{  r  r   r   r   rU  r  r  r  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_methodsr   r   r   r$  r:  itemsr  r  rX  r   r   r   r    <module>   sD  (

    1	
 !"#&



	#
D	

	

		

(	  GW P







