U
    9%eOC                     @   s$  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	Z	d dl
Z	d dlmZ zd dlZ W n ek
rx   Y nX G dd dZG dd	 d	eZe 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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 )+    N)ForkingPickler)register_after_fork)Union)check_serializing_named_tensorc                   @   sL   e Zd ZdZddgZdd Zedd Zdd	 Zd
d Z	dd Z
dd ZdS )StorageWeakRefzA weak reference to a Storage.

    The cdata member is a Python number containing the integer representation of
    the Storage pointer.cdata_free_weak_refc                 C   s   |  | _tjj| _d S N)Z	_weak_refr   torchStorager   )selfstorage r   _/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/multiprocessing/reductions.py__init__   s    
zStorageWeakRef.__init__c                 C   s   |  | }||_tjj|_|S r	   )__new__r   r
   r   r   )clsr   instancer   r   r   from_weakref%   s    

zStorageWeakRef.from_weakrefc                 C   s   t j| jS r	   )r
   r   Z_expiredr   r   r   r   r   expired,   s    zStorageWeakRef.expiredc                 C   s   |  | j d S r	   )r   r   r   r   r   r   __del__/   s    zStorageWeakRef.__del__c                 C   s   | j S r	   )r   r   r   r   r   __hash__2   s    zStorageWeakRef.__hash__c                 C   s    t | t |krdS | j|jkS )NT)idr   )r   otherr   r   r   __eq__5   s    zStorageWeakRef.__eq__N)__name__
__module____qualname____doc__	__slots__r   classmethodr   r   r   r   r   r   r   r   r   r      s   
r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )SharedCachez9dictionary from multiprocessing handles to StorageWeakRefc                 C   s   d| _ |   t| tj d S )N   )limit_after_forkr   r"   r   r   r   r   r   >   s    zSharedCache.__init__c                 C   s   t  | _d S r	   )	threadingLocklockr   r   r   r   r%   H   s    zSharedCache._after_forkc              
   C   s*   | j  t| |W  5 Q R  S Q R X d S r	   )r(   dictget)r   keyr   r   r   r*   K   s    zSharedCache.getc              	   C   s:   | j * t| || t| | jkr,|   W 5 Q R X d S r	   )r(   r)   __setitem__lenr$   free_dead_references)r   r+   storage_refr   r   r   r,   O   s    zSharedCache.__setitem__c                 C   sF   d}t |  D ] \}}| r(| |= q|d7 }qtd|d | _d S )Nr      r#      )listitemsr   maxr$   )r   liver+   r/   r   r   r   r.   U   s    
z SharedCache.free_dead_referencesN)	r   r   r   r   r   r%   r*   r,   r.   r   r   r   r   r"   ;   s   
r"   c                 C   s   t jj| |S r	   )r
   cudaEventZfrom_ipc_handle)devicehandler   r   r   rebuild_eventc   s    r:   c                 C   s   |   }t| j|ffS r	   )Z
ipc_handler:   r8   )eventr9   r   r   r   reduce_eventg   s    r<   c                 C   sJ   |\}}}}t j||||}| t jjjkr@t jjj||d}n||_|S )Nrequires_grad)r
   _utils_rebuild_tensornn	parameter	Parameterr>   )r   r   metadatastorage_offsetsizestrider>   tr   r   r   rebuild_tensorl   s    rI   c              
   C   s   |d ks|dkr"|d||dd}nZt |||	f}|d krltj  |||||	||||}t|t||	f< n|j|||d t|tj	r|n|j
}tjtjj||dd|||}| tjjjkrtjjj||
d}n|
|_|S )Nr   T)dtyper8   	_internal)r8   wrap_storagerJ   rK   r=   )storage_from_cacher
   r6   Z
_lazy_initZ_new_shared_cudar   shared_cacheZ_release_ipc_counter
isinstanceUntypedStorage_untyped_storager?   r@   r   TypedStoragerA   rB   rC   r>   )Z
tensor_clsZtensor_sizeZtensor_stridetensor_offsetZstorage_clsrJ   Zstorage_deviceZstorage_handlestorage_size_bytesstorage_offset_bytesr>   ref_counter_handleref_counter_offsetevent_handleevent_sync_requiredr   Z_storagerH   r   r   r   rebuild_cuda_tensory   sP     

  
r[   c                 C   s   |   }| jr| jstdt|  tjj|  |j	j
jdkr| \}}}}}}}}	|  }
t|t|< tt| |  |  |
t|| j||||| j||||	ffS |  |  |  | jf}tt| ||ffS )NzCowardly refusing to serialize non-leaf tensor which requires_grad, since autograd does not support crossing process boundaries.  If you just want to transfer the data, call detach() on the tensor before serializing (e.g., putting it on the queue).r6   )Z_typed_storager>   Zis_leafRuntimeErrorr   r
   utilshooksZwarn_if_has_hooksrR   r8   typeZ_share_cuda_rE   r   rO   r[   rF   rG   rJ   rI   )Ztensorr   r8   r9   rU   rV   rW   rX   rY   rZ   rT   rD   r   r   r   reduce_tensor   sX    \
r`   c                 C   s   t | }|j|jfS r	   )osfstatst_inost_dev)fdstatr   r   r   fd_idS  s    
rg   c                 C   s$   t |}|d krd S tj|jS r	   )rO   r*   r
   rQ   Z_new_with_weak_ptrr   )r   r+   r/   r   r   r   rN   [  s    
rN   c              	   C   s\   |  }zBt| t|}|d k	r(|W &S | ||}t|tt|< |W S t| X d S r	   )detachra   closerN   rg   Z_new_shared_fd_cpur   rO   )r   dfrF   re   r   r   r   r   rebuild_storage_fdb  s    rk   c                 C   sx   t | |}|d k	r| S |d kr4tj|||}n0|tj| }tj|||}tj||dd}t|t	|< | S NTrL   )
rN   Z_shared_decrefr
   rQ   Z_new_shared_filename_cpur?   Z_element_sizerS   r   rO   )r   managerr9   rF   rJ   r   Z	byte_sizeZuntyped_storager   r   r   rebuild_storage_filenameo  s$       rn   c                 C   s   |  S r	   r   )r   r   r   r   rebuild_storage_empty  s    ro   c                 C   s   t jj| |ddS rl   )r
   r   rS   )r   rJ   r   r   r   rebuild_typed_storage  s    rp   c                 C   s   t | j| jffS r	   )rp   rR   rJ   r   r   r   r   reduce_typed_storage  s    rr   c                 C   s   || ddS )NT)rM   rK   r   )r   Zstorage_typer   r   r   rebuild_typed_storage_child  s    rs   c                 C   s   t | jt| ffS r	   )rs   rR   r_   rq   r   r   r   reduce_typed_storage_child  s    rt   c                 C   s   ddl m} | jrtdn| dkr\|  }|d }t}t| tjrR|| j	f7 }| 
  nF|  dkrvtt| ffS |  \}}tj|}t|}||f}t}t| t|< |t| f| fS )Nr0   )get_sharing_strategyz>Cannot pickle CUDA storage; try pickling a CUDA tensor insteadZfile_systemr   ) ru   Zis_cudar\   Z_share_filename_cpu_rn   rP   r
   rS   rJ   Z_shared_increfrF   ro   r_   Z_share_fd_cpu_multiprocessingZ	reductionZDupFdrg   rk   r   rO   )r   ru   rD   	cache_keyZrebuildre   rF   rj   r   r   r   reduce_storage  s*    

ry   c                  C   s   t tjjt tjD ](} | jdkr2t | t qt | t	 qt tj
jt tjD ]} t | t qVt tjt t tjjjt d S )NrQ   )r   registerr
   r6   r7   r<   Z_storage_classesr   ry   rt   r   rS   rr   Z_tensor_classesr`   ZTensorrA   rB   rC   )rH   r   r   r   init_reductions  s    


r{   )N)#rw   ra   r&   Zmultiprocessing.reductionr   Zmultiprocessing.utilr   typingr   r
   Ztorch.utils.hooksZtorch._namedtensor_internalsr   Zmultiprocessing.resource_sharerImportErrorr   r)   r"   rO   r:   r<   rI   r[   r`   rg   rN   rk   rn   ro   rp   rr   rs   rt   ry   r{   r   r   r   r   <module>   s@   $%D 
