
    vj              	           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e          Ze	dfded	ed
edefdZdS )    N)ListTupleUnion)
get_loggertypedefaultc                       e Zd ZdZdefdZd Zed             Zed             Z	d Z
efdZed	d	d
fdZed	d	d
fdededef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                 0    || _         t          i i| _        d S N)_namedefault_group_modules)selfr   s     i/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/modelscope/utils/registry.py__init__zRegistry.__init__   s    
&+    c           	          | j         j        d| j         dz   }| j                                        D ]0\  }}|d| dt          |                                           dz  }1|S )Nz (z)
group_name=z
, modules=
)	__class____name__r   r   itemslistkeys)r   
format_str
group_namegroups       r   __repr__zRegistry.__repr__   s    ^,/CDJ/C/C/CC
!%!4!4!6!6 	2 	2J 2
 2 2

--2 2 2 2JJ r   c                     | j         S r   )r   r   s    r   r   zRegistry.name    s
    zr   c                     | j         S r   )r   r"   s    r   moduleszRegistry.modules$   s
    }r   c                    | j                                         D ]p\  }}t                              d|            |                                D ]}t                              d|             t                              d           qdS )z8 logging the list of module in current registry
        r   	 N)r   r   loggerinfor   )r   r   r   ms       r   r   zRegistry.list(   s     "&!4!4!6!6 	 	JKK2j22333ZZ\\ & &HHH%%%%KKOOOO		 	r   c                 Z    || j         vrd S | j         |                             |d           S r   )r   get)r   
module_key	group_keys      r   r,   zRegistry.get1   s1    DM))4=+//
DAAAr   NFc                    t          |t                    s
J d            || j        vrt                      | j        |<   ||j        }|| j        |         v r|st          | 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forces        r   _register_modulezRegistry._register_module7   s    
 )  	H 	H G	H 	H  DM))'+vvDM)$ $-K$-	22252k 8 8"j8 8+48 8 8 9 9 90:i -(
r   r.   r6   r7   c                      4t          t                    st          dt                               |                     |           |S  f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.   r6   r7   r8   c                 :                         |            | S )Nr;   )r9   )r7   r8   r.   r6   r   s    r   	_registerz+Registry.register_module.<locals>._register{   s4    !!#'%	 "   
 r   )r2   r3   	TypeErrorr   r9   )r   r.   r6   r7   r8   r=   s   ``` ` r   register_modulezRegistry.register_moduleO   s    @ #z+s'C'C# 7#'#4#47 7 8 8 8!!!#'%	 "   
 	 	 	 	 	 	 	 	 r   )r   
__module____qualname____doc__r3   r   r    propertyr   r$   r   r   r,   r9   r   r?    r   r   r
   r
      s        
,S , , , ,     X   X   )6 B B B B $1%)$($	) ) ) )2 *7+/+/#	4 4#&4%(4 %)4 4 4 4 4 4r   r
   registryr.   default_argsreturnc                    t          | t                    st          dt          |                      t          | vr(|	t          |vrt          dt           d|  d|           t          |t                    st          dt          |                     t          |t                    s!|t          dt          |                     dd	lm} |j	        
                                || d
         f}|                    |           |                                 }|0|                                D ]\  }}|                    ||           |t          }|                    t                    }	t          |	t"                    r>|                    |	|          }
|
t          |	 d|j	         d| d          ||
_        nJt)          j        |	          st)          j        |	          r|	}
nt          dt          |	                     	 t/          |
d          r |
j        di |S  |
di |S # t2          $ r(} t          |          |
j         d|           |d}~ww xY 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: rD   )r2   r4   r>   r   	TYPE_NAMEr5   r
   modelscope.utils.import_utilsrI   r   upperimport_modulecopyr   
setdefaultr   popr3   r,   r.   inspectisclass
isfunctionhasattrrJ   	Exceptionr   )cfgrE   r.   rF   rI   sigargsr   valueobj_typeobj_clses               r   build_from_cfgr^      s   @ c4   DBtCyyBBCCC9L#@#@1 1 11 1".1 12 2 2 h)) 5 4#'>>4 4 5 5 	5|T** 9l.B 8#'#5#58 8 9 9 	9 ?>>>>>=  )S[
9C""3'''88::D'--// 	) 	)KD%OOD%((((!	xx	""H(C   K,,x9,==? L LHM L L#,L L LM M M &		"	" Kg&8&B&B KIhIIK K 	K97N++ 	#'7'//$///7??T??" 9 9 9d1gg)00Q0011q89s   H9 1H9 9
I+#I&&I+)	importlibrR   typingr   r   r   modelscope.utils.loggerr   rK   r   r(   objectr
   r3   r4   r^   rD   r   r   <module>rc      s         % % % % % % % % % % . . . . . .		u u u u uv u u ut %2(,P9 P9%P9!P9 "&P9 28P9 P9 P9 P9 P9 P9r   