o
    ߗiH                     @  sX  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m	Z	m
Z
 d dlmZmZmZmZ d dlZd dlmZmZmZmZmZmZmZmZ erSd 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j,dej-dej.dej/dej0dej1ddd dej2dej3dej4d ej5i d!ej6d"ej7d#ej8d$ej9d%ej9d&ej:d'ej:d(ej;d)ej<d*ej=d+ed,ed-ed.ed/ed0ej>d1ej>Z?h d2Z@d3d4 ZAd5ZBeBD ]&ZCd6eC ZDd7eD ZEeFe&eDeAeC eGeeEe?eD< e@)eD e!HeD qdhZIe@eIB ZJh d8ZKh d9ZLdhZMeKeMB ZNh d:ZOdd$hZPdd$d;ZQh d<ZReBD ]ZCd6eC ZDeR)eD qXh d=ZSh d>ZTd?d@ ZUdAdB ZVdCdD ZWdEdF ZXdGdH ZYdIdJ ZZdKdL Z[dMdN Z\dOdP Z]dQdR Z^dSdT Z_	UddVdWZ`dXdY ZadZd[ Zbe`ej=ej6eXeYeZe[eae\ebeUeVeWe]e^d\Zcd]d^ Zdd_d` Zedadb Zfdcdd Zgdedf Zhdgdh Zididj Zjdkdl Zkdmdn Zldodp Zmdqdr Zndsdt Zodudv Zpejqe Zrdwdx ZseBD ]ZCdyeC ZteseCZuet eu_veu_eFereteu q[u[C[tdzd{ Zwdd|d}Zxd~d Zydd Zzi eci d/ej{dej'dehd"eidejdekdeldemdeedefd+eydegd#ej8d.end-eod,epdewexezdZ|eBD ]ZCd6eC ZDeGerdyeC e|eD< qk[C[D[B[rdd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Ze}eeeeedZejejdZdd Zdd Zdd Zdd Zdd Ze| D ]
\ZZeee qe D ]
\ZZeee qdd Ze| D ];\ZZeeKv reee qeeOv reee qeeMv seeLv reee eee eeQvr&eee q[[dS )    )annotationsN)	lru_cacheupdate_wrapper)OptionalTypeTYPE_CHECKINGUnion)	sym_floatsym_itesym_maxsym_minsym_notSymBoolSymFloatSymInt)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   \/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/fx/experimental/sym_node.py_to_symtype5   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ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdS )r   z
    This is a type erased SymInt/SymFloat which we use to do actual operations.
    End users don't touch this.  Magic methods are NOT defined on this object.
    Fr   _optimized_summationNhint!Optional[Union[int, float, bool]]c                   s   | _ | _| _| _ fdd}|d urMt||u s0t|t|u s0J d| dt|  jrL jjrL| }	||	ksLJ | d|	 d j dn| }| _| _	 jo\ jj}
|
o`| _
d S )Nc                    sP   ddl m}  |  jrd S  jj jdd}|d ur&t|ts$ |n|}|S )Nr   )has_free_unbacked_symbolsT)compute_hint)%torch.fx.experimental.symbolic_shapesr"   expr	shape_env_maybe_evaluate_static
isinstanceSymTypespytype)r"   r    selfr   r   r#   {   s   
z&SymNode.__init__.<locals>.compute_hintzCannot create SymNode of type z  with incompatible hint of type z != z (for ))_exprr&   r*   r   typer   _translation_validation_enabledr%   _hintconstantfx_node)r,   r%   r&   r*   r    r2   r3   optimized_summationr#   computed_hinttx_validation_enr   r+   r   __init__Q   s2   

zSymNode.__init__r&   r   returnc                 C  s   t | j|| j| j| j| jS r   )r   r.   r*   r1   r2   r3   )r,   r&   r   r   r   with_shape_env   s   zSymNode.with_shape_envotherc                 C  s<   | j |j ko| j|jko| j|jko| j|jko| j|jkS r   )r.   r*   r1   r2   r3   r,   r:   r   r   r   	_value_eq   s   



zSymNode._value_eqr   c                 C  s   t | j| j| j| j| jfS r   )hashr.   r*   r1   r2   r3   r+   r   r   r   _value_hash   s   zSymNode._value_hashc                 C  s   | j | jS r   )r&   replacer.   r+   r   r   r   r%      s   zSymNode.exprc                 C  s   | j S r   r1   r+   r   r   r   r       s   zSymNode.hintc                 C  s
   | j d uS r   r@   r+   r   r   r   has_hint      
zSymNode.has_hintc                 C  s*   | j d u r|d ur|S | j| jS | j S r   )r1   r&   	size_hintr%   )r,   fallbackr   r   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,   rI   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)rI   r%   truefalserK   r   r   r   maybe_as_bool   s   zSymNode.maybe_as_boolc                 C  
   | j tu S r   )r*   r   r+   r   r   r   is_int   rB   zSymNode.is_intc                 C  rP   r   )r*   r   r+   r   r   r   is_float   rB   zSymNode.is_floatc                 C  rP   r   )r*   r   r+   r   r   r   is_bool   rB   zSymNode.is_boolc                 C  s"   | j d uot| j to| j j S r   )r1   r(   r   nodeis_nested_intr+   r   r   r   rU      s
   


zSymNode.is_nested_intc                 C  4   t |tu sJ dd l}t||| jt|||dS Nr   )r2   r3   )r/   r   rI   r   Integerr&   r,   numrI   r   r   r   wrap_int   
   zSymNode.wrap_intc                 C  rV   rW   )r/   r   rI   r   rJ   r&   rY   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 rW   )r/   r   rI   r   rM   rN   r&   rY   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   rc   r+   r   r   r   __str__  rd   zSymNode.__str__c                 C  s   d| j  d| j d| j g}| jd ur|d| j  | jd ur+|d| j  | jd ur9|d| j  d|d S )	NzSymNode(z, shape_env=z	, pytype=zhint=z	constant=zfx_node=z, r-   )r.   r&   r*   r1   appendr2   r3   join)r,   repr   r   r   __repr__  s   


zSymNode.__repr__builtins.strc                 C  re   r   rf   r+   r   r   r   _graph_repr%  s   zSymNode._graph_reprc                 C  re   r   )_absr+   r   r   r   abs+  rd   zSymNode.absc                 C  re   r   )_posr+   r   r   r   pos.  rd   zSymNode.posc                 C  
   |  |S r   )_roundr,   ndigitsr   r   r   round1  rB   zSymNode.roundc                 C  re   r   )_truncr+   r   r   r   trunc4  rd   zSymNode.truncc                 C  rr   r   )_addr;   r   r   r   add7  rB   zSymNode.addc                 C  rr   r   )_subr;   r   r   r   sub:  rB   zSymNode.subc                 C  rr   r   )_mulr;   r   r   r   mul=  rB   zSymNode.mulc                 C  rr   r   )_modr;   r   r   r   mod@  rB   zSymNode.modc                 C  rr   r   )
_float_powr;   r   r   r   	float_powC  rB   zSymNode.float_powc                 C  rr   r   )_pow_by_naturalr;   r   r   r   pow_by_naturalF  rB   zSymNode.pow_by_naturalc                 C  rr   r   )_and_r;   r   r   r   and_I  rB   zSymNode.and_c                 C  rr   r   )_or_r;   r   r   r   or_L  rB   zSymNode.or_c                 C  rr   r   )_float_truedivr;   r   r   r   float_truedivO  rB   zSymNode.float_truedivc                 C  rr   r   )_int_truedivr;   r   r   r   int_truedivR  rB   zSymNode.int_truedivc                 C  rr   r   )_int_floordivr;   r   r   r   int_floordivU  rB   zSymNode.int_floordivc                 C  rr   r   )_lshiftr;   r   r   r   lshiftX  rB   zSymNode.lshiftc                 C  rr   r   )_rshiftr;   r   r   r   rshift[  rB   zSymNode.rshiftc                 C  re   r   )_sym_notr+   r   r   r   r   ^  rd   zSymNode.sym_notc                 C  rr   r   )_eqr;   r   r   r   eqa  rB   z
SymNode.eqc                 C  rr   r   )_ner;   r   r   r   ned  rB   z
SymNode.nec                 C  rr   r   )_gtr;   r   r   r   gtg  rB   z
SymNode.gtc                 C  rr   r   )_ltr;   r   r   r   ltj  rB   z
SymNode.ltc                 C  rr   r   )_ler;   r   r   r   lem  rB   z
SymNode.lec                 C  rr   r   )_ger;   r   r   r   gep  rB   z
SymNode.gec                 C  re   r   )_floorr+   r   r   r   floors  rd   zSymNode.floorc                 C  re   r   )_is_integerr+   r   r   r   
is_integerv  rd   zSymNode.is_integerc                 C  re   r   )
_sym_floatr+   r   r   r   r	   y  rd   zSymNode.sym_floatc                 C  re   r   )_sym_intr+   r   r   r   sym_int|  rd   zSymNode.sym_intc                 C  re   r   )_ceilr+   r   r   r   ceil  rd   zSymNode.ceilc                 C  re   r   )_negr+   r   r   r   neg  rd   zSymNode.negc                 C  rr   r   )_sym_minr;   r   r   r   r     rB   zSymNode.sym_minc                 C  rr   r   )_sym_maxr;   r   r   r   r     rB   zSymNode.sym_maxc                 C     |  ||S r   )_sym_ite)r,   then_valelse_valr   r   r   r
        zSymNode.sym_itec                 C  r   r   )_is_contiguousr,   sizesstridesr   r   r   is_contiguous  r   zSymNode.is_contiguousc                 C  r   r   )_is_channels_last_contiguous_2dr   r   r   r   is_channels_last_contiguous_2d  r   z&SymNode.is_channels_last_contiguous_2dc                 C  r   r   )_is_channels_last_contiguous_3dr   r   r   r   is_channels_last_contiguous_3d  r   z&SymNode.is_channels_last_contiguous_3dc                 C  r   r   )_is_channels_last_strides_2dr   r   r   r   is_channels_last_strides_2d  r   z#SymNode.is_channels_last_strides_2dc                 C  r   r   )_is_channels_last_strides_3dr   r   r   r   is_channels_last_strides_3d  r   z#SymNode.is_channels_last_strides_3dc                 C  r   r   )'_is_non_overlapping_and_dense_indicatorr   r   r   r   &is_non_overlapping_and_dense_indicator  r   z.SymNode.is_non_overlapping_and_dense_indicatorc                 C  rr   r   )r   r;   r   r   r   sym_or  rB   zSymNode.sym_orc                 C  rr   r   )r   r;   r   r   r   sym_and  rB   zSymNode.sym_andc                 C  rr   r   )_bitwise_andr;   r   r   r   bitwise_and  rB   zSymNode.bitwise_andc                 C  rr   r   )_bitwise_orr;   r   r   r   
bitwise_or  rB   zSymNode.bitwise_orc                 C  rr   r   )r   r;   r   r   r   truediv  rB   zSymNode.truedivc                 C  rr   r   )r   r;   r   r   r   floordiv  rB   zSymNode.floordivc                 C  rr   r   )r   r;   r   r   r   pow  rB   zSymNode.powc                 C  s   |  ||t| dS )N   )r   r   to_noder   r   r   r   is_non_overlapping_and_dense  s   z$SymNode.is_non_overlapping_and_densec                 C     |  ddS N r   )	guard_intr+   r   r   r   int_  r   zSymNode.int_c                 C  s   dd l }ddlm}m} | r!t| |tjtdd |D fi S dd |D }|j| }g }d }|D ]}	|	j	d u r< n|
|	j	 q3t|}| jtjtdd |D f\}
}t|| jt||
dS )	Nr   get_proxy_modehandle_sym_dispatchc                 s  s    | ]}t |V  qd S r   	wrap_node.0ar   r   r   	<genexpr>  s    z"SymNode.sym_sum.<locals>.<genexpr>c                 S     g | ]}|j qS r   rb   r   r   r   r   
<listcomp>      z#SymNode.sym_sum.<locals>.<listcomp>c                 s  s    | ]}|j V  qd S r   r3   r   r   r   r   r     s    r   )rI   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr    rh   sumr&   _create_fx_call_functionr   r   )r,   argsrI   r   r   exprsout
size_hintsout_hintr   r3   _r   r   r   r     s0   

zSymNode.sym_sumc                 C  @   | j j| j| j| jd}zt|W S  ty   td|  w )Nr   zFailed to convert to int: %s)	r&   evaluate_exprr%   r    r3   r   	Exceptionlogwarningr,   filelinerr   r   r   r        
zSymNode.guard_intc                 C  r   )Nr   zFailed to convert to float: %s)	r&   r   r%   r    r3   r   r   r   r   r   r   r   r   guard_float  r   zSymNode.guard_floatc                 C  r   )Nr   Failed to convert to bool: %s	r&   r   r%   r    r3   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   )free_unbacked_symbols:r   )	r$   r   rA   r%   r&   +prefer_deferred_runtime_asserts_over_guardsr   defer_runtime_assertr3   )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   rA   r   )r,   r   r   r   br   r   r   r   expect_size  s   zSymNode.expect_sizec                 C  sB   | j j| j| j| 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)r3   size_obliviousr   r   r   r   r   r   guard_size_oblivious'  s   
zSymNode.guard_size_obliviousc                 C  r   r   )r   r+   r   r   r   bool_=  r   zSymNode.bool_c                 C     dS )NTr   r+   r   r   r   is_symbolic@  ra   zSymNode.is_symbolicc                 C  s   d S r   r   r+   r   r   r   
nested_intC  ra   zSymNode.nested_intc                 C  r  )NFr   r+   r   r   r   is_constantF  ra   zSymNode.is_constant)NNF)r    r!   )r&   r   r8   r   )r:   r   r8   r   )r8   r   r   )r8   rl   )r8   r   )Y__name__
__module____qualname____doc__r   __annotations__r7   r9   r<   r>   propertyr%   r    rA   rE   rG   rL   rO   rQ   rR   rS   rU   r[   r]   r^   r`   rc   rg   rk   rm   ro   rq   rv   rx   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  r  r  r   r   r   r   r   B   s   
 
R















































&


r   rq   ro   rz   andr   r   r   r   rx   r   r   r   r   c                 C  re   r   )r   xr   r   r   <lambda>X  s    r  r   r   r   r   r~   r   r   orr   r   r   rv   r   r|   r	   r
   r   r   r   r   r   >	   ro   r   rq   r   r   rx   r   r   r	   c                       fdd}|S )Nc                   s   t | d   S )N_sym_)getattrr+   namer   r   fn  s   z_get_sym_node_fn.<locals>.fnr   r  r  r   r  r   _get_sym_node_fn~  s   r  )sqrtcoscoshsinsinhtantanhasinacosatanlog2sym_r   >   r  r  r
   r   >   rz   r~   r|   >   rv   r   sym_log2r   )r   r   >   r   r	   r   r   >   r   r   rx   r   >   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+  r0  )r   r   r0  r   r   r   _sympy_floordiv  r-  r1  c                 C  s0   ddl m}m} | jr|jr|| |S || |S )Nr   Mod	PythonMod)r+  r3  r4  is_nonnegative)r   r   r3  r4  r   r   r   
_sympy_mod  s   

r6  c                 C  r)  )Nr   )PowByNatural)r+  r7  )r   r   r7  r   r   r   _sympy_pow_by_natural  r-  r8  c                 C  r)  )Nr   )FloatPow)r+  r9  )r   r   r9  r   r   r   _sympy_float_pow  r-  r:  c                 C     dd l }|| |S rH   )rI   Andr   r   rI   r   r   r   
_sympy_and     r>  c                 C  r;  rH   )rI   Orr=  r   r   r   	_sympy_or  r?  rA  c                 C  r)  )Nr   )LShift)r+  rB  )r   r   rB  r   r   r   _sympy_lshift  r-  rC  c                 C  r)  )Nr   )RShift)r+  rD  )r   r   rD  r   r   r   _sympy_rshift	  r-  rE  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.basicrF  rG  compareinsert)ordered_argsnew_argsort_keyrG  lowhighmidcompare_resultr   r   r   _binary_search_insert_arg  s&   



rU  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)rF  c                   s    j | ddi}d|fS )NevaluateFT)r   )rN  resultrI   r   r   make_optimizedA  s   z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationrH  )
rI   rK  rF  r+  rZ  _args	is_symbolrU  listr   )	lhsrhslhs_is_optimized_summationrhs_is_optimized_summationsortkeyrY  rZ  new_argsrW  r   rX  r   _optimized_add1  s*   

rd  c                 C  r)  )Nr   )BitwiseFn_bitwise_and)r+  re  )r   r   re  r   r   r   r   b  r-  r   c                 C  r)  )Nr   )BitwiseFn_bitwise_or)r+  rf  )r   r   rf  r   r   r   r   h  r-  r   )rz   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   rI  r   )rI   r(   Mulr   rJ  rJ   r   rX   )r   r  rI   aacoefr   r   r   _floor_ceil_helper  s   &


rj  c                 C     ddl m} || S )Nr   )
FloorToInt)r+  rl  )r   rl  r   r   r   _sympy_floor     rm  c                 C  rk  )Nr   )
TruncToInt)r+  ro  )r   ro  r   r   r   _sympy_trunc  rn  rp  c                 C  rk  )Nr   )	CeilToInt)r+  rq  )r   rq  r   r   r   _sympy_ceil  rn  rr  c                 C  r;  rH   )rI   Eqr=  r   r   r   	_sympy_eq  r?  rt  c                 C  r;  rH   )rI   Ner=  r   r   r   	_sympy_ne  r?  rv  c                 C  r;  rH   )rI   Gtr=  r   r   r   	_sympy_gt  r?  rx  c                 C  r;  rH   )rI   Ltr=  r   r   r   	_sympy_lt  r?  rz  c                 C  r;  rH   )rI   Ler=  r   r   r   	_sympy_le  r?  r|  c                 C  r;  rH   )rI   Ger=  r   r   r   	_sympy_ge  r?  r~  c                 C  r)  )Nr   )Min)r+  r  )r   r   r  r   r   r   
_sympy_min  r-  r  c                 C  r)  )Nr   Max)r+  r  )r   r   r  r   r   r   
_sympy_max  r-  r  c                 C  s   dd l }||| f|dfS )Nr   T)rI   	Piecewise)r   r   frI   r   r   r   
_sympy_ite  s   r  c                   r  )Nc                   s"   dd l }t|jjjd  | S )Nr   OpaqueUnaryFn_)r+  r  utils_sympy	functions)r   r   r  r   r   r    s   z_get_sym_math_fn.<locals>.fnr   r  r   r  r   _get_sym_math_fn  s   r  _sympy_c                 C  s   dd l }|| S rH   )rI   Absr   rI   r   r   r   
_sympy_abs  s   
r  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  rk  Nr   )ToFloat)r+  r  )r   r  r   r   r   _sympy_sym_float  s   r  c                 C  s*   dd l }ddlm} |||| | S r  )rI   r+  r  rs  r   )r   rI   r  r   r   r   _sympy_is_integer	  s   r  )rv   r   c                 C  s$   t | }t| |tt|d ddS )Nr   rH  )rJ  sympy_is_contiguous_genericr]  range)r   r   dimr   r   r   sympy_is_contiguous0  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 rH   )	rI   rJ  rN   rM   SOners  r  Zero)r   r   	dim_orderrI   r  r   zdr   r   r   r  5  s   (r  c                 C     t | |g dS N)r      rI  r   r  r   r   r   r   r   $sympy_is_channels_last_contiguous_2dM     r  c                 C  r  N)r      r  rI  r   r  r  r   r   r   $sympy_is_channels_last_contiguous_3dQ  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   )	rI   r+  r  rJ  rN   r  r  rM   ru  )	r   r   r  rI   r  r  mr   r  r   r   r   &sympy_is_channels_last_strides_genericU  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)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)   rT   r/   r   r^   r   r[   r   r]   NotImplemented)r,   rZ   r   r   r   r     s   



r   c                 C  sX   t | tr| jd ur| jS |  rt| S |  rt| S |  r%t| S t	d|  )Nzunrecognized return type )
r(   r   r2   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     rd   r   c                   s   t d  tv r d}n} fdd} fdd}tv r/ttd| | d S dkrE fdd	}ttd| | d S d
kr\d fdd	}ttd| | d S ttd| | d S )N   r   c              	     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   r2  rz   failed to eval %s(%s, %s)z%s %s %s -> %s)r3   r4   )!r   r   r   r   r     alternate_impl_if_hinted_methodsgetr   r   r(   r   r+  r3  r4  r&   r%   r5  bound_sympylowerr   r   r   r   sym_node_logdebugalways_float_magic_methodsr   always_bool_magic_methodsr   r*   r)   r   r3   )r,   r:   r   r   opr   alternate_implr4   r3  r4  r&   r   r*   r3   r   rW  funcr  r   r   binary_magic_impl  s   

	z+_make_node_magic.<locals>.binary_magic_implc           
        s  ddl m}m} t}| rt| ||t| fi S | j}dks&dkr,| j|}z |}W n t	yA   t
d|  w td || d }| jd urV|| j}tv r]t}ntv rdt}n
tv rkt}n| j}| j|| jf\}}	t|| j|||dS )Nr   r   r   ceilingzfailed to eval %s(%s)z%s %s -> %sr   )r   r   r   r   r   r   r%   r&   _simplify_floor_divr   r   r   r  r  r    always_int_magic_methodsr   r  r   r  r   r*   r   r3   r   )
r,   r   r   r  r%   r   r   r*   r3   r   r  r   r   unary_magic_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   r3   r   r*   )		pred_node	then_node	else_noder   r   r   r   r3   r   r  r   r   sym_ite_implK  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    r3   rh   r&   r   r   r   )r,   ru   r   r   r  r%   r   r*   r   r   r3   r   r  r   r   
round_implv  s0   
	
z$_make_node_magic.<locals>.round_implr   )r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )r  r  method_attrr  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  s   g | ]}t |qS r   r   r   sr   r   r   r     s    zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  r   r   rb   r  r   r   r   r     r   c                 S  r   r   rb   r  r   r   r   r     r   r  
_indicator)r   r   r   r  sysmodulesr	  r   r   r   r   r    rh   endswithr   r   r   r&   )r,   r   r   r   r   r  
size_exprsstride_exprsr   r   r   r  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   rT   r   r   r   r   r   r         zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                   r  r   r  r  r  r   r   r     r  r   c                      g | ]}  |qS r   sympifyr   rX  r   r   r         c                   r  r   r  r   rX  r   r   r     r  )rI   r$   r  	itertoolschainr(   r   r   r  rT   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  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   rT   r   r  r  r   r   r   get_constant  s
   
z&_make_user_magic.<locals>.get_constantc                 S  s2   t | tttfr
dS t | tttfr| j S dS )NTF)	r(   r   r   r   r   r   r   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   r[   r   r  r   r   r   promote5  s   
z!_make_user_magic.<locals>.promotec                 S  r_   r   r   r  r   r   r   r  =  ra   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)rz   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  rT   r+   )r  r  r  r  r  r   r   r  j  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   rT   r   r  r,   r:   
other_noderetr  r  r  r  r  r  r   r   r  p  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   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r't|tr'|j|jks)J tt| j ||}|j  r= |S |S r   )	rT   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  rT   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  	user_typer  r  r  origr  r  method_namer   r  r   _make_user_magic  s<   
!
*
r  )FFr   )
__future__r   r  r  loggingmathoperatorr  	functoolsr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r$   r   	getLoggerr	  r   _logginggetArtifactLoggerr  __all__torch.typesr   r)   r   r   rq   ro   rz   r   r   r   r   rx   r   r   r   r   r   r   r   r~   r   r   r   r   rv   r   r|   r   r  r   r  math_op_namesr  sym_namepriv_sym_namer  r  rh   r  r  only_bool_magic_methodsr  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr  r  r  r  r  r,  r/  r1  r6  r8  r:  r>  rA  rC  rE  rU  rd  r   r   r  rj  rm  rp  rr  rt  rv  rx  rz  r|  r~  r  r  r  r  current_moduler  priv_sympy_namer  r  r  r  r  r  invertr   r  r  r  r  r  r  r  r  sizes_strides_methodsminmaxr  r   r   r   r  r  itemsr  r  r  r   r   r   r   <module>   s  
(
    	
 !"%



	#
1
	

		

(	 hW 8







