o
    ॵi                  	   @   sv   d dl Z d dlZd dlmZmZmZ d dlmZ dZdZ	e Z
dZG dd deZe	dfded	ed
edefddZdS )    N)ListTupleUnion)
get_loggertypedefaultc                   @   s   e Zd ZdZdefddZdd Zedd Zed	d
 Z	dd Z
efddZedddfddZedddfdededefddZdS )Registryz Registry which support registering modules and group them by a keyname

    If group name is not provided, modules will be registered to default group.
    namec                 C   s   || _ ti i| _d S N)_namedefault_group_modules)selfr	    r   M/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/registry.py__init__   s   zRegistry.__init__c                 C   sL   | j jd| j d }| j D ]\}}|d| dt|  d7 }q|S )Nz (z)
group_name=z
, modules=
)	__class____name__r   r   itemslistkeys)r   
format_str
group_namegroupr   r   r   __repr__   s   

zRegistry.__repr__c                 C      | j S r
   )r   r   r   r   r   r	   !      zRegistry.namec                 C   r   r
   )r   r   r   r   r   modules%   r   zRegistry.modulesc                 C   sP   | j  D ] \}}td|  | D ]
}td|  qtd qdS )z8 logging the list of module in current registry
        r   	 N)r   r   loggerinfor   )r   r   r   mr   r   r   r   )   s   zRegistry.listc                 C   s    || j vrd S | j | |d S r
   )r   get)r   
module_key	group_keyr   r   r   r&   2   s   
zRegistry.getNFc                 C   s|   t |ts	J d|| jvrt | j|< |d u r|j}|| j| v r2|s2t| d| j d| d|| j| |< ||_d S )Nz%group_key is required and must be strz is already registered in [])
isinstancestrr   dictr   KeyErrorr   r(   )r   r(   module_name
module_clsforcer   r   r   _register_module8   s"   


zRegistry._register_moduler(   r/   r0   c                    sX   du st tstdt |dur!j| d |S  fdd}|S )a   Register module

        Example:
            >>> models = Registry('models')
            >>> @models.register_module('image-classification', 'SwinT')
            >>> class SwinTransformer:
            >>>     pass

            >>> @models.register_module('SwinDefault')
            >>> class SwinTransformerDefaultGroup:
            >>>     pass

            >>> class SwinTransformer2:
            >>>     pass
            >>> MODELS.register_module('image-classification',
                                        module_name='SwinT2',
                                        module_cls=SwinTransformer2)

        Args:
            group_key: Group name of which module will be registered,
                default group name is 'default'
            module_name: Module name
            module_cls: Module class object
            force (bool, optional): Whether to override an existing class with
                the same name. Default: False.

        Nz,module_name must be either of None, str,got r(   r/   r0   r1   c                    s   j |  d | S )Nr3   )r2   )r0   r1   r(   r/   r   r   r   	_register|   s   z+Registry.register_module.<locals>._register)r+   r,   	TypeErrorr   r2   )r   r(   r/   r0   r1   r5   r   r4   r   register_moduleP   s    zRegistry.register_module)r   
__module____qualname____doc__r,   r   r   propertyr	   r    r   r   r&   r2   r   r7   r   r   r   r   r      s4    

	
r   registryr(   default_argsreturnc              
   C   s  t | tstdt|  t| vr'|du st|vr'tdt d|  d| t |ts5tdt| t |tsG|du sGtdt| dd	lm} |j	
 || d
 f}|| |  }|durs| D ]
\}}||| qh|du ryt}|t}	t |	tr|j|	|d}
|
du rt|	 d|j	 d| d||
_nt|	st|	r|	}
n	tdt|	 zt|
dr|
jdi |W S |
di |W S  ty } zt||
j d| d}~ww )a  Build a module from config dict when it is a class configuration, or
    call a function from config dict when it is a function configuration.

    Example:
        >>> models = Registry('models')
        >>> @models.register_module('image-classification', 'SwinT')
        >>> class SwinTransformer:
        >>>     pass
        >>> swint = build_from_cfg(dict(type='SwinT'), MODELS,
        >>>     'image-classification')
        >>> # Returns an instantiated object
        >>>
        >>> @MODELS.register_module()
        >>> def swin_transformer():
        >>>     pass
        >>>       = build_from_cfg(dict(type='swin_transformer'), MODELS)
        >>> # Return a result of the calling function

    Args:
        cfg (dict): Config dict. It should at least contain the key "type".
        registry (:obj:`Registry`): The registry to search the type from.
        group_key (str, optional): The name of registry group from which
            module should be searched.
        default_args (dict, optional): Default initialization arguments.
        type_name (str, optional): The name of the type in the config.
    Returns:
        object: The constructed object.
    zcfg must be a dict, but got Nz.`cfg` or `default_args` must contain the key "z", but got r   z8registry must be an modelscope.Registry object, but got z-default_args must be a dict or None, but got r   )LazyImportModuler   )r(   z is not in the z registry group zE. Please make sure the correct version of ModelScope library is used.z*type must be a str or valid type, but got _instantiatez: r   )r+   r-   r6   r   	TYPE_NAMEr.   r   modelscope.utils.import_utilsr?   r	   upperimport_modulecopyr   
setdefaultr   popr,   r&   r(   inspectisclass
isfunctionhasattrr@   	Exceptionr   )cfgr<   r(   r=   r?   sigargsr	   valueobj_typeobj_clser   r   r   build_from_cfg   sf   
 




rT   )	importlibrH   typingr   r   r   modelscope.utils.loggerr   rA   r   r#   	AST_INDEXobjectr   r,   r-   rT   r   r   r   r   <module>   s(   z