U
    9%e!                     @   sX  d dl Z d dlmZ d dl mZ d dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlmZ d dlmZmZ d	d
lmZmZmZ e ZG dd dZG dd dZdd ZG dd dZG dd dZG dd dZe  edeZedeZedeZedeZedeZ edeZ!edeZ"G dd dZ#G d d! d!Z$e$ Z%G d"d# d#Z&e& Z'dS )$    N)contextmanager)chain)local)Any)patch)IndentedBuffer)inplace_methodsmagic_methods   )reduction_num_outputs	sympy_strsympy_symbolc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Virtualizedz
    A global variable that redirects via thread local variable

    This allows us to swap in different op implementations in codegen.
    c                 C   s   d| | _ || _d S )NZ__torchinductor_)_key_default)selfZvnamedefault r   Z/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/_inductor/virtualized.py__init__   s    zVirtualized.__init__c                    s.      ttj| t fdd}| S )Nc                	   3   s   z
d V  W 5    X d S N)_set_handlerr   Zpriorr   r   r   ctx"   s    
z%Virtualized._set_handler.<locals>.ctx)_get_handlersetattrthreadlocalr   r   )r   valuer   r   r   r   r      s
    zVirtualized._set_handlerc                 C   s0   zt t| jW S  tk
r*   |   Y S X d S r   )getattrr   r   AttributeErrorr   r   r   r   r   r   +   s    zVirtualized._get_handlerc                 C   s   t |  |S r   )r   r   )r   namer   r   r   __getattr__1   s    zVirtualized.__getattr__N)__name__
__module____qualname____doc__r   r   r   r"   r   r   r   r   r      s
   r   c                   @   s   e Zd ZdS )NullHandlerN)r#   r$   r%   r   r   r   r   r'   5   s   r'   c                 C   s   t | tjrt| S t| S r   )
isinstancesympyExprr   str)ar   r   r   _arg_str9   s    r-   c                   @   s:   e Zd Zdd Zedd ZedddZedd	 Zd
S )MockHandlerc                    s    dkrdS  fdd}|S )Nr!   r.   c                     s>   dd | D }| dd | D  d  dd| dS )	Nc                 S   s   g | ]}t |qS r   )r-   .0r,   r   r   r   
<listcomp>E   s     z:MockHandler.__getattr__.<locals>.inner.<locals>.<listcomp>c                 s   s    | ]\}}| d | V  qdS )=Nr   r0   kvr   r   r   	<genexpr>F   s     z9MockHandler.__getattr__.<locals>.inner.<locals>.<genexpr>zops.(, ))extenditemsjoin)argskwargsZfargsr!   r   r   innerD   s    z&MockHandler.__getattr__.<locals>.innerr   r   r!   r@   r   r?   r   r"   @   s    zMockHandler.__getattr__c                 C   s   d|  d|  d| dS )Nzops.masked(r8   r9   r   )maskbodyotherr   r   r   maskedK   s    zMockHandler.maskedTc                 C   s   t dt|  dS )Nr7   r9   )r   r+   )Z	index_varsizecheckr   r   r   indirect_indexingO   s    zMockHandler.indirect_indexingc                 C   s8   dd }t t t D ]\}}t| ||| qd S )Nc                    s   t  fdd}|S )Nc                     s
    j |  S r   )format)r=   format_stringr   r   r@   V   s    z:MockHandler._init_cls.<locals>.make_handler.<locals>.inner)staticmethod)rK   r@   r   rJ   r   make_handlerU   s    z+MockHandler._init_cls.<locals>.make_handler)r   r	   r;   r   r   )clsrM   r!   rK   r   r   r   	_init_clsS   s     zMockHandler._init_clsN)T)	r#   r$   r%   r"   rL   rE   rH   classmethodrO   r   r   r   r   r.   ?   s   
r.   c                   @   s:   e Zd Zdd ZedddZdd Zdd	 Zd
d ZdS )KernelFormatterHandlerc                 C   s   || _ td| _t | _d S )Nr
   )parent_handlerr   output	itertoolscountvar_counter)r   rR   r   r   r   r   c   s    
zKernelFormatterHandler.__init__Nc                 C   s  ddl m} |d k	r||gn|g}|d k	r2ddgndg}tt }|jd  |jdd| d W 5 Q R X t||D ]6\}}|r~dd	d
 |D }	|j|	 d|  q~t	
|F t|dd, | | }
||
W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )Nr
   )FlexibleLayoutindexrindexzdef inner_fn(r8   z):c                 S   s(   g | ] }t t|ttjfrd n|qS )_)r+   r(   intr)   Integerr0   r5   r   r   r   r1   u   s   z7KernelFormatterHandler.ir_to_string.<locals>.<listcomp> = Zallow_indexingT)ZirrW   rQ   r.   rS   indent	writeliner<   zipVset_ops_handlerr   objectgetvalue)Zir_fnrX   rY   rW   r=   names	formatterr!   arglhsresultr   r   r   ir_to_stringh   s*    
$  z#KernelFormatterHandler.ir_to_stringc                    s    fdd}|S )Nc                     sH   t j | |} dkr|S dtj }j| d|  |S )NrH   tmpr_   )r   rR   nextrV   rS   ra   )r=   r>   linevarnamer!   r   r   r   r@      s    z1KernelFormatterHandler.__getattr__.<locals>.innerr   rA   r   rq   r   r"      s    	z"KernelFormatterHandler.__getattr__c                    sd    j ||||}t|} fddt|D } jd| d|  |dkr\t|S |d S )Nc                    s   g | ]}d t  j qS )rm   )rn   rV   )r0   r[   r    r   r   r1      s     z4KernelFormatterHandler.reduction.<locals>.<listcomp>,r_   r
   r   )rR   	reductionr   rangerS   ra   r<   tuple)r   ZdtypeZ	src_dtypeZreduction_typer   ro   Z
num_valuesvarnamesr   r    r   rs      s
    z KernelFormatterHandler.reductionc                 C   s   | j d|  | j  S )Nzreturn )rS   ra   rf   )r   rk   r   r   r   rf      s    zKernelFormatterHandler.getvalue)N)	r#   r$   r%   r   rL   rl   r"   rs   rf   r   r   r   r   rQ   b   s   rQ   c                   @   s   e Zd Zdd Zdd ZdS )WrapperHandlerc                 C   s
   || _ d S r   )_inner)r   r@   r   r   r   r      s    zWrapperHandler.__init__c                 C   s   t | j|S r   )r   rx   )r   itemr   r   r   r"      s    zWrapperHandler.__getattr__N)r#   r$   r%   r   r"   r   r   r   r   rw      s   rw   opsgraphreal_inputs	fake_modekerneldebuginterpreterc                   @   sr   e Zd ZU dZeed< 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d Zdd ZdS )OpsValuea,  The return type of most ops calls.

    This exists so we can overload magic methods, and write mathematical
    expressions much more fluently. So instead of

        ops.add(ops.mul(ops.mul(ops.sub(ops.mul(_Ap2, x), _Ap3), x), x), _1)

    we can write

        (_Ap2 * x - _Ap3) * x * x + _1

    r   c                 C   s
   || _ d S r   r   )r   r   r   r   r   r      s    zOpsValue.__init__c                 C   s
   t | jS r   )r+   r   r    r   r   r   __str__   s    zOpsValue.__str__c                 C   s   d| j dS )Nz	OpsValue(r9   r   r    r   r   r   __repr__   s    zOpsValue.__repr__c                 C   s   t | |S r   )rz   addr   rD   r   r   r   __add__   s    zOpsValue.__add__c                 C   s   t | |S r   )rz   mulr   r   r   r   __mul__   s    zOpsValue.__mul__c                 C   s   t | |S r   )rz   subr   r   r   r   __sub__   s    zOpsValue.__sub__c                 C   s
   t | S r   )rz   negr    r   r   r   __neg__   s    zOpsValue.__neg__c                 C   s   t | |S r   )rz   truedivr   r   r   r   __truediv__   s    zOpsValue.__truediv__c                 C   s   t | |S r   )rz   floordivr   r   r   r   __floordiv__   s    zOpsValue.__floordiv__c                 C   s   t | |S r   )rz   modr   r   r   r   __mod__   s    zOpsValue.__mod__c                 C   s   t | |S r   )rz   powr   r   r   r   __pow__   s    zOpsValue.__pow__N)r#   r$   r%   r&   r   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
r   c                   @   s>   e Zd ZdZdd Zedd Zedd Zedd	d
ZdS )
OpsWrapperzThis wraps any returned IR values into an `OpsValue` instance, so that we
    can overload the magic methods for writing mathematical expressions fluently.
    c                    s    fdd}|S )Nc                     s6   dd | D }dd |  D }ttt ||S )Nc                 S   s   g | ]}t |qS r   r   _unwrapr/   r   r   r   r1      s     z9OpsWrapper.__getattr__.<locals>.inner.<locals>.<listcomp>c                 S   s   i | ]\}}|t |qS r   r   r3   r   r   r   
<dictcomp>   s      z9OpsWrapper.__getattr__.<locals>.inner.<locals>.<dictcomp>)r;   r   _wrapr   _ops)r=   r>   new_argsZ
new_kwargsr?   r   r   r@      s    z%OpsWrapper.__getattr__.<locals>.innerr   rA   r   r?   r   r"      s    zOpsWrapper.__getattr__c                 C   s4   t | ttfr tdd | D S t | tr0| jS | S )Nc                 s   s   | ]}t |V  qd S r   r   r^   r   r   r   r6      s     z%OpsWrapper._unwrap.<locals>.<genexpr>)r(   listru   r   r   xr   r   r   r      s
    
zOpsWrapper._unwrapc                 C   s(   t | ttfr tdd | D S t| S )Nc                 s   s   | ]}t |V  qd S r   )r   r^   r   r   r   r6      s     z#OpsWrapper._wrap.<locals>.<genexpr>)r(   r   ru   r   r   r   r   r   r      s    zOpsWrapper._wrapTc                 C   s   t | } t| ||S r   )r   r   r   rH   )rX   rF   rG   r   r   r   rH      s    
zOpsWrapper.indirect_indexingN)T)	r#   r$   r%   r&   r"   rL   r   r   rH   r   r   r   r   r      s   

r   c                   @   s   e Zd ZeZeZeZejZej	Z
ejZejZej	ZejZej	ZejZejZejZeedddZedd Zedd Zedd	 Zed
d Zedd Zedd Z dS )_V)returnc                 C   s   t  S )z9The operator handler specific to the current codegen task)r   r   r    r   r   r   rz     s    z_V.opsc                 C   s   t  S z#The graph currently being generated)_graphr   r    r   r   r   r{     s    z_V.graphc                 C   s   t  S )znon-fake example inputs)_real_inputsr   r    r   r   r   r|     s    z_V.real_inputsc                 C   s   t  S r   )
_fake_moder   r    r   r   r   r}   #  s    z_V.fake_modec                 C   s   t  S )z$The kernel currently being generated)_kernelr   r    r   r   r   r~   (  s    z	_V.kernelc                 C   s   t  S r   )_debugr   r    r   r   r   r   -  s    z_V.debugc                 C   s   t  S r   )_interpreterr   r    r   r   r   r   1  s    z_V.interpreterN)!r#   r$   r%   r.   rQ   rw   r   r   rd   r   Zget_ops_handlerr   Zset_graph_handlerr   Zset_real_inputsZget_real_inputsr   Zset_fake_modeZget_fake_moder   Zset_kernel_handlerr   Zset_debug_handlerr   Zset_interpreter_handlerpropertyrz   r{   r|   r}   r~   r   r   r   r   r   r   r     s6   




r   )(rT   
contextlibr   r   	threadingr   typingr   Zunittest.mockr   r)   Ztorch._inductor.utilsr   Ztorch.fx.graphr   r	   utilsr   r   r   r   r   r'   r-   r.   rQ   rw   rO   r   r   r   r   r   r   r   r   r   rz   r   rc   r   r   r   r   <module>   s:   "#8






2"2