
    il4                     r   % S SK r 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  \ R2                  " \5      r " S
 S5      rS r\" S\40 5      r\\ S'    " S S\\RB                  RD                  5      r# " S S\#5      r$ " S S\#5      r% " S S\#5      r&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     \/var/www/html/ai-image-ml/venv/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                   |  ^  \ rS rSrSr\" \5      rSSSSSS\R                  S4S\
S\R                  S\S	\\   S
\\   S\\   S\\R                     S\\R                     S\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$ )AffineQuantizedObserverBaseB   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`
NTFmapping_typetarget_dtypegranularity	quant_min	quant_maxepsscale_dtypezero_point_dtypepreserve_zerozero_point_domainkeepdimc                 |  > [         TU ]  5         Uc   S5       eU
c  [        S5      eU	(       d  [        R                  " S[
        SS9  U
[        R                  :w  a  [        R                  " SU
 S3[
        SS9  Xl        X l	        X0l
        X@l        XPl        X`l        Xpl        Xl        Xl        Xl        Xl        g )Ngranularity is Nonez/Please use ZeroPointDomain.NONE instead of Nonezppreserve_zero=False is deprecated and will be removed in a future release. Only preserve_zero=True is supported.   )
stacklevelzzero_point_domain=z^ is deprecated and will be removed in a future release. Only ZeroPointDomain.INT is supported.)superr   
ValueErrorwarningswarnDeprecationWarningr   INTr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   	__class__s               r   r   $AffineQuantizedObserverBase.__init__N   s     	&=(==&$NOO MM8"	  3 33MM$%6$7 89 9"	 )(&""& 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   rQ   s     r   forward#AffineQuantizedObserverBase.forward~       
 	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_qparams   rW   r   )r?   r<   rD   r:   rB   r>   r=   r@   r;   rC   rA   )r-   r.   r/   r0   __doc__classmethodr)   r+   r   rN   r   torchdtyper   r   intfloatboolr   r   TensorrU   r   rY   r1   __classcell__rO   s   @r   r8   r8   B   s$    J'I $(#'#-126"-<-@-@.!. kk. !	.
 C=. C=. e_. ekk*. #5;;/. . +. . .` 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   rQ   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%U R                  S9n[        R                  " X%U R                  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   rF   dimrD   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viewr]   aminrD   amaxhasattrrk   rl   minmaxcopy_)r   rQ   input_detached
block_sizeshape_for_reductionreduction_dimsrk   rl   s           r   rU   %AffineQuantizedMinMaxObserver.forward   s   ;;=AL+B-BB+#N$8$8$:J:JK
.C++-/
+ (,,-@A**^V**^V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   rR   c                 z   [        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                  5
      u  pU R                  [        R                  :X  a  S nX4$ Nrk   rl   zhExpecting the observer has min_val and max_val, please run the observer before calling calculate_qparamsrt   r   rk   rl   r:   r;   r=   r>   r?   r@   rA   rC   r   NONEr   scale
zero_points      r   rY   /AffineQuantizedMinMaxObserver.calculate_qparams       tY''GD),D,D 	
v	
D ?LLLLNNNNHH!!
 !!_%9%99J  r   )rl   rk   N)
r-   r.   r/   r0   r]   rb   rU   r   rY   r1   r2   r   r   rf   rf      s0    U\\ >!5u||)C#D !r   rf   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   r   r   c                 (  > [         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   r^   r   )rI   r   r]   rb   
zeros_likeregister_bufferto)r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   rO   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   )r]   r   r   r@   r   rA   r   r   s      r   set_qparams.AffineQuantizedFixedQParamObserver.set_qparams   sE    ))%0JXXD$4$4X5
$--d.C.C-Dr   c                     U$ r   r2   rT   s     r   rU   *AffineQuantizedFixedQParamObserver.forward   s    r   c                 2    U R                   U R                  4$ r   r   r   r&   s    r   rY   4AffineQuantizedFixedQParamObserver.calculate_qparams   s    zz4??**r   r   r   )r-   r.   r/   r0   r[   r   rN   r   r]   r^   r   r   r_   r`   ra   rb   r   r   rU   rY   r1   rc   rd   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)rI   r   r   
calibratedr   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   rO   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$ )NrG   Fri   )abspowr   rp   rq   r]   mean)r   predexpectry   lossrz   r{   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                  5
      u  pVU R                  [        R                  :X  a  S n[        UUUUU R
                  U R                  U R                  U R                  5      nU R                  XqU5      $ r   )r   ro   r<   r   r:   r;   r=   r>   r?   r@   rA   rC   r   r   r	   r   )r   xnew_minnew_maxry   r   r   x_qs           r   loss_fn"AffineQuantizedMSEObserver.loss_fn#  s    #AGGT-=-=>
>NNNNHH!!
 !!_%9%99J#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   rF   Fri   g    eAr
   )rm   rn   r<   r   ro   r   rp   rq   r]   rr   rs   rv   r   r   ranger   r   whereru   )r   rQ   rx   ry   rz   r{   rk   rl   	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   rk   rl   rT   s     r   rU   "AffineQuantizedMSEObserver.forward\  s4    $//)-)9)9%)@&DL$,"DOr   c                 z   [        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                  5
      u  pU R                  [        R                  :X  a  S nX4$ r~   r   r   s      r   rY   ,AffineQuantizedMSEObserver.calculate_qparamsc  r   r   )r   rl   rk   r   r   )r-   r.   r/   r0   r[   r   rN   r   r]   r^   r   r   r_   r`   ra   r   r   r   r   rU   rY   r1   rc   rd   s   @r   r   r      s     $(#'#-126"-<-@-@!!! kk! !	!
 C=! C=! e_! ekk*! #5;;/! ! +! ! ! !>C,: 8! !r   r   )'loggingrK   abcr   r   	functoolsr   typingr   r   r   r]   %torchao.quantization.quant_primitivesr	   r<   r   r   r   quant_primitivesr   r   r   r   utilsr   	getLoggerr-   loggerr   r)   objectr6   __annotations__nnModuler8   rf   r   r   r2   r   r   <module>r      s      '  ' '  G 7 7  "			8	$1 1( 56)R(S (H#uxx HV3!$? 3!l1+)D 1+h!!< !r   