
    i1z              	          S SK Jr  S SKJrJrJrJrJrJr  S SK	r	S SK
JrJr  S SK	Jr  S SKJr  S SKJrJrJrJrJrJr  S SKJrJr  S	rS
r\" SS9 " S S5      5       rS\S\4S jrS\S4S\S\S\4S jjr S\S4S\S\S\4S jjr!S\S4S\S\S\4S jjr"S\S4S\S\S\4S jjr#S\S4S\S\S\4S jjr$S\S4S\S\S\4S jjr%\	RL                  \	RN                  \SS S4S\S\(S\S\4S jjr)\	RL                  \	RN                  \SS S4S\S\(S\S\4S jjr*\	RL                  \	RN                  \SS 4S\S\(S\4S jjr+S\S4S\S\S\4S jjr,S\S4S\S\S\4S  jjr-\	RL                  \	RN                  \SS S4S\(S\S\4S! jjr.g)"    )	dataclass)AnyCallableDictListOptionalTupleN)PerBlockParamFakeQuantizePerBlockParamObserver)Tensor)Node)FakeQuantizeFusedMovingAvgObsFakeQuantizeMinMaxObserverMovingAverageMinMaxObserver%MovingAveragePerChannelMinMaxObserverPerChannelMinMaxObserver)DerivedQuantizationSpecQuantizationSpecg~;4Q>gFe"6>T)eqc                   p    \ rS rSr% \\   \S'   \\   \S'   \\   \S'   \\\-     \S'   Sr\\	   \S'   Sr
g)	QuantizationConfig#   input_activationoutput_activationweightbiasN
block_size )__name__
__module____qualname____firstlineno__r   r   __annotations__r   r   r	   __static_attributes__r       m/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/backends/qualcomm/quantizer/qconfig.pyr   r   #   sE    /00 011%&&
#h.
//"&J&r&   r   nodereturnc           
        ^  S[         S[        [        [        4   4U 4S jjnT R                  S   n[	        U[
        5      (       d   eT R                  S   n[	        U[
        5      (       d   e[        UT 4UT 4/U[        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  S[        R                  S9$ )N
obs_or_fqsr)   c                 ^  > [        U 5      S:X  d   S[        U 5       35       eU S   nU S   nUR                  5       u  p4UR                  5       u  pV[        R                  " XS5      u  pxXx-  R	                  [        R
                  5      n	TR                  [        R                  R                  R                  R                  [        R                  R                  R                  R                  1;   aL  [        TR                  5      S:  a3  TR                  S   S:w  a   TR                  S   n
U	R                  U
5      n	[        R                  " U	R                  5       UR                   S9R	                  [        R"                  5      nUn[%        U[&        5      (       a  UR(                  n[%        U[*        5      (       ai  U	R-                  U	R                  S5      S5      R/                  SS9UR0                  -  n	UR-                  UR                  S5      S5      R/                  SS9nX4$ )	N   zCExpecting two obs/fqs, one for activation and one for weight, got: r         )device)dim)lencalculate_qparamstorchbroadcast_tensorstofloat32targetopsatenconv_transpose2dinputconv_transpose3dargsrepeat_interleavezerossizer0   int32
isinstancer
   activation_post_processr   viewamax	num_steps)r+   act_obs_or_fqweight_obs_or_fqweight_scale	weight_zp	act_scaleact_zpbroadcast_act_scalebroadcast_weight_scalederived_scalegroupsderived_zeroweight_observerr(   s                r'   _derive_bias_qparams_fn9_derived_bias_quant_spec.<locals>._derive_bias_qparams_fn-   s    
Oq 	cPQTU_Q`Pab	c "1%a="2"D"D"F);;=	8=8O8O9
5	 -EII%--X KK		//55		//55
 DII"		!!YYq\F);;FCM{{=#5#5#7	@P@PQTTKK

 +&(ABB.FFOo'<== ""=#5#5a#8"=BBrBJ!++,  (,,\->->q-A2FKKPRKSL,,r&   r   r.   )derived_fromderive_qparams_fndtype	quant_min	quant_maxch_axisqscheme)r   r	   r   r?   rD   r   r   r5   rC   iinfominmaxper_channel_symmetric)r(   rU   	input_actr   s   `   r'   _derived_bias_quant_specrc   ,   s    /-/-	vv~	/-b 		!Ii&&&&YYq\Ffd####" $'&$81kk++ekk*..++ekk*..++ r&   Fact_symmetricepsc                 >   SU(       a  UO[         0nU (       a9  [        [        R                  [        R                  SUR
                  " S0 UD6S9nO[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  UR
                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  S-   [        R                  " [        R                  5      R                  [        R                  S[        R
                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  [        R
                  " S0 UD6S9n[        UUUUS9nU$ )	Nre   r   rY   r]   r\   observer_or_fake_quant_ctrrY   rZ   r[   r]   rh   r.   rY   rZ   r[   r]   r\   rh   r   r   r   r   r   DEFAULT_EPS_8BITr   r5   uint8per_tensor_symmetric	with_argsr^   r_   r`   per_tensor_affineint8r   rC   r   rd   act_observerre   
extra_argsact_quantization_specweight_quantization_specbias_quantization_specquantization_configs           r'   get_8a8w_qnn_ptq_configrz   m   s|    #(9I!JJ 0++//'3'='='K
'K	!
 !1++kk%++.22kk%++.22,,'3'='='K
'K!
  0jj++ejj)--1++ejj)--**#1#;#;#Ij#I  .kk++ekk*..++ekk*..**#1#;#;#Ij#I -./'#	 r&   c                    SU(       a  UO[         0nU (       a9  [        [        R                  [        R                  SUR
                  " S	0 UD6S9nO[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  UR
                  " S	0 UD6S9n[        [        R                  SS[        R                  S[        R
                  " S	0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  [        R
                  " S	0 UD6S9n[        UUUUS9nU$ )
Nre   r   rg   ri      rj   rk   r   rl   rs   s           r'   get_8a4w_qnn_ptq_configr~      sS    #(9I!JJ !1++..'3'='='K
'K	!
 !1++kk%++.22kk%++.22++'3'='='K
'K!
  0jj**#1#;#;#Ij#I  .kk++ekk*..++ekk*..**#1#;#;#Ij#I -./'#	 r&   c                 6   SU(       a  UO[         0n[        [        R                  [        R                  " [        R
                  5      R                  [        R                  " [        R
                  5      R                  U (       a  [        R                  O[        R                  UR                  " S0 UD6S9n[        [        R                  SS[        R                  S[        R                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  [        R                  " S0 UD6S9n[        UUUUS9nU$ )	Nre   ri   r|   r}   r   rj   rk   r   )DEFAULT_EPS_16BITr   r5   rC   r^   uint16r_   r`   ro   rq   rp   rr   r   r   rs   s           r'   get_16a4w_qnn_ptq_configr      s'    #(9J!KJ,kk++ell+//++ell+//*7E&&U=T=T#/#9#9#GJ#G  0jj**#1#;#;#Ij#I  .kk++ekk*..++ekk*..**#1#;#;#Ij#I -./'#	 r&   c                 2   SU(       a  UO[         0n[        [        R                  [        R                  " [        R
                  5      R                  [        R                  " [        R
                  5      R                  U (       a  [        R                  O[        R                  UR                  " S0 UD6S9n[        [        R                  [        R                  S[        R                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  [        R                  " S0 UD6S9n[        UUUUS9nU$ )Nre   ri   r   rg   rk   r   )r   r   r5   rC   r^   r   r_   r`   ro   rq   rp   rn   r   r   rs   s           r'   get_16a8w_qnn_ptq_configr     s!    #(9J!KJ,kk++ell+//++ell+//*7E&&U=T=T#/#9#9#GJ#G  0kk**#1#;#;#Ij#I	  .kk++ekk*..++ekk*..**#1#;#;#Ij#I -./'#	 r&   c                    SU(       a  UO[         0n[        [        R                  [        R                  " [        R
                  5      R                  [        R                  " [        R
                  5      R                  U (       a  [        R                  O[        R                  UR                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  S-   [        R                  " [        R                  5      R                  [        R                  S[        R                  " S0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R                  [        R                  " S0 UD6S9n[        UUUUS9nU$ )Nre   ri   r.   r   rj   rk   r   )r   r   r5   rC   r^   r   r_   r`   ro   rq   rp   int16r   r   rs   s           r'   get_16a16w_qnn_ptq_configr   1  sR    #(9J!KJ,kk++ell+//++ell+//*7E&&U=T=T#/#9#9#GJ#G  0kk++ekk*..2++ekk*..**#1#;#;#Ij#I  .kk++ekk*..++ekk*..**#1#;#;#Ij#I -./'#	 r&   c                 h   SU(       a  UO[         0n[        R                  " [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  U (       a  [        R                  O[        R                  UR                  " S0 UD6S9n[        [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  U (       a  [        R                  O[        R                  US9n[        R                  " [        R                  [        R
                  " [        R                  5      R                  S-   [        R
                  " [        R                  5      R                  [        R                  [        R                  " S0 UD6S9n[        [        R                  [        R
                  " [        R                  5      R                  S-   [        R
                  " [        R                  5      R                  [        R                  SUS9n[        R                  " [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  [        R                  [        R                  " S0 UD6S9n[        [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  [        R                  US9n	[        UUUU	S9n
U
$ )	Nre   rY   rZ   r[   r]   observerri   r.   r   rj   rk   r   r   r   rp   r5   rC   r^   r   r_   r`   ro   rq   r   rr   r   r   r   rd   rt   re   ru   act_fake_quant_ctrrv   weight_fake_quant_ctrrw   bias_fake_quant_ctrrx   ry   s              r'   get_16a8w_qnn_qat_configr   _  sW    #(9J!KJ6@@kk++ell+//++ell+//*7E&&U=T=T''5*5 -kk++ell+//++ell+//*7E&&U=T=T#5 :CCjj++ejj)--1++ejj)--**,66DD  0jj++ejj)--1++ejj)--**#8  '00kk++ekk*..++ekk*..**,66DD .kk++ekk*..++ekk*..**#6 -./'#	 r&   r\   c                    SU(       a  UO[         0n[        R                  [        R                  [        R                  [        R
                  1n[        R                  [        R                  [        R
                  1nX;   d   SU  SU 35       eX;   d   SU SU 35       eU(       aO  [        U [        R                  :X  a  [        R                  OU [        R                  SUR                  " S0 UD6S9n	O[        U [        R                  :X  a  [        R                  OU [        R                  " U 5      R                  [        R                  " U 5      R                  [        R                  UR                  " S0 UD6S9n	[        U[        R                  :X  a  [        R                  OUU[        R                  :X  a  SO"[        R                  " U5      R                  S	-   U[        R                  :X  a  S
O[        R                  " U5      R                  [        R                  U[         R                  " S0 UD6S9n
["        n[%        U	U	U
US9nU$ )Nre   act_dtype,   is not one of supported types, weight_dtype, r   rg   ri   r|   r.   r}   rj   rk   r   )r   r5   rn   r   rr   r   int4r   rC   ro   rp   r^   r_   r`   rq   ra   r   rc   r   )	act_dtypeweight_dtypert   rd   r\   re   ru   supported_act_typessupported_weight_dtypesrv   rw   rx   ry   s                r'    get_ptq_per_channel_quant_configr     s    #(9J!KJ

	  %zz5::u{{C(V	YK?@S?TUV( 	/`	~%EF]E^_`/  !1!*ell!:%++	..'3'='='K
'K	!
 !1!*ell!:%++	kk),00kk),00++'3'='='K
'K!
  0(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++#;#E#E#S
#S	  6,./'#	 r&   c                    SU(       a  UO[         0n[        U UUUS9n[        U[        R                  :X  a  [        R
                  OUU[        R                  :X  a  SO"[        R                  " U5      R                  S-   U[        R                  :X  a  SO[        R                  " U5      R                  [        R                  U[        R                  " S0 UD6S9n[        UR                  UR                  UUR                  S9$ )	Nre   )r   r   rt   rd   r|   r.   r}   rj   rk   r   )r   r   r   r5   r   rr   r^   r_   r`   ra   r   rp   r   r   r   r   )	r   r   rt   rd   r\   re   ru   ry   rw   s	            r'   get_ptq_per_block_quant_configr     s     #(9J!KJ:!!#	  0(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++#8#B#B#PZ#P	  ,==-??' %%	 r&   c           	         [         R                  [         R                  [         R                  [         R                  1n[         R
                  [         R                  1nX;   d   SU  SU 35       eX;   d   SU SU 35       eU(       a  [        R                  " U [         R                  :X  a  [         R                  OU [         R                  US9n[        U [         R                  :X  a  [         R                  OU [         R                  SUS9nGO[        R                  " U [         R                  :X  a  [         R                  OU [         R                  " U 5      R                  [         R                  " U 5      R                  [         R                  US9n[        U [         R                  :X  a  [         R                  OU [         R                  " U 5      R                  [         R                  " U 5      R                  [         R                  US9n[        R                  " U[         R
                  :X  a  [         R                  OUU[         R
                  :X  a  S	O"[         R                  " U5      R                  S
-   U[         R
                  :X  a  SO[         R                  " U5      R                  [         R                   US9n	[        U[         R
                  :X  a  [         R                  OUU[         R
                  :X  a  S	O"[         R                  " U5      R                  S
-   U[         R
                  :X  a  SO[         R                  " U5      R                  [         R                   UU	S9n
["        n[%        UUU
US9nU$ )Nr   r   r   rY   r]   r   r   rg   r   ri   r|   r.   r}   )rY   rZ   r[   r]   r\   rj   rk   )r5   rn   r   rr   r   r   r   rp   rC   ro   r   r^   r_   r`   rq   r
   ra   rc   r   )r   r   rt   rd   r\   r   r   r   rv   r   rw   rx   ry   s                r'   get_qat_per_block_quant_configr     s    	

	  %zz5::6(V	YK?@S?TUV( 	/`	~%EF]E^_`/  ;DD!*ell!:%++	..!

 !1!*ell!:%++	..'9	!
 ;DD!*ell!:%++	kk),00kk),00++!
 !1!*ell!:%++	kk),00kk),00++'9!
 6??(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++  0(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++#8	  6,./'#	 r&   c                    SU(       a  UO[         0n[        R                  " [        R                  U (       a  [        R
                  O[        R                  UR                  " S
0 UD6S9n[        [        R                  U (       a  [        R
                  O[        R                  SUS9n[        R                  " [        R                  [        R                  " [        R                  5      R                  S-   [        R                  " [        R                  5      R                  [        R
                  [        R                  " S
0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  S-   [        R                  " [        R                  5      R                  [        R
                  SUS9n[        R                  " [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R
                  [        R                  " S
0 UD6S9n[        [        R                  [        R                  " [        R                  5      R                  [        R                  " [        R                  5      R                  [        R
                  US9n	[        UUUU	S	9n
U
$ )Nre   r   r   rg   r.   r   rj   ri   rk   r   )rm   r   rp   r5   rn   ro   rq   r   rr   r^   r_   r`   r   r   rC   r   r   s              r'   get_8a8w_qnn_qat_configr   c  s    #(9I!JJ6@@kk*7E&&U=T=T''5*5 -kk*7E&&U=T=T#5 :CCjj++ejj)--1++ejj)--**,66DD  0jj++ejj)--1++ejj)--**#8  '00kk++ekk*..++ekk*..**,66DD .kk++ekk*..++ekk*..**#6 -./'#	 r&   c                    SU(       a  UO[         0n[        R                  " [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  U (       a  [        R                  O[        R                  UR                  " S
0 UD6S9n[        [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  U (       a  [        R                  O[        R                  US9n[        R                  " [        R                  SS[        R                  S[        R                  " S
0 UD6S9n[        [        R                  SS[        R                  SUS9n[        R                  " [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  [        R                  [        R                  " S
0 UD6S9n[        [        R                  [        R
                  " [        R                  5      R                  [        R
                  " [        R                  5      R                  [        R                  US9n	[        UUUU	S	9n
U
$ )Nre   r   ri   r|   r}   r   rY   rZ   r[   r]   r\   r   rj   rk   r   r   r   s              r'   get_16a4w_qnn_qat_configr     s    #(9J!KJ6@@kk++ell+//++ell+//*7E&&U=T=T''5*5 -kk++ell+//++ell+//*7E&&U=T=T#5 :CCjj**,66DD  0jj**#8  '00kk++ekk*..++ekk*..**,66DD .kk++ekk*..++ekk*..**#6 -./'#	 r&   c                 $   U [         R                  [         R                  1;   a  SU(       a  UO[        0nOSU(       a  UO[        0n[         R                  [         R
                  [         R                  [         R                  1n[         R                  [         R                  [         R                  1nX;   d   SU  SU 35       eX;   d   SU SU 35       eU(       a  [        R                  " U [         R
                  :X  a  [         R                  OU [         R                  UR                  " S0 UD6S9n	[        U [         R
                  :X  a  [         R                  OU [         R                  SU	S9n
GO[        R                  " U [         R
                  :X  a  [         R                  OU [         R                  " U 5      R                  [         R                  " U 5      R                  [         R                   UR                  " S0 UD6S9n	[        U [         R
                  :X  a  [         R                  OU [         R                  " U 5      R                  [         R                  " U 5      R                  [         R                   U	S	9n
[        R                  " U[         R                  :X  a  [         R                  OUU[         R                  :X  a  S
O"[         R                  " U5      R                  S-   U[         R                  :X  a  SO[         R                  " U5      R                  [         R"                  U[$        R                  " S0 UD6S9n[        U[         R                  :X  a  [         R                  OUU[         R                  :X  a  S
O"[         R                  " U5      R                  S-   U[         R                  :X  a  SO[         R                  " U5      R                  [         R"                  UUS9n[&        n[)        U
U
UUS9nU$ )Nre   r   r   r   r   r   rg   r   ri   r|   r.   r}   r   rj   rk   r   )r5   rn   rr   rm   r   r   r   r   r   rp   rC   ro   r   r^   r_   r`   rq   ra   r   rc   r   )r   r   rt   rd   r\   re   ru   r   r   r   rv   r   rw   rx   ry   s                  r'    get_qat_per_channel_quant_configr     s    U[[%**--&+CS=M%N
&+CS=N%O


	  %zz5::u{{C(V	YK?@S?TUV( 	/`	~%EF]E^_`/  ;DD!*ell!:%++	..!++9j9

 !1!*ell!:%++	..'9	!
 ;DD!*ell!:%++	kk),00kk),00++!++9j9
 !1!*ell!:%++	kk),00kk),00++'9!
 :CC(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++6@@N:N	  0(EJJ6ejjL%**,B%++l2K2O2ORS2S#uzz1!u{{<7P7T7T++#8	  6,./'#	 r&   )/dataclassesr   typingr   r   r   r   r   r	   r5   Iexecutorch.backends.qualcomm.quantizer.observers.per_block_param_observerr
   r   r   torch.fxr   torchao.quantization.pt2er   r   r   r   r   r   #torchao.quantization.pt2e.quantizerr   r   rm   r   r   rc   boolfloatrz   r~   r   r   r   r   rn   rr   intr   r   r   r   r   r   r   r&   r'   <module>r      s   " = =    
   "  d' ' '>4 >,C >D  ,00 
0 	0h  ,77 
7 	7x  ,)) 
) 	)Z  ,'' 
' 	'V  ,** 
* 	*^  ,@@ 
@ 	@H kk,E 	E
 E 
E ER kk, 	
  
 F kk,S 	S
 S Sp  ,== 
= 	=B  ,AA 
A 	AJ kk,Z
 Z 
Z Zr&   