Ë
    GêñiV)  ã                   ó8  — U d Z ddlZddlZddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ erddlmZ ddlmZ  ej4                  e«      Zi Zeeee eee e	jB                     f   f   f   e"d<    G d„ d«      Z# G d„ d«      Z$ G d„ de#«      Z%dddddede#deee e	jB                     f   f
d„Z&dddddede#ddf
d„Z'd e%«       iZ(eee#f   e"d<   deee)eeef   z  f   de*e   fd „Z+	 d"dddeee)eeef   z  f   dz  ddfd!„Z,y)#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                   ó¸   — e Zd ZU dZdZeedf   ed<   dedefd„Zde	j                  defd	„Zd
ee	j                     dee	j                     fd„Zdddee   fd„Zy)ÚModuleFusionSpeczÿ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   — dt        | «      j                  › d|› �S )zDReturn the log message emitted when no compatible modules are found.zNo compatible z classes found to fuse for )ÚtypeÚ__name__)Úselfr   s     ú]/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/fusion_mapping.pyÚget_empty_logzModuleFusionSpec.get_empty_log6   s"   € à¤ T£
× 3Ñ 3Ð4Ð4OÐPZÈ|Ð\Ð\ó    Úmodulec                 ó   — t         ‚)z>Return whether `module` is compatible with this fusion family.©ÚNotImplementedError)r   r    s     r   Ú
is_fusablezModuleFusionSpec.is_fusable:   ó   € ä!Ð!r   Úoriginal_clsc                 ó   — t         ‚)zBBuild the runtime replacement class for a compatible module class.r"   )r   r&   s     r   Úmake_fused_classz!ModuleFusionSpec.make_fused_class>   r%   r   Úconfigr   c                 ó   — t         ‚)zMBuild the weight transforms needed to load and save the fused runtime layout.r"   )r   r)   s     r   Úmake_transformsz ModuleFusionSpec.make_transformsB   r%   r   N)r   Ú
__module__Ú__qualname__Ú__doc__r   ÚtupleÚstrÚ__annotations__r   r   ÚModuleÚboolr$   r   r(   Úlistr   r+   r   r   r   r   r   ,   s…   … ñð 02Ð˜U 3¨ 8™_Ó1ð]¨ð ]°ó ]ð" §¡ð "¨tó "ð"¨T°"·)±)©_ð "ÀÀbÇiÁiÁó "ð"Ð&8ð "¸TÀ/Ñ=Rô "r   r   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )Ú_FusedPatchEmbeddingMixinc                 óÐ  •— t        ‰| �  |i |¤Ž | j                  j                  t	        j
                  | j                  j                  «      z  | _        t        j                  | j                  | j                  j                  | j                  j                  d u| j                  j                  j                  | j                  j                  j                  ¬«      | _        | `y )N)ÚbiasÚdeviceÚdtype)ÚsuperÚ__init__ÚprojÚin_channelsÚmathÚprodÚkernel_sizeÚpatch_volumer   ÚLinearÚout_channelsr8   Úweightr9   r:   Úlinear_proj)r   ÚargsÚkwargsÚ	__class__s      €r   r<   z"_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                 óô   — | j                   j                  j                  }|j                  d| j                  «      }| j                  |j                  |¬«      «      }|j                  d| j                  «      S )Néÿÿÿÿ)r:   )rF   rE   r:   ÚviewrB   ÚtoÚ	embed_dim)r   rJ   Útarget_dtypes      r   Úforwardz!_FusedPatchEmbeddingMixin.forwardW   sf   € Ø×'Ñ'×.Ñ.×4Ñ4ˆØ%×*Ñ*¨2¨t×/@Ñ/@ÓAˆØ×(Ñ(¨×)9Ñ)9ÀÐ)9Ó)MÓNˆØ×!Ñ! " d§n¡nÓ5Ð5r   )r   r,   r-   r<   ÚtorchÚTensorrQ   Ú__classcell__)rI   s   @r   r6   r6   G   s#   ø„ ôð6 U§\¡\ð 6°e·l±l÷ 6r   r6   c                   ó’   — e Zd ZdZdZdej                  defd„Zde	ej                     de	ej                     fd„Z
dd	dee   fd
„Zy)ÚPatchEmbeddingsFusionSpeczJFuse compatible Conv3d patch embeddings into flattened Linear projections.)z(^|\.)patch_embed$r    r   c                 óê   — t        t        |dd «      x}t        j                  «      sy|j                  |j
                  k(  xr1 |j                  dk(  xr  |j                  dk(  xr |j                  dk(  S )Nr=   F)r   r   r   )r   r   r   r   )	Ú
isinstanceÚgetattrr   ÚConv3dÚstriderA   ÚpaddingÚdilationÚgroups)r   r    r=   s      r   r$   z$PatchEmbeddingsFusionSpec.is_fusablec   so   € Ü¤'¨&°&¸$Ó"?Ð?˜$ÄÇÁÔKØð �K‰K˜4×+Ñ+Ñ+ò !Ø—‘ 	Ñ)ò!à—‘ Ñ*ò!ð —‘˜qÑ ð		
r   r&   c                 ón   — t        d|j                  › �t        |fi «      }d|j                  › �|_        |S )NÚFused)r   r   r6   r-   )r   r&   Ú	fused_clss      r   r(   z*PatchEmbeddingsFusionSpec.make_fused_classo   sB   € Ü˜5 ×!6Ñ!6Ð 7Ð8Ô;TÐVbÐ:cÐegÓhˆ	Ø#(¨×)BÑ)BÐ(CÐ!Dˆ	ÔØÐr   r)   r   c                 óô   — t        |d|«      }|j                  }t        |t        «      r||f}|j                  gt        |«      ¢­}|j                  }t        ddt        ||¬«      g¬«      t        dd¬«      gS )	NÚvision_configzpatch_embed\.proj\.weight$z!patch_embed\.linear_proj\.weight$)r>   rA   )Úsource_patternsÚtarget_patternsÚ
operationszpatch_embed\.proj\.bias$zpatch_embed\.linear_proj\.bias$)rd   re   )
rY   Ú
patch_sizerX   ÚintÚtemporal_patch_sizer/   r>   r   r
   r   )r   r)   rc   rg   rA   r>   s         r   r+   z)PatchEmbeddingsFusionSpec.make_transformst   s�   € Ü ¨¸Ó@ˆØ"×-Ñ-ˆ
Ü�j¤#Ô&Ø$ jÐ1ˆJØ$×8Ñ8ÐM¼5ÀÓ;LÑMˆØ#×/Ñ/ˆô Ø =Ø Dä"Ø$/Ø$/ôðô	ô Ø ;Ø Bôð
ð 	
r   N)r   r,   r-   r.   r   r   r2   r3   r$   r   r(   r4   r   r+   r   r   r   rV   rV   ^   s^   „ ÙTà6Ðð

 §¡ð 

¨tó 

ð¨T°"·)±)©_ð ÀÀbÇiÁiÁó ð

Ð&8ð 
¸TÀ/Ñ=Rô 
r   rV   Úclsztype[PreTrainedModel]r)   r   Úfusion_nameÚspecr   c                 ó<  — t         j                  |i «      }| |v r||    S t        j                  d«      5   | |«      }ddd«       t	        «       }i }|j
                  r.t        j                  dj                  |j
                  «      «      nd}j                  «       D ]j  \  }	}
t        |
«      }||v rŒ|�|j                  |	«      €Œ*|j                  |
«      sŒ<|j                  |«       |j                  |«      ||j                  <   Œl ||| <   |S # 1 sw Y   ŒÕxY w)ar  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   Ú
setdefaultrR   r9   Úsetr   ÚreÚcompileÚjoinÚnamed_modulesr   Úsearchr$   Úaddr(   r   )rj   r)   rk   rl   ÚcacheÚmodelÚseen_classesÚpatch_mappingÚtarget_module_patternÚmodule_namer    Ú
module_clss               r   Ú_discover_fusable_modulesr   Ž   s"  € ô( $×.Ñ.¨{¸BÓ?€EØ
ˆe�|Ø�S‰zÐä	�‰�fÓ	ñ Ù�F“ˆ÷ô “5€LØ€Mà>B×>ZÒ>ZŒ�
‰
�3—8‘8˜D×8Ñ8Ó9Ô:Ð`dð ð  %×2Ñ2Ó4ò 
OÑˆ�VÜ˜&“\ˆ
Ø˜Ñ%ØØ Ð,Ð1F×1MÑ1MÈkÓ1ZÐ1bØØ�‰˜vÔ&Øà×Ñ˜Ô$Ø-1×-BÑ-BÀ:Ó-Nˆ�j×)Ñ)Ò*ð
Oð €Eˆ#�JØÐ÷+ð ús   µ	DÄDc           
      óz  — t        | |||¬«      }|s/t        j                  |j                  | j                  «      «       yt        |d¬«       t        | d«      rt        | j                  d«      st        d| j                  › d�«      ‚| j                  j                  }|j                  |«      }t        |«      }|�l|D �ci c]  }t        |j                  «      |“Œ }	}|D ]?  }
t        |
j                  «      }|	j                  |«      }|€Œ,t        d	|› d
|› d|› d�«      ‚ ||z   }t        ||d¬«       yc c}w )a‰  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
    )rk   rl   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   r/   rd   Úgetr	   )rj   r)   rk   rl   Úfusable_classesrƒ   Ú
convertersÚexisting_convertersÚexistingÚexisting_converter_sourcesÚ	converterrd   Úexisting_converters                r   Ú_register_module_fusionr‘   ¾   sO  € ô 0°°VÈÐ[_Ô`€OÙÜ�‰�D×&Ñ& s§|¡|Ó4Ô5Øä˜?°dÕ;ä�3˜Ô'¬w°s×7GÑ7GÈÔ/VÜ˜6 #§,¡, Ð/QÐRÓSÐSØ×!Ñ!×,Ñ,€JØ×%Ñ% fÓ-€Jä;¸JÓGÐØÐ&ð atÖ%tÐT\¤e¨H×,DÑ,DÓ&EÀxÑ&OÐ%tÐ"Ð%tØ#ò 	ˆIÜ# I×$=Ñ$=Ó>ˆOØ!;×!?Ñ!?ÀÓ!PÐØ!Ñ-Ü Ø˜k˜]Ð*:¸:¸,ð G+Ø+:Ð*;¸1ð>óð ð		ð )¨:Ñ5ˆ
ä*¨:°zÈTÖRùò &us   ÃD8Úpatch_embeddingsÚ_FUSION_REGISTRYÚfusion_configc                 óØ   — g }| j                  «       D ]T  \  }}|t        vrt        d|› �«      ‚|du rŒ!|durt        |t        «      st        d|› d�«      ‚|j                  |«       ŒV |S )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ˆ   rX   r   Úappend)r”   Úenabled_fusionsrk   Úfusion_optionss       r   Ú_iter_enabled_fusionsrš   î   s�   € ð €OØ'4×':Ñ':Ó'<ò 	,Ñ#ˆ�^ØÔ.Ñ.ÜÐ4°[°MÐBÓCÐCØ˜UÑ"ØØ Ñ%¬j¸ÌÔ.QÜØ,¨[¨MÐ9mÐnóð ð 	×Ñ˜{Õ+ð	,ð Ðr   c                 óT   — |syt        |«      D ]  }t        | ||t        |   «       Œ y)a  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“   )rj   r)   r”   rk   s       r   Úregister_fusion_patchesrœ   ÿ   s4   € ñ Øä,¨]Ó;ò YˆÜ  V¨[Ô:JÈ;Ñ:WÕXñYr   )N)-r.   r?   rr   Úcollections.abcr   Útypingr   r   rR   r   Úconversion_mappingr   r	   Úcore_model_loadingr
   r   r   r   Úmonkey_patchingr   Úutilsr   Úconfiguration_utilsr   Úmodeling_utilsr   Ú
get_loggerr   r…   r   Údictr0   r   r2   r1   r   r6   rV   r   r‘   r“   r3   r4   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   