o
    پi8                     @   s  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< dRdededeeef fddZ)dedefddZ*deeeeeef ef f fddZ+dedef dedef fd d!Z,dSd"ed#ed$efd%d&Z-d'ed(eeee f fd)d*Z.d+edeee/ef  fd,d-Z0d.efd/d0Z1			1		1	dTd.eeee f d2eeee f d3e2d4eeee f d5e2d6ee2 dee fd7d8Z3		dUd.eeee f d4edee fd9d:Z4dRd2edeeef fd;d<Z5dede2fd=d>Z6dVded?ee dedef fd@dAZ7dee fdBdCZ8dedDeeedf ee ee f de2fdEdFZ9dede2fdGdHZ:dWdedJe2dee fdKdLZ;dedMedee fdNdOZ<dedeeef fdPdQZ=dS )XzB 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get_arch_pretrained_cfgs_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+   tag_listtag r1   I/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/_registry.pyr   !   s   r   c                 C   s   t | d S )Nr   )r   r*   r1   r1   r2   r   '   s   r   cfgsc                 C   s   t t}t }|  D ]]\}}t|trtdi |}|j}t|\}}||v }|r-| p4|	do4| }	|
d}|| }
|	rL|
j| || n|rX|
jsX|
j| n|
j| |rcd|
_||
j|< q|S )N*Tr1   )r   r   setitems
isinstancedictr   has_weightsr   endswithstriptags
appendleftaddis_pretrainedappendr4   )r4   outdefault_setkvr:   modelr0   is_default_setprioritydefault_cfgr1   r1   r2   r   +   s*   


r   fnc                 C   s  t j| j }| jd}t|r|d nd}| j}t|dr%|j| n|g|_|t	v r?t
jd| d| j d| ddd	 | t	|< |t|< t| | t|d
r||jv r|j| }t|ts{t|tsiJ tdi |}ttdgd|id}t|jD ]d\}}|dk}	|j| }|rd||gn|}
t||r|nd d}|jr|jdkr|j|
 |d< t|fi |}|	r|t|< |jrt| |r|t|
< |jrt|
 t| |
 qt| | q|t|< | S )Nr-   r)   __all__zOverwriting z in registry with zr. This is because the name being registered conflicts with an existing name. Please check if this is not expected.   
stackleveldefault_cfgs)r=   r4   r   )architecturer0   ztimm/	hf_hub_idr1   ) sysmodules
__module__r.   len__name__hasattrrL   rA   r"   warningswarnr!   r    r?   rP   r8   r   r9   r   r   	enumerater=   r4   joinrR   r   r%   r:   r#   r&   r$   )rJ   modmodule_name_splitmodule_namer*   rI   pretrained_cfgtag_idxr0   
is_defaultmodel_name_tagreplace_itemsr1   r1   r2   r   K   sR   





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 } d
| |p3d	|S )NzModel z& has been removed with no replacement.r-   zMapping deprecated model name z to current rM   rN   r`   )
pretrainedr`   r1   )r\   rW   rY   rZ   pop)rh   kwargscurrent_namer`   rf   rg   re   r1   r2   _fn   s
   z#_deprecated_model_shim.<locals>._fn)Fr1   )re   rf   rg   rm   r1   rl   r2   _deprecated_model_shim   s   rn   r_   deprecation_mapc           
      C   s   t j|  }| d}t|r|d nd} | D ]E\}}t|dr'|j| d }d}|r8t|\}}t	||}t
|||}	t|||	 |	t|< | t|< t|  | |t|< |t|  |< qd S )Nr-   rK   r)   rL   )rS   rT   r.   rV   r7   rX   rL   rA   r   getattrrn   setattrr"   r!   r    r?   r(   r'   )
r_   ro   r]   r^   
deprecatedcurrentrf   rg   rk   deprecated_entrypoint_fnr1   r1   r2   register_model_deprecations   s&   



ru   string_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 r1   )isdigitint).0sr1   r1   r2   
<listcomp>   s     z _natural_key.<locals>.<listcomp>z(\d+))rer.   lower)rv   r1   r1   r2   _natural_key   s   r~   filterc                 C   s(   t | \}}|sd|dg| gS | gS )z< expand a 'base_filter' to 'base_filter.*' if no tag portionr-   r5   )r   r\   )r   filter_base
filter_tagr1   r1   r2   _expand_filter   s   r   Fmodulerh   exclude_filtersname_matches_cfginclude_tagsc                 C   sr  | rt | ttfr| n| g}ng }|du r|}|s tt }n t |tr*t| }nt |ts1J t }|D ]	}|	t|  q6|t
  }|rgt }	|D ]	}|		t|  qM|	}dd |D }dd |D }|rt }
|D ]}t||}t|r|
|}
qnn|}
|rt |ttfs|g}|D ]}t|
|}t|r|
|}
q|rt|
}
|rt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      g | ]}t |D ]}|qqS r1   r   ry   fefr1   r1   r2   r{          zlist_models.<locals>.<listcomp>c                 S   r   r1   r   r   r1   r1   r2   r{      r   )key)r8   tuplelistr6   r"   keysstrr    r   updater(   r&   fnmatchr   rV   union
differencer#   intersectionr%   sortedr~   )r   r   rh   r   r   r   include_filters
all_modelsmmodels_with_tagsmodelsr   include_modelsxfexclude_modelsr1   r1   r2   r      sV   




r   c                 C   s   t | d|ddS )NT)r   rh   r   r   )r   )r   r   r1   r1   r2   r     s   r   c                 C   s   | rt |  nt}t|S N)r'   r(   r   )r   all_deprecatedr1   r1   r2   get_deprecated_models  s   r   c                 C   s   t | }|tv S )z" Check if a model name exists
    )r   r"   )r*   	arch_namer1   r1   r2   r        r   module_filterc                 C   s:   t | }|r|t|i vrt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   r1   r1   r2   r   $  s   r   c                  C   s   t  } t| S )zI Return list of module names that contain models / model entrypoints
    )r    r   r   )rT   r1   r1   r2   r   -  r   r   module_namesc                    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    )ry   nr   r1   r2   	<genexpr>?  s    z&is_model_in_modules.<locals>.<genexpr>)r   r8   r   r   r6   any)r*   r   r1   r   r2   r   4  s   	r   c                 C   s   | t v S r   )r#   r3   r1   r1   r2   r   B  s   r   Tallow_unregisteredc                 C   sV   | t v r
tt |  S t| \}}|tv rtd| d| d|r#d S td| d)NzInvalid pretrained tag (z) for r-   zModel architecture (z#) has no pretrained cfg registered.)r%   r   r   r$   r   )r*   r   r   r0   r1   r1   r2   get_pretrained_cfgF  s   r   cfg_keyc                 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   rp   )r*   r   cfgr1   r1   r2   r   S  s   r   c                 C   s&   t | \}}t| }dd |D }|S )z7 Get all pretrained cfgs for a given architecture.
    c                 S   s   i | ]}|t | qS r1   )r%   )ry   r   r1   r1   r2   
<dictcomp>_  s    z,get_arch_pretrained_cfgs.<locals>.<dictcomp>)r   r&   )r*   r   _model_namesr4   r1   r1   r2   r   Z  s   r   )r)   )Nr)   )r)   r)   Fr)   FN)r)   r)   r   )T)>__doc__r   r|   rS   rY   collectionsr   r   copyr   dataclassesr   typingr   r   r   r	   r
   r   r   r   r   r   _pretrainedr   r   rL   r6   r    r   __annotations__r!   r"   r#   r$   r%   r   r&   r9   r'   r(   r   r   r   r   rn   ru   rx   r~   r   boolr   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   s    0$ &" @


T
$	
