ó
    ‡Ž¡jV)  ã                   óL  • % S r SSKrSSK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Jr  SSKJrJrJrJr  SS	KJr  SS
KJr  \(       a  SSKJr  SSKJr  \R4                  " \5      r0 r\\\\ \\\ \	RB                     4   4   4   \"S'    " S S5      r# " S S5      r$ " S S\#5      r%SSSSS\S\#S\\\ \	RB                     4   4
S jr&SSSSS\S\#SS4
S jr'S\%" 5       0r(\\\#4   \"S'   S\\\)\\\4   -  4   S\*\   4S  jr+ S"SSS\\\)\\\4   -  4   S-  SS4S! jjr,g)#zrFusion registration helpers.

See `docs/source/en/fusion_mapping.md` for the design overview and extension guide.
é    N)ÚMapping)ÚTYPE_CHECKINGÚAny)Únné   )Ú!get_checkpoint_conversion_mappingÚ&register_checkpoint_conversion_mapping)ÚConv3dToLinearÚWeightConverterÚWeightRenamingÚWeightTransform)Úregister_patch_mapping)Úlogging)ÚPretrainedConfig)ÚPreTrainedModelÚ_FUSION_DISCOVERY_CACHEc                   óÈ   • \ rS rSr% SrSr\\S4   \S'   S\S\4S jr	S	\
R                  S\4S
 jrS\\
R                     S\\
R                     4S jrSSS\\   4S jrSrg)ÚModuleFusionSpecé,   zïBase recipe for a fusion family.

A fusion spec decides which modules are eligible for a fusion, how to build
the runtime replacement class, and which weight transforms are needed to map
checkpoints between the original and fused layouts.
© .Útarget_modules_patternsÚ
model_nameÚreturnc                 ó8   • S[        U 5      R                   SU 3$ )zDReturn the log message emitted when no compatible modules are found.zNo compatible z classes found to fuse for )ÚtypeÚ__name__)Úselfr   s     Ú©C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/fusion_mapping.pyÚget_empty_logÚModuleFusionSpec.get_empty_log6   s"   € à¤ T£
× 3Ñ 3Ð4Ð4OÐPZÈ|Ð\Ð\ó    Úmodulec                 ó   • [         e)z>Return whether `module` is compatible with this fusion family.©ÚNotImplementedError)r   r"   s     r   Ú
is_fusableÚModuleFusionSpec.is_fusable:   ó   € ä!Ð!r!   Úoriginal_clsc                 ó   • [         e)zBBuild the runtime replacement class for a compatible module class.r$   )r   r)   s     r   Úmake_fused_classÚ!ModuleFusionSpec.make_fused_class>   r(   r!   Úconfigr   c                 ó   • [         e)zMBuild the weight transforms needed to load and save the fused runtime layout.r$   )r   r-   s     r   Úmake_transformsÚ ModuleFusionSpec.make_transformsB   r(   r!   N)r   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚtupleÚstrÚ__annotations__r   r   ÚModuleÚboolr&   r   r+   Úlistr   r/   Ú__static_attributes__r   r!   r   r   r   ,   s…   ‡ ñð 02Ð˜U 3¨ 8™_Ó1ð]¨ð ]°ô ]ð" §¡ð "¨tô "ð"¨T°"·)±)©_ð "ÀÀbÇiÁiÁô "ð"Ð&8ð "¸TÀ/Ñ=R÷ "r!   r   c                   ób   ^ • \ rS rSrU 4S jrS\R                  S\R                  4S jrSrU =r	$ )Ú_FusedPatchEmbeddingMixinéG   c                 óÐ  >• [         TU ]  " U0 UD6  U R                  R                  [        R
                  " U R                  R                  5      -  U l        [        R                  " U R                  U R                  R                  U R                  R                  S LU R                  R                  R                  U R                  R                  R                  S9U l        U ?g )N)ÚbiasÚdeviceÚdtype)ÚsuperÚ__init__ÚprojÚin_channelsÚmathÚprodÚkernel_sizeÚpatch_volumer   ÚLinearÚout_channelsr@   ÚweightrA   rB   Úlinear_proj)r   ÚargsÚkwargsÚ	__class__s      €r   rD   Ú"_FusedPatchEmbeddingMixin.__init__H   s£   ø€ ä‰Ò˜$Ð) &Ò)Ø ŸI™I×1Ñ1´D·I²I¸d¿i¹i×>SÑ>SÓ4TÑTˆÔäŸ9š9Ø×ÑØ�I‰I×"Ñ"Ø—‘—‘ tÐ+Ø—9‘9×#Ñ#×*Ñ*Ø—)‘)×"Ñ"×(Ñ(ñ
ˆÔð ‰Ir!   Úhidden_statesr   c                 óî   • U R                   R                  R                  nUR                  SU R                  5      nU R                  UR                  US95      nUR                  SU R                  5      $ )Néÿÿÿÿ)rB   )rN   rM   rB   ÚviewrJ   ÚtoÚ	embed_dim)r   rS   Útarget_dtypes      r   ÚforwardÚ!_FusedPatchEmbeddingMixin.forwardW   sf   € Ø×'Ñ'×.Ñ.×4Ñ4ˆØ%×*Ñ*¨2¨t×/@Ñ/@ÓAˆØ×(Ñ(¨×)9Ñ)9ÀÐ)9Ð)MÓNˆØ×!Ñ! " d§n¡nÓ5Ð5r!   )rN   rJ   )
r   r1   r2   r3   rD   ÚtorchÚTensorrZ   r;   Ú__classcell__)rQ   s   @r   r=   r=   G   s(   ø† õð6 U§\¡\ð 6°e·l±l÷ 6ò 6r!   r=   c                   ó    • \ rS rSrSrSrS\R                  S\4S jr	S\
\R                     S\
\R                     4S jrS	S
S\\   4S jrSrg)ÚPatchEmbeddingsFusionSpecé^   zJFuse compatible Conv3d patch embeddings into flattened Linear projections.)z(^|\.)patch_embed$r"   r   c                 ó  • [        [        USS 5      =n[        R                  5      (       d  gUR                  UR
                  :H  =(       a;    UR                  S:H  =(       a%    UR                  S:H  =(       a    UR                  S:H  $ )NrE   F)r   r   r   )r   r   r   r   )	Ú
isinstanceÚgetattrr   ÚConv3dÚstriderI   ÚpaddingÚdilationÚgroups)r   r"   rE   s      r   r&   Ú$PatchEmbeddingsFusionSpec.is_fusablec   sr   € Ü¤'¨&°&¸$Ó"?Ð?˜$ÄÇÁ×KÑKØð �K‰K˜4×+Ñ+Ñ+÷ !Ø—‘ 	Ñ)÷!à—‘ Ñ*÷!ð —‘˜qÑ ð		
r!   r)   c                 ón   • [        SUR                   3[        U40 5      nSUR                   3Ul        U$ )NÚFused)r   r   r=   r2   )r   r)   Ú	fused_clss      r   r+   Ú*PatchEmbeddingsFusionSpec.make_fused_classo   sB   € Ü˜5 ×!6Ñ!6Ð 7Ð8Ô;TÐVbÐ:cÐegÓhˆ	Ø#(¨×)BÑ)BÐ(CÐ!Dˆ	ÔØÐr!   r-   r   c           	      óê   • [        USU5      nUR                  n[        U[        5      (       a  X34nUR                  /[        U5      Q7nUR                  n[        SS[        UUS9/S9[        SSS9/$ )	NÚvision_configzpatch_embed\.proj\.weight$z!patch_embed\.linear_proj\.weight$)rF   rI   )Úsource_patternsÚtarget_patternsÚ
operationszpatch_embed\.proj\.bias$zpatch_embed\.linear_proj\.bias$)rq   rr   )
rd   Ú
patch_sizerc   ÚintÚtemporal_patch_sizer5   rF   r   r
   r   )r   r-   rp   rt   rI   rF   s         r   r/   Ú)PatchEmbeddingsFusionSpec.make_transformst   s�   € Ü ¨¸Ó@ˆØ"×-Ñ-ˆ
Ü�j¤#×&Ñ&Ø$Ð1ˆJØ$×8Ñ8ÐM¼5ÀÓ;LÑMˆØ#×/Ñ/ˆô Ø =Ø Dä"Ø$/Ø$/ñðñ	ô Ø ;Ø Bñð
ð 	
r!   r   N)r   r1   r2   r3   r4   r   r   r8   r9   r&   r   r+   r:   r   r/   r;   r   r!   r   r`   r`   ^   s^   † ÙTà6Ðð

 §¡ð 

¨tô 

ð¨T°"·)±)©_ð ÀÀbÇiÁiÁô ð

Ð&8ð 
¸TÀ/Ñ=R÷ 
r!   r`   Úclsztype[PreTrainedModel]r-   r   Úfusion_nameÚspecr   c                 óh  • [         R                  U0 5      nX;   a  X@   $ [        R                  " S5         U " U5      nSSS5        [	        5       n0 nUR
                  (       a/  [        R                  " SR                  UR
                  5      5      OSnWR                  5        Ht  u  pš[        U
5      nX¶;   a  M  Ub  UR                  U	5      c  M.  UR                  U
5      (       d  MF  UR                  U5        UR                  U5      X{R                  '   Mv     XtU '   U$ ! , (       d  f       Nê= f)aJ  Discover compatible module classes for one fusion family on a meta-initialized model.

This function:
- instantiates `cls(config)` on the meta device
- scans `named_modules()` for candidate modules
- optionally pre-filters them with `target_modules_patterns`
- uses `is_fusable(...)` as the final structural check
- builds the class-level patch mapping used by monkey patching

Results are cached per `(fusion_name, cls)` to avoid repeated meta-initialization.
This matches the current class-level fusion behavior, where one compatible
module class maps to one fused replacement class.
ÚmetaNÚ|)r   Ú
setdefaultr\   rA   Úsetr   ÚreÚcompileÚjoinÚnamed_modulesr   Úsearchr&   Úaddr+   r   )rx   r-   ry   rz   ÚcacheÚmodelÚseen_classesÚpatch_mappingÚtarget_module_patternÚmodule_namer"   Ú
module_clss               r   Ú_discover_fusable_modulesr�   Ž   s  € ô( $×.Ñ.¨{¸BÓ?€EØ
ƒ|Ø‰zÐä	�Š�fÕ	Ù�F“ˆ÷ 
ô “5€LØ€Mà>B×>Z×>ZŒ�
Š
�3—8‘8˜D×8Ñ8Ó9Ô:Ð`dð ð  %×2Ñ2Ö4ÑˆÜ˜&“\ˆ
ØÓ%ÙØ Ñ,Ð1F×1MÑ1MÈkÓ1ZÑ1bÙØ�‰˜v×&Ñ&Ùà×Ñ˜Ô$Ø-1×-BÑ-BÀ:Ó-Nˆ×)Ñ)Ó*ñ  5ð ˆ#�JØÐ÷+ 
Õ	ús   ¶	D#Ä#
D1c           
      óŒ  • [        XX#S9nU(       d/  [        R                  UR                  U R                  5      5        g[        USS9  [        U S5      (       a  [        U R                  S5      (       d  [        SU R                   S35      eU R                  R                  nUR                  U5      n[        U5      nUbq  U Vs0 s H  n[        UR                  5      U_M     n	nU HA  n
[        U
R                  5      nU	R                  U5      nUc  M.  [        S	U S
U SU S35      e   Xv-   n[        XVSS9  gs  snf )aq  Register one fusion family for `cls`.

This function updates the two global registries used by fused loading:
- the monkey-patching registry, so compatible module classes are replaced before initialization
- the checkpoint conversion mapping, so fused runtime modules still load from the original checkpoint layout

Notes:
- conflicting checkpoint transforms fail fast
)ry   rz   NT)Ú	overwriteÚconfig_classÚ
model_typezModel z" has no config class or model typezFusion z for model type zC conflicts with an existing conversion mapping for source patterns Ú.)r�   ÚloggerÚinfor   r   r   Úhasattrr�   Ú
ValueErrorr‘   r/   r   r5   rq   Úgetr	   )rx   r-   ry   rz   Úfusable_classesr‘   Ú
convertersÚexisting_convertersÚexistingÚexisting_converter_sourcesÚ	converterrq   Úexisting_converters                r   Ú_register_module_fusionrŸ   ¾   sJ  € ô 0°ÈÑ`€OÞÜ�‰�D×&Ñ& s§|¡|Ó4Ô5Øä˜?°dÒ;ä�3˜×'Ñ'¬w°s×7GÑ7GÈ×/VÑ/VÜ˜6 #§,¡, Ð/QÐRÓSÐSØ×!Ñ!×,Ñ,€JØ×%Ñ% fÓ-€Jä;¸JÓGÐØÑ&ñ atÓ%tÒ`sÐT\¤e¨H×,DÑ,DÓ&EÀxÒ&OÑ`sÐ"Ð%tÛ#ˆIÜ# I×$=Ñ$=Ó>ˆOØ!;×!?Ñ!?ÀÓ!PÐØ!Ó-Ü Ø˜k˜]Ð*:¸:¸,ð G+Ø+:Ð*;¸1ð>óð ñ	 $ð )Ñ5ˆ
ä*¨:ÈTÓRùò &us   Ã	 EÚpatch_embeddingsÚ_FUSION_REGISTRYÚfusion_configc                 óî   • / nU R                  5        H^  u  p#U[        ;  a  [        SU 35      eUSL a  M$  USLa$  [        U[        5      (       d  [        SU S35      eUR                  U5        M`     U$ )zQValidate `fusion_config` and return enabled fusion names in user-specified order.zUnknown fusion type: FTzInvalid fusion config for z4: expected `True`, `False`, or a mapping of options.)Úitemsr¡   r–   rc   r   Úappend)r¢   Úenabled_fusionsry   Úfusion_optionss       r   Ú_iter_enabled_fusionsr¨   î   sŒ   € ð €OØ'4×':Ñ':Ö'<Ñ#ˆØÔ.Ó.ÜÐ4°[°MÐBÓCÐCØ˜UÒ"ÙØ Ò%¬j¸Ì×.QÑ.QÜØ,¨[¨MÐ9mÐnóð ð 	×Ñ˜{Ö+ñ (=ð Ðr!   c                 ó`   • U(       d  g[        U5       H  n[        XU[        U   5        M     g)zúRegister requested runtime fusions for `cls`.

This function:
- validates `fusion_config` against `_FUSION_REGISTRY`
- resolves the enabled fusion families in user order
- registers monkey patches and checkpoint transforms before model instantiation
N)r¨   rŸ   r¡   )rx   r-   r¢   ry   s       r   Úregister_fusion_patchesrª   ÿ   s+   € ö Øä,¨]Ö;ˆÜ ¨[Ô:JÈ;Ñ:WÖXò <r!   )N)-r4   rG   r€   Úcollections.abcr   Útypingr   r   r\   r   Úconversion_mappingr   r	   Úcore_model_loadingr
   r   r   r   Úmonkey_patchingr   Úutilsr   Úconfiguration_utilsr   Úmodeling_utilsr   Ú
get_loggerr   r“   r   Údictr6   r   r8   r7   r   r=   r`   r�   rŸ   r¡   r9   r:   r¨   rª   r   r!   r   Ú<module>rµ      s´  ðòó
 Û 	Ý #ß %ã Ý ç iß `Ó `Ý 3Ý ö Ý5Ý/ð 
×	Ò	˜HÓ	%€àMOÐ ˜˜c 4¨¨d°3¸¸R¿Y¹Y¹Ð3GÑ.HÐ(HÑ#IÐIÑJÓ O÷"ñ "÷66ñ 6ô.-
Ð 0ô -
ð`-Ø	 ð-àð-ð ð-ð ð	-ð
 
ˆ#ˆt�B—I‘I‰Ð
Ñô-ð`*SØ	 ð*SØ*<ð*SØKNð*SØVfð*Sà	ô*SðZ 2DÑE^ÓE`Ð0aÐ �$�sÐ,Ð,Ñ-Ó að¨°°d¸WÀSÈ#ÀXÑ=NÑ6NÐ1NÑ)Oð ÐTXÐY\ÑT]ô ð$ jnñYØ	 ðYØ9@ÀÀdÈWÐUXÐZ]ÐU]ÑM^ÑF^ÐA^Ñ9_ÐbfÑ9fðYà	öYr!   