
    Ngd8                        d Z ddlZddlmZmZmZmZ ddlZddlmZ ddl	m
Z
 ddlmZ 	 	 	 d1d
edededeej                 fdZ	 	 	 d2d
edededeej                 dej        f
dZddddej        dfdee         dededededej        deej                 dej        fdZddddddd	dej        df
dee         deej                 d
edededed ed!ed"eee                  dej        deej                 deej                 fd#Z G d$ d%ej                  Zd& Zd'ej        fd(Zd'eej                 fd)Zd'ej        fd*Zd+ Zdddddd	dej        df	dee         deej                 dedededed!ed"eee                  dej        deej                 fd,Z G d- d.ej                  Z  G d/ d0ej                  Z!dS )3zv Sin-cos, fourier, rotary position embedding modules and functions

Hacked together by / Copyright 2022 Ross Wightman
    N)ListTupleOptionalUnion)nn   )ndgrid)_assert      l@T	num_bandsmax_freqlinear_bandsdevicec                     |r't          j        d|dz  | t           j        |          }n<dt          j        dt          j        |d          dz
  | t           j        |          z  }|t           j        z  S )N      ?   dtyper   r   r   )torchlinspacefloat32mathlogpi)r   r   r   r   bandss        X/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/pos_embed_sincos.pypixel_freq_bandsr      sr      qsHqL)5=Y_```U^Atx!'<'<q'@)SXS`iopppp58         @r   temperaturestepreturnc                     t          j        d| |t           j        |                              t           j                  | z  }d||z  z  }|S )Nr   r   r   r   arangeint64tor   )r   r    r!   r   expr   s         r   
freq_bandsr)      sL     ,q)TV
L
L
L
O
OPUP]
^
^aj
jC+$%ELr   @   F
feat_shapedimreverse_coordinterleave_sin_cosr   c                 H   |dz  dk    s
J d            |dz  }t          ||d          }|r| ddd         } t          j        t          fd| D                                                     d                              dd          }	|	                    d          |                    d          z  }
|rd	nd}t          j        t          j        |
          t          j        |
          g|
                              d          }|	                    |          S )a  

    Args:
        feat_shape:
        dim:
        temperature:
        reverse_coord: stack grid order W, H instead of H, W
        interleave_sin_cos: sin, cos, sin, cos stack instead of sin, sin, cos, cos
        dtype:
        device:

    Returns:

       r   zHEmbed dimension must be divisible by 4 for sin-cos 2D position embeddingr   r    r!   r   Nc                     g | ]@}t          j        |t           j                                       t           j                  AS )r   r   r$   .0sr   s     r   
<listcomp>z,build_sincos2d_pos_embed.<locals>.<listcomp>D   sL        	QvU[999<<U]KK  r   r   r,   r   )
r)   r   stackr	   flatten	transpose	unsqueezesincosr'   )r+   r,   r    r-   r.   r   r   pos_dimr   gridpos2	stack_dimpos_embs         `      r   build_sincos2d_pos_embedrF   '   s3   . 7a<<<c<<<QhGwKaOOOE &"%
;v           	

99Q?? 	 >>" 2 22D (.QIk59T??EIdOO<)LLLTTUVWWG::E:"""r      r   max_resinclude_grid	in_pixelsref_feat_shapec                 D  
 |7|r!t          |t          |          |
          }n&t          ||d
          }n
|j        
|	|j        }	|r
fd| D             }n
fd| D             }|d t          || |          D             }t          j        t          |          d	          }|	                    d          }||z  }|
                                                    |	
          |                                                    |	          }}|r|||gn||g}|S )a[  

    Args:
        feat_shape: Feature shape for embedding.
        bands: Pre-calculated frequency bands.
        num_bands: Number of frequency bands (determines output dim).
        max_res: Maximum resolution for pixel based freq.
        temperature: Temperature for non-pixel freq.
        linear_bands: Linear band spacing for pixel based freq.
        include_grid: Include the spatial grid in output.
        in_pixels: Output in pixel freq.
        ref_feat_shape: Reference feature shape for resize / fine-tune.
        dtype: Output dtype.
        device: Output device.

    Returns:

    N)r   r   r   r1   c           	      V    g | ]%}t          j        d d|t           j                  &S )g      r   )stepsr   r   )r   r   r   r5   s     r   r8   z+build_fourier_pos_embed.<locals>.<listcomp>   s1    fffVWU^C1V5=QQQfffr   c                     g | ]@}t          j        |t           j                                       t           j                  AS r4   r$   r5   s     r   r8   z+build_fourier_pos_embed.<locals>.<listcomp>   s=    eeeUVU\!F%+>>>AA%-PPeeer   c                 &    g | ]\  }}}||z  |z  S  rQ   )r6   xfrs       r   r8   z+build_fourier_pos_embed.<locals>.<listcomp>   s&    III71aQUQYIIIr   r2   r9   r:   )r   floatr)   r   r   zipr   r;   r	   r>   r?   r'   r@   )r+   r   r   rH   r    r   rI   rJ   rK   r   r   trB   pospos_sinpos_cosouts             `      r   build_fourier_pos_embedr\   P   sc   > } 	$g)	  EE '	  EE >\F=KE fffff[efffeeeeZdeee!IIc!Z&H&HIII;vayyb)))D>>"D
,Cwwyy||%|00#'')),,u2E2EWG&2
J4'
"
"'8JCJr   c                   8     e Zd Z	 	 	 	 d	dedef fdZd Z xZS )
FourierEmbedrG   r*   TFrH   r   c                     t                                                       || _        || _        || _        || _        |                     dt          ||          d           d S )Nr   F
persistent)super__init__rH   r   concat_gridkeep_spatialregister_bufferr   )selfrH   r   rd   re   	__class__s        r   rc   zFourierEmbed.__init__   ss     	"&(Wi00 	 	
 	
 	
 	
 	
r   c           	         |j         d d         \  }}|j         dd          }t          || j        | j        |j        |j                  }t          j        |d          }|                    dd          	                    t          |                    }|fd|j        dz
  z  z   }| j        rUt          j        ||                    d                              |                              dd	dd          gd          }n}t          j        |                    ddd	d          |                    d                              |          gd          }|                    ||                                d          }|S )
Nr   )rI   r   r   r2   r9   )r2   r   r      )shaper\   r   rd   r   r   r   catr=   r<   lenndimre   r>   expandpermutereshapenumel)rg   rR   BCr+   embbatch_expands          r   forwardzFourierEmbed.forward   si   wrr{1WQRR[
%J)'8
 
 
 i$$$mmB##++C
OO<<teqvz22  	5	1cmmA..55lCCKKAqRSUVWWX^_```AA	199Q1a00#--2B2B2I2I,2W2WX^`aaaA		!Z--//44Ar   )rG   r*   TF)__name__
__module____qualname__intrc   rx   __classcell__rh   s   @r   r^   r^      sq         
 

 
 
 
 
 
 
$      r   r^   c                     t          j        | ddd df          | dd d df         gd                              | j                  S )N.r   r   r2   )r   r;   rr   rl   )rR   s    r   rotr      sG    ;319qccc{3R88@@IIIr   rR   c                    |j         dk    rd| |                    d                              |           z  t          |           |                    d                              |           z  z   S | |z  t          |           |z  z   S )Nrk   r   )ro   r>   	expand_asr   rR   sin_embcos_embs      r   apply_rot_embedr      s~    |q7$$Q''11!444s1vv@Q@QRS@T@T@^@^_`@a@a7aaaw;Q')))r   c                 ^    t          | t          j                  r| g} fd| D             S )Nc                 @    g | ]}|z  t          |          z  z   S rQ   )r   )r6   rW   r   r   s     r   r8   z(apply_rot_embed_list.<locals>.<listcomp>   s-    666qAK#a&&7**666r   )
isinstancer   Tensorr   s    ``r   apply_rot_embed_listr      s<    !U\"" C66666A6666r   c                 B   |                     dd          \  }}|j        dk    rd| |                    d                              |           z  t	          |           |                    d                              |           z  z   S | |z  t	          |           |z  z   S )Nr   r2   rk   r   )tensor_splitro   r>   r   r   )rR   rv   r   r   s       r   apply_rot_embed_catr      s    ''2..GW|q7$$Q''11!444s1vv@Q@QRS@T@T@^@^_`@a@a7aaaw;Q')))r   c           	         |                     d                              | j        d         dd          }|                    d|                     d                              dd|j        d                             }|S )Nr   r2   r   )r>   rp   rl   gather)rR   	pos_embedkeep_indicess      r   apply_keep_indices_nlcr      sp    ##A&&--agaj"bAAI  L$:$:2$>$>$E$Eb"io^`Na$b$bccIr   c
                    t          | ||dz  ||||||	|
  
        \  }
}d}| D ]}||z  }|
                    |d                              dd          }
|                    |d                              dd          }|
|fS )a  

    Args:
        feat_shape: Spatial shape of the target tensor for embedding.
        bands: Optional pre-generated frequency bands
        dim: Output dimension of embedding tensor.
        max_res: Maximum resolution for pixel mode.
        temperature: Temperature (inv freq) for non-pixel mode
        linear_bands: Linearly (instead of log) spaced bands for pixel mode
        in_pixels: Pixel vs language (inv freq) mode.
        dtype: Output dtype.
        device: Output device.

    Returns:

    r0   )	r   r   rH   r    r   rJ   rK   r   r   r   r2   r   )r\   rr   repeat_interleave)r+   r   r,   rH   r    r   rJ   rK   r   r   r   r   num_spatial_dimrR   s                 r   build_rotary_pos_embedr      s    8 /(!%  GW O  1ooor22DDQKKGooor22DDQKKGGr   c            	            e Zd ZdZ	 	 	 	 	 	 ddedeee                  d	eee                  f fd
Zddeee                  fdZ	d Z
 xZS )RotaryEmbeddinga   Rotary position embedding

    NOTE: This is my initial attempt at impl rotary embedding for spatial use, it has not
    been well tested, and will likely change. It will be moved to its own file.

    The following impl/resources were referenced for this impl:
    * https://github.com/lucidrains/vit-pytorch/blob/6f3a5fcf0bca1c5ec33a35ef48d97213709df4ba/vit_pytorch/rvt.py
    * https://blog.eleuther.ai/rotary-embeddings/
    rG   '  TFNr   r+   rK   c                    t                                                       || _        || _        || _        || _        || _        || _        |b|r#t          |dz  t          |          |          }nt          |dz  |d          }|                     d|d           d | _        d | _        d S t          |||||| j                  \  }	}
d | _        |                     d	|	d           |                     d
|
d           d S )Nr0   r   r   r    r!   r   Fr`   r+   r,   rH   r   rJ   rK   pos_embed_sinpos_embed_cos)rb   rc   r,   rH   r    rJ   r+   rK   r   rU   r)   rf   r   r   r   r   )rg   r,   rH   r    rJ   r   r+   rK   r   emb_sinemb_cosrh   s              r   rc   zRotaryEmbedding.__init__  sr    	&"$, (1H'NN!-   #1H +  
     !   
 "&D!%D  6%)##2     GW DJ    !   
     !     r   rl   c                 l    | j          |J t          || j         | j                  S | j        | j        fS )N)rJ   )r   r   rJ   r   r   )rg   rl   s     r   	get_embedzRotaryEmbedding.get_embedX  sM    :!$$$)
.    %t'999r   c                 n    |                      |j        dd                    \  }}t          |||          S Nr   )r   rl   r   )rg   rR   r   r   s       r   rx   zRotaryEmbedding.forwardd  s4    >>!'!""+66q'7333r   rG   r   TFNNNry   rz   r{   __doc__boolr   r   r|   rc   r   rx   r}   r~   s   @r   r   r     s          !&.226; ; ; !c+; %T#Y/; ; ; ; ; ;z
: 
:xS	2 
: 
: 
: 
:4 4 4 4 4 4 4r   r   c            	            e Zd ZdZ	 	 	 	 	 	 ddedeee                  d	eee                  f fd
Zddeee                  fdZ	d Z
 xZS )RotaryEmbeddingCata   Rotary position embedding w/ concatenatd sin & cos

    The following impl/resources were referenced for this impl:
    * https://github.com/lucidrains/vit-pytorch/blob/6f3a5fcf0bca1c5ec33a35ef48d97213709df4ba/vit_pytorch/rvt.py
    * https://blog.eleuther.ai/rotary-embeddings/
    rG   r   TFNr   r+   rK   c                    t                                                       || _        || _        || _        || _        || _        || _        |[|r#t          |dz  t          |          |          }nt          |dz  |d          }|                     d|d           d | _        d S t          |||||| j                  }	d | _        |                     d	t          j        |	d
          d           d S )Nr0   r   r   r   r   Fr`   r   r   r2   )rb   rc   r,   rH   r    rJ   r+   rK   r   rU   r)   rf   r   r   r   r   rm   )rg   r,   rH   r    rJ   r   r+   rK   r   embedsrh   s             r   rc   zRotaryEmbeddingCat.__init__r  sF    	&"$, (1H'NN!-   #1H +  
     !   
 "DNNN ,%)##2  F DJ  	&"%%  !     r   rl   c                     | j         9|7t          || j         | j        | j                  }t	          j        |d          S | j        | j        S J d            )N)rJ   rK   r2   FzPget_embed() requires pre-computed pos_embed or valid shape w/ pre-computed bands)r   r   rJ   rK   r   rm   r   )rg   rl   r   s      r   r   zRotaryEmbeddingCat.get_embed  si    :!e&7+
.#2	  F 9VR(((^'>!lllllr   c                 f    |                      |j        dd                    }t          ||          S r   )r   rl   r   )rg   rR   r   s      r   rx   zRotaryEmbeddingCat.forward  s-    NN17122;//	"1i000r   r   r   r   r~   s   @r   r   r   j  s          !&.2265 5 5 !c+5 %T#Y/5 5 5 5 5 5nm mxS	2 m m m m1 1 1 1 1 1 1r   r   )r   TN)r   r   N)"r   r   typingr   r   r   r   r   r   rB   r	   trace_utilsr
   r|   rU   r   r   r   r   r)   r   r   rF   r\   Moduler^   r   r   r   r   r   r   r   r   rQ   r   r   <module>r      sl     / / / / / / / / / / / /                         
 !)-	
 


 
 &	
 
 
 
 $)-	   &	
 \    ###("])-&# &#I&#&# &# 	&#
 !&# {&# &&# \&# &# &# &#V )-#"".2"])-C CIC%C C 	C
 C C C C !c+C {C &C 
%,C C C CL) ) ) ) )29 ) ) )XJ J J*u| * * * *7D. 7 7 7 7*5< * * * *   )-#".2"])-. .I.%. . 	.
 . . . !c+. {. &. . . .bW4 W4 W4 W4 W4bi W4 W4 W4tQ1 Q1 Q1 Q1 Q1 Q1 Q1 Q1 Q1 Q1r   