
    3jW,                        S SK JrJrJr  S SKrS SKJr  S\S\S\R                  4S jrSS\S\S\S	\S\R                  4
S
 jjr	 " S S\R                  5      r
 " S S\R                  5      r " S S\R                  5      r " S S\R                  5      r " S S\R                  5      r " S S\R                  5      r " S S\R                  5      rg)    )AnyDictTupleN)nninpoupreturnc                     [         R                  " [         R                  " XSSSSS9[         R                  " U5      [         R                  " 5       5      $ )z&Apply 1x1 Convolution with Batch Norm.   r   Fbiasr   
SequentialConv2dBatchNorm2dSiLU)r   r   s     R/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/models/vit_mobile.pyconv_1x1_bnr      s:    ==3Q15A2>>RUCVXZX_X_Xabb    kernal_sizestridec                     [         R                  " [         R                  " XX#SSS9[         R                  " U5      [         R                  " 5       5      $ )z&Apply NxN Convolution with Batch Norm.r   Fr   r   )r   r   r   r   s       r   conv_nxn_bnr      s;    ==3[!%PRTR`R`adRegigngngpqqr   c                      ^  \ rS rSrSrS\S\R                  SS4U 4S jjrS\	R                  S	\\\4   S\	R                  4S
 jrSrU =r$ )PreNorm"   zApply a normalization layer before the functional block.

Args:
    dim: The input dimension size.
    fn: The module or function to be executed after normalization.
dimfnr	   Nc                 d   > [         TU ]  5         [        R                  " U5      U l        X l        g N)super__init__r   	LayerNormnormr   )selfr   r   	__class__s      r   r"   PreNorm.__init__*   s#    LL%	r   xkwargsc                 F    U R                   " U R                  U5      40 UD6$ r    r   r$   )r%   r(   r)   s      r   forwardPreNorm.forward/   s    wwtyy|.v..r   r+   )__name__
__module____qualname____firstlineno____doc__intr   Moduler"   torchTensorr   strr   r,   __static_attributes____classcell__r&   s   @r   r   r   "   sU    C RYY 4 
/ /c3h /ELL / /r   r   c            	       ~   ^  \ rS rSrSrSS\S\S\SS4U 4S jjjrS	\R                  S\R                  4S
 jr
SrU =r$ )FeedForward3   zImplement the Feed-Forward network block for Vision Transformers.

Args:
    dim: The input dimension size.
    hidden_dim: The dimension of the hidden layer.
    dropout: The dropout probability. Default: 0.0.
r   
hidden_dimdropoutr	   Nc           	      &  > [         TU ]  5         [        R                  " [        R                  " X5      [        R
                  " 5       [        R                  " U5      [        R                  " X!5      [        R                  " U5      5      U l        g r    )r!   r"   r   r   Linearr   Dropoutnet)r%   r   r>   r?   r&   s       r   r"   FeedForward.__init__<   sX    ==IIc&	2::g3F		R\Hbdfdndnovdw
r   r(   c                 $    U R                  U5      $ r    rC   r%   r(   s     r   r,   FeedForward.forwardB   s    xx{r   rF           r.   r/   r0   r1   r2   r3   floatr"   r5   r6   r,   r8   r9   r:   s   @r   r<   r<   3   sN    
C 
S 
5 
4 
 
 %,,  r   r<   c                      ^  \ rS rSrSrSS\S\S\S\SS4
U 4S	 jjjrS
\R                  S\R                  4S jr
SrU =r$ )	AttentionF   zImplement the Multi-Head Attention module.

Args:
    dim: The input dimension size.
    heads: The number of attention heads. Default: 8.
    dim_head: The dimension of each head. Default: 64.
    dropout: The dropout probability. Default: 0.0.
r   headsdim_headr?   r	   Nc                   > [         TU ]  5         X2-  nUS:H  =(       a    X1:H  (       + nX l        US-  U l        [        R
                  " SS9U l        [        R                  " XS-  SS9U l        U(       aE  [        R                  " [        R                  " XQ5      [        R                  " U5      5      U l        g [        R                  " 5       U l        g )Nr   g      r      Fr   )r!   r"   rP   scaler   SoftmaxattendrA   to_qkvr   rB   Identityto_out)r%   r   rP   rQ   r?   	inner_dimproject_outr&   s          r   r"   Attention.__init__P   s    $	 A:9(/:
t^
jjR(ii]?WbbmmBIIi$=rzz'?RShjhshshur   r(   c                   ^ ^	^
^^ T R                  U5      R                  SSS9nUS   R                  u  m	mmm
U	U
UUU 4S jU 5       u  p4n[        R                  " X4R                  SS5      5      T R                  -  nT R                  U5      n[        R                  " Xu5      nUR                  SS5      R                  T	TTT
5      nT R                  U5      $ )NrU   rS   rT   r   c           	   3      >#    U  H@  oR                  TTTTR                  TTR                  -  5      R                  S S5      v   MB     g7f)   rU   N)reshaperP   	transpose).0tbhdnpr%   s     r   	<genexpr>$Attention.forward.<locals>.<genexpr>a   sA     a]`XY99Q1djj"

2BCMMaQRSS]`s   AAra   )
rY   chunkshaper5   matmulrc   rV   rX   rb   r[   )r%   r(   qkvqkvdotsattnoutrf   rg   rh   ri   s   `        @@@@r   r,   Attention.forward]   s    kk!n""1""-!fll1aaa]`aa||A{{2r23djj@{{4 ll4#mmAq!))!Q26{{3r   )rX   rP   rV   r[   rY   )   @   rJ   rK   r:   s   @r   rN   rN   F   s]    vC v v3 ve v^b v v
  
 %,, 
  
 r   rN   c                      ^  \ rS rSrSrSS\S\S\S\S\S\S	S
4U 4S jjjrS\R                  S	\R                  4S jr
SrU =r$ )Transformerj   az  Transformer block described in ViT.

Paper: https://arxiv.org/abs/2010.11929
Based on: https://github.com/lucidrains/vit-pytorch

Args:
    dim: input dimension.
    depth: depth for transformer block.
    heads: number of heads in multi-head attention layer.
    dim_head: head size.
    mlp_dim: dimension of the FeedForward layer.
    dropout: dropout ratio, defaults to 0.

r   depthrP   rQ   mlp_dimr?   r	   Nc                 .  > [         TU ]  5         [        R                  " / 5      U l        [        U5       H\  nU R                  R                  [        R                  " [        U[        XXF5      5      [        U[        XU5      5      /5      5        M^     g r    )
r!   r"   r   
ModuleListlayersrangeappendr   rN   r<   )	r%   r   r}   rP   rQ   r~   r?   _r&   s	           r   r"   Transformer.__init__z   sq    mmB'uAKKYs8%MN[w%GH r   r(   c                 \    U R                    H  u  p#U" U5      U-   nU" U5      U-   nM     U$ r    r   )r%   r(   ru   ffs       r   r,   Transformer.forward   s3    HDQ!A1	A $ r   r   rI   rK   r:   s   @r   r{   r{   j   sf    C  C 3 QT _d os   %,,  r   r{   c                      ^  \ rS rSrSrSS\S\S\S\SS4
U 4S	 jjjrS
\R                  S\R                  4S jr	Sr
U =r$ )MV2Block   aQ  MV2 block described in MobileNetV2.

Paper: https://arxiv.org/pdf/1801.04381
Based on: https://github.com/tonylins/pytorch-mobilenet-v2

Args:
    inp: input channel.
    oup: output channel.
    stride: stride for convolution, defaults to 1, set to 2 if down-sample.
    expansion: expansion ratio for hidden dimension, defaults to 4.

r   r   r   	expansionr	   Nc                 0  > [         TU ]  5         X0l        [        X-  5      nU R                  S:H  =(       a    X:H  U l        US:X  a  [
        R                  " [
        R                  " XUSUSUSS9[
        R                  " U5      [
        R                  " 5       [
        R                  " XRSSSSS9[
        R                  " U5      5      U l
        g [
        R                  " [
        R                  " XSSSSS9[
        R                  " U5      [
        R                  " 5       [
        R                  " XUSUSUSS9[
        R                  " U5      [
        R                  " 5       [
        R                  " XRSSSSS9[
        R                  " U5      5      U l
        g )Nr   rU   F)groupsr   r   r   )r!   r"   r   r3   use_res_connectr   r   r   r   r   conv)r%   r   r   r   r   r>   r&   s         r   r"   MV2Block.__init__   s!   )
#{{a/>CJ>		*!VQzX]^z*			*1a?s#DI 		#1a?z*			*!VQzX]^z*			*1a?s#DIr   r(   c                 l    U R                   (       a  XR                  U5      -   $ U R                  U5      $ r    )r   r   rG   s     r   r,   MV2Block.forward   s*    yy|##99Q<r   )r   r   r   )r      )r.   r/   r0   r1   r2   r3   r"   r5   r6   r,   r8   r9   r:   s   @r   r   r      sW    C c 3 s SW  @   %,,    r   r   c                      ^  \ rS rSrSr SS\S\S\S\S\\\4   S\S	\S
S4U 4S jjjrS\	R                  S
\	R                  4S jrSrU =r$ )MobileViTBlock   aU  MobileViT block mentioned in MobileViT.

Args:
    dim: input dimension of Transformer.
    depth: depth of Transformer.
    channel: input channel.
    kernel_size: kernel size.
    patch_size: patch size for folding and unfloding.
    mlp_dim: dimension of the FeedForward layer in Transformer.
    dropout: dropout ratio, defaults to 0.

r   r}   channelkernel_size
patch_sizer~   r?   r	   Nc                    > [         TU ]  5         Uu  U l        U l        [	        X3U5      U l        [        X15      U l        [        XSSXg5      U l	        [        X5      U l
        [	        SU-  X45      U l        g )Nr   rx   ra   )r!   r"   phpwr   conv1r   conv2r{   transformerconv3conv4)	r%   r   r}   r   r   r   r~   r?   r&   s	           r   r"   MobileViTBlock.__init__   si     	% ;?
 .
&s1aJ .
 WgC
r   r(   c                     UR                  5       nU R                  U5      nU R                  U5      nUR                  u  p4pVXPR                  -  X`R
                  -  pUR                  X4-  U-  U R                  XR
                  5      R                  SS5      nUR                  X4Xx-  U R                  U R
                  -  5      R                  SS5      nU R                  U5      nUR                  SS5      R                  X4-  U-  XR                  U R
                  5      nUR                  SS5      R                  X4XV5      nU R                  U5      n[        R                  " X4S5      nU R                  U5      nU$ )Nr   ra   rU   )cloner   r   rn   r   r   rb   rc   r   r   r5   catr   )	r%   r(   yrf   dhwnhnws	            r   r,   MobileViTBlock.forward   s5   GGI JJqMJJqMWW
aggqGG|B IIaebj$''2ww7AA!QGIIaBGTWWtww%67AA!QGQ KK1%%aebj"ggtwwGKK1%%aA1 JJqMIIqfa JJqMr   )r   r   r   r   r   r   r   rI   )r.   r/   r0   r1   r2   r3   r   rL   r"   r5   r6   r,   r8   r9   r:   s   @r   r   r      s    * DD D 	D
 D #s(OD D D 
D D* %,,  r   r   c                      ^  \ rS rSrSr SS\S\S\\\4   S\SS4
U 4S	 jjjr	S
\
R                  S\
R                  4S jrSrU =r$ )	MobileViTi  a
  Module MobileViT. Default arguments is for MobileViT XXS.

Paper: https://arxiv.org/abs/2110.02178
Based on: https://github.com/chinhsuanwu/mobilevit-pytorch

Args:
    mode: 'xxs', 'xs' or 's', defaults to 'xxs'.
    in_channels: the number of channels for the input image.
    patch_size: image_size must be divisible by patch_size.
    dropout: dropout ratio in Transformer.

Example:
    >>> img = torch.rand(1, 3, 256, 256)
    >>> mvit = MobileViT(mode='xxs')
    >>> mvit(img).shape
    torch.Size([1, 320, 8, 8])

modein_channelsr   r?   r	   Nc                 B  > [         T
U ]  5         US:X  a  Sn/ SQn/ SQnO!US:X  a  Sn/ SQn/ SQnOUS	:X  a
  Sn/ S
Qn/ SQnSn/ SQn	[        UWS   SS9U l        [        R
                  " / 5      U l        U R                  R                  [        US   US   SW5      5        U R                  R                  [        US   US   SU5      5        U R                  R                  [        US   US   SU5      5        U R                  R                  [        US   US   SU5      5        U R                  R                  [        US   US   SU5      5        U R                  R                  [        US   US   SU5      5        U R                  R                  [        US   US   SU5      5        [        R
                  " / 5      U l	        U R                  R                  [        WS   U	S   US   X[        US   S-  5      US95        U R                  R                  [        US   U	S   US   X[        US   S-  5      US95        U R                  R                  [        US   U	S   US   X[        US   S-  5      US95        [        US   US   5      U l        g )Nxxsra   )ry   P   `   )   r      r   0   r   ry   ry   r   r   i@  xsr   )r   x      )r       r   r   ry   ry   r   r   r   r   i  s)r         )r   r   ry   ry   r   r      r      r   i  rU   )ra   r   rU   r   )r   r            rx   )r?   	   rl   rS   )r!   r"   r   r   r   r   mv2r   r   mvitr   r3   r   r   )r%   r   r   r   r?   r   dimschannelsr   r}   r&   s             r   r"   MobileViT.__init__  sm    	5=IDDHT\I!DDHS[I"DHH hqk!D
==$!hqk1iHI!hqk1iHI!hqk1iHI!hqk1iHI!hqk1iHI!hqk1iHI!hqk1iHIMM"%			47E!Hhqk;TWX\]^X_bcXcTdnuv	
 			47E!Hhqk;TWX\]^X_bcXcTdnuv	
 			47E!Hhqk;TWX\]^X_bcXcTdnuv	
 !"x|<
r   r(   c                    U R                  U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  S   " U5      nU R                  U5      nU$ )Nr   r   ra   rU   r   r   r   )r   r   r   r   rG   s     r   r,   MobileViT.forwardD  s    JJqMHHQKNHHQKNHHQKNHHQKNHHQKNIIaLOHHQKNIIaLOHHQKNIIaLOJJqMr   )r   r   r   r   )r   rU   )ra   ra   rJ   )r.   r/   r0   r1   r2   r7   r3   r   rL   r"   r5   r6   r,   r8   r9   r:   s   @r   r   r     sj    ( or*=*=.1*=CHc?*=fk*=	*= *=X %,,  r   r   )rU   r   )typingr   r   r   r5   r   r3   r4   r   r   r   r<   rN   r{   r   r   r    r   r   <module>r      s   $ $ #  cS cs cryy c
rS rs r r# rbii r
/bii /"")) &! 		 ! H!")) !H2 ryy 2 j>RYY >BQ		 Qr   