U
    yh                     @  sb   d dl mZ d dlmZmZmZ ddlmZmZ erHd dl	Z	d dl
mZ dgZG dd deZdS )	    )annotations)DictListTYPE_CHECKING   )QuantizationAnnotation	QuantizerN)NodeComposableQuantizerc                      sh   e Zd ZdZdd fddZdddd	d
dZdddddZdddddZdddddZ  Z	S )r
   at  
    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)
    ```
    zList[Quantizer])
quantizersc                   s   t    || _i | _d S N)super__init__r   _graph_annotations)selfr   	__class__ f/var/www/html/venv/lib/python3.8/site-packages/torch/ao/quantization/quantizer/composable_quantizer.pyr   $   s    
zComposableQuantizer.__init__ztorch.fx.GraphModuler   None)gm	quantizerreturnc                 C  s   |j jD ]}d|jkrh|| jkrVt| j| t|jd krVtd|jj d| q|jd | j|< q|| jkrtd|jj d| qd S )NZquantization_annotationz
Quantizer z! has changed annotations on node z! has removed annotations on node )graphZnodesmetar   idRuntimeErrorr   __name__)r   r   r   nr   r   r    _record_and_validate_annotations)   s    


z4ComposableQuantizer._record_and_validate_annotations)modelr   c                 C  s&   | j D ]}|| | || q|S )z!just handling global spec for now)r   annotater   r   r    r   r   r   r   r!   ?   s    

zComposableQuantizer.annotatec                 C  s   | j D ]}||}q|S r   )r   transform_for_annotationr"   r   r   r   r#   F   s    
z,ComposableQuantizer.transform_for_annotationc                 C  s   d S r   r   )r   r    r   r   r   validateM   s    zComposableQuantizer.validate)
r   
__module____qualname____doc__r   r   r!   r#   r$   __classcell__r   r   r   r   r
      s   )
__future__r   typingr   r   r   r   r   r   ZtorchZtorch.fxr	   __all__r
   r   r   r   r   <module>   s   