
    `i                    h    d dl mZ d dlmZ ddlmZmZ er
d dlZd dlm	Z	 dgZ
 G d de          ZdS )	    )annotations)TYPE_CHECKING   )QuantizationAnnotation	QuantizerN)NodeComposableQuantizerc                  D     e Zd ZdZd fdZddZddZddZddZ xZ	S )r	   a  
    ComposableQuantizer allows users to combine more than one quantizer into a single quantizer.
    This allows users to quantize a model with multiple quantizers. E.g., embedding quantization
    maybe supported by one quantizer while linear layers and other ops might be supported by another
    quantizer.

    ComposableQuantizer is initialized with a list of `Quantizer` instances.
    The order of the composition matters since that is the order in which the quantizers will be
    applies.
    Example:
    ```
    embedding_quantizer = EmbeddingQuantizer()
    linear_quantizer = MyLinearQuantizer()
    xnnpack_quantizer = (
        XNNPackQuantizer()
    )  # to handle ops not quantized by previous two quantizers
    composed_quantizer = ComposableQuantizer(
        [embedding_quantizer, linear_quantizer, xnnpack_quantizer]
    )
    prepared_m = prepare_pt2e(model, composed_quantizer)
    ```
    
quantizerslist[Quantizer]c                d    t                                                       || _        i | _        d S N)super__init__r   _graph_annotations)selfr   	__class__s     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/ao/quantization/quantizer/composable_quantizer.pyr   zComposableQuantizer.__init__)   s.    $FH    gmtorch.fx.GraphModule	quantizerr   returnNonec                n   |j         j        D ]}d|j        v rt|| j        v rUt	          | j        |                   t	          |j        d                   k    rt          d|j        j         d|           |j        d         | j        |<   || j        v rt          d|j        j         d|           d S )Nquantization_annotationz
Quantizer z! has changed annotations on node z! has removed annotations on node )graphnodesmetar   idRuntimeErrorr   __name__)r   r   r   ns       r    _record_and_validate_annotationsz4ComposableQuantizer._record_and_validate_annotations.   s      	 	A(AF22 ///t.q122!&!:;<<= = 'gY%8%Aggdegg   238Q1RD+A..///&gY%8%Aggdegg   0	 	r   modelc                p    | j         D ]-}|                    |           |                     ||           .|S )z!just handling global spec for now)r   annotater$   r   r%   r   s      r   r'   zComposableQuantizer.annotateD   sG     	D 	DIu%%%11%CCCCr   c                D    | j         D ]}|                    |          }|S r   )r   transform_for_annotationr(   s      r   r*   z,ComposableQuantizer.transform_for_annotationK   s/      	> 	>I66u==EEr   c                    d S r    )r   r%   s     r   validatezComposableQuantizer.validateR   s    r   )r   r   )r   r   r   r   r   r   )r%   r   r   r   )r%   r   r   r   )
r"   
__module____qualname____doc__r   r$   r'   r*   r-   __classcell__)r   s   @r   r	   r	      s         .I I I I I I
   ,             r   )
__future__r   typingr   r   r   r   torchtorch.fxr   __all__r	   r,   r   r   <module>r7      s    " " " " " "             8 8 8 8 8 8 8 8  LLL 
B B B B B) B B B B Br   