
    Vh};                     L   d dl Z d dlZdgZ G d dej                  j                        Zdej                  dej                  dej                  dej                  dej                  d	e	d
e j                  e	   de j                  e	   dej                  fdZdej                  dej                  dej                  dej                  dej                  d	e	d
e j                  e	   de j                  e	   dej                  fdZdej                  dej                  dej                  dej                  dej                  de	dej                  fdZdej                  dej                  dej                  dej                  dej                  de	d
e j                  e	   de j                  e	   dej                  fdZdej                  dej                  dej                  dej                  dej                  de	dej                  fdZd Zdeee j&                  f   defdZy)    NReferenceQuantizedModulec                   :     e Zd Zd Zd Zd Z fdZ fdZ xZS )r   c                    |#t         j                  t         j                  ddd}|d   | _        |d   | _        | j                  d t         j                  t         j
                  t         j                  fv s%J d| j                   d| j                                 | j                  t         j                  t         j                  t         j                  t         j                  fv rt        |d   t         j                        r|d   j                  nt         j                  }|d	   }t        |t         j                        r|j                         j!                         n%t        j"                  |t         j$                  |
      }| j'                  d|       |d   }t        |t         j                        r|j                         j!                         nt        j"                  |||
      }| j'                  d|       | j                  t         j
                  t         j                  fv rv|d   }t        |t         j                        r|j                         j!                         n%t        j"                  |t         j                  |
      }	| j'                  d|	       n| j'                  dt        j"                  dt         j                  |
             n| j'                  dt        j"                  dt         j$                  |
             | j'                  dt        j"                  dt         j                  |
             | j'                  dt        j"                  dt         j                  |
             |j)                  dd      | _        | j,                  j/                         | _        |j)                  dd       | _        |j)                  dd       | _        y )Ng      ?r   )qschemedtypescale
zero_pointr   r   z	qscheme: z' is not support in reference quantized r	   r   )r   deviceweight_scaleweight_zero_pointaxisweight_axisis_decomposedF	quant_min	quant_max)torchper_tensor_affinequint8weight_qschemeweight_dtypeper_channel_affine per_channel_affine_float_qparams	_get_nameqint8quint4x2qint32
isinstanceTensorr   intdetachclonetensorfloatregister_buffergetr   r   itemweight_axis_intweight_quant_minweight_quant_max)
selfweight_qparamsr
   zero_point_dtypew_scalew_scale_tensorw_zpw_zp_tensorw_axisw_axis_tensors
             ]/home/dcms/DCMS/lib/python3.12/site-packages/torch/ao/nn/quantized/reference/modules/utils.py_init_weight_qparamsz-ReferenceQuantizedModule._init_weight_qparams   s8   ! 22	N .<I-F*73""##$$22	'
 
 	f
 t**++RSWSaSaScRde	f 
 LLKKNNLL	!
 
 n\:ELLI |,22YY 
 %W-G gu||4  &&(\\'VL 
   @!,/D dELL1 ##%\\$.>vN 
   !4kB""((66'  (/ "&%,,7 MMO))+fEIIfM 
 $$]MB $$!5<<6#R
   SF S   #U\\!599V%T   u||AUYYvN $2#5#5ou#M %)$4$4$9$9$;6D6H6H7
 7E6H6H7
    c           
         t        | j                  t        j                        sJ t        | j                  t        j                        sJ | j
                  rbt        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        S t        | j                  | j                  | j                  | j                  | j                  | j                        S )z
        Fake quantize (quantize and dequantize) the weight with
        the quantization parameters for weight, this is used to
        simulate the numerics for the quantized weight in a quantized
        model
        )r   r   r   r   r   r   *_quantize_and_dequantize_weight_decomposedweightr   r   r'   r(   r)   _quantize_and_dequantize_weightr*   s    r3   
get_weightz#ReferenceQuantizedModule.get_weight\   s     $++U\\:::$00%,,???=##!!!!&&$$%%%%	 	 3##!!!!&&$$ r5   c           
         t        | j                  t        j                        sJ t        | j                  t        j                        sJ | j
                  rbt        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        S t        | j                  | j                  | j                  | j                  | j                  | j                        S N)r   r   r   r   r   r   _quantize_weight_decomposedr8   r   r   r'   r(   r)   _quantize_weightr:   s    r3   get_quantized_weightz-ReferenceQuantizedModule.get_quantized_weight{   s    $++U\\:::$00%,,???.##!!!!&&$$%%%%	 	 $##!!!!&&$$ r5   c           	          t         |   |||       t        ||| j                  | j                  | j
                  | j                  | j                         y r=   )super_save_to_state_dict_save_weight_qparamsr   r   r   r   r   )r*   destinationprefix	keep_vars	__class__s       r3   rC   z,ReferenceQuantizedModule._save_to_state_dict   sO    #KC""	
r5   c           	          t        ||      D ])  }t        | ||||z             |j                  ||z          + t        	|   |||d|||       y )NF)_get_weight_qparam_keyssetattrpoprB   _load_from_state_dict)
r*   
state_dictrF   local_metadatastrictmissing_keysunexpected_keys
error_msgskeyrH   s
            r3   rM   z.ReferenceQuantizedModule._load_from_state_dict   sd     +:v> 	)CD#z&3,78NN6C<(	) 	%	
r5   )	__name__
__module____qualname__r4   r;   r@   rC   rM   __classcell__)rH   s   @r3   r   r      s#    M
^>4


 
r5   r8   r   r   r   r   r   r(   r)   returnc           	      t   t         j                  dt         j                  dt         j                  di}t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  i}	|t         j                  k(  rr|t         j                  t         j
                  t         j                  fv r|	|   }
||||
   \  }}t         j                  j                  j                  | |||||
      } | S |t         j                  t         j                  fv rs|t         j                  t         j
                  t         j                  fv rB|	|   }
||||
   \  }}t         j                  j                  j                  | ||||||
      } | S t        d| d|       N)r      )i   )i   iUnsupported dtype and qscheme: , )r   uint8int8int32r   r   r   r   opsquantized_decomposedquantize_per_tensorr   r   quantize_per_channel
ValueErrorr8   r   r   r   r   r   r(   r)   _DTYPE_TO_QVALUE_BOUNDS$_QDTYPE_TO_UNDERLYING_INT_REPR_DTYPEweight_dtype_s              r3   r>   r>      s    	X

K* 	ekkUZZekk,(
 000ELL%++u||DD@NM'+;+C5L!62 "2 YY33GG!  F M	  .. 

 ELL%++u||DD@NM'+;+C5L!62 "2 YY33HH!  F M
6|nB~FVW
XXr5   c           	      R   t         j                  dt         j                  dt         j                  di}t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  i}	|	|   }
||||
   \  }}|t         j                  k(  ra|t         j                  t         j
                  t         j                  fv rt         j                  j                  j                  | |||||
      } | S |t         j                  t         j                  fv rb|t         j                  t         j
                  t         j                  fv r1t         j                  j                  j                  | ||||||
      } | S t        d| d|       r[   )r   r`   ra   rb   r   r   r   r   rc   rd   dequantize_per_tensorr   r   dequantize_per_channelrg   rh   s              r3   _dequantize_weight_decomposedro      sj    	X

K* 	ekkUZZekk,(
 9FM#3#;-D]-S**000ELL%++u||DDYY33II!  F M	  .. 

 ELL%++u||DDYY33JJ!  F M
6|nB~FVW
XXr5   r'   c                 &   |t         j                  k(  r| j                  |      } | S |t         j                  k(  rK|t         j                  t         j
                  t         j                  fv rt        j                  | |||      } | S |t         j                  t         j                  fv r[|t         j                  t         j
                  t         j                  t         j                  fv rt        j                  | ||||      } | S t        d| d|       )Nr^   r_   )r   float16tor   r   r   r   re   r   r   r   rf   rg   )r8   r   r   r   r   r'   s         r3   r?   r?   .  s     u}}$<(000ELL%++u||DD..&7F M	  .. 
 ELL%++u~~u||TT//&7,F M
6|nB~FVW
XXr5   c           
          |t         j                  t         j                  t         j                  fv r&t	        | |||||||      }t        ||||||||      }	|	S | }	|	S zUQuantize and then dequantize the weight based on
    the quantization parameters
    )r   r   r   r   r>   ro   )
r8   r   r   r   r   r'   r(   r)   weight_quantweight_dequants
             r3   r7   r7   L  s       .. 
 3	
 7	
   r5   c                     |t         j                  t         j                  t         j                  fv r"t	        | |||||      }|j                         }|S | }|S rt   )r   r   r   r   r?   
dequantize)r8   r   r   r   r   r'   ru   rv   s           r3   r9   r9   w  so       .. 
 (
 &002   r5   c                     || |dz   <   || |dz   <   |-|| |dz   <   || |dz   <   |t         j                  k(  r	|| |dz   <   y y y Nr   r   r   r   r   )r   r   )rE   rF   r   r   r   r   r   s          r3   rD   rD     so     .<K))*+7K'(!/;F^+,4EF001U5552=K./ 6 "r5   rN   rF   c                     ddg}| |dz      }|F|j                  d       |j                  d       |t        j                  k(  r|j                  d       |S rz   )appendr   rf   )rN   rF   keysr   s       r3   rJ   rJ     sZ    n-D)9 9:N!N#'(U777KK&Kr5   )typingr   __all__nnModuler   r   r   r   r   Optionalr>   ro   r?   r7   r9   rD   dictstrAnyrJ    r5   r3   <module>r      s     
k
uxx k
\:YLL:YMM:Y ++:Y ,,	:Y
 ||:Y :Y ooc*:Y ooc*:Y \\:Yz4YLL4YMM4Y ++4Y ,,	4Y
 ||4Y 4Y ooc*4Y ooc*4Y \\4YnYLLYMMY ++Y ,,	Y
 ||Y Y \\Y<(LL(MM( ++( ,,	(
 ||( ( ooc*( ooc*( \\(VLLMM ++ ,,	
 ||  \\<>$S&**_(= s r5   