a
    d4                  	   @   sj  U d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZ g d	ZeeZeeee f ed
< i Zeeef ed< i Z eeedef f ed< e Z!ee ed< i Z"eeef ed< i Z#eeef ed< ee$Z%eeee f ed< ee&Z'eeeeee f f ed< i Z(eeee f ed< dKeeeeef dddZ)eedddZ*eeeeeef ef f dddZ+edef edef ddd Z,dLeeed!d"d#Z-eeeee f d$d%d&Z.eeee/ef  d'd(d)Z0ed*d+d,Z1dMeeee f ee2eeee f e2ee2 ee d.d/d0Z3dNeeee f eee d1d2d3Z4dOeeeef d4d5d6Z5ee2dd7d8Z6dPeee edef d9d:d;Z7ee d<d=d>Z8eeeedf ee ee f e2d?d@dAZ9ee2ddBdCZ:dQee2ee dEdFdGZ;eeee dHdIdJZ<dS )RzB Model Registry
Hacked together by / Copyright 2020 Ross Wightman
    N)defaultdictdeque)deepcopy)replace)
AnyCallableDictIterableListOptionalSetSequenceUnionTuple   )PretrainedCfg
DefaultCfg)split_model_name_tagget_arch_nameregister_modelgenerate_default_cfgslist_modelslist_pretrainedis_modelmodel_entrypointlist_modulesis_model_in_modulesget_pretrained_cfg_valueis_model_pretrained_module_to_models_model_to_module._model_entrypoints_model_has_pretrained_model_default_cfgs_model_pretrained_cfgs_model_with_tags_module_to_deprecated_models_deprecated_models )
model_nameno_tagreturnc                 C   s(   |  dd^} }|r|d n|}| |fS )N.r   r   )split)r)   r*   Ztag_listtag r/   ^/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/_registry.pyr   !   s    r   )r)   r+   c                 C   s   t | d S )Nr   )r   r)   r/   r/   r0   r   '   s    r   )cfgsc                 C   s   t t}t }|  D ]\}}t|tr6tf i |}|j}t|\}}||v }|rZ| ph|	doh| }	|
d}|| }
|	r|
j| || n$|r|
js|
j| n|
j| |rd|
_||
j|< q|S )N*T)r   r   setitems
isinstancedictr   has_weightsr   endswithstriptags
appendleftaddZis_pretrainedappendr2   )r2   outZdefault_setkvr8   modelr.   Zis_default_setprioritydefault_cfgr/   r/   r0   r   +   s*    


r   )fnr+   c                 C   s  t j| j }| jd}t|r(|d nd}| j}t|drJ|j| n|g|_| t	|< |t
|< t| | t|dr||jv r|j| }t|tst|tsJ tf i |}ttdgd|id}t|jD ]\}}|dk}	|j| }|rd||gn|}
t||r|nd d}|jrB|jd	krB|j|
 |d
< t|fi |}|	rr|t|< |jrrt| |r|t|
< |jrt|
 t| |
 qt| | q|t|< | S )Nr,   r(   __all__default_cfgs)r;   r2   r   )architecturer.   ztimm/	hf_hub_id)sysmodules
__module__r-   len__name__hasattrrG   r>   r!   r    r   r=   rH   r6   r   r7   r   r   	enumerater;   r2   joinrJ   r   r$   r8   r"   r%   r#   )rE   modmodule_name_splitmodule_namer)   rD   pretrained_cfgZtag_idxr.   Z
is_defaultZmodel_name_tagZreplace_itemsr/   r/   r0   r   K   sH    





r   )deprecated_name
current_fncurrent_tagc                    s   d fdd	}|S )NFc                    sr    d usJ d dr,d  jgn j}tjd d| ddd |dd } f | |pfd	|S )
NzModel z& has been removed with no replacement.r,   zMapping deprecated model name z to current    )
stacklevelrV   )
pretrainedrV   )rR   rO   warningswarnpop)r\   kwargscurrent_namerV   rX   rY   rW   r/   r0   _fn   s
    z#_deprecated_model_shim.<locals>._fn)Fr/   )rW   rX   rY   rc   r/   rb   r0   _deprecated_model_shim   s    rd   )rU   deprecation_mapc           
      C   s   t j|  }| d}t|r$|d nd} | D ]\}}t|drN|j| d }d}|rpt|\}}t	||}t
|||}	t|||	 |	t|< | t|< t|  | |t|< |t|  |< q0d S )Nr,   rF   r(   rG   )rK   rL   r-   rN   r5   rP   rG   r>   r   getattrrd   setattrr!   r    r   r=   r'   r&   )
rU   re   rS   rT   
deprecatedcurrentrX   rY   ra   Zdeprecated_entrypoint_fnr/   r/   r0   register_model_deprecations   s$    



rj   )string_r+   c                 C   s   dd t d|  D S )zHSee https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/c                 S   s    g | ]}|  rt|n|qS r/   )isdigitint).0sr/   r/   r0   
<listcomp>       z _natural_key.<locals>.<listcomp>z(\d+))rer-   lower)rk   r/   r/   r0   _natural_key   s    rt   )filterc                 C   s,   t | \}}|s"d|dg| gS | gS dS )z< expand a 'base_filter' to 'base_filter.*' if no tag portionr,   r3   N)r   rR   )ru   Zfilter_baseZ
filter_tagr/   r/   r0   _expand_filter   s    rv   F)ru   moduler\   exclude_filtersname_matches_cfginclude_tagsr+   c                 C   s>  | rt | ttfr| n| g}ng }|du r.|}|r:t| n
tt }|t  }|rt }|D ]}	|t	|	  q`|}dd |D }dd |D }|rt }
|D ]"}t
||}t|r|
|}
qn|}
|rt |ttfs|g}|D ]"}t
|
|}t|r|
|}
q|rt|
}
|r2tt|
}
t|
tdS )a   Return list of available model names, sorted alphabetically

    Args:
        filter - Wildcard filter string that works with fnmatch
        module - Limit model selection to a specific submodule (ie 'vision_transformer')
        pretrained - Include only models with valid pretrained weights if True
        exclude_filters - Wildcard filters to exclude models after including them with filter
        name_matches_cfg - Include only models w/ model_name matching default_cfg name (excludes some aliases)
        include_tags - Include pretrained tags in model names (model.tag). If None, defaults
            set to True when pretrained=True else False (default: None)

    Returns:
        models - The sorted list of models

    Example:
        model_list('gluon_resnet*') -- returns all models starting with 'gluon_resnet'
        model_list('*resnext*, 'resnet') -- returns all models with 'resnext' in 'resnet' module
    Nc                 S   s   g | ]}t |D ]}|qqS r/   rv   rn   fZefr/   r/   r0   rp      rq   zlist_models.<locals>.<listcomp>c                 S   s   g | ]}t |D ]}|qqS r/   r{   r|   r/   r/   r0   rp      rq   )key)r6   tuplelistr   r4   r!   keysr'   updater%   fnmatchru   rN   union
differencer"   intersectionr$   sortedrt   )ru   rw   r\   rx   ry   rz   Zinclude_filtersZ
all_modelsZmodels_with_tagsmmodelsr}   Zinclude_modelsZxfZexclude_modelsr/   r/   r0   r      sB    
r   )ru   rx   r+   c                 C   s   t | d|ddS )NT)ru   r\   rx   rz   )r   )ru   rx   r/   r/   r0   r      s    r   )rw   r+   c                 C   s   | rt |  nt}t|S N)r&   r'   r   )rw   Zall_deprecatedr/   r/   r0   get_deprecated_models	  s    r   c                 C   s   t | }|tv S )z" Check if a model name exists
    )r   r!   )r)   	arch_namer/   r/   r0   r     s    r   )r)   module_filterr+   c                 C   s:   t | }|r2|t|i vr2td|  d| dt| S )z6Fetch a model entrypoint for specified model name
    zModel (z not found in module r,   )r   r   getRuntimeErrorr!   )r)   r   r   r/   r/   r0   r     s    r   )r+   c                  C   s   t  } t| S )zI Return list of module names that contain models / model entrypoints
    )r   r   r   )rL   r/   r/   r0   r     s    r   )r)   module_namesr+   c                    s2   t |  t|tttfsJ t fdd|D S )zCheck if a model exists within a subset of modules

    Args:
        model_name - name of model to check
        module_names - names of modules to search in
    c                 3   s   | ]} t | v V  qd S r   )r   )rn   nr   r/   r0   	<genexpr>0  rq   z&is_model_in_modules.<locals>.<genexpr>)r   r6   r   r   r4   any)r)   r   r/   r   r0   r   %  s    	r   c                 C   s   | t v S r   )r"   r1   r/   r/   r0   r   3  s    r   T)r)   allow_unregisteredr+   c                 C   sZ   | t v rtt |  S t| \}}|tv r>td| d| d|rFd S td| dd S )NzInvalid pretrained tag (z) for r,   zModel architecture (z#) has no pretrained cfg registered.)r$   r   r   r#   r   )r)   r   r   r.   r/   r/   r0   get_pretrained_cfg7  s    r   )r)   cfg_keyr+   c                 C   s   t | dd}t||dS )zO Get a specific model default_cfg value by key. None if key doesn't exist.
    F)r   N)r   rf   )r)   r   cfgr/   r/   r0   r   D  s    r   )r(   )Nr(   )r(   r(   Fr(   FN)r(   r(   )r(   )N)T)=__doc__r   rr   rK   r]   collectionsr   r   copyr   Zdataclassesr   typingr   r   r   r	   r
   r   r   r   r   r   Z_pretrainedr   r   rG   r4   r   str__annotations__r    r!   r"   r#   r$   r   r%   r7   r&   r'   r   r   r   r   rd   rj   rm   rt   rv   boolr   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   sv   0$&  :

      K   	