U
    ¯Ê¹jè=  ã                   @   sâ  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 d dlm	Z	 d dl
mZmZmZ d dlZd dlmZmZmZ zd dlmZ W n  ek
r¤   d dlmZ Y nX zd dlZd	ZW n ek
rÎ   d
ZY nX zd dl
mZ W n" ek
�r   d dlmZ Y nX d dlmZ d dlmZ zBd dlm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' ee"ded�Z"d	Z(W n ek
�r|   dZ"d
Z(Y nX e )e*¡Z+ddddddddgZ,dZ-dZ.dZ/dZ0d>dd„Z1d?d d„Z2d@d!d"„Z3dAd#d„Z4e5d$œd%d„Z6ee5ej7f d&œd'd(„Z8e5e5d)œd*d+„Z9e5d,œd-d„Z:e-fe5e5d)œd.d„Z;dBe5ee< ee< d/œd0d1„Z=dCe5ee< ee< ee>ed2 f d3œd4d„Z?dDej@jAe5e5ee5 ee5 e>e>ee< ee< ee< ee>ed2 f d6œd7d„ZBe<e5d8œd9d:„ZCe5ee5 d;œd<d=„ZDdS )Eé    N)Úpartial)ÚPath)ÚTemporaryDirectory)ÚIterableÚOptionalÚUnion)Ú
HASH_REGEXÚdownload_url_to_fileÚurlparse)Úget_dir)Ú_get_torch_homeTF)ÚLiteral)Ú__version__)Úfilter_pretrained_cfg)Úcreate_repoÚget_hf_file_metadataÚhf_hub_downloadÚ
hf_hub_urlÚrepo_type_and_id_from_hf_idÚupload_folder)ÚEntryNotFoundErrorÚtimm)Zlibrary_nameZlibrary_versionÚget_cache_dirÚdownload_cached_fileÚ
has_hf_hubÚhf_splitÚload_model_config_from_hfÚload_state_dict_from_hfÚsave_for_hfÚpush_to_hf_hubzpytorch_model.binzmodel.safetensorszopen_clip_pytorch_model.binzopen_clip_model.safetensorsÚ c                 C   sN   t  d¡rt d¡ tƒ }| s"dn| f} t jj|df| žŽ }t j|dd� |S )zf
    Returns the location of the directory where models are cached (and creates it if necessary).
    ZTORCH_MODEL_ZOOz@TORCH_MODEL_ZOO is deprecated, please use env TORCH_HOME instead© ZcheckpointsT)Úexist_ok)ÚosÚgetenvÚ_loggerÚwarningr   ÚpathÚjoinÚmakedirs)Z	child_dirZhub_dirZ	model_dirr!   r!   úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/_hub.pyr   8   s    

c                 C   s”   t | ttfƒr| \} }nt| ƒ}tj |j¡}tj tƒ |¡}tj 	|¡s�t
 d | |¡¡ d }|r€t |¡}|r|| d¡nd }t| |||d� |S )NzDownloading: "{}" to {}
é   )Úprogress)Ú
isinstanceÚlistÚtupler
   r#   r'   Úbasenamer(   r   Úexistsr%   ÚinfoÚformatr   ÚsearchÚgroupr	   )ÚurlÚ
check_hashr,   ÚfilenameÚpartsÚcached_fileÚhash_prefixÚrr!   r!   r*   r   G   s    

c           	   	   C   sÀ   t | ttfƒr| \} }nt| ƒ}tj |j¡}tj tƒ |¡}tj 	|¡r¼|r¸t
 |¡}|rf| d¡nd }|r¸t|dƒ�:}t | ¡ ¡ ¡ }|d t|ƒ… |kr®W 5 Q R £ dS W 5 Q R X dS dS )Nr+   ÚrbFT)r-   r.   r/   r
   r#   r'   r0   r(   r   r1   r   r4   r5   ÚopenÚhashlibÚsha256ÚreadÚ	hexdigestÚlen)	r6   r7   r8   r9   r:   r<   r;   ÚfZhdr!   r!   r*   Úcheck_cached_fileX   s     

rE   c                 C   s   t s| rtdƒ‚t S )Nz^Hugging Face hub model specified but package not installed. Run `pip install huggingface_hub`.)Ú_has_hf_hubÚRuntimeError)Z	necessaryr!   r!   r*   r   l   s
    ÿ)Úhf_idc                 C   sT   |   d¡}dt|ƒ  k r"dks,n tdƒ‚|d }t|ƒdkrH|d nd }||fS )Nú@r   é   zChf_hub id should only contain one @ character to identify revision.r+   éÿÿÿÿ)ÚsplitrC   ÚAssertionError)rH   Z	rev_splitÚhf_model_idÚhf_revisionr!   r!   r*   r   t   s
    
")Ú	json_filec              	   C   s,   t | ddd��}| ¡ }W 5 Q R X t |¡S )Nr<   zutf-8)Úencoding)r>   rA   ÚjsonÚloads)rP   ÚreaderÚtextr!   r!   r*   Úload_cfg_from_json}   s    rV   )Úmodel_idr8   c                 C   s   t | ƒ\}}t|||d�S )N)Úrevision)r   r   )rW   r8   rN   rO   r!   r!   r*   Údownload_from_hfƒ   s    rY   )rW   c                 C   sà   t dƒst‚t| dƒ}t|ƒ}d|krj|}i }| d¡|d< | dd ¡|d< d|krb| d¡|d< ||d< |d }| |d< d	|d
< d|kr–|d |d< d|kr¬| d¡|d< d|krÂ| d¡|d< | di ¡}|d }|||fS )NTúconfig.jsonÚpretrained_cfgÚarchitectureÚnum_featuresÚlabelsÚlabel_namesZ	hf_hub_idzhf-hubÚsourceÚnum_classesÚlabel_descriptionsÚ
model_args)r   rM   rY   rV   ÚpopÚget)rW   r:   Ú	hf_configr[   rc   Ú
model_namer!   r!   r*   r   ˆ   s.    
c              
   C   s¶   t dƒst‚t| ƒ\}}tr‚t|ƒD ]\}zBt|||d�}t d| › d|› d|› d�¡ tj	j
|dd�W   S  tk
r~   Y q$X q$t|||d	�}t d| › d
|› d�¡ t	j|dd�S )NT©Úrepo_idr8   rX   ú[z"] Safe alternative available for 'z' (as 'z&'). Loading weights using safetensors.Úcpu)Zdevice)r8   rX   z"] Safe alternative not found for 'z)'. Loading weights using default pytorch.)Zmap_location)r   rM   r   Ú_has_safetensorsÚ_get_safe_alternativesr   r%   r2   ÚsafetensorsÚtorchZ	load_filer   ÚdebugÚload)rW   r8   rN   rO   Zsafe_filenameZcached_safe_filer:   r!   r!   r*   r   «   s    ÿ)Úconfig_pathÚmodel_configrc   c           
   	   C   s6  |pi }i }t | jddd�}| d¡|d< | d| j¡|d< | d| j¡|d< | dt| dd ƒ¡}t|tƒrx|rx||d< d|krœt 	d¡ | 
d	| d¡¡ | d	d ¡}|rÈt|tttfƒsÀt‚||d	< | d
d ¡}|rît|tƒsæt‚||d
< |rú||d< ||d< | |¡ | d¡�}	tj||	dd� W 5 Q R X d S )NT)Zremove_sourceZremove_nullr\   ra   r]   Zglobal_poolr^   z“'labels' as a config field for is deprecated. Please use 'label_names' and 'label_descriptions'. Renaming provided 'labels' field to 'label_names'.r_   rb   rc   r[   ÚwrJ   )Úindent)r   r[   rd   ra   r]   Úgetattrr-   Ústrr%   r&   Ú
setdefaultÚdictr.   r/   rM   Úupdater>   rR   Údump)
Úmodelrr   rs   rc   rf   r[   Zglobal_pool_typer_   rb   rD   r!   r!   r*   Úsave_config_for_hfÁ   s8    ÿ
r}   Úboth)Úsave_directoryrs   rc   Úsafe_serializationc                 C   s”   t dƒst‚t|ƒ}|jddd� |  ¡ }|dks:|dkrXtsFtdƒ‚tj ||t	 ¡ |dksh|dkrxt 
||t ¡ |d }t| |||d� d S )NT)r"   Úparentsr~   z-`pip install safetensors` to use .safetensorsFrZ   )rs   rc   )r   rM   r   ÚmkdirZ
state_dictrl   rn   ro   Z	save_fileÚHF_SAFE_WEIGHTS_NAMEÚsaveÚHF_WEIGHTS_NAMEr}   )r|   r   rs   rc   r€   Ztensorsrr   r!   r!   r*   r   ò   s     üú	Add model)r|   ri   Úcommit_messageÚtokenrX   ÚprivateÚ	create_prrs   Ú
model_cardrc   r€   c              
   C   sÜ   t |||dd�}t|ƒ\}}}|› d|› �}ztt|d|d�ƒ d}W n tk
r^   d}Y nX tƒ �l}t| |||	|
d� |s´|p„i }| d¡d }t|ƒd }t	||ƒ}| 
|¡ t|||||d	�W  5 Q R £ S Q R X d
S )a5  
    Arguments:
        (...)
        safe_serialization (`bool` or `"both"`, *optional*, defaults to `False`):
            Whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`).
            Can be set to `"both"` in order to push both safe and unsafe weights.
    T)rˆ   r‰   r"   ú/z	README.mdrh   F)rs   rc   r€   rK   )ri   Zfolder_pathrX   rŠ   r‡   N)r   r   r   r   r   r   r   rL   r   Úgenerate_readmeÚ
write_textr   )r|   ri   r‡   rˆ   rX   r‰   rŠ   rs   r‹   rc   r€   Úrepo_urlÚ_Z
repo_ownerÚ	repo_nameZ
has_readmeZtmpdirrg   Zreadme_pathÚreadme_textr!   r!   r*   r     s:    
û	

û)r‹   rg   c           
      C   s°  d}|d7 }|d7 }|d|   dd¡› d�7 }d| k�rd	| d k�r|d
7 }t| d d	 ttfƒrŠ| d d	 D ]}|d| ¡ › d�7 }qnn|d| d d	  ¡ › d�7 }d| d k�rt| d d ttfƒrò| d d D ]}|d| ¡ › d�7 }qÖn|d| d d  ¡ › d�7 }|d7 }|d|› d�7 }d| k�rD|d| d › d�7 }d| k�r
|d7 }| d  ¡ D ]¦\}}t|ttfƒ�r¨|d|› d�7 }|D ]}|d|› d�7 }�qŽn^t|tƒ�rð|d|› d�7 }| ¡ D ] \}}|d|› d|› d�7 }�qÌn|d|› d|› d�7 }�qbd| k�r0|d7 }|| d 7 }|d7 }d| k�rV|d7 }|| d 7 }|d7 }d| k�r¬|d7 }t| d ttfƒ�sˆ| d g}n| d }|D ]}	|d|	› d�7 }�q”|S )Nz---
z$tags:
- image-classification
- timm
zlibrary_name: timm
z	license: Úlicensez
apache-2.0Ú
ÚdetailsZDatasetz
datasets:
z- zPretrain Datasetz# Model card for Údescriptionz
## Model Details
z- **z:**
z  - z: z:** Úusagez
## Model Usage
Z
comparisonz
## Model Comparison
Zcitationz
## Citation
z
```bibtex
z
```
)re   r-   r/   r.   ÚlowerÚitemsry   )
r‹   rg   r’   ÚdÚkÚvÚviZkiZ	citationsÚcr!   r!   r*   r�   N  s^    




r�   )r8   Úreturnc                 c   sH   | t krtV  | tkrtV  | t tfkrD|  d¡rD| dd… d V  dS )aI  Returns potential safetensors alternatives for a given filename.

    Use case:
        When downloading a model from the Huggingface Hub, we first look if a .safetensors file exists and if yes, we use it.
        Main use case is filename "pytorch_model.bin" => check for "model.safetensors" or "pytorch_model.safetensors".
    z.binNéüÿÿÿz.safetensors)r…   rƒ   ÚHF_OPEN_CLIP_WEIGHTS_NAMEÚHF_OPEN_CLIP_SAFE_WEIGHTS_NAMEÚendswith)r8   r!   r!   r*   rm   †  s    rm   )r    )TF)T)F)NN)NNF)	r†   NNFFNNNF)Er?   rR   Úloggingr#   Ú	functoolsr   Úpathlibr   Útempfiler   Útypingr   r   r   ro   Z	torch.hubr   r	   r
   r   ÚImportErrorr   Zsafetensors.torchrn   rl   r   Útyping_extensionsr   r   Ztimm.models._pretrainedr   Zhuggingface_hubr   r   r   r   r   r   Zhuggingface_hub.utilsr   rF   Ú	getLoggerÚ__name__r%   Ú__all__r…   rƒ   r¡   r¢   r   r   rE   r   rw   r   ÚPathLikerV   rY   r   r   ry   r}   Úboolr   ÚnnÚModuler   r�   rm   r!   r!   r!   r*   Ú<module>   s¶   
 


  ÿ



	#  üü4   ûû         õõ@8