o
    r::j                     @  s>   d dl mZ d dlZd dlmZ dd	d
ZG dd deZdS )    )annotationsN)OpRunx
np.ndarray	num_headsintreturnc                 C  sZ   | j \}}}|| dkrtd| d| d| j  d|| }| ||||ddddS )	z$Reshape (B, T, H*D) -> (B, H, T, D).r   z	Last dim z not divisible by num_heads z for shape .         )shape
ValueErrorreshape	transpose)r   r   bthdd r   m/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/onnx/reference/ops/op_linear_attention.py_unpack_3d_to_4d   s   r   c                   @  s&   e Zd Z								dddZdS )LinearAttentionNc           +      C  s  |d u rd}|dvrt d| d|	d u s|d u rt d|	dks,|dks,|	| dkr7t d|	 d| d	|d
v }|dv }|rM|d u rMt d| d|s[|d ur[t d| d|ri|d u rit d| d|sw|d urwt d| dd|fd|fd|ffD ]\}}|jdkrt | d|j dq|j}|j\}}}|jd |	 }|jd | }|	| }t||	tj}t||tj}t||tj}|d ur|jdkrt d|j d|jd }||kr||||d	dddd}n||| krt||}nt d| d| d||  d	|tj}|d urZ|jdkr/t d|j d|jd }||dfvrFt d| d | d!||||d	dddd}|tj}|d ur|j||||fkr~t d"|j d#| d$| d$| d$| d	|j}|tj
 }n|}tj||||ftjd%}|
d u s|
d&krd't| } nt|
} tj||	||ftjd%}!t|D ]}"|d d d d |"d d f }#|d d d d |"d d f }$|d d d d |"d d f }%|r|d d d d |"d d f }&|t|&d(  }|r td)||$}'|d d d d |"d d f |%|'  }%||$d*d d d f |%d*d d d f   }|dkr<|}(ntj||dd+}(| td,|#|( |!d d d d |"d d f< q|!	dddd|||	| })|)|})||}*|)|*fS )-Ngated_delta)lineargateddeltar   zUnsupported update_rule 'z>'. Expected one of: 'linear', 'gated', 'delta', 'gated_delta'.z5q_num_heads and kv_num_heads are required attributes.r   zq_num_heads (z/) must be a positive multiple of kv_num_heads (z).)r   r   )r   r   zupdate_rule 'z' requires decay input.z' forbids decay input.z' requires beta input.z' forbids beta input.querykeyvaluer   z' must be rank 3 (B, T, H*D), got shape r	   z decay must be rank 3, got shape r   r
   zdecay last dim z must equal kv_num_heads (z) or kv_num_heads*d_k (zbeta must be rank 3, got shape zbeta last dim z must be kv_num_heads (z) or 1.zpast_state shape z does not match (z, )dtypeg        g      ?).Nzbhdm,bhd->bhm.)axiszbhd,bhdm->bhm)r   ndimr   r!   r   astypenpfloat32r   r   copyzerossqrtfloatrangeexpeinsumrepeat)+selfr   r   r   
past_statedecaybeta
chunk_sizekv_num_headsq_num_headsscaleupdate_rulegatingdelta_correctionnamearr	out_dtyper   r   _d_kd_v
group_sizeq4k4v4
decay_lastdecay4	beta_lastbeta4state_in_dtypestate	scale_valoutputsiq_tk_tv_tg_t	retrievedstate_for_readoutputpresent_stater   r   r   _run   s   








$(
"

zLinearAttention._run)NNNNNNNN)__name__
__module____qualname__rU   r   r   r   r   r      s    r   )r   r   r   r   r   r   )
__future__r   numpyr%   onnx.reference.op_runr   r   r   r   r   r   r   <module>   s
   
