+
    "Ý³j¨ ã            "      óî  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIHtHtHtHt ^ RIt^ RIHu Ht ^ RIHt ^ RIHt ^R	IHt ^R
IHtHtHt ^RI H!t!H"t" R˜t#R]$R&   R˜t%R]$R&   R™t&R]$R&   Ršt'R]$R&   Rt(R R lt)R R lt*R R lt+R R lt,R R lt-RRR R/R! R" llt.RRR R/R# R$ llt/R% R& lt0R' R( lt1R)R*/R+ R, llt2R›R- R. llt3R/ R0 lt4R1 R2 lt5R3 R4 lt6R5 R6 lt7R7 R8 lt8]! ^ R97      R: R; l4       t9R< R= lt:R> R? lt;R@ RA lt<RBR*/RC RD llt=RE RF lt>RG RH lt?RIR/RJ RK llt@RIR/RL RM lltARN RO ltBRP RQ ltC ! RR RS]Pˆ                  4      tERTRRUR/RV RW lltF]! ^R97      RX 4       tGRTRRURRYRZ/R[ R\ lltH ! R] R^]Pˆ                  4      tI]
 ! R_ R`4      4       tJRa Rb ltK]Rc Rd l4       tLReR*/Rf Rg lltMRh Ri ltNRj Rk ltORl Rm ltPRn Ro ltQRpR*/Rq Rr lltRRsR*RtR/Ru Rv lltSRwR/Rx Ry lltTRtR/Rz R{ lltURwRR|RRsR*RtR/R} R~ lltVRsR*RtR/R R€ lltWRwRR|RRsR*RtR/R� R‚ lltXRƒ R„ ltYR… R† ltZR|RR‡RˆR‰RœRŠR‹RŒR*R�RŽR�RŽR�R*RIRRwRR‘RR’RR“RRsR*RtRR”]"R•]!/R– R— llt[. R�Ot\R# )žao  ParoQuant calibration-time optimization utilities.

This module implements the paper's transformed-domain PTQ lifecycle in a
direct way:
1. learn channel scales and Givens-rotation angles on calibration activations
2. initialize and optimize quantization parameters in the transformed domain
3. export packed runtime tensors that reproduce the pseudo-quantized layer
)ÚannotationsN)ÚcontextmanagerÚnullcontext)Ú	dataclass)Ú	lru_cache)ÚIterableÚLiteralÚOptionalÚSequence)Únn)Ú
checkpoint)Úenv_flag)Úapply_paroquant_rotationÚ!apply_paroquant_rotation_autogradÚbuild_identity_rotation_buffers)Ú%PAROQUANT_OPT_SCALE_CLAMP_MAX_DEFAULTÚ%PAROQUANT_OPT_SCALE_CLAMP_MIN_DEFAULTÚfastztuple[str, ...]Ú_PAROQUANT_STAGE_PAIR_IMPLSÚ_PAROQUANT_QUANTIZER_IMPLSÚadamwÚ_PAROQUANT_OPTIMIZERSÚfp32Ú_PAROQUANT_BEST_STATE_DTYPESi z c               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚnameÚstrÚfieldÚreturn© )Úformats   "Ún/home/luca/screen-checking/.venv/lib/python3.14/site-packages/gptqmodel/quantization/paroquant/optimization.pyÚ__annotate__r#   1   s!   € ÷ ñ ˜cð ¨Sð °Sñ ó    c          	     óœ   € \        V 4      P                  4       P                  4       pV\        9  d   \	        R V R\         RV  R24      hV# )zParoQuant optimization: `z` must be one of ú, got `ú`.)r   ÚstripÚlowerr   Ú
ValueError)r   r   Ú
normalizeds   &$ r"   Ú_normalize_opt_implr,   1   sX   € Ü�T“—‘Ó"×(Ñ(Ó*€JØÔ4Ô4ÜØ'¨ wÐ.?Ô@[Ð?\Ð\cÐdhÐciÐikÐló
ð 	
ð Ðr$   c               ó    € V ^8„  d   QhRRRR/# ©r   r   r   r   r    )r!   s   "r"   r#   r#   :   s   € ÷ ñ  Cð ¨Cñ r$   c                ó–   € \        V 4      P                  4       P                  4       pV\        9  d   \	        R \         RV  R24      hV# )z8ParoQuant optimization: `quantizer_impl` must be one of r&   r'   )r   r(   r)   r   r*   ©r   r+   s   & r"   Ú_normalize_quantizer_implr1   :   sO   € Ü�T“—‘Ó"×(Ñ(Ó*€JØÔ3Ô3ÜØFÜ)Ð*¨'°$°°rð;ó
ð 	
ð Ðr$   c               ó    € V ^8„  d   QhRRRR/# r.   r    )r!   s   "r"   r#   r#   D   s   € ÷ ñ  3ð ¨3ñ r$   c                ó–   € \        V 4      P                  4       P                  4       pV\        9  d   \	        R \         RV  R24      hV# )z8ParoQuant optimization: `optimizer_name` must be one of r&   r'   )r   r(   r)   r   r*   r0   s   & r"   Ú_normalize_opt_optimizerr4   D   sO   € Ü�T“—‘Ó"×(Ñ(Ó*€JØÔ.Ô.ÜØFÜ$Ð% W¨T¨F°"ð6ó
ð 	
ð Ðr$   c               ó    € V ^8„  d   QhRRRR/# )r   Úbest_state_dtypeúOptional[str | torch.dtype]r   r   r    )r!   s   "r"   r#   r#   N   s   € ÷ ñ Ð7Rð ÐWZñ r$   c                óž  € V f   R# \        V \        4      '       d;   V P                  4       P                  4       pVR9   d   R# VR9   d   R# VR9   d   R# Me\        V \        P
                  4      '       dF   V \        P                  8X  d   R# V \        P                  8X  d   R# V \        P                  8X  d   R# \        R\         R24      h)	zYNormalize the requested best-state snapshot dtype into one of the supported policy names.r   Úfp16Úbf16z:ParoQuant optimization: `best_state_dtype` must be one of z/ or torch.float16/torch.bfloat16/torch.float32.>   r9   Úfloat16>   r:   Úbfloat16>   r   Úfloat32)Ú
isinstancer   r(   r)   ÚtorchÚdtyper;   r<   r=   r*   r   )r6   r+   s   & r"   Ú _normalize_best_state_dtype_namerA   N   s·   € àÒÙÜÐ"¤C×(Ò(Ø%×+Ñ+Ó-×3Ñ3Ó5ˆ
ØÐ,Ô,ÙØÐ-Ô-ÙØÐ,Ô,Ùð -ä	Ð$¤e§k¡k×	2Ò	2ØœuŸ}™}Ô,ÙØœuŸ~™~Ô-ÙØœuŸ}™}Ô,ÙÜ
ØDÜ'Ð
(Ð(Wð	Yóð r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r6   r7   Údeviceútorch.devicer   ztorch.dtyper    )r!   s   "r"   r#   r#   g   s(   € ÷ ñ à1ðð ðð ñ	r$   c                ó–   € ?\        V 4      pVR8X  d   \        P                  # VR8X  d   \        P                  # \        P                  # )zLResolve the best-state snapshot dtype policy for the target snapshot device.r9   r:   )rA   r?   r;   r<   r=   )r6   rC   r+   s   $$ r"   Ú"_resolve_best_state_snapshot_dtyperF   g   s@   € ð 	Ü1Ð2BÓC€JØ�VÔÜ�}‰}ÐØ�VÔÜ�~‰~ÐÜ�=‰=Ðr$   Útarget_deviceÚtarget_dtypec               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Útensorútorch.TensorrG   úOptional[torch.device]rH   úOptional[torch.dtype]r   r    )r!   s   "r"   r#   r#   v   s2   € ÷ ñ Øðð *ðð (ð	ð
 ñr$   c               óp  € V P                  4       pVe   VP                  4       '       d   TMRpVRJ;'       d    VP                  V8g  pVRJ;'       d    VP                  V8g  pV'       g	   V'       d4   TP	                  Ve   TMVP                  Ve   TMVP                  R7      pVP                  4       # )z^Clone a state tensor, optionally moving it and casting floating tensors for compact snapshots.N©rC   r@   )ÚdetachÚis_floating_pointrC   r@   ÚtoÚclone)rJ   rG   rH   ÚsnapshotÚ
cast_dtypeÚ
needs_moveÚ
needs_casts   &$$    r"   Ú_snapshot_state_tensorrX   v   s£   € ð �}‰}‹€HØ!-Ò!9¸h×>XÑ>X×>ZÒ>Z‘Ð`d€JØ dÐ*×OÐO¨x¯©À-Ñ/O€JØ 4Ð'×HÐH¨H¯N©N¸jÑ,H€Jß—ZØ—;‘;Ø$1Ò$=‘=À8Ç?Á?Ø *Ò 6‘*¸H¿N¹Nð ó 
ˆð �>‰>ÓÐr$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úmodelú	nn.ModulerG   rL   rH   rM   r   zdict[str, torch.Tensor]r    )r!   s   "r"   r#   r#   ‰   s2   € ÷ 
ñ 
Øð
ð *ð
ð (ð	
ð
 ñ
r$   c               óŠ   € V P                  4       P                  4        UUu/ uF  w  r4V\        WAVR7      bK  	  upp# u uppi )z_Capture a model state dict with optional float-only dtype compression for best-state snapshots.)rG   rH   )Ú
state_dictÚitemsrX   )rZ   rG   rH   ÚkeyrJ   s   &$$  r"   Ú_snapshot_model_stater`   ‰   sK   € ð !×+Ñ+Ó-×3Ñ3Ô5ôá5‰KˆCð 	Ô# FÐVbÔcÒcÙ5òð ùó s   ¢?c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚsymÚboolÚquantizer_implr   r   r    )r!   s   "r"   r#   r#   –   s!   € ÷ ñ  ð °sð ¸tñ r$   c                ó@   € \        V4      pVR 8X  d   R# \        V 4      # )Ú	referenceF)r1   rc   )rb   rd   Úimpls   && r"   Ú_quantizer_sym_for_implrh   –   s!   € Ü$ ^Ó4€DØˆ{ÔÙÜ�‹9Ðr$   c               ó    € V ^8„  d   QhRRRR/# ©r   ÚxrK   r   r    )r!   s   "r"   r#   r#   �   s   € ÷ (ñ (�,ð ( <ñ (r$   c                óZ   € V P                  4       V ,
          P                  4       V ,           # )zFApply a straight-through round so gradients flow through quantization.)ÚroundrP   )rk   s   &r"   Ú
_round_stern   �   s    € à�G‰G‹I˜�M×!Ñ!Ó# aÕ'Ð'r$   ÚenabledFc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚargsrK   ro   rc   r   r    )r!   s   "r"   r#   r#   ¢   s'   € ÷ Bñ B¨<ð BÀ$ð BÐS_ñ Br$   c               ó<   € V'       g   V ! V!  # \        V .VO5RR/ # )zSRecompute the train forward during backward when the stage opts into checkpointing.Úuse_reentrantF)Útorch_checkpoint)Úfunctionro   rq   s   &$*r"   Ú_checkpointed_forwardrv   ¢   s$   € çÙ˜‰ÐÜ˜HÐA tÒA¸5ÑAÐAr$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rk   rK   Ú	min_valuezfloat | int | NoneÚ	max_valuer   r    )r!   s   "r"   r#   r#   ©   s0   € ÷ <ñ <Øð<à!ð<ð "ð<ð ñ	<r$   c                ó\   € V P                  W4      V ,
          P                  4       V ,           # )zEClamp with a straight-through estimator to stabilize learned qparams.)ÚclamprP   )rk   rx   ry   s   &&&r"   Ú
_clamp_ster|   ©   s&   € ð �G‰G�IÓ)¨AÕ-×5Ñ5Ó7¸!Õ;Ð;r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú
group_sizeÚintÚin_featuresr   r    )r!   s   "r"   r#   r#   ²   s!   € ÷ ñ  cð ¸ð Àñ r$   c                óØ   € V R	8X  d   TM
\        V 4      pV^ 8:  d   \        RV  RV R24      hW,          ^ 8w  d   \        RV RV R24      hV^,          ^ 8w  d   \        RV R24      hV# )
zGValidate and normalize a ParoQuant group size for a given hidden width.z,ParoQuant optimization: invalid group_size `z` for in_features=Ú.z%ParoQuant optimization: in_features (z#) must be divisible by group_size (z).ú$ParoQuant optimization: group_size (z) must be even.éÿÿÿÿ)r   r*   )r~   r€   r+   s   && r"   Ú_normalize_group_sizer…   ²   s‘   € à *¨bÔ 0‘´c¸*³o€JØ�Q„ÜÐGÈ
À|ÐSeÐfqÐerÐrsÐtÓuÐuØÕ 1Ô$ÜØ3°K°=Ð@cÐdnÐcoÐoqÐró
ð 	
ð �A…~˜ÔÜÐ?À
¸|È?Ð[Ó\Ð\ØÐr$   c               ó    € V ^8„  d   QhRRRR/# )r   rb   rc   r   ÚNoner    )r!   s   "r"   r#   r#   À   s   € ÷ ]ñ ] ð ]¨ñ ]r$   c                ó(   € V RJd   \        R4      hR# )zBReject asymmetric ParoQuant configurations in this implementation.Tz@ParoQuant optimization: `sym=False` is disabled; use `sym=True`.N)r*   )rb   s   &r"   Ú_require_paroquant_symr‰   À   s   € à
�$ƒÜÐ[Ó\Ð\ñ r$   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Ú	all_pairsúSequence[tuple[int, int]]Údimr   Únum_rotationsÚnum_pairs_eachr   úlist[list[tuple[int, int]]]r    )r!   s   "r"   r#   r#   Æ   s:   € ÷ ñ Ø(ðà	ðð ðð ð	ð
 !ñr$   c                óÂ  € \         P                  ! W\         P                  R7      pVP                  R4       . p\	        V4       F–  pVP                  4       p. pV  Fj  w  rš\        V4      V8¼  d    MW\        WyV
3,          4      '       g   K2  VP                  Wš34       RWyR3&   RWzR3&   RVRV	3&   RVRV
3&   RWIV
3&   RWJV	3&   Kl  	  VP                  V4       K˜  	  V# )z<Choose non-overlapping channel pairs for each rotation step.©r@   FºNNN)r?   Úonesrc   Úfill_diagonal_ÚrangerS   ÚlenÚappend)r‹   r�   rŽ   r�   Ú	availableÚ	rotationsÚ_Úavailable_in_rotationÚselectedÚiÚjs   &&&&       r"   Ú_select_independent_pairsr    Æ   sñ   € ô —
’
˜3¬5¯:©:Ô6€IØ×Ñ˜UÔ#Ø-/€Iä�=Ö!ˆØ )§¡Ó 1ÐØ*,ˆã‰DˆAÜ�8‹} Ô.ÙÜÐ-°¨dÕ3×4Ò4Ùà�O‰O˜Q˜FÔ#Ø*/Ð! Q $Ñ'Ø*/Ð! Q $Ñ'Ø*/Ð! ! Q $Ñ'Ø*/Ð! ! Q $Ñ'Ø#ˆI˜�d‰OØ#ˆI˜�d‹Oñ ð 	×Ñ˜Ö"ñ% "ð( Ðr$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úselected_pairsrŒ   r~   r   rC   rD   r   ú!tuple[torch.Tensor, torch.Tensor]r    )r!   s   "r"   r#   r#   è   s0   € ÷ )ñ )Ø-ð)àð)ð ð	)ð
 'ñ)r$   c               óR  € V^,          p\         P                  ! V^3\         P                  VR7      p\         P                  ! V3\         P                  VR7      p\         P                  ! V3\         P                  VR7      p^ pV  F<  w  r‰Ws8¼  d    M3\	        V4      WG^ 3&   \	        V	4      WG^3&   RWh&   RWi&   V^,          pK>  	  Ws8X  d   WE3# \        V4       U
u. uF  p
\        Wj,          4      '       d   K  V
NK   	  pp
\        V4      ^,          ^ 8w  d   \        RV R24      h\        V4      pWs8  dE    \        V4      p\        V4      p	\	        T4      YG^ 3&   \	        T	4      YG^3&   RYW&   T^,          pKJ  WE3# u up
i   \         d   p\        RT R24      ThRp?ii ; i)z9Pad a sparse rotation schedule with dummy identity pairs.©r@   rC   Tz4ParoQuant optimization: unable to pad group of size r‚   zEParoQuant optimization: incomplete dummy-pair padding for group size N)r?   ÚzerosÚint16rc   r   r–   r—   r*   ÚiterÚnextÚStopIteration)r¢   r~   rC   Ú
half_groupÚpairsÚmaskÚusedÚcountrž   rŸ   ÚidxÚ	remainingÚremaining_iterÚexcs   &&$           r"   Ú_pad_rotation_groupr´   è   s™  € ð ˜q•€JÜ�KŠK˜ Q˜¬u¯{©{À6ÔJ€EÜ�;Š;˜
�}¬E¯J©J¸vÔF€DÜ�;Š;˜
�}¬E¯J©J¸vÔF€Dà€EÛ‰ˆØÔÙÜ˜a›&ˆ�Qˆh‰Ü˜a›&ˆ�Qˆh‰Øˆ‰Øˆ‰Ø��
Šñ ð ÔØˆ{Ðä % jÔ 1ÓIÑ 1˜¼¸d½i¿—�Ñ 1€IÐIÜ
ˆ9ƒ~˜Õ˜QÔÜÐOÐPZÈ|Ð[\Ð]Ó^Ð^ä˜)“_€NØ
Ô
ð	}Ü�^Ó$ˆAÜ�^Ó$ˆAô ˜a›&ˆ�Qˆh‰Ü˜a›&ˆ�Qˆh‰Øˆ‰Ø��
Šàˆ;Ðùò! Jøô ô 	}ÜÐdÐeoÐdpÐpqÐrÓsÐy|Ð|ûð	}ús$   ÃFÃ;FÄ;F ÆF&ÆF!Æ!F&c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# ©
r   r€   r   r~   ÚkrotÚ
pair_ratioÚfloatÚseedr   r£   r    )r!   s   "r"   r#   r#     sF   € ÷ /ñ /àð/ð ð/ð ð	/ð
 ð/ð ð/ð 'ñ/r$   c           
     óD  € \        W4      pV^ 8:  d   \        RV R24      hR\        V4      u;8  d   R8:  g   M \        R4      h\        P                  ! \        V4      4      pW,          p\        ^\        V\        V4      ,          4      4      p\        W…^,          4      p. p	. p
\        V4       F—  pV	P                  \        P                  ! ^ \        P                  \        P                  ! R4      R7      4       V
P                  \        P                  ! ^ \        P                  \        P                  ! R4      R7      4       K™  	  \        V4       Fî  p\        V4       UUu. uF   p\        V^,           V4       F  qÜV3NK  	  K"  	  pppVP                  V4       \!        VVVV4      p\        V4       F†  p\#        VV,          V\        P                  ! R4      R7      w  pp\        P$                  ! V	V,          VP'                  R
4      3^ R	7      V	V&   \        P$                  ! V
V,          V3^ R	7      V
V&   Kˆ  	  Kð  	  \        P(                  ! V	^ R	7      P+                  4       p\        P(                  ! V
^ R	7      P+                  4       pVV3# u uppi )é    ú5ParoQuant optimization: `krot` must be positive, got r‚   ç        ç      à?úFParoQuant optimization: `pair_ratio` must be in the interval (0, 0.5].Úcpur¥   ©rC   ©r�   r„   )r…   r*   r¹   ÚrandomÚRandomr   ÚmaxÚminr–   r˜   r?   Úemptyr§   rC   rc   Úshuffler    r´   ÚcatÚreshapeÚstackÚ
contiguous)r€   r~   r·   r¸   rº   Únormalized_group_sizeÚrngÚ
num_groupsr�   Úrotation_rowsÚ	mask_rowsr›   rž   rŸ   Úgroup_pairsÚselected_per_rotationÚrot_idxÚpadded_pairsr­   r¬   Úmaskss   $$$$$                r"   Ú)_build_random_rotation_buffers_cpu_legacyrØ     s+  € ô 2°*ÓJÐØˆq„yÜÐPÐQUÐPVÐVWÐXÓYÐYØ”%˜
Ó#Ö* sÖ*ÜÐaÓbÐbä
�-Š-œ˜D›	Ó
"€CØÕ5€JÜ˜œCÐ 5¼¸jÓ8IÕ IÓJÓK€NÜ˜À!Õ)CÓD€Nà(*€MØ$&€Iä�4Ž[ˆØ×ÑœUŸ[š[¨´%·+±+ÄeÇlÂlÐSXÓFYÔZÔ[Ø×ÑœŸš Q¬e¯j©jÄÇÂÈeÓATÔUÖVñ ô �:ÖˆÜ',Ð-BÔ'CÔqÑ'C !ÌUÐSTÐWXÕSXÐZoÖMpÈ˜1“vÑMp‘vÑ'CˆÑqØ�‰�KÔ Ü 9ØØ!ØØó	!
Ðô ˜T–{ˆGÜ!4Ø% gÕ.Ø%Ü—|’| EÓ*ô"ÑˆL˜$ô
 &+§Y¢Y°¸gÕ0FÈ×H\ÑH\Ð]_ÓH`Ð/aÐghÔ%iˆM˜'Ñ"Ü!&§¢¨I°gÕ,>ÀÐ+EÈ1Ô!MˆI�gÓó #ñ ô& �KŠK˜¨1Ô-×8Ñ8Ó:€EÜ�KŠK˜	 qÔ)×4Ñ4Ó6€EØ�%ˆ<Ðùó) rs   Å+&J)Úmaxsizec               ó    € V ^8„  d   QhRRRR/# )r   r~   r   r   rK   r    )r!   s   "r"   r#   r#   G  s   € ÷ 3ñ 3¨3ð 3°<ñ 3r$   c                ó  € V ^ 8:  g   V ^,          ^ 8w  d   \        RV  R24      h\        \        V 4      4      pV ^,          p. p\        V ^,
          4       F‹  p\        P                  ! V^3\        P
                  R7      p\        V4       F)  pW,          WV^ 3&   W^,
          V,
          ,          WV^3&   K+  	  VP                  V4       V^ ,          VR,          .V^R OpK�  	  \        P                  ! V^ R7      P                  4       # )z;Cache one-factorized full matchings for an even group size.rƒ   z") must be a positive even integer.r’   rÃ   r„   )	r*   Úlistr–   r?   rÈ   Úlongr˜   rÌ   rÍ   )r~   Úplayersr«   Úroundsr›   Úround_pairsÚpair_idxs   &      r"   Ú_round_robin_pair_templaterâ   F  sñ   € ð �Q„˜* q�.¨AÔ-ÜÐ?À
¸|ÐKmÐnÓoÐoä”5˜Ó$Ó%€GØ˜q•€JØ!#€FÜ�: •>Ö"ˆÜ—k’k :¨q /¼¿¹ÔDˆÜ˜jÖ)ˆHØ'.Õ'8ˆK !˜Ñ$Ø'.¸A­~ÀÕ/HÕ'IˆK !˜Ó$ñ *ð 	�‰�kÔ"Ø˜1•:˜w r�{Ð;¨W°Q°r¨]Ð;Šñ #ô �;Š;�v 1Ô%×0Ñ0Ó2Ð2r$   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# r¶   r    )r!   s   "r"   r#   r#   Y  sF   € ÷ .:ñ .:àð.:ð ð.:ð ð	.:ð
 ð.:ð ð.:ð 'ñ.:r$   c           	     ó~  € \        W4      pV^ 8:  d   \        RV R24      hR\        V4      u;8  d   R8:  g   M \        R4      hW%^,
          8”  d   \        V VVVVR7      # V^,          pW,          p\	        ^\        V\        V4      ,          4      4      p\        W†4      p\        V4      p	\        P                  ! RR7      p
V
P                  \        V4      4       \        P                  ! W 3\        P                  R	7      p\        P                  ! W ^,          3\        P                  R	7      pW†8  d0   \        V4       F   pWÖ,          pR
VRWè,           Wæ,           13&   K"  	  \        V4       F¥  p\        P                   ! V	P"                  ^ ,          V
R7      RV pV	P%                  ^ V4      p\        P                   ! WZR7      pVV,          P'                  \        P                  R	7      P)                  W%4      pWÕ,          pVVRWîV,           13&   K§  	  VP+                  4       VP+                  4       3# )z_Build randomized pair schedules using cached round-robin matchings plus per-group permutations.r½   r‚   r¾   r¿   rÀ   ©r€   r~   r·   r¸   rº   rÁ   rÂ   r’   Tr“   )Ú	generatorN)r…   r*   r¹   rØ   rÆ   r   rÇ   râ   r?   Ú	GeneratorÚmanual_seedrÈ   r§   r¦   rc   r–   ÚrandpermÚshapeÚindex_selectrR   rË   rÍ   )r€   r~   r·   r¸   rº   rÎ   r«   rÐ   r�   Útemplateræ   Ú	pair_rowsrÒ   Ú	group_idxÚstartÚround_orderÚlocal_templateÚpermrÓ   s   $$$$$              r"   Ú"_build_random_rotation_buffers_cpuró   Y  sú  € ô 2°*ÓJÐØˆq„yÜÐPÐQUÐPVÐVWÐXÓYÐYØ”%˜
Ó#Ö* sÖ*ÜÐaÓbÐbØ aÕ'Ô'Ü8Ø#Ø,ØØ!Øô
ð 	
ð '¨!Õ+€JØÕ5€JÜ˜œCÐ 5¼¸jÓ8IÕ IÓJÓK€NÜ˜Ó4€NÜ)Ð*?Ó@€HÜ—’ uÔ-€IØ×Ñœ#˜d›)Ô$ä—’˜TÐ/´u·{±{ÔC€IÜ—’˜T°!Õ#3Ð4¼E¿J¹JÔG€IØÔ"Ü˜zÖ*ˆIØÕ*ˆEØFJˆI�a˜Õ/°Õ0BÐBÐBÓCñ +ô ˜:Ö&ˆ	Ü—n’n X§^¡^°AÕ%6À)ÔLÈUÈdÐSˆØ!×.Ñ.¨q°+Ó>ˆÜ�~Š~Ð3ÔIˆØ˜>Õ*×-Ñ-´E·K±KÐ-Ó@×HÑHÈÓeˆØÕ1ˆØ<Gˆ	�!�UÐ#8Õ8Ð8Ð8Ó9ñ 'ð ×ÑÓ! 9×#7Ñ#7Ó#9Ð9Ð9r$   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# ©r   r€   r   r~   r·   r¸   r¹   rº   rC   rD   r   r£   r    )r!   s   "r"   r#   r#   Š  sP   € ÷  ñ  àð ð ð ð ð	 ð
 ð ð ð ð ð ð 'ñ r$   c           	     óX  € V^ 8:  d   \        RV R24      hR\        V4      u;8  d   R8:  g   M \        R4      h\        V VV\        V4      \        V4      R7      w  rg\        P
                  ! V4      P                  R8X  d%   VP                  VR7      VP                  VR7      3# Wg3# )	zGBuild randomized pair schedules and masks for ParoQuant angle learning.r½   r‚   r¾   r¿   rÀ   rå   ÚcudarÂ   )r*   r¹   ró   r   r?   rC   ÚtyperR   )r€   r~   r·   r¸   rº   rC   Ú	pairs_cpuÚ	masks_cpus   $$$$$$  r"   Úbuild_random_rotation_buffersrû   Š  s©   € ð ˆq„yÜÐPÐQUÐPVÐVWÐXÓYÐYØ”%˜
Ó#Ö* sÖ*ÜÐaÓbÐbä=ØØØÜ˜Ó$Ü�‹YôÑ€Iô ‡|‚|�FÓ× Ñ  FÔ*Ø�|‰| 6ˆ|Ó*¨I¯L©LÀ¨LÓ,GÐGÐGØÐÐr$   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r¬   rK   r�   r   rŽ   r�   r   r�   r    )r!   s   "r"   r#   r#   ¦  s:   € ÷ ñ Øðà	ðð ðð ð	ð
 !ñr$   c                óÊ  € V P                  4       P                  4       p. p\        P                  ! W4      pVP	                  ^ 4       \        V4       FŒ  p. pVP                  4       p	V F`  w  r«\        V4      V8X  d    MMWšV3,          ^ 8X  d   K(  VP                  W«34       ^ WšR3&   ^ W›R3&   ^ V	RV
3&   ^ V	RV3&   ^ WjV3&   ^ WkV
3&   Kb  	  VP                  V4       KŽ  	  V# )r¼   r“   )	rÁ   Útolistr?   r”   r•   r–   rS   r—   r˜   )r¬   r�   rŽ   r�   rù   Úrotations_pairsr™   r›   Úindependent_pairsrœ   rž   rŸ   s   &&&&        r"   Ú(_get_independent_channel_pairs_referencer  ¦  s  € ð —	‘	“×"Ñ"Ó$€IØ35€OÜ—
’
˜3Ó$€IØ×Ñ˜QÔä�=Ö!ˆØ35ÐØ )§¡Ó 1ÐÛ‰DˆAÜÐ$Ó%¨Ô7ÙØ$¨ TÕ*¨aÔ/ÙØ×$Ñ$ a VÔ,Ø*+Ð! Q $Ñ'Ø*+Ð! Q $Ñ'Ø*+Ð! ! Q $Ñ'Ø*+Ð! ! Q $Ñ'ØˆI˜�d‰OØˆI˜�d‹Oñ ð 	×ÑÐ0Ö1ñ "ð  Ðr$   Úinclude_maskc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   ÚpairrK   Úangler~   r   r  rc   r   z6tuple[torch.Tensor, torch.Tensor, torch.Tensor | None]r    )r!   s   "r"   r#   r#   Ä  sA   € ÷ @(ñ @(Ø
ð@(àð@(ð ð	@(ð
 ð@(ð <ñ@(r$   c               ó  € V P                  ^ 4      VP                  ^ 4      8w  g   V P                  ^4      ^8w  d   \        R4      h^ p^ p. p. p. p WPP                  ^ 4      8¼  d   EM›\        P                  ! V\        P                  R7      p	^ p
\        P                  ! V^,          ^3\        P                  V P
                  R7      p\        P                  ! V^,          \        P                  VP
                  R7      p\        P                  ! V^,          \        P                  VP
                  R7      pW¢^,          8  Ed}   WPP                  ^ 4      8  d´   W^ 3,          WB,          ,
          V8  d˜   W^3,          WB,          ,
          V8  d|   WR3,          WºR3&   W,          WÊ&   W�V^ 3,          V,          ,          ^8X  g   W�V^3,          V,          ,          ^8X  d   \        R4      h^W�VR3,          V,          &   V^,          pM¨\        P                  ! R	R	.4      p\        V4       F  pWŸ,          ^ 8X  g   K  Wþ^ &   ^WŸ&    M	  \        V4       F  pWŸ,          ^ 8X  g   K  Wþ^&   ^WŸ&    M	  V^ ,          R	8X  g   V^,          R	8X  d   \        R4      hWëV
R3&   \        ^ 4      WÊ&   ^WÚ&   V
^,          p
EKŠ  V^,          pVP                  V4       VP                  V4       VP                  V4       EK³  \        P                  ! V^ R7      P                  R	4      P                  4       V,          p\        P                  ! V^ R7      p\        P                  ! V^ R7      pV'       d   VVV3# VVR3# )
r¼   z=ParoQuant optimization(reference): pair/angle shape mismatch.r’   r¥   r“   z0ParoQuant optimization(reference): illegal pair.z=ParoQuant optimization(reference): unable to find dummy pair.rÃ   Nr„   )Úsizer*   r?   r¦   Úint32rC   r¹   rJ   r–   r˜   rÊ   ÚviewrÍ   )r  r  r~   r  rî   Úpair_ptrÚpair_groupsÚangle_groupsÚmask_groupsÚoccupiedr¯   Ú
temp_pairsÚ
temp_angleÚ	temp_maskÚt_pairrž   Úrotation_pairsÚanglesr×   s   &&$$               r"   Ú&_align_pairs_to_kernel_shape_referencer  Ä  sð  € ð ‡y�y�ƒ|�u—z‘z !“}Ô$¨¯	©	°!«¸Ô(9ÜÐXÓYÐYà€IØ€HØ&(€KØ')€LØ&(€Kà
Ø—y‘y “|Ô#ÙÜ—;’; 
´5·;±;Ô?ˆØˆÜ—[’[ *°¥/°1Ð!5¼U¿[¹[ÐQU×Q\ÑQ\Ô]ˆ
Ü—[’[ *°¥/¼%¿+¹+ÈeÏlÉlÔ[ˆ
Ü—K’K ¨q¥¼¿¹ÈUÏ\É\ÔZˆ	Ø A•oÕ%àŸ9™9 Q›<Ô'Ø 1˜Õ%¨	Õ(>Õ>ÀÔKØ 1˜Õ%¨	Õ(>Õ>ÀÔKà'+°a¨KÕ'8�
 !˜8Ñ$Ø$)¥O�
Ñ!Ø ¨1 Õ-°
Õ:Õ;¸qÔ@ÀHÐRZÐ\]ÐR]ÕM^ÐakÕMkÕDlÐpqÔDqÜ$Ð%WÓXÐXØ;<�˜h¨˜kÕ*¨ZÕ7Ñ8Ø˜A•‘äŸš r¨2 hÓ/�Ü˜zÖ*�AØ•{ aÖ'Ø$%˜q™	Ø&'˜™Ùñ	 +ô
 ˜zÖ*�AØ•{ aÖ'Ø$%˜q™	Ø&'˜™Ùñ	 +ð
 ˜!•9 ”? f¨Q¥i°2¤oÜ$Ð%dÓeÐeØ'-˜5 !˜8Ñ$Ü$)¨!£H�
Ñ!Ø#$�	Ñ Ø�Q�J‹EØ�Q�ˆ	Ø×Ñ˜:Ô&Ø×Ñ˜JÔ'Ø×Ñ˜9×%ä—Y’Y˜{°Ô2×7Ñ7¸Ó;×FÑFÓHÈ:ÕU€NÜ�YŠY�|¨Ô+€FÜ�IŠI�k qÔ)€EßØ˜v uÐ,Ð,Ø˜6 4Ð'Ð'r$   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# rõ   r    )r!   s   "r"   r#   r#     sY   € ÷ 1jñ 1jàð1jð ð1jð ð	1jð
 ð1jð ð1jð ð1jð 'ñ1jr$   c           	     ó¼  € \        W4      pV^ 8:  d   \        RV R24      hR\        V4      u;8  d   R8:  g   M \        R4      h\        P                  ! \        V4      4      pW,          p\        V\        V4      ,          4      p	\        V4       U
u. uF  p
. NK  	  pp
\        V4       FÂ  p\        V4       UUu. uF   p\        V^,           V4       F  qíV3NK  	  K"  	  pppVP                  V4       \        \        P                  ! V4      VVV	4      pWÆ,          p\        V4       F>  pVV,           F.  w  ppVV,          P                  VV,           VV,           34       K0  	  K@  	  KÄ  	  V Uu. uF*  p\        P                  ! V\        P                  VR7      NK,  	  ppV Uu. uF<  p\        P                  ! VP                  ^ ,          3\        P                  VR7      NK>  	  pp. p. p\!        VV4       Fw  w  pp\#        VVVRR7      w  pppVP                  VP%                  \        P&                  R	7      4       VP                  VP%                  \        P(                  R	7      4       Ky  	  \        P*                  ! V^ R
7      P-                  4       \        P*                  ! V^ R
7      P-                  4       3# u up
i u uppi u upi u upi )r¼   z@ParoQuant optimization(reference): `krot` must be positive, got r‚   r¾   r¿   zQParoQuant optimization(reference): `pair_ratio` must be in the interval (0, 0.5].r¥   T)r~   r  r’   rÃ   )r…   r*   r¹   rÄ   rÅ   r   r–   rÉ   r  r?   rJ   r˜   r  r¦   rê   r=   Úzipr  rR   r§   rc   rÌ   rÍ   )r€   r~   r·   r¸   rº   rC   rÎ   rÏ   Ú	group_numÚnum_pairs_per_groupr›   Úpairs_by_rotationrî   rž   rŸ   r‹   Úselected_by_rotationÚoffsetÚrotation_idxÚcol1Úcol2r¬   Úpair_tensorsÚangle_tensorsÚaligned_pairsÚaligned_masksÚpair_tensorÚangle_tensorr  Ú_angler­   s   $$$$$$                         r"   Ú'build_random_rotation_buffers_referencer(    sy  € ô 2°*ÓJÐØˆq„yÜÐ[Ð\`Ð[aÐabÐcÓdÐdØ”%˜
Ó#Ö* sÖ*ÜÐlÓmÐmä
�-Š-œ˜D›	Ó
"€CØÕ4€IÜÐ3´e¸JÓ6GÕGÓHÐÜBGÈÄ+Ó5NÁ+¸Q³bÁ+ÐÐ5Nä˜9Ö%ˆ	Ü%*Ð+@Ô%AÔoÑ%A Ì5ÐQRÐUVÕQVÐXmÖKnÀa˜“VÑKn‘VÑ%Aˆ	ÑoØ�‰�IÔÜGÜ�LŠL˜Ó#Ø!ØØó	 
Ðð Õ2ˆÜ! $žKˆLØ2°<×@Ð@‘
��dØ! ,Õ/×6Ñ6¸¸v½ÀtÈfÅ}Ð7UÖVó Aó (ñ &ñ XiÓiÑWhÈe”E—L’L ¬e¯k©kÀ&×IÑWh€LÐiÙeqÓrÑeqÐ\a”U—[’[ %§+¡+¨a¥.Ð!2¼%¿-¹-ÐPV×WÑeq€MÐrà(*€MØ(*€MÜ%(¨°}Ö%EÑ!ˆ�\ÜCØØØ,Øô	
Ñˆˆf�dð 	×Ñ˜TŸW™W¬5¯;©;˜WÓ7Ô8Ø×Ñ˜TŸW™W¬5¯:©:˜WÓ6Ö7ñ &Fô �;Š;�}¨!Ô,×7Ñ7Ó9¼5¿;º;À}ÐZ[Ô;\×;gÑ;gÓ;iÐiÐiùò? 6Oùó pùò jùÚrs   ÂK	Â?&KÅ80KÆ.AKc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚinputsrK   Úmax_rowsr   r   r    )r!   s   "r"   r#   r#   ;  s!   € ÷ )ñ ) Lð )¸Cð )ÀLñ )r$   c                ó~  € V P                  RV P                  R,          4      pVP                  ^ ,          V8:  d   V# \        P                  ! ^ VP                  ^ ,          ^,
          WP                  R7      p\        P
                  ! V4      P                  \        P                  R7      pVP                  ^ V4      # )z;Downsample calibration activations to a bounded replay set.)ÚstepsrC   r’   r„   )	rË   rê   r?   ÚlinspacerC   rm   rR   rÝ   rë   )r*  r+  ÚrowsÚindicess   &&  r"   Ú_sample_activation_rowsr1  ;  s†   € à�>‰>˜"˜fŸl™l¨2Õ.Ó/€DØ‡z�z�!…}˜Ô ØˆÜ�nŠn˜Q §
¡
¨1¥°Õ 1¸Ï+É+ÔV€GÜ�kŠk˜'Ó"×%Ñ%¬E¯J©JÐ%Ó7€GØ×Ñ˜Q Ó(Ð(r$   Úfused_rotationc               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r   rk   rK   r¬   ÚthetaÚscalesúOptional[torch.Tensor]r~   r   r2  úOptional[bool]r   r    )r!   s   "r"   r#   r#   E  sW   € ÷ Cñ CØðCàðCð ðCð
 #ðCð ðCð #ðCð ñCr$   c               ó@  € V P                  4       ^8w  d#   \        R\        V P                  4       R24      hVf   \	        RRR7      M
\        V4      pV'       ds   Vf   RMVP                  ^R
4      pV P                  '       g9   VP                  '       g'   Ve   VP                  '       g   \        V VVVVR7      # \        V VVVVR7      # T pVe   WƒP                  ^R
4      ,          pVP                  R
,          p	\        WI4      p
Wš,          pV
^,          p\        P                  ! W¸P                  \        P                  R7      P                  ^4      V
,          pVP!                  VP                  \        P                  R7      P                  VP                  ^ ,          W¼^4      pVP!                  VP                  VP"                  R7      P                  VP                  ^ ,          W¼4      p\%        VP                  ^ ,          4       EF‡  pVVR	R	^ 3,          V,           P'                  R
4      pVVR	R	^3,          V,           P'                  R
4      pVR	V3,          P                  VP                  ^ ,          W¼4      pVR	V3,          P                  VP                  ^ ,          W¼4      p\        P(                  ! VV,          4      P                  ^ 4      p\        P*                  ! VV,          4      P                  ^ 4      pVP-                  4       pVV,          VV,          ,           P'                  VP                  ^ ,          R
4      VR	V3&   V) V,          VV,          ,           P'                  VP                  ^ ,          R
4      VR	V3&   TpEKŠ  	  V# )zAApply the forward ParoQuant transform in the optimization domain.z4ParoQuant optimization expects a rank-2 tensor, got r‚   NÚ&GPTQMODEL_PAROQUANT_OPT_FUSED_ROTATIONT©Údefault)r5  r~   rO   r“   r„   )r�   r*   Útuplerê   r   rc   r	  Úrequires_gradr   r   r…   r?   ÚarangerC   rÝ   Ú	unsqueezerR   r@   r–   rË   ÚcosÚsinrS   )rk   r¬   r4  r5  r~   r2  Úuse_fused_rotationÚscale_tensorÚoutÚhiddenrÎ   rÐ   r«   ÚoffsetsÚ	pair_viewÚ
theta_viewrÕ   Úidx_iÚidx_jÚxiÚxjÚcos_tÚsin_tÚnext_outs   &&&$$$                  r"   Ú_apply_rotationrP  E  s   € ð 	‡u�uƒw�!„|ÜÐOÔPUÐVW×V]ÑV]ÓP^ÐO_Ð_`ÐaÓbÐbð Ò!ô 	Ð9À4ÕHä�.Ó!ð ÷ Ø%š~‘t°6·;±;¸qÀ"Ó3Eˆà�O�OˆOØ×"×"Ð"ØÒ(¨\×-G×-GÐ-Gä+ØØØØ#Ø%ôð ô 1ØØØØØ!ô
ð 	
ð €CØÒØ—K‘K  2Ó&Õ&ˆà�Y‰Y�r�]€FÜ1°*ÓEÐØÕ0€JØ&¨!Õ+€JÜ�lŠl˜:¯j©jÄÇ
Á
ÔK×UÑUÐVWÓXÐ[pÕp€GØ—‘ §
¡
´%·*±*�Ó=×BÑBÀ5Ç;Á;ÈqÅ>ÐS]ÐklÓm€IØ—‘ §¡°3·9±9�Ó=×BÑBÀ5Ç;Á;ÈqÅ>ÐS]Ój€Jä˜Ÿ™¨Õ+×,ˆØ˜7 A q¨!Ð+Õ,¨wÕ6×?Ñ?ÀÓCˆØ˜7 A q¨!Ð+Õ,¨wÕ6×?Ñ?ÀÓCˆà��E��]×Ñ §	¡	¨!¥¨jÓEˆØ��E��]×Ñ §	¡	¨!¥¨jÓEˆÜ—	’	˜* WÕ-Ó.×8Ñ8¸Ó;ˆÜ—	’	˜* WÕ-Ó.×8Ñ8¸Ó;ˆà—9‘9“;ˆØ  5�j¨2°­:Õ5×>Ñ>¸s¿y¹yÈ½|ÈRÓPˆ��E�ÑØ!˜c E�k¨B°­JÕ6×?Ñ?ÀÇ	Á	È!ÅÈbÓQˆ��E�ÑØ‹ñ -ð €Jr$   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r   rk   rK   r¬   r4  r~   r   r2  r7  r   r    )r!   s   "r"   r#   r#   ‹  sD   € ÷ ñ Øðàðð ðð
 ðð #ðð ñr$   c          	     ó–   € VP                   ^ ,          ^ 8X  d   V # \        V VP                  ^ 4      VP                  ^ 4      ) RVVR7      # )zPApply the inverse transform that maps export-domain weights back to input space.N©r5  r~   r2  )rê   rP  Úflip)rk   r¬   r4  r~   r2  s   &&&$$r"   Ú_apply_inverse_rotationrU  ‹  sJ   € ð ‡{�{�1…~˜ÔØˆÜØ	Ø�
‰
�1‹Ø	�‰�A‹ˆØØØ%ôð r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   ÚweightrK   r~   r   Úvaluesr   r    )r!   s   "r"   r#   r#      s)   € ÷ 0ñ 0 ,ð 0¸Cð 0Èð 0ÐZfñ 0r$   c                ó|   € V P                   ^,          V,          pVP                  V P                   ^ ,          V4      # )zDRestore flat per-group quantizer values to the packed weight layout.)rê   r	  )rW  r~   rX  Úgroupss   &&& r"   Ú_reshape_group_paramsr[     s-   € à�\‰\˜!�_ 
Õ*€FØ�;‰;�v—|‘| A•¨Ó/Ð/r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rW  rK   r~   r   Úbitsr   r£   r    )r!   s   "r"   r#   r#   ¦  s2   € ÷ #ñ #Øð#ð ð#ð ð	#ð
 'ñ#r$   c               óæ   € V P                  RV4      pVP                  ^RR7      pVP                  ^RR7      p^V,          ^,
          pWT,
          P                  RR7      V,          pWG,          pWx3# )z=Compute affine quantizer parameters from transformed weights.T©r�   Úkeepdimçñhãˆµøä>©rÇ   r„   )rË   ÚaminÚamaxr{   )	rW  r~   r]  r	  Úmin_valÚmax_valÚqmaxÚscaleÚzero_point_floats	   &$$      r"   Ú_calc_affine_qparamsrj  ¦  sq   € ð �>‰>˜"˜jÓ)€DØ�i‰i˜A tˆiÓ,€GØ�i‰i˜A tˆiÓ,€GØˆd�7�Q�;€DØÕ×%Ñ%¨$Ð%Ó/°$Õ6€EØ•ÐØÐ"Ð"r$   c                  óV   a € ] tR tRtRtR V 3R lltR R ltR R ltR	 R
 ltRt	V ;t
# )ÚGroupLinearQuantizeri¶  zNLearnable per-group quantizer matching ParoQuant's transformed-domain packing.c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rW  rK   r]  r   r~   rb   rc   r   r‡   r    )r!   s   "r"   r#   Ú!GroupLinearQuantizer.__annotate__¹  sC   € ÷ Cñ CàðCð ð	Cð
 ðCð ðCð 
ñCr$   c               óŒ  <€ \         S	V `  4        \        V4      V n        \        V4      V n        \        V4      V n        V P                  '       dš   VP                  RV P                  4      p^V P                  ^,
          ,          ^,
          pVP                  4       P                  ^RR7      P                  RR7      V,          p\        P                  ! V4      V n        RV n        R# \        WP                  V P                  R7      w  rx\        P                  ! V4      V n        \        P                  ! V4      V n        R# )zHInitialize either symmetric or affine groupwise quantization parameters.Tr_  ra  rb  N©r~   r]  r„   )ÚsuperÚ__init__r   r]  r~   rc   rb   rË   Úabsrd  r{   r   Ú	Parameterrh  ri  rj  )
ÚselfrW  r]  r~   rb   r	  rg  rh  ri  Ú	__class__s
   &&$$$    €r"   rr  ÚGroupLinearQuantizer.__init__¹  sä   ø€ ô 	‰ÑÔÜ˜“IˆŒ	Ü˜j›/ˆŒÜ˜“9ˆŒà�8�8ˆ8Ø—>‘> " d§o¡oÓ6ˆDØ˜Ÿ™ Q�Õ'¨!Õ+ˆDØ—H‘H“J—O‘O¨°4�OÓ8×>Ñ>À4Ð>ÓHÈ4ÕOˆEÜŸš eÓ,ˆDŒJØ$(ˆDÖ!ä&:¸6ÏoÉoÐdh×dmÑdmÔ&nÑ#ˆEÜŸš eÓ,ˆDŒJÜ$&§L¢LÐ1AÓ$BˆDÖ!r$   c               ó    € V ^8„  d   QhRRRR/# )r   rW  rK   r   r    )r!   s   "r"   r#   rn  Ò  s   € ÷ 

ñ 

˜lð 

¨|ñ 

r$   c           
     óŠ   € \        VV P                  V P                  V P                  V P                  V P
                  RR7      # )zEPseudo-quantize a transformed weight tensor with STE-enabled qparams.T©r]  r~   rb   rh  ri  Úuse_ste)Ú _maybe_compile_large_train_quantr]  r~   rb   rh  ri  )ru  rW  s   &&r"   ÚforwardÚGroupLinearQuantizer.forwardÒ  s:   € ä/ØØ—‘Ø—‘Ø—‘Ø—*‘*Ø!×2Ñ2Øô
ð 	
r$   c               ó   € V ^8„  d   QhRR/# )r   r   zlist[nn.Parameter]r    )r!   s   "r"   r#   rn  Þ  s   € ÷ ñ Ð0ñ r$   c                ór   € V P                   .pV P                  e   VP                  V P                  4       V# )zKReturn only the quantizer parameters that should receive optimizer updates.)rh  ri  r˜   )ru  Úparamss   & r"   Úoptim_paramsÚ!GroupLinearQuantizer.optim_paramsÞ  s0   € à—*‘*�ˆØ× Ñ Ò,Ø�M‰M˜$×/Ñ/Ô0Øˆr$   c               ó    € V ^8„  d   QhRRRR/# )r   rW  rK   r   r£   r    )r!   s   "r"   r#   rn  å  s   € ÷ 	ñ 	 ,ð 	Ð3Tñ 	r$   c                ó´  € \        WP                  V P                  P                  4       4      pV P                  '       d3   \
        P                  ! V^V P                  ^,
          ,          4      pW#3# ^V P                  ,          ^,
          p\        V P                  P                  4       P                  4       ) ^ V4      p\        WP                  V4      pW#3# )zBConvert learned qparams into the runtime scale/zero-point tensors.)r[  r~   rh  rP   rb   r?   Ú	full_liker]  r|   ri  rm   )ru  rW  r5  r¦   rg  s   &&   r"   Úpack_paramsÚ GroupLinearQuantizer.pack_paramså  s¤   € ä& v¯©ÀÇ
Á
×@QÑ@QÓ@SÓTˆØ�8�8ˆ8Ü—O’O F¨A°$·)±)¸aµ-Õ,@ÓAˆEð
 ˆ}Ðð �d—i‘i•< !Õ#ˆDÜ × 5Ñ 5× <Ñ <Ó >× DÑ DÓ FÐFÈÈ4ÓPˆEÜ)¨&·/±/À5ÓIˆEØˆ}Ðr$   )r]  r~   rh  rb   ri  )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rr  r}  r‚  r‡  Ú__static_attributes__Ú__classcell__©rv  s   @r"   rl  rl  ¶  s&   ø† ÙX÷Cð Cõ2

õ÷	ó 	r$   rl  rh  ri  c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
R	RRRR/# ©r   rW  rK   r]  r   r~   rb   rc   rh  r6  ri  r{  r   r    )r!   s   "r"   r#   r#   ñ  sZ   € ÷ ,0ñ ,0Øð,0ð ð,0ð ð	,0ð
 
ð,0ð "ð,0ð -ð,0ð ð,0ð ñ,0r$   c               ól  € V P                   pV P                  R	V4      pV'       dî   ^V^,
          ,          ) p	^V^,
          ,          ^,
          p
Vf9   VP                  4       P                  ^RR7      P	                  RR7      V
,          pV'       d4   \        VRRR7      p\        \        W„,          4      Wš4      pW´,          pEMPVP	                  RRR7      p\        P                  ! \        P                  ! W„,          4      Wš4      pW´,          pEM^ p	^V,          ^,
          p
Ve   Vf   \        WVR7      w  rEV'       dJ   \        VRRR7      p\        \        V4      ) Wš4      p\        W„,          4      V,           p\        W¹V
4      pMyVP	                  RRR7      p\        P                  ! \        P                  ! V4      ) Wš4      p\        P                  ! W„,          4      V,           p\        P                  ! W¹V
4      pW½,
          V,          pVP                  V 4      P                  V4      # )
zKReference pseudo-quantization path shared by optimization and export tests.Tr_  ra  rb  g     jø@©rx   ry   ©rÇ   rÆ   rp  r„   )r@   rË   rs  rd  r{   r|   rn   r?   rm   rj  Ú
reshape_asrR   )rW  r]  r~   rb   rh  ri  r{  r@   Úweight_viewÚqminrg  ÚquantÚdequantÚround_zero_points   &$$$$$$       r"   Úpseudo_quantize_dequantrœ  ñ  sË  € ð �L‰L€EØ—.‘.  ZÓ0€Kç
Ø�t˜a•x•Ð!ˆØ�T˜A•X� Õ"ˆØŠ=Ø—O‘OÓ%×*Ñ*¨q¸$Ð*Ó?×EÑEÈ$ÐEÓOÐRVÕVˆEßÜ˜u°ÀÔDˆEÜœz¨+Õ*=Ó>ÀÓKˆEØ•mŠGà—K‘K D¨c�KÓ2ˆEÜ—K’K¤§¢¨KÕ,?Ó @À$ÓMˆEØ•mŠGàˆØ�$�w˜�{ˆØŠ=Ð,Ò4Ü&:¸6Ð_cÔ&dÑ#ˆEßÜ˜u°ÀÔDˆEÜ)¬:Ð6FÓ+GÐ*GÈÓTÐÜ˜{Õ2Ó3Ð6FÕFˆEÜ˜u¨DÓ1‰Eà—K‘K D¨c�KÓ2ˆEÜ$Ÿ{š{¬E¯KªKÐ8HÓ,IÐ+IÈ4ÓVÐÜ—K’K Õ 3Ó4Ð7GÕGˆEÜ—K’K ¨TÓ2ˆEØÕ+¨uÕ4ˆà×Ñ˜fÓ%×(Ñ(¨Ó/Ð/r$   c                 ót   € \        \        RR4      p V f   R#  V ! \        RRR7      #   \         d     R# i ; i)zCLazily compile the large training-time quant path once per process.ÚcompileNr;  T)ÚmodeÚ	fullgraph)Úgetattrr?   rœ  Ú	Exception)Ú
compile_fns    r"   Ú_get_large_train_quant_compiler¤     sB   € ô œ 	¨4Ó0€JØÒÙðÙÔ1¸	ÈTÔRÐRøÜô Úðús   ™( ¨7¶7r{  Tc               ó8   € V ^8„  d   QhRRRRRRRRRR	R
R	RRRR/# r’  r    )r!   s   "r"   r#   r#   ,  sZ   € ÷ %ñ %Øð%ð ð%ð ð	%ð
 
ð%ð "ð%ð -ð%ð ð%ð ñ%r$   c          
     ó0  € \        V4      ;'       dN    V P                  P                  R8H  ;'       d-    V P                  4       \        8¬  ;'       d    \        RRR7      pV'       d   \        4       pVe   V! V VVVVVVR7      # \        V VVVVVVR7      # )zMCompile only large training-time quant calls where the compile tax amortizes.r÷   Ú1GPTQMODEL_PAROQUANT_OPT_LARGE_TRAIN_QUANT_COMPILETr:  rz  )rc   rC   rø   ÚnumelÚ._PAROQUANT_LARGE_TRAIN_QUANT_COMPILE_MIN_NUMELr   r¤  rœ  )	rW  r]  r~   rb   rh  ri  r{  Úshould_compileÚcompileds	   &$$$$$$  r"   r|  r|  ,  s¼   € ô 	ˆW‹÷ 	Xð 	XØ�M‰M×Ñ &Ñ(÷	Xð 	Xà�L‰L‹NÔLÑL÷	Xð 	Xô ÐHÐRVÔWð	 ÷ Ü1Ó3ˆØÒÙØØØ%ØØØ!1Øôð ô #ØØØØØØ)Øôð r$   c                  ó¶   a € ] tR tRtRtR]R]RR/R V 3R llltR	 R
 ltRR/R R llt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltRtV ;t# )Ú_ParoQuantOptimLineariT  zEMinimal layer wrapper used during ParoQuant calibration optimization.Úscale_clamp_minÚscale_clamp_maxr2  Nc               óD   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRRRRRR/# )r   rW  rK   Úbiasr6  r]  r   r~   Úquantizer_symrc   r¬   Ú
theta_maskr®  r¹   r¯  r2  r7  r   r‡   r    )r!   s   "r"   r#   Ú"_ParoQuantOptimLinear.__annotate__W  sx   € ÷ "-ñ "-àð"-ð %ð"-ð
 ð"-ð ð"-ð ð"-ð ð"-ð !ð"-ð ð"-ð ð"-ð 'ð"-ð 
ñ"-r$   c               ó  <€ \         SV `  4        \        V4      V n        \        V4      V n        \        V4      V n        \        V4      V n        \        V	4      V n	        V P                  ^ 8:  g   V P                  ^ 8:  d   \        R4      hV P                  V P                  8¼  d   \        R4      hV P                  RV4       V P                  RV4       \        P                  ! VP                  4       4      V n        Vf   RM#\        P                  ! VP                  4       4      V n        \        P                  ! \"        P$                  ! VP&                  ^ ,          VP&                  ^,          ^,          3VP(                  VP*                  R7      4      V n        \        P                  ! \"        P.                  ! VP&                  ^,          3VP(                  VP*                  R7      4      V n        RV n        W n        R# )zCMaterialize a replayable linear layer in the original input domain.z<ParoQuant optimization: scale clamp bounds must be positive.zQParoQuant optimization: `scale_clamp_min` must be smaller than `scale_clamp_max`.r¬   r³  NrO   )rq  rr  r   r]  r~   rc   r²  r¹   r®  r¯  r*   Úregister_bufferr   rt  rS   rW  r±  r?   r¦   rê   rC   r@   r4  r”   Úchannel_scales_optÚ	quantizerr2  )ru  rW  r±  r]  r~   r²  r¬   r³  r®  r¯  r2  rv  s   &&&$$$$$$$$€r"   rr  Ú_ParoQuantOptimLinear.__init__W  sy  ø€ ô 	‰ÑÔÜ˜“IˆŒ	Ü˜j›/ˆŒÜ! -Ó0ˆÔÜ$ _Ó5ˆÔÜ$ _Ó5ˆÔØ×Ñ 1Ô$¨×(<Ñ(<ÀÔ(AÜÐ[Ó\Ð\Ø×Ñ 4×#7Ñ#7Ô7ÜØcóð ð 	×Ñ˜W eÔ,Ø×Ñ˜\¨:Ô6Ü—l’l 6§<¡<£>Ó2ˆŒØ šL‘D¬b¯lªl¸4¿:¹:»<Ó.HˆŒ	Ü—\’\¤%§+¢+¨u¯{©{¸1­~¸v¿|¹|ÈA½ÐRSÕ?SÐ.TÐ]c×]jÑ]jÐrx×r~Ñr~Ô"ó  AˆŒ
Ü"$§,¢,¬u¯zªz¸6¿<¹<È½?Ð:LÐU[×UbÑUbÐjp×jvÑjvÔ/wÓ"xˆÔØ9=ˆŒØ,Ör$   c               ó    € V ^8„  d   QhRRRR/# ©r   r{  rc   r   rK   r    )r!   s   "r"   r#   r´  {  s   € ÷ Pñ P¨Dð P°\ñ Pr$   c                óÜ   € V P                   P                  ^R4      pV'       d#   \        VV P                  V P                  R7      # VP                  V P                  V P                  R7      # )a  Keep learned channel scales in a numerically safe range.

During optimization we use an STE clamp so forward values stay bounded
while gradients still flow to ``channel_scales_opt``. During export we
switch to a hard clamp so the saved runtime tensors reflect the exact
bounded values.
r”  r•  r„   )r·  r	  r|   r®  r¯  r{   )ru  r{  r5  s   && r"   Ú_safe_channel_scalesÚ*_ParoQuantOptimLinear._safe_channel_scales{  sb   € ð ×(Ñ(×-Ñ-¨a°Ó4ˆßÜØØ×.Ñ.Ø×.Ñ.ôð ð
 �|‰| × 4Ñ 4¸$×:NÑ:Nˆ|ÓOÐOr$   r{  Tc               ó    € V ^8„  d   QhRRRR/# r»  r    )r!   s   "r"   r#   r´  Œ  s   € ÷ 
ñ 
¨Tð 
¸\ñ 
r$   c          	     óº   € V P                   V P                  VR7      ,          p\        VV P                  V P                  RV P
                  V P                  R7      # )zAProject the learnable weight into ParoQuant's transformed domain.©r{  NrS  )rW  r½  rP  r¬   r4  r~   r2  )ru  r{  Úscaled_weights   &$ r"   Útransformed_weightÚ(_ParoQuantOptimLinear.transformed_weightŒ  sQ   € ð Ÿ™ d×&?Ñ&?ÈÐ&?Ó&PÕPˆÜØØ�J‰JØ�J‰JØØ—‘Ø×.Ñ.ô
ð 	
r$   c               ó   € V ^8„  d   QhRR/# ©r   r   rK   r    )r!   s   "r"   r#   r´  š  s   € ÷ 
+ñ 
+¨lñ 
+r$   c                ó¾   € V P                  RR7      pV P                  f.   \        VV P                  V P                  V P
                  R7      # V P                  V4      # )zEPseudo-quantize the transformed weight using current learned qparams.TrÁ  ©r]  r~   rb   )rÃ  r¸  r|  r]  r~   r²  ©ru  Útransformeds   & r"   Úquantized_transformed_weightÚ2_ParoQuantOptimLinear.quantized_transformed_weightš  sW   € à×-Ñ-°dÐ-Ó;ˆØ�>‰>Ò!Ü3ØØ—Y‘YØŸ?™?Ø×&Ñ&ô	ð ð �~‰~˜kÓ*Ð*r$   c               ó   € V ^8„  d   QhRR/# rÆ  r    )r!   s   "r"   r#   r´  ¦  s   € ÷ *ñ *˜|ñ *r$   c                óÆ   € V P                  4       p\        VV P                  V P                  V P                  V P
                  R7      pV P                  RR7      pW,          # )zHMap the transformed-domain quantized weight back to runtime input space.©r~   r2  TrÁ  )rË  rU  r¬   r4  r~   r2  r½  )ru  Ú	quantizedÚchannel_scaless   &  r"   Úpseudo_weightÚ#_ParoQuantOptimLinear.pseudo_weight¦  sY   € à×5Ñ5Ó7ˆ	Ü+ØØ�J‰JØ�J‰JØ—‘Ø×.Ñ.ô
ˆ	ð ×2Ñ2¸4Ð2Ó@ˆØÕ)Ð)r$   c               ó    € V ^8„  d   QhRRRR/# rj   r    )r!   s   "r"   r#   r´  ³  s   € ÷ ñ ˜ð ¨,ñ r$   c           	     óx  € VP                  4       ^8  d#   \        R\        VP                  4       R24      hVP                  pVP                  4       ^8”  d   VP	                  RVR,          4      MTpV P                  RR7      P                  4       p\        VV P                  V P                  VV P                  V P                  R7      p\        P                  ! WPP                  4       V P                  4      pVP                  4       ^8”  d*   VP                   ! . VRR OVP                  R,          N5!  # V# )zVReplay calibration activations through the runtime-equivalent transformed-domain path.z3ParoQuant optimization expects rank-2+ inputs, got r‚   TrÁ  rS  Nr„   )r�   r*   r<  rê   rË   r½  Ú
reciprocalrP  r¬   r4  r~   r2  ÚFÚlinearrË  r±  r	  )ru  rk   Úoriginal_shapeÚx_2dÚruntime_scalesÚrotated_inputsÚoutputss   &&     r"   r}  Ú_ParoQuantOptimLinear.forward³  s  € à�5‰5‹7�QŒ;ÜÐRÔSXÐYZ×Y`ÑY`ÓSaÐRbÐbcÐdÓeÐeØŸ™ˆØ45·E±E³G¸a´Kˆq�y‰y˜˜^¨BÕ/Ô0ÀQˆð ×2Ñ2¸4Ð2Ó@×KÑKÓMˆÜ(ØØ�J‰JØ�J‰JØ!Ø—‘Ø×.Ñ.ô
ˆô —(’(˜>×+LÑ+LÓ+NÐPT×PYÑPYÓZˆØ�5‰5‹7�QŒ;Ø—<’<ÐH °°Ð!4ÐH°g·m±mÀBÕ6GÓHÐHØˆr$   c               ó   € V ^8„  d   QhRR/# ©r   r   r‡   r    )r!   s   "r"   r#   r´  Ê  s   € ÷ 8ñ 8 Tñ 8r$   c                óÆ   € \         P                  ! 4       ;_uu_ 4        V P                  P                  V P                  ^ 4       RRR4       R#   + '       g   i     R# ; i)zCForce dummy padded pairs to stay at zero angle during optimization.N)r?   Úno_gradr4  Úmasked_fill_r³  )ru  s   &r"   Úreset_masked_anglesÚ)_ParoQuantOptimLinear.reset_masked_anglesÊ  s1   € ä�]Š]�_�_Ø�J‰J×#Ñ# D§O¡O°QÔ7÷ �_�_Š_ús   ž'AÁA 	c               ó   € V ^8„  d   QhRR/# rà  r    )r!   s   "r"   r#   r´  Ï  s   € ÷ 
ñ 
 ñ 
r$   c                óª   € V P                  RR7      P                  4       p\        VV P                  V P                  V P
                  R7      V n        R# )zKBootstrap the transformed-domain quantizer from the current rotated weight.FrÁ  rÈ  N)rÃ  rP   rl  r]  r~   r²  r¸  rÉ  s   & r"   Úinit_quantizerÚ$_ParoQuantOptimLinear.init_quantizerÏ  sD   € à×-Ñ-°eÐ-Ó<×CÑCÓEˆÜ-ØØ—‘Ø—‘Ø×"Ñ"ô	
ˆŽr$   c               ó   € V ^8„  d   QhRR/# )r   r   zYtuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]r    )r!   s   "r"   r#   r´  Ù  s   € ÷ /`ñ /`à	bñ/`r$   c           
     ób  € V P                  RR7      P                  4       pV P                  f²   \        VV P                  V P
                  V P                  R7      pVP                  V4      w  r4\        TV P                  V P
                  V P                  VP                  P                  4       VP                  f   RMVP                  P                  4       RR7      pM«V P                  P                  V4      w  r4\        TV P                  V P
                  V P                  V P                  P                  P                  4       V P                  P                  f   RM#V P                  P                  P                  4       RR7      pV P                  P                  4       P                  V P                  ^ 4      pV P                  RR7      P                  4       P                  4       p\!        VV P"                  V P                  V P
                  V P$                  R7      V,          pWSWFWx3# )z`Export quantized transformed weights and the exact runtime-equivalent pseudo weight in one pass.FrÁ  NrÈ  rz  rÏ  )rÃ  rP   r¸  rl  r]  r~   r²  r‡  rœ  rh  ri  r4  Úmasked_fillr³  r½  rÖ  rU  r¬   r2  )	ru  rÊ  r¸  Úpack_scalesÚ
pack_zerosrÐ  r4  Úruntime_channel_scalesrÒ  s	   &        r"   Ú_export_runtime_stateÚ+_ParoQuantOptimLinear._export_runtime_stateÙ  sÉ  € ð ×-Ñ-°eÐ-Ó<×CÑCÓEˆØ�>‰>Ò!Ü,ØØ—Y‘YØŸ?™?Ø×&Ñ&ô	ˆIð '0×&;Ñ&;¸KÓ&HÑ#ˆKÜ/ØØ—Y‘YØŸ?™?Ø×&Ñ&Ø—o‘o×,Ñ,Ó.Ø)2×)CÑ)CÒ)K¡ÐQZ×QkÑQk×QrÑQrÓQtØô‰Ið '+§n¡n×&@Ñ&@ÀÓ&MÑ#ˆKÜ/ØØ—Y‘YØŸ?™?Ø×&Ñ&Ø—n‘n×*Ñ*×1Ñ1Ó3à ŸN™N×;Ñ;ÒC‘DÈÏÉ×IhÑIh×IoÑIoÓIqàô
ˆIð —
‘
×!Ñ!Ó#×/Ñ/°·±ÀÓCˆð "&×!:Ñ!:À5Ð!:Ó!I×!PÑ!PÓ!R×!]Ñ!]Ó!_ÐÜ/ØØ�J‰JØ�J‰JØ—‘Ø×.Ñ.ô
ð #õ#ˆð  zÐ:PÐ_Ð_r$   c               ó   € V ^8„  d   QhRR/# )r   r   zKtuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]r    )r!   s   "r"   r#   r´  
  s   € ÷ Qñ QÐ#nñ Qr$   c                ó4   € V P                  4       w  rr4rVWW4V3# )zLExport runtime tensors that should match the pseudo-quantized layer exactly.)rð  )ru  rÐ  rí  rî  r4  rï  Ú_pseudo_weights   &      r"   Úexport_pack_stateÚ'_ParoQuantOptimLinear.export_pack_state
  s&   € à\`×\vÑ\vÓ\xÑYˆ	 
Ð3IØ zÐ:PÐPÐPr$   )r±  r]  r·  r2  r~   r¸  r²  r¯  r®  r4  rW  )r‰  rŠ  r‹  rŒ  r�  r   r   rr  r½  rÃ  rË  rÒ  r}  rä  rè  rð  rõ  rŽ  r�  r�  s   @r"   r­  r­  T  so   ø† ÙOð"-ð "Gð"-ð "Gð"-ð *.÷"-ò "-õHPð"
°D÷ 
õ
+õ*õõ.8õ

õ/`÷bQó Qr$   r­  c                  ó€   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   R]R&   RtR# )ÚParoQuantOptimizationResulti  zMAll tensors and diagnostics produced by one ParoQuant layer optimization run.rK   rÒ  Úpack_weightÚq_scalesÚq_zerosr¬   r4  rÑ  r¹   Ú
train_lossÚval_lossrc   Úused_identityr    N)r‰  rŠ  r‹  rŒ  r�  Ú__annotations__rŽ  r    r$   r"   rø  rø    s@   ‡ áWàÓØÓØÓØÓØÓØÓØ Ó ØÓØƒOØ×r$   rø  c               ó$   € V ^8„  d   QhRRRRRR/# )r   r/  rK   Ú
batch_sizer   r   zIterable[torch.Tensor]r    )r!   s   "r"   r#   r#      s"   € ÷ -ñ -�lð -°ð -Ð8Nñ -r$   c              #  óp   "  € \        ^ V P                  ^ ,          V4       F  pWW!,            x € K  	  R# 5i)zEYield contiguous mini-batches from flattened calibration activations.N)r–   rê   )r/  r  rï   s   && r"   Ú_chunk_rowsr     s.   é € ä�q˜$Ÿ*™* Q�-¨Ö4ˆØ˜Õ+Ð,Ô,ó 5ùs   ‚46c               ó$   € V ^8„  d   QhRRRRRR/# )r   rZ   r[   Úparam_groupsúSequence[dict[str, object]]r   zIterable[None]r    )r!   s   "r"   r#   r#   '  s&   € ÷ 2ñ 2Øð2à-ð2ð ñ2r$   c           	   #  óZ  "  € V UUu0 uFI  pVP                  R. 4       F0  p\        V\        P                  4      '       g   K%  \	        V4      kK2  	  KK  	  pppV P                  4        Uu. uF  q3VP                  3NK  	  ppV F,  w  r6\	        V4      V9   pWg8w  g   K  VP                  V4       K.  	   Rx € V F)  w  r6VP                  V8w  g   K  VP                  V4       K+  	  R# u uppi u upi   T F)  w  r6TP                  T8w  g   K  TP                  T4       K+  	  i ; i5i)zTTemporarily disable gradients for parameters that are inactive in the current stage.r�  N)Úgetr>   r   rt  ÚidÚ
parametersr=  Úrequires_grad_)rZ   r  Úparam_groupÚparamÚactive_param_idsÚoriginal_flagsÚwas_enabledÚshould_enables   &&      r"   Ú_activate_stage_paramsr  &  s  é € ñ (ôá'ˆKØ —_‘_ X¨rÖ2ˆEÜ�eœRŸ\™\×*ô 	Œˆ5Ž	á2ñ 	Ù'ð ñ ð AF×@PÑ@PÔ@RÓSÑ@R°u˜e×1Ñ1Ó2Ñ@R€NÐSÛ,ÑˆÜ˜5›	Ð%5Ñ5ˆØÖ'Ø× Ñ  Ö/ñ -ð2Ûã"0ÑˆEØ×"Ñ" kÖ1Ø×$Ñ$ [Ö1ó #1ùóùò Tøó #1ÑˆEØ×"Ñ" kÖ1Ø×$Ñ$ [Ö1ò #1üsL   ‚D+ˆ7C,ÁC,ÁD+Á,C2ÂD+Â!D+Â7C7 Â;D+Ã"D+Ã7D(ÄD(Ä(D+Úuse_ampc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rZ   r[   r*  rK   Útargetsr  rc   r   r¹   r    )r!   s   "r"   r#   r#   ?  s:   € ÷ "ñ "Øð"àð"ð ð"ð
 ð"ð ñ"r$   c          	     óú  € VP                  4       ^ 8X  d   R# \        P                  ! 4       ;_uu_ 4        V'       d;   VP                  P                  R8X  d    \        P
                  P                  R4      M	\        4       pV;_uu_ 4        V ! V4      p\        P                  ! WR4      pRRR4       \        XP                  4       4      uuRRR4       #   + '       g   i     L3; i  + '       g   i     R# ; i)z<Measure replay error for early stopping and stage selection.r¾   r÷   N)r¨  r?   râ  rC   rø   ÚampÚautocastr   r×  Úsmooth_l1_lossr¹   Úitem)rZ   r*  r  r  Úautocast_ctxÚpredsÚlosss   &&&$   r"   Ú_evaluate_modelr  ?  s˜   € ð ‡|�|ƒ~˜ÔÙÜ	�Š��ß5<ÀÇÁ×ASÑASÐW]ÔA]”u—y‘y×)Ñ)¨&Ô1ÔcnÓcpˆßŠ\Ù˜&“MˆEÜ×#Ò# EÓ3ˆD÷ ô �T—Y‘Y“[Ó!÷ 
Šç�\ú÷ 
�ˆús$   µAC)ÂC	Â+ C)ÃC&Ã!C)Ã)C:	c               ó    € V ^8„  d   QhRRRR/# )r   r  r  r   úlist[dict[str, object]]r    )r!   s   "r"   r#   r#   Q  s   € ÷ ñ Ø-ðàñr$   c                ó6  € . pV  EFŠ  pVP                  R . 4       Uu. uF;  p\        V\        P                  4      '       g   K%  VP                  '       g   K9  VNK=  	  ppV'       g   Ke  \
        ;QJ d$    . R VP                  RR4       4       F  NK  	  5M! R VP                  RR4       4       4      pVP                  R VR\        VR,          4      R\        VP                  RR4      4      RV^ ,          V^,          3R\        VP                  RR4      4      R\        VP                  RR	4      4      R
\        VP                  R
R4      4      R\        VP                  RR4      4      R\        VP                  RR	4      4      /	4       EK�  	  V# u upi )r�  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N©r¹   ©Ú.0Úbetas   & r"   Ú	<genexpr>Ú4_normalize_optimizer_param_groups.<locals>.<genexpr>Y  s   é € ÐXÑ2W¨$œ% Ÿ+˜+Ó2Wùó   ‚ÚbetasÚlrÚweight_decayç{®Gáz„?Úepsç»½×Ùß|Û=ÚamsgradFÚmomentumr¾   Ú	dampeningÚnesterov©gÍÌÌÌÌÌì?gffffffî?)	r  r>   r   rt  r=  r<  r˜   r¹   rc   )r  Únormalized_groupsr  r  r�  Ú	betas_objs   &     r"   Ú!_normalize_optimizer_param_groupsr8  Q  sR  € ð 24ÐÜ#ˆØ%0§_¡_°X¸rÔ%BÓ~Ñ%B˜EÄjÐQVÔXZ×XdÑXd×Fe”%Ðjo×j}Õj}—%�%Ñ%BˆÐ~ßÙß”EÑX°+·/±/À'È;Ô2WÓX—E‘EÑX°+·/±/À'È;Ô2WÓXÓXˆ	Ø× Ñ à˜&Ø”e˜K¨Õ-Ó.Ø¤ k§o¡o°nÀdÓ&KÓ LØ˜) A�,¨	°!­Ð5Ø”u˜[Ÿ_™_¨U°EÓ:Ó;Øœ4 §¡°	¸5Ó AÓBØœE +§/¡/°*¸cÓ"BÓCØœU ;§?¡?°;ÀÓ#DÓEØœD §¡°¸UÓ!CÓDð
÷	
ñ $ð$ Ðùò# s   �"FÁFÁFc               ó$   € V ^8„  d   QhRRRRRR/# )r   r6  r  rC   rD   r   rc   r    )r!   s   "r"   r#   r#   j  s(   € ÷ 	ñ 	Ø2ð	ð ð	ð 
ñ		r$   c               ó˜   € VP                   R 8H  ;'       d5    \        ;QJ d    R V  4       F  '       d   K   R# 	  R# ! R V  4       4      # )r÷   c              3  ó  "  € T Fw  pVP                  R . 4       F^  p\        V\        P                  4      ;'       d8    VP                  P
                  R8H  ;'       d    \        P                  ! V4      x € K`  	  Ky  	  R# 5i)r�  r÷   N)r  r>   r   rt  rC   rø   r?   rQ   )r&  Úgroupr  s   &  r"   r(  Ú8_optimizer_param_groups_support_fused.<locals>.<genexpr>o  si   é € ð )á&ˆEØ—Y‘Y˜x¨Ö,ˆEô 	�5œ"Ÿ,™,Ó'×jÐj¨E¯L©L×,=Ñ,=ÀÑ,G×jÐjÌE×LcÒLcÐdiÓLjÔjá,ñ 	kÛ&ùs   ‚:B½ BÁ#BFT)rø   Úall)r6  rC   s   &$r"   Ú%_optimizer_param_groups_support_fusedr?  j  sT   € ð
 �;‰;˜&Ñ ÷ ð §S£Sñ )á&ó)§S¤Sð ¢Sð  Sñ )á&ó)ó &ð r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r,  r¹   rC   rD   Úgraph_capturerc   r   zfloat | torch.Tensorr    )r!   s   "r"   r#   r#   v  s8   € ÷ Gñ GØðGð ðGð ð	Gð
 ñGr$   c               óˆ   € V'       g   \        V 4      # \        P                  ! \        V 4      V\        P                  R 7      # )rO   )r¹   r?   rJ   r=   )r,  rC   rA  s   &$$r"   Ú_optimizer_lr_valuerC  v  s,   € ÷ Ü�R‹yÐÜ�<Š<œ˜b›	¨&¼¿¹ÔFÐFr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  zdict[str, object]Úvaluer¹   r   r‡   r    )r!   s   "r"   r#   r#   �  s"   € ÷ %ñ %Ð):ð %À5ð %ÈTñ %r$   c                óÄ   € V P                  R 4      p\        V\        P                  4      '       d!   VP	                  \        V4      4       W R &   R# \        V4      V R &   R# )r,  N)r  r>   r?   ÚTensorÚfill_r¹   )r  rE  Úcurrents   && r"   Ú_set_optimizer_group_lrrJ  �  sJ   € Ø�o‰o˜dÓ#€GÜ�'œ5Ÿ<™<×(Ò(Ø�‰”e˜E“lÔ#Ø#�DÑÙÜ˜e›€K�Ór$   rA  c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r6  r  rC   rD   Úoptimizer_namer   rA  rc   r   ztorch.optim.Optimizerr    )r!   s   "r"   r#   r#   Š  sC   € ÷ >Pñ >PØ2ð>Pð ð>Pð ð	>Pð
 ð>Pð ñ>Pr$   c               ó,  a aa€ \        V4      pVR9   ;'       d    \        S SR7      pR VVV 3R llpVR9   Ed   V! 4       p\        VS 4       F¢  w  r‰\        ;QJ d$    . R V	P	                  RR4       4       F  NK  	  5M! R V	P	                  RR4       4       4      p
V
^ ,          V
^,          3VR&   \        V	P	                  RR4      4      VR&   \        V	P	                  R	R
4      4      VR	&   K¤  	  VR 8X  d   \        P                  P                  M\        P                  P                  p/ pS'       d   RVR&   V'       d   RVR&    V! V3/ VB # VR8X  d§   V! 4       p\        VS 4       F_  w  r‰\        V	P	                  RR4      4      VR&   \        V	P	                  RR4      4      VR&   \        V	P	                  RR
4      4      VR&   Ka  	  V'       d   RR/M/ p \        P                  P                  ! V3/ VB # \!        RV R24      h  \        \        \        3 d(    T'       d   TP                  RR4       T! T3/ TB u # h i ; i  \        \        \        3 d,    T'       d"   \        P                  P                  T4      u # h i ; i)r   ÚsgdrÂ   c               ó   € V ^8„  d   QhRR/# )r   r   r   r    )r!   s   "r"   r#   Ú/build_paroquant_optimizer.<locals>.__annotate__—  s   € ÷ 
ñ 
Ð1ñ 
r$   c                 óÖ   <€ . p S F_  pV P                  R VR ,          R\        \        VP                  RR4      4      SSR7      R\        VP                  RR4      4      /4       Ka  	  V # )r�  r,  r¾   )rC   rA  r-  r.  )r˜   rC  r¹   r  )rZ  r<  rC   rA  r6  s     €€€r"   Ú_base_groupsÚ/build_paroquant_optimizer.<locals>._base_groups—  si   ø€ Ø*,ˆÛ&ˆEØ�M‰Mà˜e H�oØÔ-¬e°E·I±I¸dÀCÓ4HÓ.IÐRXÐhuÔvØ"¤E¨%¯)©)°NÀDÓ*IÓ$Jðöñ 'ð ˆr$   c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir#  r$  r%  s   & r"   r(  Ú,build_paroquant_optimizer.<locals>.<genexpr>¦  s   é € Ð]Ñ6\¨dœe DŸk˜kÓ6\ùr*  r+  r/  r0  r1  FTÚ
capturableÚfusedNr2  r¾   r3  r4  zUnhandled ParoQuant optimizer `r'   >   rN  Úadamr   >   rX  r   r5  )r4   r?  r  r<  r  r¹   rc   r?   ÚoptimÚAdamWÚAdamÚRuntimeErrorÚ	TypeErrorr*   ÚpopÚSGDÚAssertionError)r6  rC   rL  rA  Únormalized_nameÚ	use_fusedrR  rZ  Úbuilt_groupÚsource_groupr7  Úoptimizer_clsÚoptimizer_kwargss   fd$d         r"   Úbuild_paroquant_optimizerrg  Š  sz  ú€ ô /¨~Ó>€OØÐ#;Ñ;÷ ð Ô@eØØôA€I÷

ò 
ð Ð+Õ+Ù“ˆÜ),¨VÐ5FÖ)GÑ%ˆKßœÑ]°l×6FÑ6FÀwÐP[Ô6\Ó]Ÿ™Ñ]°l×6FÑ6FÀwÐP[Ô6\Ó]Ó]ˆIØ$-¨a¥L°)¸Aµ,Ð#?ˆK˜Ñ Ü!& |×'7Ñ'7¸¸uÓ'EÓ!FˆK˜ÑÜ%)¨,×*:Ñ*:¸9ÀeÓ*LÓ%MˆK˜	Ó"ñ	 *Hð .=ÀÔ-GœŸ™×)Ò)ÌUÏ[É[×M]ÑM]ˆØ.0ÐßØ-1Ð˜\Ñ*ßØ(,Ð˜WÑ%ð	Ù  Ñ<Ð+;Ñ<Ð<ð ˜%ÔÙ“ˆÜ),¨VÐ5FÖ)GÑ%ˆKÜ&+¨L×,<Ñ,<¸ZÈÓ,MÓ&NˆK˜
Ñ#Ü',¨\×-=Ñ-=¸kÈ3Ó-OÓ'PˆK˜Ñ$Ü&*¨<×+;Ñ+;¸JÈÓ+NÓ&OˆK˜
Ó#ñ *H÷
 /8˜G T™?¸RÐð	Ü—;‘;—?’? 6Ñ>Ð-=Ñ>Ð>ô Ð:¸?Ð:KÈ2ÐNÓ
OÐOøô+ œi¬Ð4ô 	ßØ ×$Ñ$ W¨dÔ3Ù$ VÑ@Ð/?Ñ@Ò@Øð		ûô  œi¬Ð4ô 	ßÜ—{‘{—‘ vÓ.Ò.Øð	ús0   ÅH Ç" I ÈIÈ0IÉIÉJÉ0JÊJÚgradient_checkpointingr6   c               óH   € V ^8„  d   QhRRRRRRRRRRRR	R
RRRRRRRRRRR/# ©r   rZ   r[   Úinputs_trainrK   Útargets_trainÚ
inputs_valÚtargets_valr  r  Úepochsr   r  rL  r   rh  rc   r6   r7   r   útuple[float, float]r    )r!   s   "r"   r#   r#   Ë  s�   € ÷ I*ñ I*àðI*ð ðI*ð  ð	I*ð
 ðI*ð ðI*ð .ðI*ð ðI*ð ðI*ð ðI*ð !ðI*ð 2ðI*ð ñI*r$   c                ó0  € \        V4      pVP                  P                  R8H  pV^ 8:  g	   V'       g   \        WW,R7      p\        WWLR7      pWÞ3# \	        VVP                  VRR7      p\        ^\        P                  ! \        ^VP                  ^ ,          4      \        ^V4      ,          4      4      p\        ^VV,          4      pV Uu. uF  p\        VR,          4      NK  	  pp\        P                  P                  VR7      p^ p\        W¡P                  R7      p\        V VR7      p\        R	4      p\        WW,R7      p\        V4       EF  pR
p^ p\!        \#        W4      \#        W'4      4       EF�  w  ppVP%                  RR7       V'       d    \        P                  P'                  R4      M	\)        4       pV;_uu_ 4        \+        V VV	R7      p \,        P.                  ! V V4      p!RRR4       VP1                  X!4      P3                  4        VP5                  V4       VP7                  4        V^,          pRR\        P8                  ! \        P:                  \=        VV4      ,          V,          4      ,           ,          p"\!        VP>                  V4       F5  w  pp#\A        VV#R,          V#V#R,          ,
          V",          ,           4       K7  	  V PC                  4        V\        V!PE                  4       4      ,          pV^,          pEK   	  V\        ^V4      ,          p\        WWLR7      pVV8  g   EKò  Tp\        V VR7      pEK  	  V PG                  VRR7       V PC                  4        VV3# u upi   + '       g   i     EL›; i)zFRun one optimization stage with validation-based best-state selection.r÷   ©r  F©rC   rL  rA  r,  ©ro   ©r6   rC   ©rH   Úinfr¾   T©Úset_to_noneNr¿   ç      ð?ç      4@©Ústrict)$r8  rC   rø   r  rg  rÆ   ÚmathÚceilrê   r¹   r?   r  Ú
GradScalerrF   r`   r–   r  r  Ú	zero_gradr  r   rv   r×  r  rh  ÚbackwardÚstepÚupdater@  ÚpirÇ   r  rJ  rä  r  Úload_state_dict)$rZ   rk  rl  rm  rn  r  ro  r  rL  rh  r6   r6  r  rü  rý  Ú	optimizerÚsteps_per_epochÚtotal_stepsr<  Úbase_lrsÚscalerÚglobal_stepÚbest_state_snapshot_dtypeÚ
best_stateÚbest_val_lossÚlast_train_lossÚ_epochÚ
epoch_lossÚbatch_countÚinput_batchÚtarget_batchr  r  r  Úcosine_ratioÚbase_lrs$   $$$$$$$$$$$                         r"   Ú_run_stage_gptqmodel_implr˜  Ë  s  € ô :¸,ÓGÐà×!Ñ!×&Ñ&¨&Ñ0€GØ�„{×+Ü$ U¸-ÔYˆ
Ü" 5°kÔSˆØÐ#Ð#ä)ØØ×"Ñ"Ø%Øô	€Iô ˜!œTŸYšY¤s¨1¨l×.@Ñ.@ÀÕ.CÓ'DÄsÈ1ÈjÓGYÕ'YÓZÓ[€OÜ�a˜ /Õ1Ó2€KÙ0AÓBÑ0A u”�e˜D•kÖ"Ñ0A€HÐBÜ�Y‰Y×!Ñ!¨'Ð!Ó2€FØ€KÜ BÐTd÷  nAñ  nAô  !BÐä& uÐ;TÔU€JÜ˜%“L€MÜ% e¸=ÔZ€Oä˜—-ˆØˆ
Øˆä),¬[¸Ó-RÔT_Ð`mÓTz×){Ñ%ˆK˜Ø×Ñ¨DÐÔ1ß9@œ5Ÿ9™9×-Ñ-¨fÔ5ÄkÃmˆLß’Ü-¨e°[ÐJ`Ôa�Ü×'Ò'¨¨|Ó<�÷ ð �L‰L˜Ó×'Ñ'Ô)Ø�K‰K˜	Ô"Ø�M‰MŒOØ˜1ÕˆKØ #¬¯ª´·±¼3¸{ÈKÓ;XÕ1XÐ[fÕ1fÓ(gÕ"gÕhˆLÜ"% i×&<Ñ&<¸hÖ"G‘��wÜ'ØØ˜t•^¨°G¸dµNÕ)CÀ|Õ(SÕTöñ #Hð ×%Ñ%Ô'Øœ% §	¡	£Ó,Õ,ˆJØ˜1Õ‹Kñ' *|ð* %¤s¨1¨kÓ':Õ:ˆÜ" 5°kÔSˆØ�m×#Ø$ˆMÜ.¨uÐC\Ô]‹Jñ;  ð> 
×Ñ˜*¨TÐÔ2Ø	×ÑÔØ˜MÐ)Ð)ùòU C÷  —�ús   ÃM?Ç&N	ÎNÚstage_cudagraphc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rZ   r[   rk  rK   r  r   r™  r7  r   rc   r    )r!   s   "r"   r#   r#     s<   € ÷ <ñ <Øð<ð ð<ð ð	<ð
 $ð<ð 
ñ<r$   c               óV  € Vf   \        RRR7      p\        V4      '       g   R# \        V\        P                  4      '       g   R# VP
                  P                  R8w  d   R# \        \        V RR4      4      '       g   R# VP                  ^ ,          \        ^\        V4      4      8¬  # )z[Use CUDA graphs only for real CUDA tensor stages where launch overhead is worth amortizing.Ú'GPTQMODEL_PAROQUANT_OPT_STAGE_CUDAGRAPHTr:  Fr÷   r2  )r   rc   r>   r?   rG  rC   rø   r¡  rê   rÆ   r   )rZ   rk  r  r™  s   &$$$r"   Ú%_should_use_paroquant_stage_cudagraphr�    sŠ   € ð ÒÜ"Ð#LÐVZÔ[ˆÜ�× Ò ÙÜ�l¤E§L¡L×1Ò1ÙØ×Ñ×Ñ 6Ô)ÙÜ”˜Ð/°Ó7×8Ò8ÙØ×Ñ˜aÕ ¤C¨¬3¨z«?Ó$;Ñ;Ð;r$   c               óD   € V ^8„  d   QhRRRRRRRRRRRR	R
RRRRRRRRR/# )r   rZ   r[   rk  rK   rl  rm  rn  r  r  ro  r   r  rL  r   r6   r7   r   rp  r    )r!   s   "r"   r#   r#   ,  s…   € ÷ r*ñ r*àðr*ð ðr*ð  ð	r*ð
 ðr*ð ðr*ð .ðr*ð ðr*ð ðr*ð ðr*ð 2ðr*ð ñr*r$   c        
        óf  € \        V4      p
V^ 8:  g	   V
'       g    \        WVRR7      p\        WVRR7      pW¼3# \        V
VP                  VRR7      p\	        ^\
        P                  ! \	        ^VP                  ^ ,          4      \	        ^V4      ,          4      4      p\	        ^Wn,          4      pV
 Uu. uF  p\        VR,          4      NK  	  pp^ p\        W‘P                  R7      p\        V VR7      p\        R4      p\        WVRR7      p\        P                  ! WqP                  ^,          3VP                  VP                  R	7      p\        P                  ! WrP                  ^,          3VP                  VP                  R	7      p\        P                  P                  VP                  R
7      pVP!                  \        P                  P#                  VP                  4      4       \        P                  P%                  V4      ;_uu_ 4        VRV pVRV p\'        ^4       Fˆ  pVP)                  V4       VP)                  V4       VP+                  RR7       V ! V4      p\,        P.                  ! VV4      pVP1                  4        VP3                  4        V P5                  4        ??KŠ  	  RRR4       \        P                  P#                  VP                  4      P!                  V4       \        P                  P7                  VP                  4       \        P                  P9                  4       pVP+                  RR7       \        P                  P;                  V4      ;_uu_ 4        V ! V4      p\,        P.                  ! VV4      p V P1                  4        VP3                  4        V P5                  4        RRR4       \'        V4       EFþ  p!Rp"^ p#\=        \?        W4      \?        W'4      4       EF™  w  p$p%V^,          pRR\
        P@                  ! \
        PB                  \E        VV4      ,          V,          4      ,           ,          p&\=        VPF                  V4       F5  w  pp'\I        VV'R,          V'V'R,          ,
          V&,          ,           4       K7  	  V$P                  ^ ,          V8X  dM   VP)                  V$4       VP)                  V%4       VPK                  4        \        X PM                  4       4      p(MzVP+                  RR7       V ! V$4      p\,        P.                  ! VV%4      pVP1                  4        VP3                  4        V P5                  4        \        VPM                  4       4      p(V"V(,          p"V#^,          p#EKœ  	  V"\	        ^V#4      ,          p\        WVRR7      pVV8  g   EKï  Tp\        V VR7      pEK  	  V PO                  VRR7       V P5                  4        VV3# u upi   + '       g   i     EL[; i  + '       g   i     EL_; i)zcReplay fixed-size CUDA mini-batches through one captured train-step graph with eager tail fallback.Frr  Trs  r,  ru  rv  rw  rO   rÂ   Nrx  r¾   r¿   rz  r{  r|  )(r8  r  rg  rC   rÆ   r~  r  rê   r¹   rF   r`   r?   rÈ   r@   r÷   ÚStreamÚwait_streamÚcurrent_streamÚstreamr–   Úcopy_r�  r×  r  r‚  rƒ  rä  ÚsynchronizeÚ	CUDAGraphÚgraphr  r  r@  r…  rÇ   r  rJ  Úreplayr  r†  ))rZ   rk  rl  rm  rn  r  ro  r  rL  r6   r6  rü  rý  r‡  rˆ  r‰  r<  rŠ  rŒ  r�  rŽ  r�  r�  Ústatic_inputÚstatic_targetÚwarmup_streamÚ
warm_inputÚwarm_targetr›   r  r  r§  Ústatic_lossr‘  r’  r“  r”  r•  r–  r—  Ú
loss_values)   $$$$$$$$$$                               r"   Ú_run_stage_gptqmodel_cudagraphr°  ,  s  € ô :¸,ÓGÐà�„{×+Ü$ U¸-ÐQVÔWˆ
Ü" 5°kÈ5ÔQˆØÐ#Ð#ä)ØØ×"Ñ"Ø%Øô	€Iô ˜!œTŸYšY¤s¨1¨l×.@Ñ.@ÀÕ.CÓ'DÄsÈ1ÈjÓGYÕ'YÓZÓ[€OÜ�a˜Õ1Ó2€KÙ0AÓBÑ0A u”�e˜D•kÖ"Ñ0A€HÐBØ€KÜ BÐTd÷  nAñ  nAô  !BÐä& uÐ;TÔU€JÜ˜%“L€MÜ% e¸=ÐRWÔX€Oä—;’;Ø	×'Ñ'¨Õ*Ð+Ø×"Ñ"Ø× Ñ ô€Lô
 —K’KØ	×(Ñ(¨Õ+Ð,Ø×#Ñ#Ø×!Ñ!ô€Mô —J‘J×%Ñ%¨\×-@Ñ-@Ð%ÓA€MØ×ÑœeŸj™j×7Ñ7¸×8KÑ8KÓLÔMÜ	�‰×	Ñ	˜=×	)Õ	)Ø! + :Ð.ˆ
Ø# K ZÐ0ˆÜ�q–ˆAØ×Ñ˜zÔ*Ø×Ñ Ô,Ø×Ñ¨DÐÔ1Ù˜,Ó'ˆEÜ×#Ò# E¨=Ó9ˆDØ�M‰MŒOØ�N‰NÔØ×%Ñ%Ô'Ø’tñ ÷ 
*ô 
‡J�J×Ñ˜l×1Ñ1Ó2×>Ñ>¸}ÔMÜ	‡J�J×Ñ˜<×.Ñ.Ô/ä�J‰J× Ñ Ó"€EØ×Ñ DÐÔ)Ü	�‰×	Ñ	˜%×	 Õ	 Ù�lÓ#ˆÜ×&Ò& u¨mÓ<ˆØ×ÑÔØ�‰ÔØ×!Ñ!Ô#÷ 
!ô ˜—-ˆØˆ
Øˆä),¬[¸Ó-RÔT_Ð`mÓTz×){Ñ%ˆK˜Ø˜1ÕˆKØ #¬¯ª´·±¼3¸{ÈKÓ;XÕ1XÐ[fÕ1fÓ(gÕ"gÕhˆLÜ"% i×&<Ñ&<¸hÖ"G‘��wÜ'ØØ˜t•^¨°G¸dµNÕ)CÀ|Õ(SÕTöñ #Hð × Ñ  Õ# zÔ1Ø×"Ñ" ;Ô/Ø×#Ñ# LÔ1Ø—‘”Ü" ;×#3Ñ#3Ó#5Ó6‘
à×#Ñ#°Ð#Ô5Ù˜kÓ*�Ü×'Ò'¨¨|Ó<�Ø—‘”Ø—‘Ô Ø×)Ñ)Ô+Ü" 4§9¡9£;Ó/�
à˜*Õ$ˆJØ˜1Õ‹Kñ1 *|ð4 %¤s¨1¨kÓ':Õ:ˆÜ" 5°kÈ5ÔQˆØ�m×#Ø$ˆMÜ.¨uÐC\Ô]‹JñE  ðH 
×Ñ˜*¨TÐÔ2Ø	×ÑÔØ˜MÐ)Ð)ùòk C÷* 
*×	)Ð	)ú÷& 
!×	 Ð	 ús    Â5XÈB"XÍ9AXØX	ØX0	rL  c               óL   € V ^8„  d   QhRRRRRRRRRRRR	R
RRRRRRRRRRRRR/# )r   rZ   r[   rk  rK   rl  rm  rn  r  r  ro  r   r  r™  r7  rL  r   rh  rc   r6   r7   r   rp  r    )r!   s   "r"   r#   r#   ¡  s›   € ÷ C
ñ C
àðC
ð ðC
ð  ð	C
ð
 ðC
ð ðC
ð .ðC
ð ðC
ð ðC
ð $ðC
ð ðC
ð !ðC
ð 2ðC
ð ñC
r$   c                óö  € \        T TTV
'       d   RMTR7      '       g   \        V VVVVVVVV	V
VR7      # V P                  4       P                  4        UUu/ uF#  w  rÍWÍP	                  4       P                  4       bK%  	  ppp \        V VVVVVVVV	VR7
      # u uppi   \         dO    T P                  TRR7       \        T R4      '       d   T P                  4        \        T TTTTTTTT	T
TR7      u # i ; i)z_Run the fast stage, preferring CUDA-graph replay on fused CUDA paths and falling back to eager.F)rk  r  r™  ©rZ   rk  rl  rm  rn  r  ro  r  rL  rh  r6   )
rZ   rk  rl  rm  rn  r  ro  r  rL  r6   Tr|  rä  )r�  r˜  r]   r^   rP   rS   r°  r¢  r†  Úhasattrrä  )rZ   rk  rl  rm  rn  r  ro  r  r™  rL  rh  r6   r_   rJ   Úinitial_states   $$$$$$$$$$$$   r"   Ú_run_stage_gptqmodelr¶  ¡  s3  € ô  1ØØ!Øß!7™¸_÷	ó ô )ØØ%Ø'Ø!Ø#Ø%ØØ!Ø)Ø#9Ø-ô
ð 	
ð FK×EUÑEUÓEW×E]ÑE]ÔE_Ô`ÑE_±k°c�SŸ-™-›/×/Ñ/Ó1Ò1ÑE_€MÑ`ð
Ü-ØØ%Ø'Ø!Ø#Ø%ØØ!Ø)Ø-ô
ð 	
ùó aøô ô 
Ø×Ñ˜m°DÐÔ9Ü�5Ð/×0Ò0Ø×%Ñ%Ô'Ü(ØØ%Ø'Ø!Ø#Ø%ØØ!Ø)Ø#9Ø-ô
ò 	
ð	
ús   Á)BÂB ÂAC8Ã7C8c               óH   € V ^8„  d   QhRRRRRRRRRRRR	R
RRRRRRRRRRR/# rj  r    )r!   s   "r"   r#   r#   ç  s�   € ÷ K*ñ K*àðK*ð ðK*ð  ð	K*ð
 ðK*ð ðK*ð .ðK*ð ðK*ð ðK*ð ðK*ð !ðK*ð 2ðK*ð ñK*r$   c                óX  € \        V4      pVP                  P                  R8H  pV^ 8:  g	   V'       g   \        WW,R7      p\        WWLR7      pWÞ3# \	        VVP                  VRR7      p\        ^\        P                  ! \        ^VP                  ^ ,          4      \        ^V4      ,          4      4      p\        ^VV,          4      pV Uu. uF  p\        VR,          4      NK  	  pp\        P                  P                  VR7      p^ p\        W¡P                  R7      p\        V VR7      p\        WWLR7      p\        WW,R7      p\        V4       EF  pR	p^ pVP!                  R
R7       \#        \%        W4      \%        W'4      4       EF�  w  ppV'       d    \        P                  P'                  R4      M	\)        4       pV;_uu_ 4        \+        V VV	R7      p \,        P.                  ! V V4      p!RRR4       VP1                  X!4      P3                  4        VP5                  V4       VP7                  4        VP!                  R
R7       V^,          pRR\        P8                  ! \        P:                  \=        VV4      ,          V,          4      ,           ,          p"\#        VP>                  V4       F5  w  pp#\A        VV#R,          V#V#R,          ,
          V",          ,           4       K7  	  V PC                  4        V\        V!PE                  4       4      ,          pV^,          pEK   	  V\        ^V4      ,          p\        WWLR7      pVV8  g   EK  Tp\        V VR7      pEK  	  V PG                  VR
R7       V PC                  4        VV3# u upi   + '       g   i     EL­; i)zBOfficial-parity stage runner: AMP + GradScaler + cosine LR update.r÷   rr  Frs  r,  rt  ru  rv  r¾   Trx  Nr¿   rz  r{  r|  )$r8  rC   rø   r  rg  rÆ   r~  r  rê   r¹   r?   r  r€  rF   r`   r–   r�  r  r  r  r   rv   r×  r  rh  r‚  rƒ  r„  r@  r…  rÇ   r  rJ  rä  r  r†  )$rZ   rk  rl  rm  rn  r  ro  r  rL  rh  r6   r6  r  rü  rý  r‡  rˆ  r‰  r<  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r›   r’  r“  r”  r•  r  r  r  r–  r—  s$   $$$$$$$$$$$                         r"   Ú_run_stage_referencer¹  ç  s  € ô :¸,ÓGÐà×!Ñ!×&Ñ&¨&Ñ0€GØ�„{×+Ü$ U¸-ÔYˆ
Ü" 5°kÔSˆØÐ#Ð#ä)ØØ×"Ñ"Ø%Øô	€Iô ˜!œTŸYšY¤s¨1¨l×.@Ñ.@ÀÕ.CÓ'DÄsÈ1ÈjÓGYÕ'YÓZÓ[€OÜ�a˜ /Õ1Ó2€KÙ0AÓBÑ0A u”�e˜D•kÖ"Ñ0A€HÐBÜ�Y‰Y×!Ñ!¨'Ð!Ó2€FØ€KÜ BÐTd÷  nAñ  nAô  !BÐä& uÐ;TÔU€JÜ# E°{ÔT€MÜ% e¸=ÔZ€Oä�6�]ˆØˆ
ØˆØ×Ñ¨ÐÔ-ä),¬[¸Ó-RÔT_Ð`mÓTz×){Ñ%ˆK˜ß9@œ5Ÿ9™9×-Ñ-¨fÔ5ÄkÃmˆLß’Ü-¨e°[ÐJ`Ôa�Ü×'Ò'¨¨|Ó<�÷ ð �L‰L˜Ó×'Ñ'Ô)Ø�K‰K˜	Ô"Ø�M‰MŒOØ×Ñ¨DÐÔ1à˜1ÕˆKØ #¬¯ª´·±¼3¸{ÈKÓ;XÕ1XÐ[fÕ1fÓ(gÕ"gÕhˆLÜ"% i×&<Ñ&<¸hÖ"G‘��wÜ'ØØ˜t•^¨°G¸dµNÕ)CÀ|Õ(SÕTöñ #Hð ×%Ñ%Ô'Øœ% §	¡	£Ó,Õ,ˆJØ˜1Õ‹Kñ) *|ð, %¤s¨1¨kÓ':Õ:ˆÜ" 5°kÔSˆØ�m×#Ø$ˆMÜ.¨uÐC\Ô]‹Jñ? ðB 
×Ñ˜*¨TÐÔ2Ø	×ÑÔØ˜MÐ)Ð)ùòY C÷  —�ús   ÃNÇ&N	ÎN)c               óP   € V ^8„  d   QhRRRRRRRRRRRR	R
RRRRRRRRRRRRRRR/# )r   rZ   r[   rk  rK   rl  rm  rn  r  r  ro  r   r  Ú
stage_implr   r™  r7  rL  rh  rc   r6   r7   r   rp  r    )r!   s   "r"   r#   r#   5  s–   € ÷ -
ñ -
àð-
ð ð-
ð  ð	-
ð
 ð-
ð ð-
ð .ð-
ð ð-
ð ð-
ð ð-
ð $ð-
ð ð-
ð !ð-
ð 2ð-
ð ñ-
r$   c                óü   € \        VR R7      p\        W4      ;_uu_ 4        VR8X  d!   \        V VVVVVVVV
VVR7      uuRRR4       # \        V VVVVVVVV	V
VVR7      uuRRR4       #   + '       g   i     R# ; i)r»  ©r   rf   r³  N)rZ   rk  rl  rm  rn  r  ro  r  r™  rL  rh  r6   )r,   r  r¹  r¶  )rZ   rk  rl  rm  rn  r  ro  r  r»  r™  rL  rh  r6   rg   s   $$$$$$$$$$$$$ r"   Ú
_run_stager¾  5  s‘   € ô  ˜z°Ô>€DÜ	 ×	4Õ	4Ø�;ÔÜ'ØØ)Ø+Ø%Ø'Ø)ØØ%Ø-Ø'=Ø!1ô÷ 
5Ò	4ô $ØØ%Ø'Ø!Ø#Ø%ØØ!Ø+Ø)Ø#9Ø-ô
÷ 
5×	4×	4Ó	4ús   ¡A*Á	A*Á*A;	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rZ   r­  rü  r¹   rý  rþ  rc   r   rø  r    )r!   s   "r"   r#   r#   e  s<   € ÷ ñ Ø ðð ðð ð	ð
 ðð !ñr$   c               óP  € V P                  4       w  rErgr‰\        V	P                  4       VP                  4       VP                  4       VP                  4       V P                  P                  4       VP                  4       VP                  4       \	        V4      \	        V4      VR7
      # )zKExport one optimized linear replay module into the runtime tensor contract.©
rÒ  rù  rú  rû  r¬   r4  rÑ  rü  rý  rþ  )rð  rø  rP   r¬   r¹   )
rZ   rü  rý  rþ  rù  rú  rû  r4  rÑ  rÒ  s
   &$$$      r"   Ú_result_from_modelrÂ  e  s‹   € ð LQ×KfÑKfÓKhÑH€K˜7¨>Ü&Ø#×*Ñ*Ó,Ø×&Ñ&Ó(Ø—‘Ó"Ø—‘Ó Ø�k‰k× Ñ Ó"Ø�l‰l‹nØ%×,Ñ,Ó.Ü˜Ó$Ü�x“Ø#ôð r$   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   rW  rK   r±  r6  r]  r   r~   r²  rc   r·   r   rø  r    )r!   s   "r"   r#   r#   |  sP   € ÷ -ñ -àð-ð !ð-ð ð	-ð
 ð-ð ð-ð ð-ð !ñ-r$   c                ó²  € ?\        V P                  ^,          VVV P                  V P                  R7      w  rgp\	        V V\        W0P                  ^,          4      VR7      p	V	P                  V 4      w  r«\        T T\        W0P                  ^,          4      TV	P                  P                  4       V	P                  f   RMV	P                  P                  4       RR7      p\        VP                  4       VP                  4       V
P                  4       VP                  4       VP                  4       VP                  4       VP                  4       RRRR7
      # )	zRReturn the no-optimization fallback used when calibration activations are missing.)r€   r~   r·   rC   r@   rÈ  NFrz  r¾   TrÁ  )r   rê   rC   r@   rl  r…   r‡  rœ  rh  rP   ri  rø  )rW  r±  r]  r~   r²  r·   r¬   r4  rÑ  r¸  rú  rû  rù  s   $$$$$$       r"   Ú_identity_resultrÅ  |  s&  € ð 	Ü#BØ—L‘L •OØØØ�}‰}Ø�l‰lô$Ñ €E�.ô %ØØÜ(¨·\±\À!µ_ÓEØô	€Ið "×-Ñ-¨fÓ5Ñ€HÜ)ØØÜ(¨·\±\À!µ_ÓEØØ�o‰o×$Ñ$Ó&Ø!*×!;Ñ!;Ò!C™È×IcÑIc×IjÑIjÓIlØô€Kô 'Ø!×(Ñ(Ó*Ø×&Ñ&Ó(Ø—‘Ó"Ø—‘Ó Ø�l‰l‹nØ�l‰l‹nØ%×,Ñ,Ó.ØØØôð r$   Úoptimizer_weight_decayr.  Úoptimizer_betasÚoptimizer_epsr0  Úoptimizer_amsgradÚsgd_momentumr¾   Úsgd_dampeningÚsgd_nesterovr»  Ú	pair_implrd   r®  r¯  c          F     ó¤   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRR R
R!R"R#R"R$R%R&R%R'R%R(R
R)R*R+RR,RR-R./## )/r   rW  rK   r±  r6  r*  r]  r   r~   rb   rc   r·   r¸   r¹   Ú
train_rowsÚval_rowsr  Úrotation_epochsÚfinetune_epochsÚrotation_lrÚ	weight_lrÚquantizer_lrrº   rL  r   rÆ  rÇ  rp  rÈ  rÉ  rÊ  rË  rÌ  r2  r7  r™  r»  zLiteral['fast', 'reference']rÍ  rd   rh  r6   r7   r®  r¯  r   rø  r    )r!   s   "r"   r#   r#   ¬  s—  € ÷ Añ AàðAð !ðAð ð	Að
 ðAð ðAð 
ðAð ðAð ðAð ðAð ðAð ðAð ðAð ðAð ðAð  ð!Að" ð#Að$ ð%Að& ð'Að( "ð)Að* )ð+Að, ð-Að. ð/Að0 ð1Að2 ð3Að4 ð5Að6 #ð7Að8 $ð9Að: -ð;Að< ,ð=Að> 1ð?Að@ !ðAAðB 2ðCAðD ðEAðF ðGAðH !ñIAr$   c        "        ó~  € \        V4       V P                  4       ^8w  d#   \        R\        V P                  4       R24      h\        W@P                  ^,          4      p"\        VV4      p#\        V4      p$\        V^ ,          4      \        V^,          4      3p%\        V\        ^\        V4      \        V	4      ,           4      R7      p&V&P                  4       ^ 8X  d   \        V VVV"V#VR7      # V P                  p'\        P                   p(V P#                  4       P%                  V'V(R7      p)Vf   RM VP#                  4       P%                  V'V(R7      p*V&P%                  V'V(R7      p&\&        P(                  ! V&V)V*4      p+\+        V&P                  ^ ,          \        ^\        V4      4      4      p,\+        \        ^\        V	4      4      \        ^V&P                  ^ ,          V,,
          4      4      p-V&RV, p.V+RV, p/V&V-) R p0V+V-) R p1V.P                  4       ^ 8X  g   V/P                  4       ^ 8X  d   \        R4      h\-        VRR	7      p2\-        VR
R	7      p3\/        V4       V2R8X  d'   \1        V)P                  ^,          V"VVVV'R7      w  p4p5M%\3        V)P                  ^,          V"VVVV'R7      w  p4p5\5        V)V*VV"V#V4V5V V!VR7
      P%                  V'V(R7      p6V6P7                  4        \9        V6V.V/V0V1RV6P:                  .RVRVRV%RVRVRVRVRV/	RV6P<                  .RVRVRV%RVRVRVRVRV/	.VV
V3VV$VVR7       V6P?                  4        \9        V6V.V/V0V1RV6P@                  .RVRVRV%RVRVRVRVRV/	RV6PB                  PE                  4       RVRVRV%RVRVRVRVRV/	.VV
V3VV$VVR7      w  p7p8\G        V6V7V8RR7      # )zGOptimize one linear layer following the paper's two-stage PTQ schedule.z3ParoQuant optimization expects rank-2 weights, got r‚   )r+  )rW  r±  r]  r~   r²  r·   rO   Nz?ParoQuant optimization requires non-empty training activations.rÍ  r½  r»  rf   )r€   r~   r·   r¸   rº   rC   )r]  r~   r²  r¬   r³  r®  r¯  r2  r�  r,  r-  r+  r/  r1  r2  r3  r4  )rZ   rk  rl  rm  rn  r  ro  r  r»  r™  rL  rh  r6   F)rü  rý  rþ  )$r‰   r�   r*   r<  rê   r…   rh   r4   r¹   r1  rÆ   r   r¨  rÅ  rC   r?   r=   rP   rR   r×  rØ  rÇ   r,   r1   r(  rû   r­  rä  r¾  r·  r4  rè  rW  r¸  r‚  rÂ  )9rW  r±  r*  r]  r~   rb   r·   r¸   rÏ  rÐ  r  rÑ  rÒ  rÓ  rÔ  rÕ  rº   rL  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  r2  r™  r»  rÍ  rd   rh  r6   r®  r¯  rÎ   r²  Únormalized_optimizer_nameÚnormalized_optimizer_betasr/  Ú
opt_deviceÚ	opt_dtypeÚ
weight_optÚbias_optr  Útrain_countÚ	val_countrk  rl  rm  rn  Únormalized_pair_implÚnormalized_stage_implr¬   r³  rZ   rü  rý  s9   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$                       r"   Úoptimize_paroquant_linearrá  ¬  s]  € ôL ˜3ÔØ‡z�zƒ|�qÔÜÐNÌuÐU[×UaÑUaÓObÐNcÐcdÐeÓfÐfä1°*¿l¹lÈ1½oÓNÐÜ+¨C°Ó@€MÜ 8¸Ó HÐÜ"'¨¸Õ(:Ó";¼UÀ?ÐSTÕCUÓ=VÐ!WÐÜ" 6´C¸¼3¸z»?ÌSÐQYË]Õ;ZÓ4[Ô\€DØ‡z�zƒ|�qÔÜØØØØ,Ø'Øô
ð 	
ð —‘€JÜ—‘€IØ—‘“×#Ñ#¨:¸YÐ#ÓG€JØ’|‰t¨¯©«×)9Ñ)9ÀÐS\Ð)9Ó)]€HØ�7‰7˜*¨Iˆ7Ó6€Dä�hŠh�t˜Z¨Ó2€GÜ�d—j‘j •m¤S¨¬C°
«OÓ%<Ó=€KÜ”C˜œ3˜x›=Ó)¬3¨q°$·*±*¸Qµ-À+Õ2MÓ+NÓO€IØ˜˜Ð%€LØ˜L˜[Ð)€MØ�y�j�kÐ"€JØ˜9˜*˜+Ð&€Kà×ÑÓ˜qÔ  M×$7Ñ$7Ó$9¸QÔ$>ÜÐZÓ[Ð[ä.¨yÀÔLÐÜ/°
À,ÔOÐÜ˜nÔ-Ø˜{Ô*ÜCØ"×(Ñ(¨Õ+Ø,ØØ!ØØô
Ñˆ‰zô :Ø"×(Ñ(¨Õ+Ø,ØØ!ØØô
Ñˆˆzô "ØØØØ(Ø#ØØØ'Ø'Ø%ô÷ 	�b�
 )€bÓ,ð 
ð 
×ÑÔäØØ!Ø#ØØð ˜5×3Ñ3Ð4Ø�kØÐ 6ØÐ3Ø�}ØÐ,Ø˜LØ˜]Ø˜Lð
ð ˜5Ÿ;™;˜-Ø�kØÐ 6ØÐ3Ø�}ØÐ,Ø˜LØ˜]Ø˜Lð
ð
ð0 ØØ(Ø'Ø0Ø5Ø)õI%ðN 
×ÑÔÜ%ØØ!Ø#ØØð ˜5Ÿ<™<˜.Ø�iØÐ 6ØÐ3Ø�}ØÐ,Ø˜LØ˜]Ø˜Lð
ð ˜%Ÿ/™/×6Ñ6Ó8Ø�lØÐ 6ØÐ3Ø�}ØÐ,Ø˜LØ˜]Ø˜Lð
ð
ð0 ØØ(Ø'Ø0Ø5Ø)ôI%Ñ€J�ôN ØØØØô	ð r$   )r   rf   )r   rX  rN  )r9   r:   r   )NNr5  )rø  rg  rû   rá  rœ  )]Ú__conditional_annotations__r�  Ú
__future__r   r~  rÄ   Ú
contextlibr   r   Údataclassesr   Ú	functoolsr   Útypingr   r   r	   r
   r?   Útorch.nn.functionalr   Ú
functionalr×  Útorch.utils.checkpointr   rt   Ú	utils.envr   Úutils.paroquantr   r   r   Úconfigr   r   r   rÿ  r   r   r   r©  r,   r1   r4   rA   rF   rX   r`   rh   rn   rv   r|   r…   r‰   r    r´   rØ   râ   ró   rû   r  r  r(  r1  rP  rU  r[  rj  ÚModulerl  rœ  r¤  r|  r­  rø  r  r  r  r8  r?  rC  rJ  rg  r˜  r�  r°  r¶  r¹  r¾  rÂ  rÅ  rá  Ú__all__)râ  s   @r"   Ú<module>rð     sò  øðôõ #ã Û ß 2Ý !Ý ß 8Ó 8ã ß Ð Ý Ý Aå !÷ñ ÷
 bð 0EÐ ˜_Ó DØ.CÐ ˜OÓ CØ)AÐ �Ó Aà0HÐ ˜oÓ HØ1:Ð .õõõõõ2ðð -1ðð +/÷	ð&
ð -1ð
ð +/÷	
õõ(ð
BÈ÷ B÷<õõ]õõD)õX/ñd �2Ôô3ó ð3õ$.:õb õ8ð<@(ð
 ÷@(õF1jõh)ðCð &*÷CðLð &*÷õ*0õ#ô 8˜2Ÿ9™9ô 8ðv,0ð %)ð,0ð 04÷,0ñ^ �1Ôñó ðð%ð %)ð%ð 04ð%ð ÷%ôPyQ˜BŸI™Iô yQðx ÷ð ó ðõ-ð ô2ó ð2ð0"ð
 ÷"õ$õ2	õGõ%ð>Pð
  ÷>PðBI*ð $)ðI*ð 5;÷I*ðX<ð
 '+÷<ð*r*ð 5;÷r*ðjC
ð '+ðC
ð "ðC
ð $)ðC
ð 5;÷C
ðLK*ð $)ðK*ð 5;÷K*ð\-
ð '+ð-
ð "ð-
ð $)ð-
ð 5;÷-
õ`õ.-ð`Að& "ð'Að( %)ð)Að* ,7ð+Að, !ð-Að. $ð/Að0 ð1Að2 ð3Að4 ð5Að6 &*ð7Að8 '+ð9Að: 06ð;Að< /5ð=Að> 4:ð?Að@ $)ðAAðB 5;ðCAðD CðEAðF C÷GAòH‚r$   