ó
    >:j†%  ã                  ól  • S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	J
r
  S SKrS SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJr  SS jr      SS jr\R2                  " 5       SSS.       SS jj5       r\R2                  " 5       SSSSS.           SS jj5       rSS.       SS jjrg)é    )Úannotations)ÚSequence)Úreplace)ÚPath)ÚAnyÚOptionalN)Ú	save_file)Ú
PeftConfig)ÚPeftType)ÚSAFETENSORS_WEIGHTS_NAMEÚWEIGHTS_NAME)Úload_peft_weightsc                ó~  • [        U [        [        45      (       a  U $ [        U SS 5      n[	        U5      (       a  U" 5       $ [        U S5      (       a\  [        U 5      nU(       aJ  [        US   [        [        45      (       a,  [        US   5      S:¼  a  U Vs/ s H  o3S   US   4PM     sn$ [        S5      es  snf )NÚto_legacy_cacheÚ__iter__r   é   é   zŒUnsupported `past_key_values` type. Expected a legacy tuple/list, an object with `to_legacy_cache()`, or an iterable of (key, value) tuples.)Ú
isinstanceÚtupleÚlistÚgetattrÚcallableÚhasattrÚlenÚ	TypeError)Úpast_key_valuesÚ	to_legacyÚlegacyÚlayers       ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/tuners/cartridge/utils.pyÚ_to_legacy_past_key_valuesr!      s°   € ä�/¤E¬4 =×1Ñ1ØÐÜ˜Ð):¸DÓA€IÜ�	×ÑÙ‹{ÐÜˆ 
×+Ñ+Ü�oÓ&ˆÞ”j ¨¡¬U´D¨M×:Ñ:¼sÀ6È!Á9»~ÐQRÓ?RÙ6<Ó=²f¨U˜1‘X˜u Q™xÓ(±fÑ=Ð=Ü
ð	+óð ùò >s   ÂB:c          	     ón  • [        U 5      n[        U5      S:X  a  [        S5      e[        U5      nUS   u  pEUR                  S:w  a  [        SUR                   S35      eUR                  S   S:w  a  [        SUR                  S    S35      eUR                  S   nUR                  S   nUR                  S	   nXq:  a  [        S
U SU S35      e[
        R                  " UUS-  UUUR                  UR                  S9n	[        U5       GH  u  n
u  p¼UR                  SS SU4:w  d  UR                  SS SU4:w  a  [        S5      eUR                  S   U:  d  UR                  S   U:  a  [        S5      eUR                  S	   U:w  d  UR                  S	   U:w  a  [        S5      eUSSS2SU2SS24   R                  SS5      R                  5       U	SS2SU
-  4'   USSS2SU2SS24   R                  SS5      R                  5       U	SS2SU
-  S-   4'   GM     U	R                  US5      $ )a  
Convert a (legacy) `past_key_values` cache into the flattened prompt embeddings tensor saved by PEFT.

The output matches the layout expected by `PeftModel.get_prompt()` for prefix-style prompt learning: shape
`[num_virtual_tokens, num_layers * 2 * token_dim]`.
r   zEmpty `past_key_values`.é   z5Expected key/value tensors with rank 4, got key.ndim=Ú.r   zZThis helper expects `past_key_values` from a single-sequence prefill (batch=1). Got batch=r   é   zNeed at least z cached tokens, got )ÚdeviceÚdtypeNz<Inconsistent head shapes across layers in `past_key_values`.zQNot enough cached tokens in `past_key_values` for the requested cartridge length.z9Inconsistent head_dim across layers in `past_key_values`.éÿÿÿÿ)r!   r   Ú
ValueErrorÚndimÚshapeÚtorchÚemptyr&   r'   Ú	enumerateÚ	transposeÚ
contiguousÚreshape)r   Únum_virtual_tokensr   Ú
num_layersÚkey0Úvalue0Ú	num_headsÚseq_lenÚhead_dimÚpackedÚ	layer_idxÚkÚvs                r    Ú&prompt_embeddings_from_past_key_valuesr=   0   sU  € ô (¨Ó8€FÜ
ˆ6ƒ{�aÓÜÐ3Ó4Ð4ô �V“€JØ˜!‘9�L€DØ‡y�y�Aƒ~ÜÐPÐQU×QZÑQZÐP[Ð[\Ð]Ó^Ð^Ø‡z�z�!�}˜ÓÜðØŸ™ A™˜ qð*ó
ð 	
ð —
‘
˜1‘€IØ�j‰j˜‰m€GØ�z‰z˜!‰}€HØÓ#Ü˜>Ð*<Ð)=Ð=QÐRYÐQZÐZ[Ð\Ó]Ð]ä�[Š[ØØ�Q‰ØØØ�{‰{Ø�j‰jñ€Fô ' v×.Ñˆ	‘6�AØ�7‰7�2�Aˆ;˜1˜i˜.Ó(¨A¯G©G°B°Q¨K¸A¸y¸>Ó,IÜÐ[Ó\Ð\Ø�7‰7�1‰:Ð*Ó*¨a¯g©g°a©jÐ;MÓ.MÜÐpÓqÐqØ�7‰7�1‰:˜Ó! Q§W¡W¨Q¡Z°8Ó%;ÜÐXÓYÐYØ#$ QªÐ+>Ð,>Ð+>ÂÐ%AÑ#B×#LÑ#LÈQÐPQÓ#R×#]Ñ#]Ó#_ˆŠq�!�i‘-ÐÑ Ø'(¨ªAÐ/BÐ0BÐ/BÂAÐ)EÑ'F×'PÑ'PÐQRÐTUÓ'V×'aÑ'aÓ'cˆŠq�!�i‘- !Ñ#Ð#Ô$ñ /ð �>‰>Ð,¨bÓ1Ð1ó    )Úadapter_namer2   c               ó|  • Uc  U R                   nU R                  U   nUR                  [        R                  [        R
                  4;  a  [        SU SUR                   S35      e[        USS5      (       a  [        S5      eUc  UR                  n[        X#S9nU R                  U   R                  U5        U$ )z¬
Initialize a KV-prefix prompt-learning adapter from an existing cached prefix (`past_key_values`).

Returns the prompt embeddings tensor that was loaded into the adapter.
ú	Adapter 'ú4' must be a CARTRIDGE or PREFIX_TUNING adapter (got ú).Úprefix_projectionFú^Initialization from KV cache is not supported for prefix tuning with `prefix_projection=True`.)r2   )Úactive_adapterÚpeft_configÚ	peft_typer   Ú	CARTRIDGEÚPREFIX_TUNINGr)   r   r2   r=   Úprompt_encoderÚload_prompt_embeddings)Úmodelr?   r   r2   ÚconfigÚprompt_embeddingss         r    Ú)initialize_kv_prefix_from_past_key_valuesrP   d   sÎ   € ð ÑØ×+Ñ+ˆØ×Ñ˜|Ñ,€FØ×Ñ¤× 2Ñ 2´H×4JÑ4JÐKÓKÜØ˜�~Ð%YÐZ`×ZjÑZjÐYkÐkmÐnó
ð 	
ô ˆvÐ*¨E×2Ñ2ÜØló
ð 	
ð Ñ!Ø#×6Ñ6Ðä>¸ÑvÐØ	×Ñ˜Ñ&×=Ñ=Ð>OÔPØÐr>   T)r?   r2   Úuse_chat_templateÚ
max_lengthc               ó  ^^^• Uc  U R                   nU R                  U   nUR                  [        R                  [        R
                  4;  a  [        SU SUR                   S35      e[        USS5      (       a  [        S5      eUc  UR                  nUUU4S jnU(       aK  [        TS	5      (       a:   TR                  S
TS./SSSSS9n	Tb  U	R                  S   T:”  a  U	SS2ST24   n	OU" 5       n	U	R                  U R                  5      n	[        R                   " U	5      n
U R#                  5          U " XšSS9nSSS5        [%        U UWR&                  US9$ ! [        [        4 a
    U" 5       n	 N€f = f! , (       d  f       NA= f)zq
Convenience initializer: prefill the base model on `text` and load the resulting cache prefix into the adapter.
NrA   rB   rC   rD   FrE   c                 ó$   >• T" TSTS LTS9n U S   $ )NÚpt)Úreturn_tensorsÚ
truncationrR   Ú	input_ids© )ÚtoksrR   ÚtextÚ	tokenizers    €€€r    Ú_tokenize_plainÚ7initialize_kv_prefix_from_text.<locals>._tokenize_plain    s%   ø€ Ù˜¨d¸zÐQUÐ?UÐblÑmˆØ�KÑ Ð r>   Úapply_chat_templateÚsystem)ÚroleÚcontentTrU   )ÚtokenizeÚadd_generation_promptÚreturn_dictrV   r   )rX   Úattention_maskÚ	use_cache)r?   r   r2   )rF   rG   rH   r   rI   rJ   r)   r   r2   r   r_   r+   r   Útor&   r,   Ú	ones_likeÚdisable_adapterrP   r   )rM   r\   r[   r?   r2   rQ   rR   rN   r]   rX   rf   Úoutputss    ``   `     r    Úinitialize_kv_prefix_from_textrl   „   s£  ú€ ð ÑØ×+Ñ+ˆØ×Ñ˜|Ñ,€FØ×Ñ¤× 2Ñ 2´H×4JÑ4JÐKÓKÜØ˜�~Ð%YÐZ`×ZjÑZjÐYkÐkmÐnó
ð 	
ô ˆvÐ*¨E×2Ñ2ÜØló
ð 	
ð Ñ!Ø#×6Ñ6Ð÷!ö œW YÐ0E×FÑFð	6Ø!×5Ñ5Ø"¨tÑ4Ð5ØØ&+Ø!Ø#ð 6ð ˆIð Ñ%¨)¯/©/¸!Ñ*<¸zÓ*IØ%¢a¨¨*¨ nÑ5�	øá#Ó%ˆ	à—‘˜UŸ\™\Ó*€IÜ—_’_ YÓ/€NØ	×	Ñ	Õ	 Ù )ÐVZÑ[ˆ÷ 
!ä4ØØ!Ø×/Ñ/Ø-ñ	ð øô œ:Ð&ó 	*á'Ó)ŠIð	*ú÷ 
!Õ	 ús   Â9E  Ä:E=Å E:Å9E:Å=
F)Úsafe_serializationc               ó   • U  Vs/ s H  n[        U5      PM     n n[        U 5      S:  a  [        S5      eU  Vs/ s H"  n[        R                  " [        U5      5      PM$     nn[        X5       H?  u  p5UR                  [        R                  :w  d  M%  [        SU SUR                   S35      e   US   nUSS  H5  nS	 H,  n[        XWS5      [        XgS5      :w  d  M  [        S
U S35      e   M7     U  Vs/ s H  n[        [        U5      SS9PM     nnU V	s/ s H  o™S   PM	     n
n	[        R                  " U
SS9nUR                  S   nUR                  n[!        XlUS9n[        U5      nUR#                  SSS9  UR%                  [        U5      5        U(       a  ['        SU0[        U[(        -  5      5        g[        R*                  " SU0[        U[,        -  5      5        gs  snf s  snf s  snf s  sn	f )zÆ
Compose multiple CARTRIDGE adapters by concatenating their prompt embeddings.

This implements the paper's "composition via concatenation" behavior at the adapter level (no runtime
multi-adapter).
r   z$Need at least 2 adapters to compose.zAdapter at 'z"' is not a CARTRIDGE adapter (got rC   r   r   N)Ú	task_typeÚ	token_dimr3   Únum_attention_headsÚnum_transformer_submodulesz.Incompatible CARTRIDGE configs for attribute 'z'.Úcpu)r&   rO   )Údim)r2   Únum_frozen_tokensT)ÚparentsÚexist_ok)r   r   r)   r
   Úfrom_pretrainedÚstrÚziprH   r   rI   r   r   r,   Úcatr+   ru   r   ÚmkdirÚsave_pretrainedr	   r   Úsaver   )Úadapter_pathsÚoutput_pathrm   ÚpÚconfigsÚcfgÚbaseÚattrÚweightsÚwrO   Úcomposedr2   ru   Úout_cfgs                  r    Úcompose_cartridge_adaptersrŠ   Â   sé  € ñ '4Ó4¢m ”T˜!–W¡m€MÐ4Ü
ˆ=Ó˜AÓÜÐ?Ó@Ð@á;HÓIº=°aŒz×)Ò)¬#¨a«&Ö1¹=€GÐIÜ�mÖ-‰ˆØ�=‰=œH×.Ñ.Õ.Ü˜|¨A¨3Ð.PÐQT×Q^ÑQ^ÐP_Ð_aÐbÓcÐcñ .ð �1‰:€DØ�q�r‹{ˆÛqˆDÜ�s $Ó'¬7°4¸tÓ+DÕDÜ Ð#QÐRVÐQWÐWYÐ!ZÓ[Ð[ó rñ ñ
 ANÓNÂ¸1Ô ¤ Q£°Ô6Á€GÐNÙ9@ÓAº°AÐ.Ô/¹ÐÐAÜ�yŠyÐ*°Ñ2€Hà!Ÿ™¨Ñ*Ðà×.Ñ.ÐÜ�dÐUfÑg€Gä�{Ó#€KØ×Ñ˜d¨TÐÑ2Ø×ÑœC Ó,Ô-æÜÐ&¨Ð1´3°{ÔE]Ñ7]Ó3^Õ_ä�
Š
Ð'¨Ð2´C¸ÄlÑ8RÓ4SÕTùò? 5ùò Jùò OùÚAs   …G,º)G1Ã:G6ÄG;)r   r   )r   r   r2   ÚintÚreturnútorch.Tensor)r?   úOptional[str]r   r   r2   úOptional[int]rŒ   r�   )r[   ry   r?   rŽ   r2   r�   rQ   ÚboolrR   r�   rŒ   r�   )r   zSequence[str | Path]r€   z
str | Pathrm   r�   rŒ   ÚNone)Ú
__future__r   Úcollections.abcr   Údataclassesr   Úpathlibr   Útypingr   r   r,   Úsafetensors.torchr	   Úpeft.configr
   Ú
peft.utilsr   Úpeft.utils.constantsr   r   Úpeft.utils.save_and_loadr   r!   r=   Úno_gradrP   rl   rŠ   rY   r>   r    Ú<module>r�      s3  ðõ #å $Ý Ý ß  ã Ý 'å "Ý ß GÝ 6ôð"12Øð12ð ð12ð ô	12ðh ‡‚ƒð #'à(,ñð  ðð ð	ð
 &ðð ôó ðð> ‡‚ƒð #'Ø(,Ø"Ø $ñ:ð ð	:ð
  ð:ð &ð:ð ð:ð ð:ð ô:ó ð:ðB  $ñ	+UØ'ð+Uð ð+Uð ð	+Uð
 
ö+Ur>   