
    9i0                         S SK r S SKrS SKJr  S SKJs  Jr  S SKJr  S r	S r
 " S S\R                  5      r " S S\R                  5      rg)	    N)	rearrangec                    [         R                  " U  Vs/ s H  oDR                  S5      PM     snSS9n [         R                  " U [	        US5      -  SS9R                  S5      n[         R                  " U Vs/ s H  oDR                  S5      PM     snSS9n[         R                  " U[	        US5      -  SS9n[
        R                  " X5US9nU$ s  snf s  snf )z
weight list: list of conv1d weight ([out, in] * a)
bias list: list of conv1d bias ([out] * a)
agg: aggreagtion weights (a)
x: input tensor (b, in, n)

return output in (b, n, out)
r   dimz
a -> a 1 1   a -> a 1weightbias)torchcat	unsqueezesumr   Fconv1dweight_list	bias_listaggxwr
   r   s          j/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/cv/vision_middleware/vim.py_agg_conv1dr      s     ))[A[[[^[A !#KYYi\22y|  		9=9a;;q>9=!I99Y3
!;;CD	-AH B >s   C:Cc                    [         R                  " U  Vs/ s H  oDR                  S5      PM     snSS9n [         R                  " U [	        US5      -  SS9n[         R                  " U Vs/ s H  oDR                  S5      PM     snSS9n[         R                  " U[	        US5      -  SS9n[
        R                  " X5USSS9nU$ s  snf s  snf )z
weight list: list of conv2d weight ([out, in, m, n] * a)
bias list: list of conv2d bias ([out] * a)
agg: aggregation weights (a)
x: input tensor (b, in, p, q)

return output in (b, out, p, q)
r   r   za -> a 1 1 1 1r      r
   r   stridepadding)r   r   r   r   r   r   conv2dr   s          r   _agg_conv2dr    %   s     ))[A[[[^[A !#KYYi%566A?F 		9=9a;;q>9=!I99Y3
!;;CD		tAq	:A H B
 >s   C+Cc                   6    \ rS rSrS\R
                  4S jrSrg)	QuickGELU>   r   c                 :    U[         R                  " SU-  5      -  $ )NgZd;?)r   sigmoid)selfr   s     r   forwardQuickGELU.forward@   s    5==+++     N)__name__
__module____qualname____firstlineno__r   Tensorr'   __static_attributes__r*   r)   r   r"   r"   >   s    , ,r)   r"   c                   @   ^  \ rS rSrU 4S jrS rS rS rS rSr	U =r
$ )ViMD   c                   > [         TU ]  5         [        5       U l        [        R
                  " 5       U l        [        R
                  " 5       U l        [        R
                  " 5       U l        [        R
                  " 5       U l	        [        R
                  " 5       U l
        [        R
                  " 5       U l        SU l        / U l        0 U l        0 U l        g Nr   )super__init__r"   actnnParameterListadapter_conv_weightadapter_conv_biasadapter_up_weightadapter_up_biasadapter_down_weightadapter_down_biasnum_modules	task_listagg_weights	agg_algos)r&   	__class__s    r   r7   ViM.__init__F   s    ;#%#3#3#5 !#!1!1!3!#!1!1!3!//1#%#3#3#5 !#!1!1!3 r)   c                    [        U5      U l        U GH0  nU R                  R                  [        R
                  " US   5      5        U R                  R                  [        R
                  " US   5      5        U R                  R                  [        R
                  " US   5      5        U R                  R                  [        R
                  " US   5      5        U R                  R                  [        R
                  " US   5      5        U R                  R                  [        R
                  " US   5      5        GM3     g )Nzadapter_conv.weightzadapter_conv.biaszadapter_up.weightzadapter_up.biaszadapter_down.weightzadapter_down.bias)lenrA   r;   appendr9   	Parameterr<   r=   r>   r?   r@   )r&   vim_list
state_dicts      r   register_ViMViM.register_ViMZ   s   x="J$$++Z(=>?A""))Z(;<=? ""))Z(;<=?  ''Z(9:;= $$++Z(=>?A""))Z(;<=? #r)   c                     UR                   S   U R                  :X  d   eU R                  R                  U5        X R                  U'   X0R
                  U'   g r5   )shaperA   rB   rI   rC   rD   )r&   	task_namerC   agg_algos       r   register_taskViM.register_taskl   sM      #t'7'7777i(&1#$,y!r)   c                     X R                   ;   d   eU R                  U   nUS:X  a  U R                  XR                  U   5      $ [	        SR                  U5      5      e)NzEns-MoEz6Aggregation algorithm [{}] is currently not supported!)rB   rD   forward_ens_moerC   NotImplementedErrorformat)r&   r   rQ   rR   s       r   r'   ViM.forwards   s^    NN***>>),y ''+;+;I+FGG%Hx " "r)   c           	      F   UnUR                   S   nUR                  [        US-   UR                  S5      5      SS9u  pVUS U nUS U n[        R
                  " USS9n	[        R                  " USS9n
U
R                  SX5      nUR                   u  pnUR                  SSS5      nS n[        U R                  5       GH  nUU   S:  d  M  [        R                  " UU R                  U   R                  S5      U R                  U   S9nU R!                  U5      n[#        [$        R&                  " UR                  S5      S-
  5      5      nUS S 2S S 2SS 24   R)                  USUU5      n[        R*                  " UU R,                  U   U R.                  U   SSS	9n[1        US
5      nUS S 2S S 2S S24   R)                  USSS5      n[        R*                  " UU R,                  U   U R.                  U   SSS	9n[1        US5      n[        R2                  " UU/SS9nU R!                  U5      n[        R                  " UU R4                  U   R                  S5      U R6                  U   S9nUc  UUU   -  nGM  UUUU   -  -  nGM     UR                  SSS5      $ )Nr   r   r   T)requires_gradr   r	   r   zb o p q -> b o (p q)zb o 1 1 -> b o 1)rP   topkminsizer   softmaxr   
zeros_likescatterpermuterangerA   r   r?   r   r@   r8   intmathsqrtreshaper   r;   r<   r   r   r=   r>   )r&   r   r   logitsk
top_logitstop_indicestop_k_logitstop_k_indicestop_k_gateszerosgatesNBCoutputix_downnum_patch_sidex_patchx_clsx_ups                         r   rV   ViM.forward_ens_moe~   s   IIaL"(++Av{{1~&A #. #/
!"1~#BQii!4  t<a<''aIIaAt''(AQx!|33A6@@C//24 &)!$TYYv{{1~/A%B!C A!""$ %%,WQN-;&=  ((33A6//2 $G-CDq!RaRx(00B1=33A6//2 "%);<E7#3;&)xx11!4>>qA--a02
 >!E!H_FdU1Xo-FU )X ~~aA&&r)   )r8   r<   r;   r@   r?   r>   r=   rD   rC   rA   rB   )r+   r,   r-   r.   r7   rM   rS   r'   rV   r0   __classcell__)rE   s   @r   r2   r2   D   s!    (?$-	"=' ='r)   r2   )rf   r   torch.nnr9   torch.nn.functional
functionalr   einopsr   r   r    Moduler"   r2   r*   r)   r   <module>r      sE         22,		 ,w'")) w'r)   