a
    h&                     @   s  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 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 d d	lmZ d
dlmZ g dZeG dd dZG dd de
ZeedddZeeef e e dddZ!ee e dddZ"edej#dZ$i Z%d&ee eede$f gede$f f dddZ&d'ee eee edf eee edf e'e ddd Z(eedej#f dd!d"Z)eeej#d#d$d%Z*dS )(    N)IterableMapping)	dataclass)Enum)partial)	signature)
ModuleType)AnyCallableget_argsOptionalTypeVarUnion)nn   )load_state_dict_from_url)WeightsEnumWeights	get_modelget_model_builderget_model_weights
get_weightlist_modelsc                   @   sB   e Zd ZU dZeed< eed< eeef ed< ee	dddZ
dS )	r   a  
    This class is used to group important attributes associated with the pre-trained weights.

    Args:
        url (str): The location where we find the weights.
        transforms (Callable): A callable that constructs the preprocessing method (or validation preset transforms)
            needed to use the model. The reason we attach a constructor method rather than an already constructed
            object is because the specific object might have memory and thus we want to delay initialization until
            needed.
        meta (Dict[str, Any]): Stores meta-data related to the weights of the model and its configuration. These can be
            informative attributes (for example the number of parameters/flops, recipe link/methods used in training
            etc), configuration parameters (for example the `num_classes`) needed to construct the model or important
            meta-data (for example the `classes` of a classification model) needed to use the model.
    url
transformsmeta)otherreturnc                 C   s   t |tstS | j|jkrdS | j|jkr.dS t | jtrvt |jtrv| jj|jjkot| jj|jjkot| jj	|jj	kS | j|jkS d S )NF)

isinstancer   NotImplementedr   r   r   r   funcargskeywords)selfr    r$   E/var/www/auris/lib/python3.9/site-packages/torchvision/models/_api.py__eq__*   s    
zWeights.__eq__N)__name__
__module____qualname____doc__str__annotations__r
   dictr	   boolr&   r$   r$   r$   r%   r      s
   
r   c                   @   sp   e Zd ZdZeeedddZeeeeef dddZ	edd	d
Z
edd Zedd Zedd ZdS )r   aM  
    This class is the parent class of all model weights. Each model building method receives an optional `weights`
    parameter with its associated pre-trained weights. It inherits from `Enum` and its values should be of type
    `Weights`.

    Args:
        value (Weights): The data class entry with the weight information.
    )objr   c                 C   sV   |d urRt |tu r,| || jd d }n&t|| sRtd| j d|jj d|S )N. z(Invalid Weight class provided; expected z but received )typer+   replacer'   r   	TypeError	__class__)clsr/   r$   r$   r%   verifyO   s    
zWeightsEnum.verify)r!   kwargsr   c                 O   s   t | jg|R i |S N)r   r   )r#   r!   r8   r$   r$   r%   get_state_dictZ   s    zWeightsEnum.get_state_dict)r   c                 C   s   | j j d| j S )Nr0   )r5   r'   _name_r#   r$   r$   r%   __repr__]   s    zWeightsEnum.__repr__c                 C   s   | j jS r9   )valuer   r<   r$   r$   r%   r   `   s    zWeightsEnum.urlc                 C   s   | j jS r9   )r>   r   r<   r$   r$   r%   r   d   s    zWeightsEnum.transformsc                 C   s   | j jS r9   )r>   r   r<   r$   r$   r%   r   h   s    zWeightsEnum.metaN)r'   r(   r)   r*   classmethodr	   r7   r   r+   r:   r=   propertyr   r   r   r$   r$   r$   r%   r   E   s   	


r   )namer   c           	      C   s   z|  d\}}W n" ty4   td|  dY n0 dtjt j ddd }t|}|gdd t	|tj
D  }d}|D ],}|j|d}|durt|tr|} qq|du rtd| d	|| S )
z
    Gets the weights enum value by its full name. Example: "ResNet50_Weights.IMAGENET1K_V1"

    Args:
        name (str): The name of the weight enum entry.

    Returns:
        WeightsEnum: The requested weight enum.
    r0   zInvalid weight name provided: ''.Nc                 S   s$   g | ]}|d  j dr|d  qS )   z__init__.py)__file__endswith).0xr$   r$   r%   
<listcomp>~   s   zget_weight.<locals>.<listcomp>zThe weight enum 'z0' for the specific method couldn't be retrieved.)split
ValueErrorjoinsysmodulesr'   	importlibimport_moduleinspect
getmembersismodule__dict__get
issubclassr   )	rA   Z	enum_nameZ
value_nameZbase_module_namebase_moduleZmodel_modulesweights_enummZpotential_classr$   r$   r%   r   m   s$    
 

r   c                 C   s   t | trt| n| }t|S )a  
    Returns the weights enum class associated to the given model.

    Args:
        name (callable or str): The model builder function or the name under which it is registered.

    Returns:
        weights_enum (WeightsEnum): The weights enum class associated with the model.
    )r   r+   r   _get_enum_from_fn)rA   modelr$   r$   r%   r      s    
r   fnr   c                 C   s   t | }d|jvrtd|jd j}d}t|trDt|trD|}n*t|D ] }t|trLt|trL|} qnqL|du r~td|S )z
    Internal method that gets the weight enum of a specific model builder method.

    Args:
        fn (Callable): The builder method used to create the model.
    Returns:
        WeightsEnum: The requested weight enum.
    weightsz-The method is missing the 'weights' argument.NzjThe WeightsEnum class for the specific method couldn't be retrieved. Make sure the typing info is correct.)	r   
parametersrK   
annotationr   r2   rV   r   r   )r]   sigannrX   tr$   r$   r%   rZ      s     	
rZ   M)bound.c                    s(   t dtf t dtf d fdd}|S )N.r\   c                    s6    d ur n| j }|tv r*td| d| t|< | S )Nz/An entry is already registered under the name 'rB   )r'   BUILTIN_MODELSrK   )r]   keyrA   r$   r%   wrapper   s
    zregister_model.<locals>.wrapper)r
   rd   )rA   ri   r$   rh   r%   register_model   s    $rj   )moduleincludeexcluder   c                    s    fddt  D }|rPt }t|tr0|g}|D ]}|tt||B }q4n|}|rt|trh|g}|D ]}|tt|| }qlt|S )a  
    Returns a list with the names of registered models.

    Args:
        module (ModuleType, optional): The module from which we want to extract the available models.
        include (str or Iterable[str], optional): Filter(s) for including the models from the set of all models.
            Filters are passed to `fnmatch <https://docs.python.org/3/library/fnmatch.html>`__ to match Unix shell-style
            wildcards. In case of many filters, the results is the union of individual filters.
        exclude (str or Iterable[str], optional): Filter(s) applied after include_filters to remove models.
            Filter are passed to `fnmatch <https://docs.python.org/3/library/fnmatch.html>`__ to match Unix shell-style
            wildcards. In case of many filters, the results is removal of all the models that match any individual filter.

    Returns:
        models (list): A list with the names of available models.
    c                    s4   h | ],\}} d u s,|j ddd  jkr|qS )Nr0   rD   r   )r(   rsplitr'   )rG   kvrk   r$   r%   	<setcomp>   s   zlist_models.<locals>.<setcomp>)rf   itemssetr   r+   fnmatchfiltersorted)rk   rl   rm   Z
all_modelsmodelsZinclude_filterZexclude_filterr$   rq   r%   r      s     


r   c                 C   s:   |   } zt|  }W n  ty4   td|  Y n0 |S )z
    Gets the model name and returns the model builder method.

    Args:
        name (str): The name under which the model is registered.

    Returns:
        fn (Callable): The model builder method.
    zUnknown model )lowerrf   KeyErrorrK   )rA   r]   r$   r$   r%   r      s    
r   )rA   configr   c                 K   s   t | }|f i |S )a&  
    Gets the model name and configuration and returns an instantiated model.

    Args:
        name (str): The name under which the model is registered.
        **config (Any): parameters passed to the model builder method.

    Returns:
        model (nn.Module): The initialized model.
    )r   )rA   r{   r]   r$   r$   r%   r   	  s    r   )N)NNN)+ru   rO   rQ   rM   collections.abcr   r   Zdataclassesr   enumr   	functoolsr   r   typesr   typingr	   r
   r   r   r   r   Ztorchr   Z_internally_replaced_utilsr   __all__r   r   r+   r   r2   r   rZ   Modulerd   rf   rj   listr   r   r   r$   r$   r$   r%   <module>   sB    /($ 0   (