U
    Mhv#                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZ d dlZd dlmZ d dlZd dlm  mZ d dlmZ d dlmZ dd Zedd	d
d ZddejeedddZG dd dZG dd dZ dS )    N)defaultdict)DictOptionalSet)default_generator)StorageWeakRefc                     s    fdd}|S )zkLazily wrap a function with torch.compile on the first call

    This avoids eagerly importing dynamo.
    c                    s   t   fdd}|S )Nc                     s.   t jf }t|t j< || |S N)torchcompile	functoolswrapsglobals__name__)argskwargsZcompiled_fn)compile_kwargsfn L/var/www/html/venv/lib/python3.8/site-packages/torch/utils/_content_store.pycompile_hook7   s    z7lazy_compile.<locals>.decorate_fn.<locals>.compile_hook)r   r   )r   r   r   )r   r   decorate_fn6   s    z!lazy_compile.<locals>.decorate_fnr   )r   r   r   r   r   lazy_compile0   s    	r   T)Zdynamicc                 C   sj   t jdd| j| jt jd }|d d  }t jdd| j| jt jd  }t||  | 	 dgS )Ni   l        )devicedtypei   r   )
r	   randintshaper   int32abslongprimsZxor_sumint)xabr   r   r   hash_storage_kernelF   s        
 r&   Fstable_hash)storager(   returnc             	      sN  dd l }ddlm} | jj}|s(||sb|  }tj|  	|
 }t }|| | S |dkrpt}n0|dkrdd l}|jj| jj }ntd| | }	z|d |jd|j| jd|     d }
|
dkrt d|
fdd  |j d	} fd
dt |D }t!j"dd|  f| # W S ||	 X d S )Nr   )is_compile_supportedcpucudazunhandled device type r   r      Zconstant   c                    s   g | ]}t   qS r   )r&   item).0_r#   r   r   
<listcomp>   s     z hash_storage.<locals>.<listcomp>>i)$Ztorch._dynamoZtorch._dynamo.utilsr+   r   typer,   ctypesZc_bytenbytesZfrom_addressZdata_ptrhashlibsha1update	hexdigestr   Z
torch.cudar-   Zdefault_generatorsindexAssertionErrorZ	get_stateZ	set_stateZmanual_seedemptyZuint8set_ZnumelFpadviewr   rangestructpackhex)r)   r(   r	   r+   Zdevice_typeZcpu_storagebufr<   	generatorstaterD   ZITERcsr   r4   r   hash_storagea   s:    

 rN   c                   @   sX   e Zd ZdeeddddZejedddZdej	d	d
dZ
eej	ddddZdS )ContentStoreWriterFN)locr(   r*   c                 C   s   || _ t | _|| _d S r   )rP   setseen_storage_hashesr(   )selfrP   r(   r   r   r   __init__   s    zContentStoreWriter.__init__)r)   r*   c                 C   st   t || jd}|| jkr|S tj| jd}tj|dd tj||}tj|rX|S t	
|| | j| |S )Nr'   storagesTexist_ok)rN   r(   rR   ospathjoinrP   makedirsexistsr	   saveadd)rS   r)   h	subfoldertargetr   r   r   write_storage   s    
z ContentStoreWriter.write_storage)tc                 C   sB   |d krt | | jd}|j|| t|j| tj	
|fS )Nr'   )rN   untyped_storager(   r   storage_offsettupler   strider	   _utilsZget_tensor_metadata)rS   rc   r_   r   r   r   compute_tensor_metadata   s    
z*ContentStoreWriter.compute_tensor_metadata)namerc   r*   c           	      C   sj   |  }| |}tj|\}}| j||d}tj| jd|}tj|dd t	
|tj|| d S )N)r_   tensorsTrV   )rd   rb   rX   rY   splitri   rZ   rP   r[   r	   r]   )	rS   rj   rc   r)   r_   dfpayloadr`   r   r   r   write_tensor   s    
zContentStoreWriter.write_tensor)F)N)r   
__module____qualname__strboolrT   r	   UntypedStoragerb   Tensorri   rp   r   r   r   r   rO      s   rO   c                   @   s`   e Zd ZddeddddZddeejdd	d
ZedddZddeej	dddZ
dS )ContentStoreReaderT)cacheN)rP   r*   c                C   s   || _ d | _|rtt| _d S r   )rP   storage_cacher   dict)rS   rP   rx   r   r   r   rT      s
    zContentStoreReader.__init__r   )r_   r*   c                C   s   |d k	rt |}| jd k	r,| j| |nd }|d k	rRt j|j}|d k	rR|S t jtj	
| jd|d|dj}|d k	s~t| jd k	rt|| j| |< |S )NrU   T)weights_onlyZmap_location)r	   r   ry   getru   Z_new_with_weak_ptrcdataloadrX   rY   rZ   rP   Z_untyped_storager@   r   )rS   r_   r   wssr   r   r   read_storage   s&    

zContentStoreReader.read_storage)rj   c                 C   s4   t j| jd|}t j|s&t|tj|ddS )Nrk   T)r|   )rX   rY   rZ   rP   r\   FileNotFoundErrorr	   r   )rS   rj   r   r   r   r   read_tensor_metadata   s    z'ContentStoreReader.read_tensor_metadata)rj   r*   c                C   sX   |  |\}}}}}}| j||d}	tjg ||	jd}
|
|	||| tj|
| |
S )Nr{   r.   )r   r   r	   Ztensorr   rB   rh   Zset_tensor_metadata)rS   rj   r   r   r_   re   sizerg   metadatar)   rc   r   r   r   read_tensor   s    zContentStoreReader.read_tensor)r   rq   rr   rs   rT   r	   ru   r   r   rv   r   r   r   r   r   rw      s   rw   )!r9   r   r;   os.pathrX   rG   collectionsr   typingr   r   r   r	   Ztorch._primsZ_primsr!   Ztorch._utilsZtorch.nn.functionalnnZ
functionalrC   Ztorch._Cr   Z torch.multiprocessing.reductionsr   r   r&   ru   rt   rs   rN   rO   rw   r   r   r   r   <module>   s$   
-3