o
    + i                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 er,d dl
mZ ddlmZ G dd	 d	ejd
ZG dd deZeZdddZdS )    )annotationsN)partial)TYPE_CHECKINGAnyCallable)Layer   )BaseQuanterc                   @  sL   e Zd ZdddZedd	 Zed
d Zejdd Z	dd Z
dd ZdS )ClassWithArgumentsargsr   kwargsreturnNonec                 O  s   || _ || _d S N)_args_kwargsselfr   r    r   g/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/quantization/factory.py__init__   s   
zClassWithArguments.__init__c                 C     | j S r   )r   r   r   r   r   r          zClassWithArguments.argsc                 C  r   r   )r   r   r   r   r   r   $   r   zClassWithArguments.kwargsc                 C  s   d S r   r   r   r   r   r   
_get_class(   s   zClassWithArguments._get_classc                 C  s8   d t| jdd | j D  }| jj d| dS )N,c                 S  s   g | ]\}}| d | qS )=r   ).0kvr   r   r   
<listcomp>.   s    z.ClassWithArguments.__str__.<locals>.<listcomp>())joinlistr   r   items	__class____name__)r   args_strr   r   r   __str__,   s   zClassWithArguments.__str__c                 C  s   |   S r   )r)   r   r   r   r   __repr__2   s   zClassWithArguments.__repr__Nr   r   r   r   r   r   )r'   
__module____qualname__r   propertyr   r   abcabstractmethodr   r)   r*   r   r   r   r   r
      s    



r
   )	metaclassc                      s,   e Zd ZdZd fddZdddZ  ZS )QuanterFactoryzr
    The factory holds the quanter's class information and
    the arguments used to create quanter instance.
    r   r   r   r   r   c                   s   t  j|i | d | _d S r   )superr   partial_classr   r&   r   r   r   <   s   
zQuanterFactory.__init__layerr   r	   c                 C  s4   | j du rt|  g| jR i | j| _ |  |S )zA
        Create an instance of quanter for target layer.
        N)r4   r   r   r   r   )r   r6   r   r   r   	_instance@   s   

zQuanterFactory._instancer+   )r6   r   r   r	   )r'   r,   r-   __doc__r   r7   __classcell__r   r   r5   r   r2   6   s    r2   
class_namestrr   0Callable[[type[BaseQuanter]], type[BaseQuanter]]c                   s   d fdd}|S )a
  
    Annotation to declare a factory class for quanter.

    Args:
        class_name (str): The name of factory class to be declared.

    Examples:
        .. code-block:: python

            >>> # type: ignore
            >>> # doctest: +SKIP('need 2 file to run example')
            >>> # Given codes in ./customized_quanter.py
            >>> from paddle.quantization import quanter
            >>> from paddle.quantization import BaseQuanter
            >>> @quanter("CustomizedQuanter")
            >>> class CustomizedQuanterLayer(BaseQuanter):
            ...     def __init__(self, arg1, kwarg1=None):
            ...         pass

            >>> # Used in ./test.py
            >>> # from .customized_quanter import CustomizedQuanter
            >>> from paddle.quantization import QuantConfig
            >>> arg1_value = "test"
            >>> kwarg1_value = 20
            >>> quanter = CustomizedQuanter(arg1_value, kwarg1=kwarg1_value)
            >>> q_config = QuantConfig(activation=quanter, weight=quanter)

    target_classtype[BaseQuanter]r   c              	     s   d| j  d| j d| j d| j d	}t| t d }t|d }t tft d t d	 d
}t	| | d|j
v rE|j  | S )Nz
def init_function(self, *args, **kwargs):
    super(type(self), self).__init__(*args, **kwargs)
    import importlib
    module = importlib.import_module("z#")
    my_class = getattr(module, "z")
    globals()["z7"] = my_class
def get_class_function(self):
    return z[
locals()["init_function"]=init_function
locals()["get_class_function"]=get_class_function
r   r   Zinit_functionZget_class_function)r   r   __all__)r,   r'   execinspectstack	getmoduletyper2   localssetattr__dict__r?   append)r=   Zinit_function_strfrmmod	new_classr:   r   r   wrappern   s.   
zquanter.<locals>.wrapperN)r=   r>   r   r>   r   )r:   rM   r   rL   r   quanterN   s    rN   )r:   r;   r   r<   )
__future__r   r/   rA   	functoolsr   typingr   r   r   Z	paddle.nnr   Zbase_quanterr	   ABCMetar
   r2   ZObserverFactoryrN   r   r   r   r   <module>   s   