U
    •Ê¹jOC  ã                   @   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 )ÚStorageWeakRefz‰A 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/bwave/python/venv/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rÔt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 )NzøCowardly 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 
