o
    i                     @   s  d dl mZmZmZ d dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZm Z m!Z!m"Z" d dl#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE eeeefD ]ZFdeF_Gqee=e'f ZHdeH_Gee>eIe= eIe' f ZJdeJ_Gg dZKG dd de=ZLdS )    )CallableOptionalUnionN)Tensor)GranularityPerAxisPerBlockPerGroupPerRow	PerTensorPerToken)
CUSTOM_KEYFROM_NODE_KEYNUMERIC_DEBUG_HANDLE_KEYcompare_resultsextract_results_from_loggersgenerate_numeric_debug_handle"prepare_for_propagation_comparison)WrapperModule) _allow_exported_model_train_eval)_move_exported_model_to_eval)_move_exported_model_to_train)bfs_trace_with_node_processfind_sequential_partitionsget_equivalent_typesupdate_equivalent_types_dict)get_block_size   )
FakeQuantizeFakeQuantizeBaseFixedQParamsFakeQuantizeFusedMovingAvgObsFakeQuantizedefault_dynamic_fake_quantdefault_fake_quantdisable_fake_quantdisable_observerenable_fake_quantenable_observer)LearnableFakeQuantizedisable_range_learningenable_range_learning)AffineQuantizedObserverBaseFixedQParamsObserverHistogramObserverMappingTypeMinMaxObserverMovingAverageMinMaxObserver%MovingAveragePerChannelMinMaxObserverNoopObserverObserverBasePartialWrapperPerChannelMinMaxObserverPlaceholderObserverRecordingObserverReuseInputObserverTorchAODTypeUniformQuantizationObserverBaseZeroPointDomainztorchao.quantization.pt2e)7r   r   r    r,   r!   r-   r(   r/   r0   r1   r2   r3   ObserverOrFakeQuantizer5   r6   r7   r8   r:   !ObserverOrFakeQuantizeConstructorDerivedObserverOrFakeQuantizer&   r'   r$   r%   r*   r)   move_exported_model_to_evalmove_exported_model_to_trainallow_exported_model_train_evalr   r   r   r   r   r   r   r   r   r   r   r   r+   r   r.   r   r   r	   r
   r   r   r9   r;   r   r#   r"   c                       s   e Zd ZdZ				ddejdee deee ge	e
e
f f dee dee deej d	ee f fd
dZde
de
fddZdd Z  ZS )r>   zuThis observer is used to describe an observer whose quantization parameters
    are derived from other observers
    Ndtype
obs_or_fqsderive_qparams_fn	quant_min	quant_maxqschemech_axisc           	         s`   t  | || _|| _|| _|| _|| _|| _ddlm	} || jr,| jd us.J dd S d S )Nr   )is_per_channelz6Must provide a valid ch_axis if qscheme is per channel)
super__init__rC   rD   rE   rF   rG   rH   utilsrI   )	selfrB   rC   rD   rE   rF   rG   rH   rI   	__class__ V/home/ubuntu/.local/lib/python3.10/site-packages/torchao/quantization/pt2e/__init__.pyrK      s   
z&DerivedObserverOrFakeQuantize.__init__xreturnc                 C   s   |S NrP   )rM   rR   rP   rP   rQ   forward   s   z%DerivedObserverOrFakeQuantize.forwardc                 C   s   |  | jS rT   )rD   rC   )rM   rP   rP   rQ   calculate_qparams   s   z/DerivedObserverOrFakeQuantize.calculate_qparams)NNNN)__name__
__module____qualname____doc__torchrB   listr<   r   tupler   r   intrG   rK   rU   rV   __classcell__rP   rP   rN   rQ   r>      s2    	
r>   )Mtypingr   r   r   r[   r   torchao.quantizationr   r   r   r	   r
   r   r   +torchao.quantization.pt2e._numeric_debuggerr   r   r   r   r   r   r   &torchao.quantization.pt2e.export_utilsr   r   rA   r   r?   r   r@   %torchao.quantization.pt2e.graph_utilsr   r   r   r   torchao.quantization.utilsr   fake_quantizer   r   r    r!   r"   r#   r$   r%   r&   r'   learnable_fake_quantizer(   r)   r*   observerr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   _frX   r<   typer=   __all__r>   rP   rP   rP   rQ   <module>   s8   $$		0LB