
    h&0                        % S SK r S SKJrJr  S SKJr  S SKJrJrJ	r	  S SK
r
S SKJr  SSKJrJrJr  SSKJrJrJrJr  SS	KJr  \ R0                  " \5      r " S
 S5      rS r\" S\40 5      r\\S'    " S S\\
R@                  RB                  5      r" " S S\"5      r# " S S\"5      r$ " S S\"5      r%\
RL                  RO                  \\/5        g)    N)ABCMetaabstractmethod)partial)AnyOptionalTuple)_fake_quantize_affine   )GranularityPerRow	PerTensor)MappingTypeZeroPointDomain_get_reduction_params"choose_qparams_affine_with_min_max)get_block_sizec                   ,    \ rS rSrS rS rS rS rSrg)_PartialWrapper    c                     Xl         g Np)selfr   s     W/home/james-whalen/.local/lib/python3.13/site-packages/torchao/quantization/observer.py__init___PartialWrapper.__init__!   s        c                 &    U R                   " U0 UD6$ r   r   )r   argskeywordss      r   __call___PartialWrapper.__call__$   s    vvt(x((r   c                 6    U R                   R                  5       $ r   )r   __repr__r   s    r   r%   _PartialWrapper.__repr__'   s    vv  r   c                      [        U /UQ70 UD6$ r   )
_with_args)r   r    kwargss      r   	with_args_PartialWrapper.with_args*   s    $0000r   r   N)	__name__
__module____qualname____firstlineno__r   r"   r%   r+   __static_attributes__ r   r   r   r       s    )!1r   r   c                 6    [        [        U /UQ70 UD65      nU$ )a  Wrapper that allows creation of class factories.

This can be useful when there is a need to create classes with the same
constructor arguments, but different instances.

Example::

    >>> # xdoctest: +SKIP("Undefined vars")
    >>> Foo.with_args = classmethod(_with_args)
    >>> foo_builder = Foo.with_args(a=3, b=4).with_args(answer=42)
    >>> foo_instance1 = foo_builder()
    >>> foo_instance2 = foo_builder()
    >>> id(foo_instance1) == id(foo_instance2)
    False
)r   r   )cls_or_selfr    r*   rs       r   r)   r)   .   s"      	=d=f=>AHr   ABCc                   v  ^  \ rS rSrSr\" \5      rSSSSSS\R                  4S\
S\R                  S\S\\   S	\\   S
\\   S\\R                     S\\R                     S\S\4U 4S jjjr\S\R(                  S\R(                  4S j5       r\S\\R(                  \R(                  4   4S j5       rSrU =r$ )AffineQuantizedObserverBaseE   a  Observer module for affine quantization (https://github.com/pytorch/ao/tree/main/torchao/quantization#affine-quantization)

Args:
  `granularity` and `block_size`: The granularity of the quantization,
    must specify at least one, if both are specified `block_size` takes precedence
    Current supported granularity type are `PerTensor` and `PerAxis`
  other args: please see `:class:torchao.dtypes.AffineQuantizedTensor`
NTmapping_typetarget_dtypegranularity	quant_min	quant_maxepsscale_dtypezero_point_dtypepreserve_zerozero_point_domainc                    > [         TU ]  5         Uc   S5       eU
c  [        S5      eXl        X l        X0l        X@l        XPl        X`l        Xpl	        Xl
        Xl        Xl        g )Ngranularity is Nonez/Please use ZeroPointDomain.NONE instead of None)superr   
ValueErrorr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   	__class__s              r   r   $AffineQuantizedObserverBase.__init__Q   sm     	&=(==&$NOO((&""& 0*!2r   inputreturnc                     g)znforward function should take the input tensor
and updates internal stats and return the original input Tensor
Nr2   r   rJ   s     r   forward#AffineQuantizedObserverBase.forwardm       
 	r   c                     g)zCalculate quantization parameter based on the stats attached to the observer module
and returns a tuple of scale and zero_point Tensor
Nr2   r&   s    r   calculate_qparams-AffineQuantizedObserverBase.calculate_qparamst   rP   r   )
r?   r<   r:   rB   r>   r=   r@   r;   rC   rA   )r-   r.   r/   r0   __doc__classmethodr)   r+   r   INTr   torchdtyper   r   intfloatboolr   r   TensorrN   r   rR   r1   __classcell__rH   s   @r   r8   r8   E   s    J'I $(#'#-126"-<-@-@3!3 kk3 !	3
 C=3 C=3 e_3 ekk*3 #5;;/3 3 +3 38 U\\ ell   5u||)C#D  r   r8   c                   v    \ rS rSrS\R
                  4S jrS\\R
                  \R
                  4   4S jrSr	g)AffineQuantizedMinMaxObserver|   rJ   c                    UR                  5       S:X  a  U$ UR                  5       nU R                  c   S5       e[        UR                  U R                  5      n[        X2R                  5       5      u  pEUR                  U5      n[        R                  " X%SS9n[        R                  " X%SS9n[        U S5      (       a  [        U S5      (       d  X`l        Xpl        U$ U R                  R                  UR                  :X  d+   SU R                  R                   SUR                   35       eU R                  R                  UR                  :X  d+   S	U R                  R                   S
UR                   35       e[        R                  " U R                  U5      n[        R                  " U R                  U5      nU R                  R!                  U5        U R                  R!                  U5        U$ )Nr   rE   Fdimkeepdimmin_valmax_valz=Can't update existing min_val - shape mismatch, self.min_val:z != min_val:z=Can't update existing max_val - shape mismatch, self.max_val z != max_val:)numeldetachr<   r   shaper   sizeviewrW   aminamaxhasattrrf   rg   minmaxcopy_)r   rJ   input_detached
block_sizeshape_for_reductionreduction_dimsrf   rg   s           r   rN   %AffineQuantizedMinMaxObserver.forward}   s   ;;=AL+B-BB+#N$8$8$:J:JK
.C++-/
+ (,,-@A**^O**^OtY''wtY/G/G"L"L  <<%%6 OPTP\P\PbPbOccopwp}p}o~6 <<%%6 OPTP\P\PbPbOccopwp}p}o~6 iig6Giig6GLLw'LLw'r   rK   c                 \   [        U S5      (       a  [        U S5      (       d   S5       e[        U R                  U R                  U R                  / U R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  5      $ Nrf   rg   zhExpecting the observer has min_val and max_val, please run the observer before calling calculate_qparamsro   r   rf   rg   r:   r;   r=   r>   r?   r@   rA   rB   rC   r&   s    r   rR   /AffineQuantizedMinMaxObserver.calculate_qparams       tY''GD),D,D 	
v	
D 2LLLLNNNNHH!!""
 	
r   )rg   rf   N)
r-   r.   r/   r0   rW   r\   rN   r   rR   r1   r2   r   r   r`   r`   |   s0    U\\ >
5u||)C#D 
r   r`   c                   .  ^  \ rS rSrSrSSSSSS\R                  SS4	S\S\R                  S\
S\\   S	\\   S
\\   S\\R                     S\\R                     S\S\S\\R                     S\\R                     4U 4S jjjrSS jrS rS rSrU =r$ )"AffineQuantizedFixedQParamObserver   zG
Observer that allows manual setting of fixed quantization parameters.
NTr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   scale
zero_pointc                 (  > [         TU ]  UUUUUUUUU	U
5
        U(       d  [        R                  " S/5      nU(       d  [        R                  " U5      nU R                  SUR                  US95        U R                  SUR                  US95        g )Nr
   r   rX   r   )rF   r   rW   r\   
zeros_likeregister_bufferto)r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   rH   s                r   r   +AffineQuantizedFixedQParamObserver.__init__   s     		
 LL!%E))%0JWehh[h&AB\:==?O=+PQr   c                     U(       d  [         R                  " U5      nUR                  U R                  S9U l        UR                  U R
                  S9U l        g )Nr   )rW   r   r   r@   r   rA   r   )r   r   r   s      r   set_qparams.AffineQuantizedFixedQParamObserver.set_qparams   sE    ))%0JXXD$4$4X5
$--d.C.C-Dr   c                     U$ r   r2   rM   s     r   rN   *AffineQuantizedFixedQParamObserver.forward   s    r   c                 2    U R                   U R                  4$ r   r   r   r&   s    r   rR   4AffineQuantizedFixedQParamObserver.calculate_qparams   s    zz4??**r   r   r   )r-   r.   r/   r0   rT   r   rV   r   rW   rX   r   r   rY   rZ   r[   r\   r   r   rN   rR   r1   r]   r^   s   @r   r~   r~      s    $(#'#-126"-<-@-@(,-1 R! R kk R !	 R
 C= R C= R e_ R ekk* R #5;;/ R  R + R % R U\\* R  RDE+ +r   r~   c                     ^  \ rS rSrSrSSSSSS\R                  SS4	S\S\R                  S	\
S
\\   S\\   S\\   S\\R                     S\\R                     S\S\S\S\4U 4S jjjrS rS rS rS rS rSrU =r$ )AffineQuantizedMSEObserver   z
Minimize quantization loss caused by outlier via linear search. More details can be found at https://arxiv.org/pdf/2209.13325
NTd   Fr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   stepsrun_oncec                 \   > [         TU ]  UUUUUUUUU	U
5
        Xl        SU l        Xl        g )NF)rF   r   r   
calibratedr   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   rH   s                r   r   #AffineQuantizedMSEObserver.__init__   sC     		
 
 r   c                     X-
  R                  5       R                  S5      n[        X4R                  5       5      u  pVUR	                  U5      n[
        R                  " XFSS9$ )N   Frc   )abspowr   rk   rl   rW   mean)r   predexpectrt   lossru   rv   s          r   mseAffineQuantizedMSEObserver.mse  sV    ""$((+.C		/
+ yy,-zz$EBBr   c                    [        UR                  U R                  5      n[        UUU R                  / U R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  5      u  pV[        UUUUU R
                  U R                  U R                  U R                  5      nU R                  XqU5      $ r   )r   rj   r<   r   r:   r;   r=   r>   r?   r@   rA   rB   rC   r	   r   )r   xnew_minnew_maxrt   r   r   x_qs           r   loss_fn"AffineQuantizedMSEObserver.loss_fn  s    #AGGT-=-=>
>NNNNHH!!""
 $NNNN""	
 xx
++r   c                     UR                  5       S:X  a  U$ UR                  5       nU R                  c   S5       e[        UR                  U R                  5      n[        X2R                  5       5      u  pEUR                  U5      n[        R                  " X%SS9n[        R                  " X%SS9n[        R                  " UR                  5       U5      n[        R                  " U5      S-   n	[        SU R                  S-   5       Hq  n
XR                  -  U
-  nU R!                  X* U5      n[        R"                  " X:  U* U5      n[        R"                  " X:  X5      n[        R$                  " X5      n	Ms     Xg4$ )Nr   rE   Frc   g    eAr
   )rh   ri   r<   r   rj   r   rk   rl   rW   rm   rn   rq   r   r   ranger   r   whererp   )r   rJ   rs   rt   ru   rv   rf   rg   	range_valoptimal_lossithrescurrent_losss                r   line_search&AffineQuantizedMSEObserver.line_search,  sI   ;;=AL+B-BB+#N$8$8$:J:JK
.C++-/
+ (,,-@A**^O**^OIIgkkmW5	''036 q$**q.)A

*Q.E<<vu=Lkk,"=vwOGkk,"=uNG 99\@L * r   c                     U R                   (       a  U R                  (       d%  U R                  U5      u  U l        U l        SU l        U$ )NT)r   r   r   rf   rg   rM   s     r   rN   "AffineQuantizedMSEObserver.forwardH  s4    $//)-)9)9%)@&DL$,"DOr   c                 \   [        U S5      (       a  [        U S5      (       d   S5       e[        U R                  U R                  U R                  / U R
                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  5      $ ry   rz   r&   s    r   rR   ,AffineQuantizedMSEObserver.calculate_qparamsO  r|   r   )r   rg   rf   r   r   )r-   r.   r/   r0   rT   r   rV   r   rW   rX   r   r   rY   rZ   r[   r   r   r   r   rN   rR   r1   r]   r^   s   @r   r   r      s     $(#'#-126"-<-@-@!!! kk! !	!
 C=! C=! e_! ekk*! #5;;/! ! +! ! ! !>C,8 8
 
r   r   )(loggingabcr   r   	functoolsr   typingr   r   r   rW   %torchao.quantization.quant_primitivesr	   r<   r   r   r   quant_primitivesr   r   r   r   utilsr   	getLoggerr-   loggerr   r)   objectr6   __annotations__nnModuler8   r`   r~   r   serializationadd_safe_globalsr2   r   r   <module>r      s     '  ' '  G 
  "			8	$1 1( 56)R(S (4#uxx 4n1
$? 1
h1+)D 1+h|
!< |
@    $ $fi%8 9r   