o
    H!i                     @   s   d dl Z d dlZd dlmZ d dlZddlmZmZm	Z	 ddl
T dd Zdefd	d
ZG dd deZG dd deZG dd deZG dd deZG dd deeZdS )    N)ABCMeta   )DuplicateRegistrationErrorraise_class_not_found_error raise_no_entity_registered_error)*c                 C   s   t | trdd |  D S t | trdd | D S t | tjr$|  S t | tjtjfr1t	| S t | tj
tjfr>t| S t | tjrHt| S t | tjtjfrUt| S | S )Nc                 S   s$   i | ]\}}t |ts|t|qS  )
isinstancetypeconvert_and_remove_types).0kvr   r   ^/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddlex/utils/misc.py
<dictcomp>    s    z,convert_and_remove_types.<locals>.<dictcomp>c                 S   s   g | ]}t |qS r   )r   )r   r   r   r   r   
<listcomp>&   s    z,convert_and_remove_types.<locals>.<listcomp>)r	   dictitemslistnpZndarraytolistZfloat32Zfloat64floatZint32Zint64intZbool_boolZstr_Zunicode_str)datar   r   r   r      s"   

r   pathc                 C   s   t j| S )ztget absolute path

    Args:
        path (str): the relative path

    Returns:
        str: the absolute path
    )osr   abspath)r   r   r   r   r   4   s   	r   c                       s(   e Zd ZdZ fddZdd Z  ZS )CachedPropertyaD  
    A property that is only computed once per instance and then replaces itself
    with an ordinary attribute.

    The implementation refers to
    https://github.com/pydanny/cached-property/blob/master/cached_property.py .

    Note that this implementation does NOT work in multi-thread or coroutine
    scenarios.
    c                    s"   t    || _t|dd| _d S )N__doc__ )super__init__funcgetattrr    )selfr$   	__class__r   r   r#   L   s   
zCachedProperty.__init__c                 C   s(   |d u r| S |  |}||j| j j< |S N)r$   __dict____name__)r&   objclsvalr   r   r   __get__Q   s
   
zCachedProperty.__get__)r+   
__module____qualname__r    r#   r/   __classcell__r   r   r'   r   r   @   s    r   c                       s2   e Zd Zd Z fddZdddZdd Z  ZS )	Constantc                    s   t    || _d S r)   )r"   r#   r.   )r&   r.   r'   r   r   r#   ^   s   

zConstant.__init__Nc                 C   s   | j S r)   )r.   )r&   r,   type_r   r   r   r/   b   s   zConstant.__get__c                 C   s   t d)Nz+The value of a constant cannot be modified!)AttributeError)r&   r,   r.   r   r   r   __set__e   s   zConstant.__set__r)   )r+   r0   r1   r    r#   r/   r6   r2   r   r   r'   r   r3   [   s
    
r3   c                       s,   e Zd ZdZi Ze Z fddZ  Z	S )	Singletonzgsingleton meta class

    Args:
        type (class): type

    Returns:
        class: meta class
    c                    s\   | | j vr)| j | | j vrt j|i || j | < W d    n1 s$w   Y  | j |  S r)   )_insts_lockr"   __call__)r-   argskwargsr'   r   r   r:   v   s   


zSingleton.__call__)
r+   r0   r1   r    r8   	threadingLockr9   r:   r2   r   r   r'   r   r7   i   s
    	r7   c                       sf   e Zd ZdZdZdZdZ fddZedd Z	ed	d
 Z
edd Zdd ZdefddZ  ZS )AutoRegisterMetaClasszmeta class that automatically registry subclass to its baseclass

    Args:
        type (class): type

    Returns:
        class: meta class
    entitiesZ	__is_baseZ__registered_mapc                    s$   t  | |||}| ||| |S r)   )r"   __new__-_AutoRegisterMetaClass__register_model_entity)mcsnamebasesattrsr-   r'   r   r   rA      s   zAutoRegisterMetaClass.__new__c                 C   s0   |r|D ]}|  |}|r| || qd S d S r)   )'_AutoRegisterMetaClass__find_base_class._AutoRegisterMetaClass__register_to_base_class)rC   rE   r-   rF   basebase_clsr   r   r   Z__register_model_entity   s   
z-AutoRegisterMetaClass.__register_model_entityc                 C   sV   | j }|drd|j | }t||dr|S |jD ]}| |}|r(|  S qd S )N___F)'_AutoRegisterMetaClass__base_class_flag
startswithr+   r%   	__bases__rG   )rC   r-   Zis_base_flagrI   rJ   r   r   r   Z__find_base_class   s   


z'AutoRegisterMetaClass.__find_base_classc              	   C   s   t || j|j}t|tr|g}t || ji }|D ].}||v r7|| |ur7td| d|j d|| j d|||< td|j d| d qt|| j| d S )Nz
The name(`z5`) duplicated registration! The class entities are: `z` and `z`.zThe class entity(z) has been register as name(`z`).)	r%   ,_AutoRegisterMetaClass__model_type_attr_namer+   r	   r   +_AutoRegisterMetaClass__registered_map_namer   debugsetattr)rC   rI   r-   Zcls_entity_namerecordsrD   r   r   r   Z__register_to_base_class   s    
z.AutoRegisterMetaClass.__register_to_base_classc                 C   s(   t | t| jst|  t| t| jS )zget all subclass)hasattrr
   rQ   r   r%   )r-   r   r   r   all   s   zAutoRegisterMetaClass.allrD   c                 C   s$   |   }||vrt|| | || S )z get the registried class by name)rV   r   )r-   rD   Zall_entitiesr   r   r   get   s   zAutoRegisterMetaClass.get)r+   r0   r1   r    rP   rM   rQ   rA   classmethodrB   rG   rH   rV   r   rW   r2   r   r   r'   r   r?      s    	


r?   c                   @   s   e Zd Zd ZdS )AutoRegisterABCMetaClassN)r+   r0   r1   r    r   r   r   r   rY      s    rY   )r   r=   abcr   numpyr   errorsr   r   r   loggingr   r   r   objectr   r3   r
   r7   r?   rY   r   r   r   r   <module>   s   I