
    h3/                        S SK r S SKrS SKJr  S SKJrJrJrJr  \ R                  " SSS9r
\ R                  " / SQSS9r\ R                  " / S	Q/ S
Q/ SQ/ SQ/5      r\ R                  " / SQ5      r\ R                  " / SQ/ SQ/ SQ/ SQ/5      r/ SQr\ R                  " / SQ/5      r\ R                  " S/5      rS/rSrS r\R,                  R/                  S\" 5       \" SS9\" 5       /5      \R,                  R/                  S\
\\/5      S 5       5       r\R,                  R/                  S\\4\\4/5      S 5       rS r\R,                  R/                  S\/ SQ4/5      S 5       r\R,                  R/                  S\\4\\4/5      S  5       r\R,                  R/                  S!\\/\\// 4\\/\\// 4\\/\\// S"Q4/5      S# 5       r\R,                  R/                  S!\// S$Q// S"Q4/5      S% 5       rS& rS' r S( r!S) r"\R,                  R/                  S*S+0 \
\44S,0 \
/\/44S-S.S/0\
\44S0S.S/0\
\44S1S.S/0\
/\/44S2S.S/0\
/\/44S30 \
\
44S4SSS5.\
\
44/5      S6 5       r#g)7    N)registry)CategoricalCrossentropyCosineDistance
L2DistanceSequenceCategoricalCrossentropy)   r   f)dtype)r      r   i)皙?      ?333333?)皙?r   333333?)r   r   r   )r   r   r   )   r   r   r   )r   r   r   )r   r   r   )r   r   r   )CBAr   )皙?r           r   r   g-C6?c                     [        5       R                  [        [        5      n U R                  S:X  d   eU R
                  [        R
                  :X  d   e[        5       R                  [        /[        /5      n U S   R                  S:X  d   eU S   R
                  [        R
                  :X  d   e[        5       R                  / / 5      / :X  d   eg )Nfloat32r   )r   get_gradscores0labels0r
   shaper   )d_scoress    O/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/test_loss.py	test_lossr       s    &(11'7CH>>Y&&&>>W]]***.0997)gYOHA;	)))A;---*,55b"=CCC    distT)ignore_zerosvectc                     [        U R                  X5      S   S   5      [        R                  " S[        5      :X  d   eU R                  X5      [        R                  " S[        5      :X  d   eg )Nr   )intr   pytestapproxepsget_loss)r"   r$   s     r   test_equalityr+   '   sW    
 t}}T(+A./6==C3HHHH==$a(====r!   zguesses, labelsc                 N   [        SS9R                  X5      nUR                  U R                  :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S
[
        5      :X  d   e[        SS9R                  X5      nU[        R                  " S[
        5      :X  d   eg )NT	normalizer   r   r   皙r   g      ?r         пgp=
ף?r   r   r   r'   r(   r)   r*   guesseslabelsr   losss       r   test_categorical_crossentropyr6   0   sk    '6??PH>>W]]*** A;q>V]]34444A;q>V]]45555 A;q>V]]1c2222A;q>V]]45555A;q>V]]45555 A;q>V]]1c2222A;q>V]]1c2222A;q>V]]5#6666"T2;;GLD6==3////r!   c                     [         R                  " S/5      n [         R                  " / SQ/5      n[        R                  " [        SS9   [        SS9R                  X5        S S S 5        [         R                  " / SQ/5      n[        R                  " [        SS9   [        SS9R                  X 5        S S S 5        [         R                  " / SQ/5      n[         R                  " / SQ/5      n[        R                  " [        S	S9   [        SS9R                  X45        S S S 5        [         R                  " / S
Q/5      n[        R                  " [        S	S9   [        SS9R                  X55        S S S 5        g ! , (       d  f       GN"= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g = f)Nr   )r/   r   r   zCannot calculate.*guesses)matchTr-   )g?r   r   )r   r   r   zCannot calculate.*truth)g       @r   r   )numpyasarrayr'   raises
ValueErrorr   r   )r4   guesses_negguesses_larger_than_one
guesses_oktargets_negtargets_larger_than_ones         r   *test_crossentropy_incorrect_scores_targetsrB   I   sB   ]]A3F--!1 23K	z)E	F$/88M 
G $mm_,=>	z)E	F$/88#	
 
G
 01J--!1 23K	z)C	D$/88Q 
E $mm_,=>	z)C	D$/88	
 
E	D 
G	F 
G	F 
E	D 
E	Ds0   
E>F	F!F2>
F
F!
F/2
G c                    [        SSS9R                  X5      nUR                  U R                  :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S   S:X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S
[
        5      :X  d   e[        SSS9R                  X5      nU[        R                  " S[
        5      :X  d   eg NTr   )r.   missing_valuer   r   r/   r   r   r   r0   gHzG?r1   r2   s       r   .test_categorical_crossentropy_int_list_missingrF   b   sX   
 'QGPPH >>W]]*** A;q>V]]34444A;q>V]]45555 A;q>S   A;q>S   A;q>S    A;q>V]]1c2222A;q>V]]1c2222A;q>V]]5#6666"TCLLD 6==3////r!   c                    [        SSS9R                  X5      nUR                  U R                  :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   [        R                  " S[
        5      :X  d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S   S:X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S[
        5      :X  d   eUS	   S   [        R                  " S
[
        5      :X  d   e[        SSS9R                  X5      nU[        R                  " S[
        5      :X  d   eg rD   r1   r2   s       r   %test_categorical_crossentropy_missingrH      sX    'QGPPH >>W]]*** A;q>V]]34444A;q>V]]45555 A;q>S   A;q>S   A;q>S    A;q>V]]1c2222A;q>V]]1c2222A;q>V]]5#6666"TCLLD 6==3////r!   zguesses, labels, names)r   r   r   c                 ,   [        SUS9R                  X5      nUS   nUS   nUR                  [        R                  :X  d   eUR                  [        R                  :X  d   eUS   S   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S[        5      :X  d   e[        SUS9R                  X5      nUS   nUS   nUS   S   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S	[        5      :X  d   eUS
   S   [
        R                  " S[        5      :X  d   eUS
   S   [
        R                  " S[        5      :X  d   eUS
   S
   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S[        5      :X  d   eUS   S
   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S[        5      :X  d   eUS   S   [
        R                  " S[        5      :X  d   e[        SUS9R                  X5      nU[
        R                  " S[        5      :X  d   eg )NF)r.   namesr   r   r   gٿTr   gɿr   r   r   g      r   gffffffֿgq=
ףp?)	r   r   r   guesses1guesses2r'   r(   r)   r*   )r3   r4   rJ   r   	d_scores1	d_scores2r5   s          r   &test_sequence_categorical_crossentropyrO      sS    /eLUUH II??hnn,,,??hnn,,,Q<?fmmC5555Q<?fmmD#6666.UKTTH IIQ<?fmmC5555Q<?fmmD#6666 Q<?fmmAs3333Q<?fmmC5555Q<?fmmC5555 Q<?fmmAs3333Q<?fmmAs3333Q<?fmmD#6666 Q<?fmmC5555Q<?fmmE37777*TGPPD 6==s++++r!   )r   z!A z!Cc                    [        SUSSS9R                  X5      nUS   nUS   S   [        R                  " S[        5      :X  d   eUS   S   [        R                  " S[        5      :X  d   eUS   S	   [        R                  " S
[        5      :X  d   eUS   S   [        R                  " S[        5      :X  d   eUS   S   [        R                  " S[        5      :X  d   eUS   S	   [        R                  " S[        5      :X  d   eUS	   S   [        R                  " S[        5      :X  d   eUS	   S   [        R                  " S[        5      :X  d   eUS	   S	   [        R                  " S[        5      :X  d   eUS   S   [        R                  " S[        5      :X  d   eUS   S   [        R                  " S[        5      :X  d   eUS   S	   [        R                  " S[        5      :X  d   eg )NF!rP   )r.   rJ   
neg_prefixrE   r   gr   r   r   r   r   r   r   )r   r   r'   r(   r)   )r3   r4   rJ   r   	d_scores0s        r   *test_sequence_categorical_missing_negativerU      s    /uBhw  I Q<?fmmD#6666Q<?fmmC5555Q<?fmmC5555 Q<?fmmC5555Q<?fmmC5555Q<?fmmC5555 Q<?fmmC5555Q<?fmmC5555Q<?fmmC5555 Q<?fmmC5555Q<?fmmC5555Q<?fmmC5555r!   c                  Z   [         R                  " SS/SS//5      n [         R                  " SS/SS//5      n[        5       R                  X5      nUR                  U R                  :X  d   e[         R
                  R                  US   [         R                  " US   R                  5      [        [        S9  [        S	S
9R                  X5      nU[        R                  " S[        5      :X  d   e[        SS
9R                  X5      nU[        R                  " S[        5      :X  d   eg )Nr   r      	   
      r   rtolatolFr-      T)r9   r:   r   r   r   testingassert_allclosezerosr)   r*   r'   r(   vec1vec2d_vecsloss_not_normalizedloss_normalizeds        r   test_L2rh      s    ==1a&1a&)*D==1a&2q'*+D\""4.F<<4::%%%	MM!!q	5;;vay/c "  %u5>>tJ&--C"8888 4099$EOfmmAs3333r!   c                  0   [         R                  " SS/SS//5      n [         R                  " SS/SS//5      n[        SS9R                  X5      nUR                  U R                  :X  d   eUS   S   S:  d   eUS   S   S:  d   eUS   S   S:  d   eUS   S   S:  d   e[        S	S9R                  X5      nU[        R                  " S[        5      :X  d   e[        SS9R                  X5      nU[        R                  " S[        5      :X  d   eg )
Nr   r   rZ   rW      Tr-   r   F)	r9   r:   r   r   r   r*   r'   r(   r)   rb   s        r   test_cosine_orthogonalrk      s   ==1a&1a&)*D==1a&1a&)*Dd+44T@F<<4::%%%!9Q<!!9Q<!!9Q<!!9Q<!(59BB4N&--3"7777$t4==dIOfmmAs3333r!   c                  Z   [         R                  " SS/SS/SS//5      n [         R                  " SS/SS/SS//5      n[        5       R                  X5      nUR                  U R                  :X  d   e[         R
                  R                  U[         R                  " UR                  5      [        [        S	9  [        S
S9R                  X5      nU[        R                  " S[        5      :X  d   e[        SS9R                  X5      nU[        R                  " S[        5      :X  d   eg )Nr   r   rW   rX   r   P   Z   i,  r[   Fr-   r   T)r9   r:   r   r   r   r_   r`   ra   r)   r*   r'   r(   )rc   rd   d_vec1rf   rg   s        r   test_cosine_equalrp     s    ==1a&1a&1a&12D==1a&2r(S#J78D&&t2F<<4::%%%	MM!!&%++fll*C#TW!X(59BB4N&--3"7777$t4==dIOfmmAs3333r!   c                     [         R                  " / SQ/5      n [         R                  " SS//5      n[        R                  " [        5         [        5       R                  X5        S S S 5        g ! , (       d  f       g = f)N)r   r   r   r   r   )r9   r:   r'   r;   r<   r   r   )rc   rd   s     r   test_cosine_unmatchedrr   "  sO    ==)%D==1a&"D	z	"!!$- 
#	"	"s   A00
A>zname,kwargs,argszCategoricalCrossentropy.v1z"SequenceCategoricalCrossentropy.v1zCategoricalCrossentropy.v2rS   rR   zCategoricalCrossentropy.v3z"SequenceCategoricalCrossentropy.v2z"SequenceCategoricalCrossentropy.v3zL2Distance.v1zCosineDistance.v1)r.   r#   c                     SSU 0UE0n[         R                  " U5      S   nUR                  " U6 n[        U[        [
        45      (       a  US   nUR                  S:X  d   eUR                  " U6   U" U6   g)zQTest that losses are loaded and configured correctly from registry
(as partials).testz@lossesr   r   N)r   resolver   
isinstancelisttuplendimr*   )namekwargsargscfgfuncr5   s         r   test_loss_from_configr   )  sx    8 It.v.
/CC (D==$D$u&&Aw99>>MM4$Kr!   )$r9   r'   thincr   	thinc.apir   r   r   r   ra   r   r:   r   rK   labels1labels1_fulllabels1_stringsrL   labels2labels2_stringsr)   r    markparametrizer+   r6   rB   rF   rH   rO   rU   rh   rk   rp   rr   r    r!   r   <module>r      s@       ++fC
(
--	
- ==/?IyQR
--
%}}iIyIJ&==/*+
--
%D 
$&D(I:<X '8X!>?> @>
 7+h-EF00,
2 0	04 7+h-EF004 
H	126
H	g6;
H	A?S%,%,P 
+,o>6664"4&4 . 	%rGW+=>	-rWIy3IJ	%c':Wg<NO	%c':Wg<NO03Y	"	
 13Y	"	

 
"w015g	
!2
32
r!   