o
    ٷi                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 ee
ZdddZdd	d
Z		ddejdejdejdededejfddZG dd de	ZdS )    )	find_specN)	rearrangerepeat)init_logger)CustomOpFc                 C   sn   |s| j ddd\}}tj| |fddS | dd d df | ddd df }}ttj| |fdddddS )N   dim.   z... d two -> ... (d two))two)chunktorchcatr   stack)xinterleavedx1x2 r   S/home/ubuntu/.local/lib/python3.10/site-packages/vllm_omni/diffusion/layers/rope.pyrotate_half   s
   &r   c                 C   s   |j d d }|| j d ksJ t||sdnd}t||sdnd}tj| dd|f | t| dd|f ||  | d|df gddS )z
    x: (batch_size, seqlen, nheads, headdim)
    cos, sin: (seqlen, rotary_dim / 2) or (batch_size, seqlen, rotary_dim / 2)
    r   r   z... d -> ... 1 (2 d)z... d -> ... 1 (d 2).Nr	   )shaper   r   r   r   )r   cossinr   ro_dimr   r   r   apply_rotary_emb_torch   s   ,r   Tr   r   r   r   half_head_dimreturnc                 C   s  ddl m} | dkr|d }|d }|rW|rM|jd }|ddddddddd|dd}|ddddddddd|dd}|| ||ddd	d
S |rz|jd }|dddddd}|dddddd}|| ||ddd	d
S )Nr   )rotary_position_embedding   r   r   r   rotated_interleavedFT)rotated_mode
head_firstfusedrotated_half)mindiesdr   r
   r   	unsqueezeexpandreshaper   )r   r   r   r   r   r   seqlenr   r   r   apply_rotary_emb_mindiesd'   s   
00
r+   c                       s   e Zd ZdZ	ddeddf fddZdejd	ejd
ejdejfddZdejd	ejd
ejdejfddZ	dejd	ejd
ejdejfddZ
dejd	ejd
ejdejfddZdejd	ejd
ejdejfddZ  ZS )RotaryEmbeddingz
    rotary positional embedding.
    interleaved: if True, rotate pairs of even and odd dimensions (GPT-J style) instead
           of 1st half and 2nd half (GPT-NeoX style).
    Fis_neox_styler   Nc                    sD   t    || _| | _d | _tdd ur ddlm} || _d S d S )N
flash_attnr   )apply_rotary)super__init__r-   r   apply_rotary_emb_flash_attnr   flash_attn.ops.triton.rotaryr/   )selfr-   r/   	__class__r   r   r1   K   s   

zRotaryEmbedding.__init__r   r   r   c                 C   s:   ddl m} | dkr|d }|d }||||| jdS )Nr   )apply_rotary_embr    r   )"vllm.vllm_flash_attn.layers.rotaryr7   r
   r   )r4   r   r   r   r7   r   r   r   forward_cudaX   s   zRotaryEmbedding.forward_cudac                 C   sH   | j d u r| |||S | dkr|d }|d }| j |||| jdS )Nr    r   r8   )r2   r:   r
   r   r4   r   r   r   r   r   r   forward_hipl   s   
zRotaryEmbedding.forward_hipc                 C   s&   t drt|||| jS | |||S )Nr&   )r   r+   r   forward_nativer;   r   r   r   forward_npu   s   zRotaryEmbedding.forward_npuc                 C   s   |  |||S )N)r=   r;   r   r   r   forward_xpu   s   zRotaryEmbedding.forward_xpuc                 C   s   t |||| jdS )Nr8   )r   r   r;   r   r   r   r=      s   zRotaryEmbedding.forward_nativeF)__name__
__module____qualname____doc__boolr1   r   Tensorr:   r<   r>   r?   r=   __classcell__r   r   r5   r   r,   D   sj    



r,   r@   )FT)importlib.utilr   r   einopsr   r   vllm.loggerr   $vllm_omni.diffusion.layers.custom_opr   rA   loggerr   r   rF   rE   r+   r,   r   r   r   r   <module>   s0    

	
