o
    W+ i                  	   @   sr   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
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   e/home/app/PaddleOCR-VL-test/.venv_paddleocr/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   Z
module_key	group_keyr   r   r   r&   1   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_module7   s"   


zRegistry._register_moduler'   r.   r/   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.   r/   r0   c                    s   j |  d | S )Nr2   )r1   )r/   r0   r'   r.   r   r   r   	_register{   s   z+Registry.register_module.<locals>._register)r*   r+   	TypeErrorr   r1   )r   r'   r.   r/   r0   r4   r   r3   r   register_moduleO   s    zRegistry.register_module)r   
__module____qualname____doc__r+   r   r   propertyr	   r    r   r   r&   r1   r   r6   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,   r5   r   	TYPE_NAMEr-   r   Z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_typeZobj_clser   r   r   build_from_cfg   sf   
 




rQ   )	importlibrF   typingr   r   r   Zmodelscope.utils.loggerr   r@   r   r#   objectr   r+   r,   rQ   r   r   r   r   <module>   s&   z