o
    ,i?T                     @   s@  d dl Z d dlZd dlZd dlZd dlmZ g dZdd Zdd ZG dd	 d	ejZ	G d
d dejZ
G dd dejZG dd dejZG dd dejZG dd de	ZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdd Zd d! ZG d"d# d#ejZG d$d% d%ejZG d&d' d'ejZG d(d) d)ejZG d*d+ d+ejZG d,d- d-ejZG d.d/ d/ejZG d0d1 d1ejZG d2d3 d3ejZG d4d5 d5ejZd6d7 Z e d8Z!e d9Z"e d:Z#e d;Z$e d<Z%e d=Z&e d>Z'e d?Z(e d@Z)e dAZ*e dBZ+e dCZ,e dDZ-dS )E    N)S)FloorDivModularIndexingCleanDivCeilDiv
IntTrueDivFloatTrueDivLShiftRShift!IsNonOverlappingAndDenseIndicator
RoundToIntRoundDecimalToFloatFloatPowPowByNaturalc                    s   t   fdd}|S )Nc                     s8    |  }t dd | D rt|tjstt|}|S )Nc                 s       | ]	}t |tjV  qd S N)
isinstancesympyFloat.0a r   Z/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/utils/_sympy/functions.py	<genexpr>       z-_keep_float.<locals>.inner.<locals>.<genexpr>)anyr   r   r   float)argsrfr   r   inner   s   z_keep_float.<locals>.inner)	functoolswraps)r"   r#   r   r!   r   _keep_float   s   r&   c                 C   s   d | |fv rd S | |kS r   r   )xyr   r   r   fuzzy_eq(   s   r)   c                   @   sH   e Zd ZdZdZdZdZedd Zedd Z	d	d
 Z
edd ZdS )r   a  
    We maintain this so that:
    1. We can use divisibility guards to simplify FloorDiv(a, b) to a / b.
    2. Printing out the expression is nicer (compared to say, representing a//b as (a - a % b) / b)

    NB: This is Python-style floor division, round to -Inf
       2   Tc                 C   
   | j d S Nr   r   selfr   r   r   baseN      
zFloorDiv.basec                 C   r-   N   r/   r0   r   r   r   divisorR   r3   zFloorDiv.divisorc                 C   s2   | | j| j}| | j| j}d| d| dS )N(z//))parenthesizer2   
precedencer6   )r1   printerr2   r6   r   r   r   	_sympystrV   s   zFloorDiv._sympystrc                 C   s   |j rtd|j rtjjS |jr|dkr|S |jr$|dkr$t|dS t|tjr;t|tjr;tt	|t	| S t|t
rMt
|jd |jd | S 	 zt||}|dkrit
t|| t|| W S W d S  tjyv   Y d S w )Ndivision by zeror5   r   )is_zeroZeroDivisionErrorr   r   Zero
is_integerMulr   Integerintr   r   gcdsimplifyPolynomialError)clsr2   r6   rF   r   r   r   eval]   s.   	
zFloorDiv.evalN)__name__
__module____qualname____doc__nargsr:   rB   propertyr2   r6   r<   classmethodrJ   r   r   r   r   r   @   s    

r   c                   @   s4   e Zd ZdZdZdZedd Zdd Zdd	 Z	d
S )r   zK
    ModularIndexing(a, b, c) => (a // b) % c where % is the C modulus
       Tc                 C   s|  |dks|dkrt dS t|t jr%t|t jr%t|t jr%|| | S z!|dkrEt ||}|dkrEtt || t || |W S W n
 t jyP   Y nw t|t jrg }d}|jD ]7}t ||| || krt|t jrv|dk st|t j	rt|jd t jr|jd dk rd} n|
| q^t|t|jkr|rtt|||S t|trt|jd |jd | |S d S )Nr   r5   TF)r   rD   r   rF   r   rG   rH   Addr   rC   appendlensumr   )rI   r2   r6   modulusrF   	new_termsall_positivetermr   r   r   rJ      sT   







zModularIndexing.evalc                 C       | j d d \}}t|j|jS Nr+   )r   r)   is_nonnegativer1   pqr   r   r   _eval_is_nonnegative      z$ModularIndexing._eval_is_nonnegativec                 C   r\   r]   )r   r)   is_positiver_   r   r   r   _eval_is_positive   rc   z!ModularIndexing._eval_is_positiveN)
rK   rL   rM   rN   rO   rB   rQ   rJ   rb   re   r   r   r   r   r      s    
0r   c                   @   s8   e Zd ZdZdZdd Zdd Zdd Zed	d
 Z	dS )Wherez#
    Good ol' ternary operator
    rR   c                 C       | j d jr| j d jrdS d S Nr5   r+   T)r   rB   r0   r   r   r   _eval_is_integer       zWhere._eval_is_integerc                 C   rg   rh   )r   r^   r0   r   r   r   rb      s   

zWhere._eval_is_nonnegativec                 C   rg   rh   r   rd   r0   r   r   r   re      rj   zWhere._eval_is_positivec                 C   s    |t jkr|S |t jkr|S d S r   )r   truefalse)rI   cr`   ra   r   r   r   rJ      s
   

z
Where.evalN)
rK   rL   rM   rN   rO   ri   rb   re   rQ   rJ   r   r   r   r   rf      s    rf   c                   @   s0   e Zd ZdZdZedd Zdd Zdd Zd	S )
	PythonModr*   Tc                 C   s   |j rtd|tju s||| fv s|dkrtjS |jr$|jr$|| S |jr7|dkr7|jr1tjS |jr7tjS || }|jrAtjS ||k }|j	rQt
|rQ|jrQ|S t||dkr\tjS d S )NModulo by zeror5   r+   r   )r?   r@   r   rA   	is_Numberis_evenis_oddOnerB   
is_Booleanboolrd   r   ModrI   r`   ra   r    lessr   r   r   rJ      s(    zPythonMod.evalc                 C      | j d jrdS d S Nr5   Trk   r0   r   r   r   rb        zPythonMod._eval_is_nonnegativec                 C   rz   r{   )r   is_negativer0   r   r   r   _eval_is_nonpositive  r|   zPythonMod._eval_is_nonpositiveN)	rK   rL   rM   rO   rB   rQ   rJ   rb   r~   r   r   r   r   ro      s    
+ro   c                   @   s$   e Zd ZdZdZdZedd ZdS )rw   r*   Tc                 C   s   |j rtd|tju s||| fv s|dkrtjS |jr4|jr4|dks(J ||dks0J ||| S |jrG|dkrG|jrAtjS |jrGtjS || }|jrQtjS ||k }|j	rat
|rc|jre|S d S d S d S )Nrp   r5   r   r+   )r?   r@   r   rA   rq   rr   rs   rt   rB   ru   rv   rd   rx   r   r   r   rJ   &  s(   	 zMod.evalN)rK   rL   rM   rO   rB   r^   rQ   rJ   r   r   r   r   rw      s    rw   c                   @   s   e Zd ZdZdS )r   zZ
    Div where we can assume no rounding.
    This is to enable future optimizations.
    N)rK   rL   rM   rN   r   r   r   r   r   S  s    r   c                   @      e Zd ZdZedd ZdS )	CeilToIntTc                 C   \   |t jkrt tjd S |t j krt tj d S t|t jr,t tt	|S d S r4   )
r   oorD   sysmaxsizer   Numbermathceilr   rI   numberr   r   r   rJ   a     
zCeilToInt.evalNrK   rL   rM   rB   rQ   rJ   r   r   r   r   r   ^      r   c                   @   r   )
FloorToIntTc                 C   r   r4   )
r   r   rD   r   r   r   r   r   floorr   r   r   r   r   rJ   o  r   zFloorToInt.evalNr   r   r   r   r   r   l  r   r   c                   @   s   e Zd ZdZdZdd ZdS )r   z.
    Div used in indexing that rounds up.
    Tc                 C   s@   t |}t |}t |||krt||S t||d  |S r4   )r   sympifyrF   r   r   rI   r2   r6   r   r   r   __new__  s
   


zCeilDiv.__new__N)rK   rL   rM   rN   rB   r   r   r   r   r   r   z  s    r   c                   @   r   )r	   Tc                 C   s   |dk rt d|d|  S Nr   znegative shift countr+   
ValueErrorrI   r2   shiftr   r   r   rJ        zLShift.evalNr   r   r   r   r   r	     r   r	   c                   @   r   )r
   Tc                 C   s   |dk rt d|d|  S r   r   r   r   r   r   rJ     r   zRShift.evalNr   r   r   r   r   r
     r   r
   c                 C   s4   d}| dk r|  } |d dkrdnd}|t | | S )Nr5   r   r+   r>   )	_safe_pow)r2   expsignr   r   r   safe_pow  s
   r   c                 C   s   |dk rt d|dkrdS t| |d }|tjd kr!tjd S || }|tjd kr1tjd S |d dkrG|| 9 }|tjd krGtjd S |S )Nr   zExponent must be non-negative.r5   r+   )r   r   r   r   )r2   exponenthalf_expresultr   r   r   r     s   


r   c                   @   r   )r   Tc                 C   s`   t |tjrt |tjrtt||S t |tjr.td}tt|D ]}||9 }q%|S d S r4   )r   r   r   rD   r   rangerE   )rI   r2   r   r    _r   r   r   rJ     s   

zPowByNatural.evalNr   r   r   r   r   r     r   r   c                   @       e Zd ZdZdZedd ZdS )r   FTc                 C   s6   t |tjrt |tjrtt|t| S d S d S r   )r   r   r   r   r   )rI   r2   r   r   r   r   rJ     s   zFloatPow.evalNrK   rL   rM   rB   is_realrQ   rJ   r   r   r   r   r     
    r   c                   @   r   )r   FTc                 C   D   |j rtdt|tjrt|tjr tt|t| S d S d S Nr=   )r?   r@   r   r   r   r   r   r   r   r   r   rJ     s
   zFloatTrueDiv.evalNr   r   r   r   r   r     r   r   c                   @   r   )r   FTc                 C   r   r   )r?   r@   r   r   r   r   rE   r   r   r   r   rJ     s
   zIntTrueDiv.evalNr   r   r   r   r   r     r   r   c                   @   r   )r   Tc                 G   sx   t |d dks
J t |d }tdd |D r:ddlm} |d| }||d  }|dd |D dd |D S d S )Nr+   r   c                 s   r   r   )r   r   rD   r   r   r   r   r     r   z9IsNonOverlappingAndDenseIndicator.eval.<locals>.<genexpr>)!eval_is_non_overlapping_and_densec                 S   s   g | ]}t |qS r   )rE   r   r   r   r   
<listcomp>   s    z:IsNonOverlappingAndDenseIndicator.eval.<locals>.<listcomp>)rV   all%torch.fx.experimental.symbolic_shapesr   )rI   r   dimr   	size_argsstride_argsr   r   r   rJ     s   z&IsNonOverlappingAndDenseIndicator.evalNr   r   r   r   r   r     r   r   c                   @   r   )TruncToFloatFTc                 C   s$   t |tjrttt|S d S r   )r   r   r   r   r   truncr   r   r   r   r   rJ   *  s   zTruncToFloat.evalNr   r   r   r   r   r   &  r   r   c                   @   r   )
TruncToIntTc                 C   r   r4   )
r   r   rD   r   r   r   r   r   r   r   r   r   r   r   rJ   7  r   zTruncToInt.evalNr   r   r   r   r   r   4  r   r   c                   @   r   )r   Tc                 C   s$   t |tjrttt|dS d S r.   )r   r   r   rD   roundr   r   r   r   r   rJ   F  s   zRoundToInt.evalNr   r   r   r   r   r   C  r   r   c                   @   r   )r   FTc                 C   s8   t |tjrt |tjrttt|t|S d S d S r   )r   r   r   rD   r   r   rE   )rI   r   ndigitsr   r   r   rJ   a  s   zRoundDecimal.evalNr   r   r   r   r   r   ]  r   r   c                   @   r   )r   FTc                 C   s4   |t jt j fv r|S t|t jrt t|S d S r   )r   r   r   rD   r   rE   r   r   r   r   rJ   m  s
   zToFloat.evalNr   r   r   r   r   r   i  r   r   c                    s$   G  fdddt j}d  |_|S )Nc                       s$   e Zd ZdZ Ze fddZdS )z+make_opaque_unary_fn.<locals>.OpaqueUnaryFna  
        Unlike the builtin sympy functions on real numbers like sympy.sqrt,
        these equivalents do not do any nontrivial reasoning besides
        constant propagation.  This helps avoid performing transformations
        that are valid for real numbers but are invalid for floating point;
        in particular, while we are willing to make optimizations that change
        numerics for Tensor compute, we are NOT willing to make optimziations
        that change numerics for size compute.
        c                    s|   t |tjtjfr'zttt t|W S  ty&   tt | Y S w |tjtj tj	tj	 fv r<tt |S d S r   )
r   r   rD   r   getattrr   r   OverflowErrorr   zoo)rI   r   namer   r   rJ     s   z0make_opaque_unary_fn.<locals>.OpaqueUnaryFn.evalN)rK   rL   rM   rN   _torch_handler_namerQ   rJ   r   r   r   r   OpaqueUnaryFnw  s
    
r   OpaqueUnaryFn_)r   FunctionrK   )r   r   r   r   r   make_opaque_unary_fnv  s   
r   sqrtcoscoshsinsinhtantanhasinacosatanr   logasinh).r$   r   r   r   r   __all__r&   r)   r   r   r   rf   ro   rw   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   OpaqueUnaryFn_sqrtOpaqueUnaryFn_cosOpaqueUnaryFn_coshOpaqueUnaryFn_sinOpaqueUnaryFn_sinhOpaqueUnaryFn_tanOpaqueUnaryFn_tanhOpaqueUnaryFn_asinOpaqueUnaryFn_acosOpaqueUnaryFn_atanOpaqueUnaryFn_expOpaqueUnaryFn_logOpaqueUnaryFn_asinhr   r   r   r   <module>   sZ   HB93

&