U
    <ºcB   ã                   @   s   d dl mZ G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZ	G dd„ deƒZ
G dd„ deƒZdS )é    )Úcommunicationc                   @   s   e Zd ZdZdd„ ZdS )ÚProtocol©Úrequest_queueÚresponse_queuec                 C   s   || _ || _d S ©Nr   ©Úselfr   r   © r
   úK/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/data/communication/protocol.pyÚ__init__   s    zProtocol.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r
   r
   r
   r   r      s   r   c                   @   s@   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd
d„Zddd„Z	dS )ÚProtocolClientzr
        ProtocolClient takes charge of putting requests into req_queue and returning results from res_queue.
    Nc                 C   s   || _ || _d | _d S r   )r   r   Ú	_req_sentr   r
   r
   r   r      s    zProtocolClient.__init__c                 C   s
   | j d kS r   ©r   ©r	   r
   r
   r   Úcan_take_request   s    zProtocolClient.can_take_requestc                 C   s
   | j d k	S r   r   r   r
   r
   r   Úwaiting_for_response   s    z#ProtocolClient.waiting_for_responseTc                 C   s   |   ¡ stdƒ‚|| _d S )Nz/Protocol only supports one request in the Queue)r   Ú	Exceptionr   ©r	   Úrequestr
   r
   r   Úrequest_sent   s    zProtocolClient.request_sentc                 C   s   |   ¡ std|ƒ‚d | _d S )Nz5Expected no peding requests, but something got served)r   r   r   )r	   Úresultr
   r
   r   Úrequest_served"   s     ÿzProtocolClient.request_served)T)N)
r   r   r   Ú__doc__r   r   r   r   r   r   r
   r
   r
   r   r      s   
r   c                   @   s6   e Zd ZdZdZdd„ Zdd„ Zddd	„Zd
d„ ZdS )ÚProtocolServerzt
        ProtocolServer takes charge of getting requests from req_queue and fetching data from source datapipe.
    Nc                 C   s   || _ || _d | _d S r   )r   r   Ú_req_receivedr   r
   r
   r   r   /   s    zProtocolServer.__init__c                 C   s
   | j d k	S r   )r   r   r
   r
   r   Úhave_pending_request4   s    z#ProtocolServer.have_pending_requestFc              
   C   sX   |   ¡ rtdƒ‚z| jj|d}W n* tk
rL } ztdƒ‚W 5 d }~X Y nX || _|S )Nz5Trying to get next request, while having one unserved©Úblockúqueue is empty)r    r   r   ÚgetÚ
EmptyQueuer   ©r	   r"   ÚresponseÚer
   r
   r   Úget_new_request7   s    ÿzProtocolServer.get_new_requestc                 C   sD   |   ¡ stdƒ‚t| jtjjƒs(tdƒ‚| j tj 	¡ ¡ d | _d S )Nú(Attempting to reply with pending requestz8Replaying with terminate status to other type of message)
r    r   Ú
isinstancer   r   ÚmessagesZTerminateRequestr   ÚputZTerminateResponser   r
   r
   r   Úresponse_terminateC   s    ÿz!ProtocolServer.response_terminate)F)	r   r   r   r   r   r   r    r)   r.   r
   r
   r
   r   r   )   s   
r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMapDataPipeQueueProtocolServerc                 C   s0   |   ¡ stdƒ‚| j tj ||¡¡ d | _d S ©Nr*   )r    r   r   r-   r   r,   ZGetItemResponser   )r	   ÚkeyÚvaluer
   r
   r   Úresponse_itemN   s    z,MapDataPipeQueueProtocolServer.response_itemc                 C   s.   |   ¡ stdƒ‚| j tj |¡¡ d | _d S r0   )r    r   r   r-   r   r,   ÚLenResponser   )r	   Úsizer
   r
   r   Úresponse_lenT   s    z+MapDataPipeQueueProtocolServer.response_lenc                 C   s,   |   ¡ stdƒ‚| j tj ¡ ¡ d | _d S r0   ©r    r   r   r-   r   r,   ZStopIterationResponser   r   r
   r
   r   Úresponse_index_out_of_boundZ   s    z:MapDataPipeQueueProtocolServer.response_index_out_of_boundN)r   r   r   r3   r6   r8   r
   r
   r
   r   r/   M   s   r/   c                   @   s0   e Zd Zdd„ Zdd„ Zddd„Zdd	d
„ZdS )ÚMapDataPipeQueueProtocolClientc                 C   s4   |   ¡ stdƒ‚tj ¡ }| j |¡ |  |¡ d S )NzLCan not request len while we are still waiting response for previous request)r   r   r   r,   Z
LenRequestr   r-   r   r   r
   r
   r   Úrequest_lena   s
    
z*MapDataPipeQueueProtocolClient.request_lenc                 C   s6   |   ¡ stdƒ‚tj |¡}| j |¡ |  |¡ d S )NzMCan not request item while we are still waiting response for previous request)r   r   r   r,   ZGetItemRequestr   r-   r   )r	   Úindexr   r
   r
   r   Úrequest_itemh   s
    z+MapDataPipeQueueProtocolClient.request_itemFNc                 C   sf   |   ¡ stdƒ‚z| jj||d}W n tk
r@   tdƒ‚Y nX |  |¡ t|tj	j
ƒsbtdƒ‚|S )Nú5Can not expect any response without submitted request©r"   Útimeoutr#   úInvalid response received)r   r   r   r$   ÚTimeoutErrorr%   r   r+   r   r,   r4   ©r	   r"   r?   r'   r
   r
   r   Úget_response_leno   s    
z/MapDataPipeQueueProtocolClient.get_response_lenc                 C   sP   |   ¡ stdƒ‚z| jj||d}W n tk
r@   tdƒ‚Y nX |  |¡ |S ©Nr=   r>   r#   )r   r   r   r$   rA   r%   r   rB   r
   r
   r   Úget_response_item{   s    
z0MapDataPipeQueueProtocolClient.get_response_item)FN)FN)r   r   r   r:   r<   rC   rE   r
   r
   r
   r   r9   `   s   
r9   c                   @   s   e Zd ZdS )r%   N)r   r   r   r
   r
   r
   r   r%   ˆ   s   r%   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚIterDataPipeQueueProtocolServerc                 C   sD   |   ¡ stdƒ‚t| jtjjƒs(tdƒ‚| j tj 	¡ ¡ d | _d S )Nr*   z4Replaying with reset status to other type of message)
r    r   r+   r   r   r,   ÚResetIteratorRequestr   r-   ÚResetIteratorResponser   r
   r
   r   Úresponse_reset_iterator   s    ÿz7IterDataPipeQueueProtocolServer.response_reset_iteratorc                 C   s.   |   ¡ stdƒ‚| j tj |¡¡ d | _d S r0   )r    r   r   r-   r   r,   ZGetNextResponser   )r	   r2   r
   r
   r   Úresponse_next–   s    z-IterDataPipeQueueProtocolServer.response_nextc                 C   s,   |   ¡ stdƒ‚| j tj ¡ ¡ d | _d S r0   r7   r   r
   r
   r   Úresponse_stop_iterationœ   s    z7IterDataPipeQueueProtocolServer.response_stop_iterationc                 C   s,   |   ¡ stdƒ‚| j tj ¡ ¡ d | _d S r0   )r    r   r   r-   r   r,   ZInvalidStateResponser   r   r
   r
   r   Úresponse_invalid_state¢   s    z6IterDataPipeQueueProtocolServer.response_invalid_stateN)r   r   r   rI   rJ   rK   rL   r
   r
   r
   r   rF   Œ   s   	rF   c                   @   s0   e Zd Zdd„ Zdd„ Zddd„Zdd	d
„ZdS )ÚIterDataPipeQueueProtocolClientc                 C   s4   |   ¡ stdƒ‚tj ¡ }| j |¡ |  |¡ d S )NzFCan not reset while we are still waiting response for previous request)r   r   r   r,   rG   r   r-   r   r   r
   r
   r   Úrequest_reset_iteratorª   s
    
z6IterDataPipeQueueProtocolClient.request_reset_iteratorc                 C   s4   |   ¡ stdƒ‚tj ¡ }| j |¡ |  |¡ d S )NzRCan not request next item while we are still waiting response for previous request)r   r   r   r,   ZGetNextRequestr   r-   r   r   r
   r
   r   Úrequest_next±   s
    
z,IterDataPipeQueueProtocolClient.request_nextFc              
   C   sb   z| j j|d}W n* tk
r< } ztdƒ‚W 5 d }~X Y nX |  |¡ t|tjjƒs^tdƒ‚d S )Nr!   r#   r@   )	r   r$   r   r%   r   r+   r   r,   rH   r&   r
   r
   r   Úget_response_reset_iterator¸   s    
z;IterDataPipeQueueProtocolClient.get_response_reset_iteratorNc              
   C   s^   |   ¡ stdƒ‚z| jj||d}W n* tk
rN } ztdƒ‚W 5 d }~X Y nX |  |¡ |S rD   )r   r   r   r$   r%   r   )r	   r"   r?   r'   r(   r
   r
   r   Úget_response_nextÂ   s    ÿ
z1IterDataPipeQueueProtocolClient.get_response_next)F)FN)r   r   r   rN   rO   rP   rQ   r
   r
   r
   r   rM   ©   s   

rM   N)Ztorch.utils.datar   Úobjectr   r   r   r/   r9   r   r%   rF   rM   r
   r
   r
   r   Ú<module>   s   $(