U
    ©Ê¹j¢!  ã                   @   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/bwave/python/venv/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Úrindexéÿÿÿÿz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 )Ú
OpsWrapperz This 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