o
    eiE                  	   @   s  d dl Z d dlmZ d dlmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlm Z  ddl!m"Z" ertd dl#m$Z$ ddl%m&Z& d dl'm(Z( ej)Z)dedede*fddZ+de,e dede*fddZ-dej.ddddfdd Z/dej.de*fd!d"Z0d#e*dej1fd$d%Z2d#e*dej3fd&d'Z4e(d(d)d*d+e*d,e*ddfd-d.Z5e5j6d+e*d,e*ddfd/d0Z7eej8j9j:j; e(d1d)d*d+e*d,e*ddfd2d3Z<e<j6d+e*d,e*ddfd4d0Z7eej8j9j=j; e(d5d)d*d6e*d7e*ddfd8d9Z>e>j6d6e*d7e*ddfd:d0Z7eej8j9j>j; e(d;d)d*d6e*d7e*ddfd<d=Z?e?j6d6e*d7e*ddfd>d0Z7eej8j9j?j; e(d?d)d*d@e*dAe*ddfdBdCZ@e@j6d6e*d7e*ddfdDd0Z7eej8j9j@j; e(dEd)d*dFe*dGe*dHej)ddfdIdJZAeej8j9jAj; e(dKd)d*dLej)d7e*ddfdMdNZBeBj6dGe*dFe*dHej)ddfdOd0Z7G dPdQ dQZCG dRdS dSe ZDG dTdU dUeDZEG dVdW dWeZFdS )X    N)Callable)AnyOptional)ConstDictVariable)TupleVariable)has_side_effectProxy   )graph_break_hints)create_call_function)TYPE_CHECKINGunimplemented)get_external_object_by_indexregister_graph_created_objectCurrentStreamSource   )VariableTracker)CONSTANT_VARIABLE_NONEConstantVariable)FxTracebackAnnotateVariable)LazyVariableTracker)InstructionTranslator)	PyCodegen)	custom_opargskwargsreturnc                  O   *   t j| i |}t|ttg ti S N)torchEventr   EventVariable make_construct_in_graph_event_fnr   r   )r   r   event r%   i/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_dynamo/variables/streams.py	new_event#      r'   c                  O   r   r   )r    Streamr   StreamVariable!make_construct_in_graph_stream_fnr   r   )r   r   streamr%   r%   r&   
new_stream-   r(   r-   devicecgr   c                    s2      fdd  t|   tdd d S )Nc                           tjjjdS Nstash_graph_created_objectload_import_fromr    _dynamograph_bytecode_inputs__name__r%   r/   r%   r&   <lambda>9       z)_codegen_current_stream.<locals>.<lambda>r   F)add_push_nullr   extend_outputr   )r.   r/   r%   r8   r&   _codegen_current_stream7   s
   
r=   c                    s   t j }t| fddS )Nc                    s
   t  |S r   )r=   )_r/   r.   r%   r&   r9   E   s   
 z$get_current_stream.<locals>.<lambda>)r    acceleratorcurrent_streamr   )r.   r,   r%   r?   r&   get_current_streamB   s   rB   indexc                 C   &   t | }t|tjsJ d|  |S )Nz3Fork/join stream expected a stream object at index )r   
isinstancer    r)   )rC   r,   r%   r%   r&   _get_stream_by_indexI   
   rF   c                 C   rD   )Nz4Record/wait event expected an event object at index )r   rE   r    r!   )rC   r$   r%   r%   r&   _get_event_by_indexQ   rG   rH   zstreams::forkr%   )mutates_args
from_indexto_indexc                 C      t jt| d S r   r    r@   
set_streamrF   rJ   rK   r%   r%   r&   fork_streamY   s   rP   c                 C      d S r   r%   rO   r%   r%   r&   r>   a      r>   zstreams::joinc                 C   rL   r   rM   rO   r%   r%   r&   join_streaml   s   rS   c                 C   rQ   r   r%   rO   r%   r%   r&   r>   q   rR   zstreams::record_eventevent_indexstream_indexc                 C      t | }t|}|| d S r   )rH   rF   record_eventrT   rU   r$   r,   r%   r%   r&   rW   |      rW   c                 C   rQ   r   r%   rT   rU   r%   r%   r&   r>      rR   zstreams::wait_eventc                 C   rV   r   )rH   rF   
wait_eventrX   r%   r%   r&   r[      rY   r[   c                 C   rQ   r   r%   rZ   r%   r%   r&   r>      rR   zstreams::wait_streamwaiting_stream_indexwaited_on_stream_indexc                 C   s   t | }t |}|| d S r   )rF   wait_stream)r\   r]   waiting	waited_onr%   r%   r&   r^      rY   r^   c                 C   rQ   r   r%   rZ   r%   r%   r&   r>      rR   zstreams::sync_deallocwait_event_indexsrc_stream_index
to_deallocc                 C   s   t jjj| | dS )a  An op which waits on an event and moves the last usage of to_dealloc
    after the wait, so that after the sync occurs, the deallocation or
    subsequent reuse of the tensor's memory will be guaranteed to happen
    after a side stream is finished using it.
    See https://docs.pytorch.org/docs/stable/generated/torch.Tensor.record_stream.html#torch.Tensor.record_stream
    for more detailsN)r    opsstreamsr[   default)ra   rb   rc   r%   r%   r&   sync_dealloc   s   
rg   zstreams::record_streamtensorc                 C   s   |  t| d S r   )record_streamrF   )rh   rU   r%   r%   r&   ri      s   ri   c                 C   rQ   r   r%   )rb   ra   rc   r%   r%   r&   r>      s   c                   @   sV   e Zd ZdZdddZddd	Zdd
dZddeej	 ddfddZ
defddZdS )SymbolicStreamStatez)Track the currently entered stream if anyr   Nc                 C   sP   ddl m} g }tj r tjtj |tj jd}|g}t	
|| _d S )Nr	   r   )source)rk   r   r    r@   is_availabler   createrA   r.   collectionsdequecur_stream_stack)selfr   	cur_stack
stream_varr%   r%   r&   __init__   s   

zSymbolicStreamState.__init__r,   r*   c                 C   s   | j | d S r   )rp   append)rq   r,   r%   r%   r&   enter_stream   s   z SymbolicStreamState.enter_streamc                 C   s   | j   d S r   )rp   poprq   r%   r%   r&   exit_stream      zSymbolicStreamState.exit_streamr.   c                 C   s4   |d urt | jD ]}|j|kr|  S q	| jd S )N)reversedrp   r.   )rq   r.   r,   r%   r%   r&   
cur_stream   s   

zSymbolicStreamState.cur_streamc                 C   s   t | jdkS )Nr   )lenrp   rx   r%   r%   r&   in_stream_context   rz   z%SymbolicStreamState.in_stream_context)r   N)r,   r*   r   Nr   )r7   
__module____qualname____doc__rt   rv   ry   r   r    r.   r}   boolr   r%   r%   r%   r&   rj      s    


rj   c                	       s   e Zd ZdZedddddeeef dd fdd	Zd
e	d deddf fddZ
dddedef fddZdddedef fddZdefddZdddZ  ZS )StreamContextVariablez(This represents torch.cuda.StreamContexttxr   stream_to_enterr*   r   r   c                 K   s   t |fi |S r   )r   )r   r   r   r%   r%   r&   rm      s
   zStreamContextVariable.creater,   Nc                    s,   || _ t jdd|  jid d| d S )Nr,   )target_valuesinitial_valuesr%   )r,   superrt   
get_streamuser_object_index)rq   r,   r   	__class__r%   r&   rt     s   
zStreamContextVariable.__init__r   c                    s   |j |   t |S r   )symbolic_stream_staterv   r   r   enterrq   r   r   r   r%   r&   r   
  s   zStreamContextVariable.enterc                    s   |j   t j|g|R  S r   )r   ry   r   exitr   r   r%   r&   r     s   
zStreamContextVariable.exitc                 C      dS )NTr%   rx   r%   r%   r&   supports_graph_breaks     z+StreamContextVariable.supports_graph_breaksc                 C   s   | j sJ d| j S )Nz,Stream context should have a separate stream)r,   rx   r%   r%   r&   r     s   z StreamContextVariable.get_streamr   r*   )r7   r   r   r   staticmethoddictstrr   rm   r   rt   r   r   r   r   r   r   __classcell__r%   r%   r   r&   r      s:    

r   c                       s   e Zd ZdZ	d dedejdee de	ddf
 fdd	Z
defd
dZdddedee deeef def
 fddZdefddZdefddZdefddZd!ddZd"ddZedededeedgdf fddZ  ZS )#r*   z1Represents the device-agnostic torch.Stream classNproxyvaluer   r   r   c                    sX   |d urd|j jv r|j jd |ksJ || _|| _|j| _|| _t jdi | d S )Nexample_valuer   )nodemetar   r   r.   r   r   rt   rq   r   r   r   r   r   r%   r&   rt   %  s   	zStreamVariable.__init__c                 C   s   t jS r   )r    r)   rx   r%   r%   r&   python_type9     zStreamVariable.python_typer   r   namer   c                    sx  t | j|sJ d| ddlm}m} ddlm} |dv r2|jjd|g|| g| |R   t	S |dkrL|t
||jjd|g|| g| |R  d	S |d
krf|t||jjd|g|| g| |R  d	S ||v rt|dkr|sddlm}m}	 | jr|	| j|j |d }
t|
tst
tS |
jr| jd usJ |	| j|j t
|| | j|
jS t ||||S )Nzno stream method found named r	   )cmp_name_to_op_mappingproxy_args_kwargsr   wrap_fx_proxy_cls)r^   synchronizer[   call_methodquery
target_clsr   r   rW   )GuardBuilderinstall_guardr   )hasattrr   utilsr   r   builderr   outputcreate_proxyr   r   r"   r~   guardsr   r   rk   
make_guardEQUALS_MATCHrE   r*   rm   NotImplementedr   r   )rq   r   r   r   r   r   r   r   r   r   otherr   r%   r&   r   <  sX   

zStreamVariable.call_methodc                 C      | j S r   r   rx   r%   r%   r&   as_proxyr  r   zStreamVariable.as_proxyc                 C   r   )Nztorch._Cr%   rx   r%   r%   r&   module_nameu  r   zStreamVariable.module_namec                 C   r   )Nr)   r%   rx   r%   r%   r&   fn_namex  r   zStreamVariable.fn_namecodegenr   c                    s   | j rJ | jd ur&  fdd   | j  tdd d S d| j } jj	
|| j}  j|dd d S )Nc                      r0   )Nr   r3   r%   r   r%   r&   r9     r:   z,StreamVariable.reconstruct.<locals>.<lambda>r   F_stream_Tadd)rk   r   r;   append_outputcreate_load_constr<   r   r.   r   r   install_global_by_idr   create_load_globalrq   r   prefixr   r%   r   r&   reconstruct{  s   


zStreamVariable.reconstructc                 C   s   | S r   r%   rx   r%   r%   r&   r     r   zStreamVariable.get_streamc                        dt dddd f fdd}|S )NrC   r   r   r   c                    X      fdd    fdd      tdd  tdd d S )Nc                      r0   r1   r3   r%   r   r%   r&   r9     r:   zNStreamVariable.make_construct_in_graph_stream_fn.<locals>.fn.<locals>.<lambda>c                      r0   )Nbuild_streamr4   r    r5   r   r7   r%   r   r%   r&   r9         
r	   Fr   r;   r<   r   rC   r   r   r   r   r&   fn     

z<StreamVariable.make_construct_in_graph_stream_fn.<locals>.fnintr   r   r   r%   r   r&   r+        z0StreamVariable.make_construct_in_graph_stream_fnr   r   r   r   Nr   )r7   r   r   r   r   r    r)   r   r   r   rt   typer   r   listr   r   r   r   r   r   r   r   r   r   r   r   r+   r   r%   r%   r   r&   r*   "  sN    
6

r*   c                
       s   e Zd Zdedejdee deddf
 fddZ	d	d
de
dee dee
ef def
ddZdefddZed	d
dee dee
ef ddfddZedededeedgdf fddZdddZ  ZS )r"   r   r   r   r   r   Nc                    sP   |d urd|j jv r|j jd |ksJ t jdi | || _|| _|| _d S )Nr   r%   )r   r   r   rt   r   r   r   r   r   r%   r&   rt     s   
zEventVariable.__init__r   r   r   r   c              
   C   s0  ddl m} ddlm} |dkr'|jdtjjj	| j
t|||j
fi  tS |dkrB|jdtjjj| j
t|||j
fi  tS |dkrY|jjd	|g|| g| |R   tS |d
krs|t||jjd	|g|| g| |R  dS t| jj dt| jj d| }tdt|d| dg tjd d S )Nr	   )r   r   r   waitcall_functionrecordr   r   r   r   .zUnsupported event methodz#Dynamo doesn't support tracing the zC method. We currently support wait, record, synchronize, and query.)gb_typecontextexplanationhints)r   r   r   r   r   r   r    rd   re   r[   r   r"   _get_stream_argr   rW   r   r   r   r   r   r   r   r
   SUPPORTABLE)rq   r   r   r   r   r   r   method_namer%   r%   r&   r     sb   		"	

zEventVariable.call_methodc                 C   r   r   r   rx   r%   r%   r&   r     r   zEventVariable.as_proxyr*   c                 C   s2   d }|r	|d }n|r| d}|s| j }|S )Nr   r,   )getr   r}   )r   r   r   
stream_argr%   r%   r&   r     s   


zEventVariable._get_stream_argr   c                    r   )NrC   r   r   r   c                    r   )Nc                      r0   r1   r3   r%   r   r%   r&   r9     r:   zLEventVariable.make_construct_in_graph_event_fn.<locals>.fn.<locals>.<lambda>c                      r0   )Nbuild_eventr   r%   r   r%   r&   r9     r   r	   Fr   r   r   r   r   r&   r     r   z:EventVariable.make_construct_in_graph_event_fn.<locals>.fnr   r   r%   r   r&   r#     r   z.EventVariable.make_construct_in_graph_event_fnr   c                 C   s8   | j rJ d}|jj|| j}||j|dd d S )N_eventTr   )rk   r   r   r   r   r   r   r   r%   r%   r&   r     s   
zEventVariable.reconstructr   )r7   r   r   r   r    r!   r   r   r   rt   r   r   r   r   r   r   r   r   r   r   r   r#   r   r   r%   r%   r   r&   r"     sV    

;
r"   )Grn   collections.abcr   typingr   r   r    torch._dynamo.variables.dictsr   torch._dynamo.variables.listsr   torch.fxr   r    r
   bytecode_transformationr   excr   r   r6   r   r   rk   r   baser   constantr   r   ctx_managerr   lazyr   torch._dynamo.symbolic_convertr   r   r   torch._library.custom_opsr   Tensorr   r'   tupler-   r.   r=   rB   r)   rF   r!   rH   rP   register_faker>   rd   re   forkrf   rS   joinrW   r[   r^   rg   ri   rj   r   r*   r"   r%   r%   r%   r&   <module>   s    








$. 