
    h                     @   S SK Jr  S SKJr  S SKrS SKJr  S SKJr  S SK	J
r
  S SKJrJr  S SKJr  S S	KJrJrJr  \ " S
 S5      5       r\R*                  " SSS9S\R,                  S\R,                  4S j5       r " S S\R0                  R2                  5      rS\R,                  S\R,                  S\S\R,                  4S jr\" \5      \
SSSS4S\R,                  S\R,                  S\R,                  S\S\S-  S\S\S\\-  S-  S\R,                  4S  jj5       r g)!    )	dataclass)castN)cce_backward_kernel)cce_lse_forward_kernel)IGNORE_INDEX)LINEAR_CROSS_ENTROPY_DOCadd_doc_start)indexed_neg_dot_forward_kernel)_build_flat_valids_handle_epshandle_reduction_nonec                       \ rS rSr% \R
                  \S'   \R
                  S-  \S'   \S-  \S'   \\S'   \S-  \S'   \	\S'   \R                  \S	'   S
rg)	CCEParams   targetsNvalidssoftcap	reduction
filter_epsshiftbatch_shape )__name__
__module____qualname____firstlineno__torchTensor__annotations__floatstrboolSize__static_attributes__r       O/home/james-whalen/.local/lib/python3.13/site-packages/cut_cross_entropy/cce.pyr   r      sC    \\LL4T\NKr%   r   T)	fullgraphdynamic	logit_avgreturnc                 h    [         R                  " U 5      R                  [         R                  5      $ )N)r   argsorttoint32)r)   s    r&   sort_logit_avgr/      s     ==#&&u{{33r%   c            	           \ rS rSr\S\R                  S\R                  S\S\R                  4S j5       r\S\R                  S\	\R                  \R                  S4   4S	 j5       r
S
rg)LinearCrossEntropyFunction#   ecparamsr*   c           	      <   UR                   =(       d    UR                   nU=(       a    UR                  S Ln[        UUUR                  UR                  US9nU(       a  [        U[        5      (       d   eUu  pxO%[        U[        R                  5      (       d   eUnS n[        XUR                  UR                  UR                  UR                  UR                  5      n	U	R                  U5      n
UR                  nUS:X  a  U
R                  5       nOXUS:X  a  U
R!                  5       nOAUS:X  a-  [#        UR$                  UR                  UR                  U
5      nO['        SU 35      eU R)                  XXsR                  UR                  U5        X0l        U$ )N)r   return_logit_avgmeansumnoneUnknown reduction )requires_gradr   r   r   r   
isinstancetupler   r   r
   r   r   dtypeadd_r   r8   r9   r   r   
ValueErrorsave_for_backwardr5   )ctxr3   r4   r5   
needs_gradr7   retlser)   neg_dotnllr   losss                r&   forward"LinearCrossEntropyFunction.forward$   s[    __7
%G&*;*;4*G$MMNN-
 c5)))) NCc5<<0000CI0&..&,,v~~syy
 ll3$$	88:D%779D& (););V]]FLLZ]^D1)=>>aC	R
r%   grad_outNc                    U R                   u  p#pEpgUb  [        U5      nOS n[        [        U R                  5      n	U	R
                  n
U
S:X  a  SUR                  5       -  nO1U
S:X  a  SnO(U
S:X  a  SnUR                  S5      nO[        SU
 35      e[        UUUUUU	R                  U	R                  UU	R                  UUS9u  pXS 4$ )	Nr8      r9   g      ?r:   r;   )r   r   vocab_ordering
grad_scale)saved_tensorsr/   r   r   r5   r   numelviewrA   r   r   r   r   )rC   rL   hwrF   r   r   r)   rP   r5   r   rQ   dedcs                 r&   backward#LinearCrossEntropyFunction.backwardR   s    030A0A-cF +I6N!Ni,$$	SYY[J%J& J}}R(H1)=>>$NN,,)!
 t|r%   r   )r   r   r   r   staticmethodr   r   r   rJ   r>   rY   r$   r   r%   r&   r1   r1   #   s    +<<+ <<+ 	+
 
+ +Z " "u||U\\SW7W1X " "r%   r1   r3   r4   r5   c                     [         R                  XU5      n[        U[        R                  5      (       d   eUR
                  (       a  UR                  S:X  a	  USSS 24   nU$ )Nr:   .rN   )r1   applyr=   r   r   r   r   )r3   r4   r5   rI   s       r&   linear_cross_entropy_applyr^   x   sU    
 &++A&9DdELL))))||((F2CG}Kr%   r8   Fautor   ignore_indexr   r   r   r   c                    U R                  5       SS UR                  5       :X  d   eU R                  S5      UR                  S5      :X  d   eUR                  5       nU R                  5       n UR                  5       n[        X#U5      n	U R                  SS5      n UR                  5       n[	        U U[        UU	UU[        XpR                  5      UU5      5      $ )z
:param filter_eps: The threshold value used to determine which locations can be safely ignored
    in gradient computation. The default value of "auto" will automatically choose a value
    based on the input dtype.
r   rO   rN   )size
contiguousr   flattenr^   r   r   r?   )
r3   r4   r   r`   r   r   r   r   r   r   s
             r&   cce_linear_cross_entropyrf      s      668Ab>W\\^+++66":""" ,,.K	A  "Gu=F			!RAooG%		
GG,	
 r%   )!dataclassesr   typingr   r   cut_cross_entropy.cce_backwardr   !cut_cross_entropy.cce_lse_forwardr   cut_cross_entropy.constantsr   cut_cross_entropy.docr   r	   cut_cross_entropy.indexed_dotr
   cut_cross_entropy.utilsr   r   r   r   compiler   r/   autogradFunctionr1   r^   intr    r!   r"   rf   r   r%   r&   <module>rs      sa   !   > D 4 I H     t,4ell 4u|| 4 -4R!8!8 Rj||||  \\	 '(
 % %+-||-||- \\- 	-
 T\- - - d"- \\- )-r%   