o
    #j                     @   sh   d dl Z d dlZd dlmZ 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 ZdS )    N)partial)Layer   )BaseQuanterc                   @   sJ   e Zd Zdd Zedd Zedd Zejdd Z	d	d
 Z
dd ZdS )ClassWithArgumentsc                 O   s   || _ || _d S N)_args_kwargsselfargskwargs r   \/var/www/html/Deteccion_Ine/venv/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__0   s   zClassWithArguments.__repr__N)r!   
__module____qualname__r   propertyr   r   abcabstractmethodr   r#   r$   r   r   r   r   r      s    


r   )	metaclassc                       s2   e Zd ZdZ fddZdedefddZ  ZS )QuanterFactoryzr
    The factory holds the quanter's class information and
    the arguments used to create quanter instance.
    c                    s   t  j|i | d | _d S r   )superr   partial_classr
   r    r   r   r   :   s   
zQuanterFactory.__init__layerreturnc                 C   s4   | j du rt|  g| jR i | j| _ |  |S )zA
        Create an instance of quanter for target layer.
        N)r-   r   r   r   r   )r   r/   r   r   r   	_instance>   s   

zQuanterFactory._instance)	r!   r%   r&   __doc__r   r   r   r1   __classcell__r   r   r.   r   r+   4   s    r+   c                    s    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

            >>> # 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)

    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typer+   localssetattr__dict__r4   append)Ztarget_classZinit_function_strZfrmmod	new_class
class_namer   r   wrapperi   s.   
zquanter.<locals>.wrapperr   )rA   rB   r   r@   r   quanterL   s   rC   )r(   r6   	functoolsr   Z	paddle.nnr   Zbase_quanterr   ABCMetar   r+   ZObserverFactoryrC   r   r   r   r   <module>   s   