
    Z 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,   zBase 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     l/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/fusion_mapping.pyget_empty_logModuleFusionSpec.get_empty_log6   s"    T
 3 344OPZ|\\    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U38_1] ] ]" "t ""T"))_ "bii ""&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	$ )_FusedPatchEmbeddingMixinG   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    $)&) II11DIIdii>S>S4TT99II""t+99##**))""((
 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%**2t/@/@A(()9)9)9)MN!!"dnn55r!   )rN   rJ   )
r   r1   r2   r3   rD   torchTensorrZ   r;   __classcell__)rQ   s   @r   r=   r=   G   s(    6U\\ 6ell 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 KK4+++ !	)!*! 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;TVb:ceg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#&&$1J$88M5;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"))_ bii 

&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 
 5LM>B>Z>Z

388D889:`d   %224&\
% ,1F1M1Mk1Z1b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''ws7G7G/V/V6#,,/QRSS!!,,J%%f-J;JG& at%t`sT\eH,D,D&Ex&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,[M9mn  	{+ (= r!   c                 `    U(       d  g[        U5       H  n[        XU[        U   5        M     g)zRegister 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 c4d3RYY3G.H(H#IIJ O" "66 6.-
 0 -
`-	 -- - 	-
 
#tBII
-`*S	 *S*<*SKN*SVf*S	*SZ 2DE^E`0a $s,,- adWS#X=N6N1N)O TXY\T] $ jnY	 Y9@dWUXZ]U]M^F^A^9_bf9fY	Yr!   