o
    {i                     @   sJ   d dl Z d dlmZ d dlZd dlZd dlmZmZ G dd dejZ	dS )    N)Literal)Tensornnc                       s   e Zd Zdddddddddd	dedededB dedB d	edB d
ed dedB dedB dedB dejdB dejdB f fddZ	dedede
eef fddZdd Z  ZS )RopePositionEmbeddingg      Y@Nseparate)	base
min_period
max_periodnormalize_coordsshift_coordsjitter_coordsrescale_coordsdtypedevice	embed_dim	num_headsr   r   r	   r
   )minmaxr   r   r   r   r   r   c       
            s   t    |d|  dksJ |d uo|d u}|d u r|r#|d ur'|r'td|| }|| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _| jdtj|d ||
ddd |   d S )N   r   z<Either `base` or `min_period`+`max_period` must be provided.periodsr   r   T)
persistent)super__init__
ValueErrorr   r   r	   D_headr
   r   r   r   r   register_buffertorchempty_init_weights)selfr   r   r   r   r	   r
   r   r   r   r   r   Zboth_periodsr   	__class__ P/data/cameron/keygrip/volume_dino_tracks/dinov3/layers/rope_position_encoding.pyr      s*   
zRopePositionEmbedding.__init__HWreturnc                C   sb  | j j}| j}||d}| jdkr/t||}tjd|fi || }tjd|fi || }nI| jdkrRt||}	tjd|fi ||	 }tjd|fi ||	 }n&| jdkrptjd|fi || }tjd|fi || }ntd| j tj	tj
||ddd	d
}
|
dd}
d|
 d }
| jr| jd urtjdi || j | j}|
|d d d f 7 }
| jr| jd urt| j}| }tjdi ||| }|
|d d d f 9 }
| jr| jd urt| j}| }tjdi ||| }|
|9 }
dtj |
d d d d d f  | j d d d d f  }|dd}|d}t|}t|}||fS )Nr   r   g      ?r   r   zUnknown normalize_coords: ij)indexing)dimr      g       @g      ?   )r-   )r,   )r   r   r   r
   r   r   aranger   r   stackmeshgridflattentrainingr   r   uniform_r   nplogexpr   mathpitilecossin)r    r%   r&   r   r   ddZmax_HWcoords_hcoords_wZmin_HWcoordsZshift_hwZ
jitter_maxZ
jitter_minZ	jitter_hwZrescale_maxZrescale_minZ
rescale_hwanglesr:   r;   r#   r#   r$   forward9   sJ   





4


zRopePositionEmbedding.forwardc                 C   s   | j j}| j}| jd ur"| jdtj| jd ||d | jd   }n | j| j }tj	dd| jd ||d}|| }|| }|| j }|| j _
d S )Nr-   r   r   r   r,   )r   r   r   r   r   r.   r   r	   r   linspacedata)r    r   r   r   r   	exponentsr#   r#   r$   r   l   s   
"
z#RopePositionEmbedding._init_weights)__name__
__module____qualname__intfloatr   r   r   r   r   tupler   rA   r   __classcell__r#   r#   r!   r$   r      sF    	
(3r   )
r7   typingr   numpyr4   r   r   r   Moduler   r#   r#   r#   r$   <module>   s   