
    h              	          S SK JrJrJrJrJr  S SKrS SKJr  S SK	J
r
JrJr  S SKJr  S SKJr  S SKJrJrJrJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJ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,  S SK-J.r.  \R^                  S 5       r0S r1\Rd                  Rg                  S5      S 5       r4\Rd                  Rg                  S5      S 5       r5\Rd                  Rg                  S5      S 5       r6\Rd                  Rg                  S5      \Rd                  Ro                  SSS/5      S\84S j5       5       r9S  r:S! r;S" r<S# r=S$ r>S% r?S& r@S' rAS( rBS) rCS* rD\Rd                  Rg                  S+5      S, 5       rES- rFS. rGS/ rHS0 rIS1 rJS2 rKS3 rL\Rd                  R                  S45      S5 5       rN\Rd                  R                  S45      S6 5       rOS7 rPS8 rQS9S:S;S<S=.0S>// S?QS@.4SAS:S<S;S=.0S>SB// SCQS@.4SDS:S<S;S=.0S>// SCQS@.4SES:S;S<S=.0S>SF// S?QS@.4SG0 / / SHQS@.4/rR/ SIQrSSJ rTSK rUSL rV\Rd                  R                  SMSN9SO 5       rX\Rd                  R                  SMSN9SP 5       rYSQ rZSR r[SS r\\Rd                  Ro                  STSUSV\!SW.4SUSX\!SW.4/5      SY 5       r]\Rd                  Ro                  SZS[S\S]./S^S_S]./S`SaS].SbScS].//5      Sd 5       r^\Rd                  Rg                  Se5      Sf 5       r_Sg r`\Rd                  Ro                  ShSSX\!SW.4SSX\!SW.4/5      Si\8Sj\\a\4   4Sk j5       rbSl rcg)m    )AnyCallableDictIterableTupleN)assert_equal)Languageregistryutil)	ENT_KB_ID)pickle)	CandidateInMemoryLookupKBKnowledgeBaseget_candidatesEnglish)load_kb)build_span_maker)EntityLinker)EntityLinker_v1)DEFAULT_TOK2VEC_MODEL)Scorer)make_tempdir)DocSpan)Example)ensure_path)Vocabc                      [        5       $ Nr        a/home/james-whalen/.local/lib/python3.13/site-packages/spacy/tests/pipeline/test_entity_linker.pynlpr%      s
    9r#   c                 4    SnX-
  Us=::  a	  X-   ::  d   e   eg )Ng-C6?r"   )abdeltas      r$   assert_almost_equalr*      s$    E9&QY&&&&&r#   iB  c                  ~   [        5       n [        U R                  SS9n/ SQn/ SQn[        R                  " [
        5         UR                  SS/SS/X#/S9  S	S	S	5        UR                  5       S
:X  d   e[        5        n[        U5      nUR                  5       (       d  UR                  5         US-  nUR                  [        U5      5        [        U R                  SS9nUR                  [        U5      5        S	S	S	5        WR                  5       S
:X  d   eg	! , (       d  f       N= f! , (       d  f       N6= f)zKTest that setting entities with overlapping identifiers does not mess up IO   entity_vector_length)?g?g)\(?)g?g      @gGz @Q1    o   )entity_list	freq_listvector_listN   kb)r   r   vocabpytestwarnsUserWarningset_entitiesget_size_entitiesr   r   existsmkdirto_diskstr	from_disk)r%   r7   vector1vector2ddir_path	file_pathkb2s           r$   test_issue4674rI   "   s    )C	#))!	<BGG	k	"
t3i * 	 	
 
# !Q&&&	1q>  NNtO	


3y>"syyqAc)n% 
   "a'''! 
#	" 
s   D A>D.
D+.
D<iJ  c                 D   SSK Jn  U" U SS9nUR                  SS/ SQS9  [        R                  " [
        5         UR                  S	S/S
/S9  SSS5        UR                  S	5      SL d   eUR                  SS/S/S9  UR                  SS/S/S9  [        5        nUR                  U5        UR                  U5        SSS5        UR                  5       S:X  d   e[        UR                  5       5      SS1:X  d   eg! , (       d  f       N= f! , (       d  f       NW= f)zNEnsure that the KB does not accept empty strings, but otherwise IO works fine.r   )r   r,   r-   1   r6      r,   entityfreqentity_vector 皙?aliasentitiesprobabilitiesNFx皙?y皙?rN   )spacy.kb.kb_in_memoryr   
add_entityr9   raises
ValueError	add_aliascontains_aliasr   r@   rB   get_size_aliasessetget_alias_strings)en_vocabr   r7   tmp_dirs       r$   test_issue6730rh   <   s     7	(	;BMM3iM@	z	"
2cUC 
#R E)))LLscU3%L@LLscU3%L@	7


7
W 
  A%%%r##%&3*444 
#	" 
s   D #D 
D
Di  c                     Sn [        5       nUR                  S5        UR                  S5      nSSS0SS0SS0SS	0/S
./nUR                  U5        U" U 5      nUR                   Vs/ s H  oUPM     nn[	        U5      S:X  d   eUS   nUR
                  S   nUR                  UR                  s=:  a  UR                  :  d   e   eUR                  UR                  5      S:X  d   eg s  snf )NzfKathleen Battle sang in Mahler 's Symphony No. 8 at the Cincinnati Symphony Orchestra 's May Festival.sentencizerentity_rulerTHINGLOWERsymphonyno.8labelpatternrN   r   )
r   add_pipeadd_patternssentslenentsstartendindexsent)	textr%   rulerpatternsdocs	sentencessent0ents	            r$   test_issue7065r   R   s    sD
)CLLLL(E *%$##		

H 
x 
d)CII&IqII&y>QaLE
((1+C99uyy*377*****??388$))) 's   (C,entity_in_first_sentenceTFc                   ^^ [        5       nSmSnS/nSSSS.0nU (       a  UR                  S5        SSS.US	'   / S
QnU" U5      n[        R                  " XcXES.5      nU/mU4S jnUR	                  SSS9n	U	R                  U5        UR                  U4S jS9n
[        S5       H  nUR                  TU
S9  M     U	R                  UR                  /5        g)zTests if NEL crashes if entities cross sentence boundaries and the first associated sentence doesn't have an
entity.
entity_in_prior_sentence (bool): Whether to include an entity in the first sentence associated with the
sentence-crossing entity.
r,   z'Mahler 's Symphony No. 8 was beautiful.)
      WORK)r   r                 ?)Q7304Q270853r      PERSONr   r   )	r6   r   r   r   r6   r   r   r   rW   linkssent_startsc                    > [        U TS9nUR                  SS/ SQS9  UR                  SS/S/S9  UR                  S	S/ S
QS9  UR                  SS	/S/S9  U$ )Nr-   r      	   r6   irO   zNo. 8r   rU   r   r   r,   Mahlerr   r^   ra   r8   mykbvector_lengths     r$   	create_kb.test_sentence_crossing_ents.<locals>.create_kb   sx    MJyrL[% 	 	

 	wRzJY% 	 	

 r#   entity_linkerTlastc                     > T $ r!   r"   train_exampless   r$   <lambda>-test_sentence_crossing_ents.<locals>.<lambda>       Nr#   get_examplesrN   )sgdN)r   appendr   	from_dictru   set_kb
initializerangeupdatepredict	reference)r   r%   r~   rW   r   r   r   exampler   r   	optimizerir   r   s               @@r$   test_sentence_crossing_entsr   n   s     )CM4D !H56E()"%#6f.K
d)CUOG YN$ LLtL<M#,BCI1X

>y
1  7,,-.r#   c                    ^
^ SS/ SQ04/n [        5       nSm/ m
U  H2  u  p#U" U5      nT
R                  [        R                  " XC5      5        M4     U4S jnUR	                  SSS9nUR                  U5        UR                  U
4S	 jS
9n[        S5       H  n0 n	UR                  T
XyS9  M     UR	                  SSS9  UR                  T
5        g )NzThe sky is blue.r   )r6   r   r   r   r   r,   c                 l   > [        U TS9nUR                  SS/ SQS9  UR                  SS/S/5        U$ Nr-   Q2146908r   r   rO   Russ Cochranr/   r   r   s     r$   r   #test_no_entities.<locals>.create_kb   :    MJz*M~
|cU;r#   r   Tr   c                     > T $ r!   r"   r   s   r$   r   "test_no_entities.<locals>.<lambda>   r   r#   r   rN   r   lossesrj   first)
r   r   r   r   ru   r   r   r   r   evaluate)
TRAIN_DATAr%   r~   
annotationr   r   r   r   r   r   r   r   s             @@r$   test_no_entitiesr      s     	
J )CMN&$ig//@A ' LLtL<M#,BCI1X

>y
@ 
 LLdL+ LL r#   c                  x  ^^ SSSS00S// SQS.4/n [        5       nSm/ mU  H2  u  p#U" U5      nTR                  [        R                  " XC5      5        M4     U4S	 jnUR	                  S
SS9nUR                  U5        UR                  U4S jS9n[        S5       H  n0 n	UR                  TXyS9  M     UR	                  SSS9  SSS0SS0/S.SSS0SS0/S./n
UR	                  SS
S9nUR                  U
5        UR                  T5      nSUS   ;   d   eSUS   ;   d   eSUS   ;   d   eSUS   ;  d   eg )N,Russ Cochran his reprints include EC Comics.r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   rW   r   r,   c                 l   > [        U TS9nUR                  SS/ SQS9  UR                  SS/S/5        U$ r   r   r   s     r$   r   %test_partial_links.<locals>.create_kb   r   r#   r   Tr   c                     > T $ r!   r"   r   s   r$   r   $test_partial_links.<locals>.<lambda>   r   r#   r   rN   r   rj   r   r   rm   russcochranrr   ORGeccomicsrk   beforeents_per_typenel_f_per_type)r   r   r   r   ru   r   r   r   r   rv   r   )r   r%   r~   r   r   r   r   r   r   r   r   r   resultsr   r   s                @@r$   test_partial_linksr      s    ;!J#45./8	
	J )CMN&$ig//@A ' LLtL<M#,BCI1X

>y
@ 
 LLdL+&(9GY;O'PQgt_w6I$JKH LLL@E	x  ll>*Gw////w/0000GO,,,, 01111r#   c                    [        U R                  SS9nUR                  SS/ SQS9  UR                  SS/ S	QS9  UR                  S
S/ SQS9  UR                  SSS
/SS/S9  UR                  SS/S/S9  UR	                  5       S:X  d   eUR                  5       S:X  d   eUR                  S5      / SQ:X  d   eUR                  S5      / S	Q:X  d   eUR                  S
5      / SQ:X  d   e[        UR                  SSS9S5        [        UR                  S
SS9S5        [        UR                  SSS9S5        [        UR                  S
SS9S5        g)zCTest the valid construction of a KB with 3 entities and two aliasesr,   r-   r0      )      r,   rO   Q2   )rN   r6   r   Q3   )r   ir   douglas皙?rZ   rU   adamr/   rN   rP   rV   Q342r   douglassssssN)	r   r8   r^   ra   r=   rc   
get_vectorr*   get_prior_probr%   r   s     r$   test_kb_valid_entitiesr      s^   CIIA>D 	OO4b	OBOO4ayOAOO4bOD 	NNdD\#sNTNN4&NF !!#q(((  "a''' ??4 I---??4 I---??4 K/// ++4y+I3O++4y+I3O++6+KSQ++4~+NPSTr#   c                 *   [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9  UR                  S	S
S/S9  [        R                  " [
        5         UR                  SSS/SS/S9  SSS5        g! , (       d  f       g= f)zSTest the invalid construction of a KB with an alias linked to a non-existing entityr6   r-   r0   r   rO   r   r   rN   r   r   r,   r   r   r   rZ   rU   Nr   r8   r^   r9   r_   r`   ra   r   s     r$   test_kb_invalid_entitiesr     s    CIIA>D 	OO4bO<OO4asO;OO4bO< 
z	"tVnS#J 	 	
 
#	"	"   %B
Bc                 *   [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9  UR                  S	S
S/S9  [        R                  " [
        5         UR                  SSS	/SS/S9  SSS5        g! , (       d  f       g= f)zDTest the invalid construction of a KB with wrong prior probabilitiesr6   r-   r0   r   rO   r   r   rN   r   r   r,   r   r   rT   rU   Nr   r   s     r$   test_kb_invalid_probabilitiesr   *  s    CIIA>D 	OO4bO<OO4asO;OO4bO< 
z	"Y$cSVZX 
#	"	"r   c                 *   [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9  UR                  S	S
S/S9  [        R                  " [
        5         UR                  SSS	// SQS9  SSS5        g! , (       d  f       g= f)zTTest the invalid construction of a KB with non-matching entity and probability listsr6   r-   r0   r   rO   r   r   rN   r   r   r,   r   )333333?rT   r\   rU   Nr   r   s     r$   test_kb_invalid_combinationr   8  s    CIIA>D 	OO4bO<OO4asO;OO4bO< 
z	"tTl/ 	 	
 
#	"	"r   c                     [        U R                  SS9nUR                  SS/ SQS9  [        R                  " [
        5         UR                  SSS	/S9  S
S
S
5        g
! , (       d  f       g
= f)zMTest the invalid construction of a KB with non-matching entity vector lengthsr,   r-   r0   r   rM   rO   r   r   rN   N)r   r8   r^   r9   r_   r`   r   s     r$   test_kb_invalid_entity_vectorr   H  sT    CIIA>D 	OO4b	OB 
z	"t!A3? 
#	"	"s   A
A,c                    U R                  S0 S9n[        UR                  5      S:X  d   e[        R                  " [
        SS9   UR                  5         SSS5        UR                  R                  5       S:X  d   eUR                  R                  5       S:X  d   eUR                  R                  S:X  d   eg! , (       d  f       Nk= f)z<Test that the default (empty) KB is loaded upon constructionr   configr   E139)matchN@   )
ru   rx   r7   r9   r_   r`   validate_kbr=   rc   r.   r%   r   s     r$   test_kb_defaultr  T  s    LLL<M} A%%%	z	0!!# 
1 --/1444,,.!33300B666 
1	0s   B;;
C	c                    U R                  SSS0S9n[        UR                  5      S:X  d   eUR                  R                  5       S:X  d   eUR                  R	                  5       S:X  d   eUR                  R
                  S:X  d   eg)zNTest that the default (empty) KB can be configured with a custom entity lengthr   r.   #   r  r   N)ru   rx   r7   r=   rc   r.   r  s     r$   test_kb_custom_lengthr  a  s    LL:PRT9ULVM} A%%%--/1444,,.!33300B666r#   c                     U R                  S5      n[        R                  " [        5         UR	                  S 5        SSS5        g! , (       d  f       g= f)z2Test that the EL can't initialize without examplesr   c                      / $ r!   r"   r"   r#   r$   r   *test_kb_initialize_empty.<locals>.<lambda>n  s    r#   N)ru   r9   r_   	TypeErrorr   r  s     r$   test_kb_initialize_emptyr  j  s6    LL1M	y	!  , 
"	!	!s   A
Ac                    [        U R                  SS9n[        5        nUR                  US-  5        UR	                  US-  5        UR                  US-  S-  5        UR	                  US-  S-  5        UR                  US-  5        [
        R                  " [        5         UR	                  US-  S-  5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zTest serialization of the KBr6   r-   r7   newunknownN)r   r8   r   r@   rB   r9   r_   r`   )r%   r   rE   s      r$   test_kb_serializer  q  s    CIIA>D	1QXq4x QY%&q5y4'(QX]]:&NN1y=4/0 ' 
 '& 
s$   BC$C<C
C	C
C,i#  c                 ~   / SQn[        U R                  SS9nUR                  S/S/U/5        UR                  S5      U:X  d   e[	        5        nUR                  US-  5        [        U R                  SS9nUR                  US-  5        UR                  S5      U:X  d   e S S S 5        g ! , (       d  f       g = f)Nr   r      r   r   r8   r.   E1r6   r7   )r   r8   r<   r   r   r@   rB   )r%   vkb1rE   rH   s        r$   test_kb_serialize_2r    s    A

CCdVaS1#&>>$1$$$	1AHSYYQGa$h~~d#q(((	 
s   AB..
B<c                    / SQn/ SQn/ SQn[        U R                  SS9nUR                  S/S/U/5        UR                  5       S/:X  d   eUR                  SS	/SS
/X#/5        [	        UR                  5       5      SS	1:X  d   eUR                  S5      U:X  d   eUR                  S	5      U:X  d   e[        5        nUR                  US-  5        [        U R                  SS9nUR                  US-  5        [	        UR                  5       5      SS	1:X  d   eUR                  S5      U:X  d   eUR                  S	5      U:X  d   e SSS5        g! , (       d  f       g= f)zGTest that set_entities entirely overwrites the previous set of entitiesr  )r6   r6   r6   r   )rN   rN   rN   r,   r   r  E0r6   r  E2r   r7   N)	r   r8   r<   get_entity_stringsrd   r   r   r@   rB   )r%   r  v1v2r  rE   rH   s          r$   test_kb_set_entitiesr#    sK   A	B	B

CCdVaS1#&!!#v---dD\Aq6B84s%%'(T4L888>>$2%%%>>$2%%%	1AHSYYQGa$h3))+,t<<<~~d#r)))~~d#r))) 
s   ?BE
E#c                    SnXR                   R                  ;  d   e[        U R                   SS9nUR                  U5      (       a   eUR	                  USS/S9  UR                  U5      (       d   eXR                   R                  ;   d   e[        5        nUR                  US-  5        [        [        5       SS9nUR                  US-  5        XR                   R                  ;   d   e SSS5        g! , (       d  f       g= f)	z/Test serialization of the KB and custom strings	MyFunnyIDr6   r-   iV  r,   )rQ   rR   r7   N)	r8   stringsr   contains_entityr^   r   r@   r   rB   )r%   rP   r   rE   mykb_news        r$   test_kb_serialize_vocabr)    s    F*****CIIA>D##F++++OOFQCO8''''ZZ'''''	1QX#EG!D1t8$///// 
s   AC99
Dc                    [        U R                  SS9nU " S5      nUSS nUSS nUSS nUSS nUR                  SS	S/S
9  UR                  SSS/S
9  UR                  SSS/S
9  UR                  SSS/SS/S9  UR                  SS/S/S9  [	        [        X5      5      S:X  d   e[	        [        X5      5      S:X  d   e[	        [        X5      5      S:X  d   e[	        [        X5      5      S:X  d   e[        X5      S   R                  S:X  d   e[        X5      S   R                  S:X  d   e[        [        X5      S   R                  S5        [        [        X5      S   R                  S5        g)z!Test correct candidate generationr6   r-   zdouglas adam Adam shrubberyr   rN   r,   r   r0      rO   r   r   r   r   r   r   r\   rU   r   r/   N)r   r8   r^   ra   rx   r   entity_alias_r*   entity_freq
prior_prob)r%   r   r   douglas_entadam_entAdam_entshrubbery_ents          r$   test_candidate_generationr4    s   CIIA>D
+
,Ca(K1QxH1QxH!HM 	OO4bO<OO4bO<OO4asO; 	NNdD\#sNTNN4&NF ~d01Q666~d-.!333~d-.!333~d23q888 $)!,44<<<$)!,33v===t6q9EErJt6q9DDcJr#   c                 b  ^	^
 U R                  S5        SSS0/S.nU R                  S5      nUR                  U/5        S nU R                  SS	S
0S9nUR                  U5        SnU " U5      nUS   R                  S:X  d   eUS   R                  S:X  d   eUS   R                  S:X  d   eS m	U	4S jm
[        R
                  " S5      S[        [        S/[        [           4   4U	4S jj5       n[        R
                  " S5      S[        [        [        S   /[        [        [              4   4U
4S jj5       nU R                  SSS
SS0SS0S.S9nUR                  U5        U " U5      nUS   R                  S:X  d   eUS   R                  S:X  d   eUS   R                  S:X  d   eg)z8Test correct candidate generation as part of the EL piperj   r   rm   r   rr   rk   c                     [        U SS9nUR                  SSS/S9  UR                  SSS	/S9  UR                  S
SS/SS/S9  U$ )Nr6   r-   r   r   rN   rO   r   r   r,   r   r   r\   rU   r   r8   r7   s     r$   r   -test_el_pipe_configuration.<locals>.create_kb  sV    e!<
T1#>
T!=
9d|CQT:V	r#   r   incl_contextFr  z%Douglas and douglas are not the same.r   NILr6   rS   rN   r   c                 T    U R                  UR                  R                  5       5      $ r!   )get_alias_candidatesr~   lower)r7   spans     r$   get_lowercased_candidates=test_el_pipe_configuration.<locals>.get_lowercased_candidates  s    &&tyy'899r#   c                 @   > U Vs/ s H  nT" X5      PM     sn$ s  snf r!   r"   )r7   spansr>  r?  s      r$   get_lowercased_candidates_batchCtest_el_pipe_configuration.<locals>.get_lowercased_candidates_batch  s!    @EF)"3FFFs   z$spacy.LowercaseCandidateGenerator.v1returnr   c                     > T $ r!   r"   )r?  s   r$   create_candidates5test_el_pipe_configuration.<locals>.create_candidates  s     )(r#   z)spacy.LowercaseCandidateBatchGenerator.v1c                     > T $ r!   r"   )rC  s   r$   create_candidates_batch;test_el_pipe_configuration.<locals>.create_candidates_batch  s     /.r#   z@misc)r9  r   get_candidates_batchN)ru   rv   r   
ent_kb_id_r
   miscr   r   r   r   replace_pipe)r%   rt   r   r   r   r~   r   rG  rJ  r?  rC  s            @@r$   test_el_pipe_configurationrP    s   LL w	.B-CDGLL(E	y! LL.%9PLQM#2D
d)Cq6%%%q6"""q6$$$:G ]]9:)x	6"HY$77  ) ;)
 ]]>?/X	8F+,hx	7J.KK& / @/ $$!&(NOD%
 % 
M #
d)Cq6$$$q6"""q6$$$r#   c                     U R                  S0 S9nUR                  S:X  d   eU R                  SSSS0S9nUR                  S:X  d   eg)z6Test that n_sents can be set through the configurationr   r  r   n_sentsrN   N)ru   rR  rO  r  s     r$   test_nel_nsentsrS    s^    LLL<M  A%%%$$)Q % M   A%%%r#   c                    [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9nUR                  S	S
S/S9  UR                  SSS	/SS/S9  UR                  SS/S/S9nUR	                  S5      n[        U5      S:X  d   eUS   R                  U:X  d   eUS   R                  S:X  d   eUS   R                  U:X  d   eUS   R                  S:X  d   e[        5        nUR                  US-  5        [        [        5       SS9nUR                  US-  5        UR	                  S5      n[        U5      S:X  d   eUS   R                  U:X  d   eUS   R                  S:X  d   eUS   R                  U:X  d   eUS   R                  S:X  d   eUR                  S5      S/:X  d   e[        UR!                  SS5      S5        SSS5        g! , (       d  f       g= f)z7Test that string information is retained across storager6   r-   r0   r+  rO   r   r   rN   r   r   r,   r   rT   r\   rU   r   r/   r   r7   N)r   r8   r^   ra   r<  rx   rP   r,  rV   r-  r   r@   r   rB   r   r*   r   )r%   r   q2_hash	adam_hash
candidatesrE   kb_new_vocabs          r$   test_vocab_serializationrY    s   CIIA>D 	OO4bO<ooT1#oFGOO4asO; 	NNdD\#sNTVtfSERI**62Jz?aa=7***a=  D(((a=)+++a=6)))	1QX'aHq4x(!66v>
:!###!}##w...!}$$,,,!}""i///!}##v---&&t,333L77iH#N 
s   3C%G!!
G/c                 T   [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9  UR                  S	S
S/S9  UR                  SSS	/SS/S9  UR                  SS/S/S9  [	        UR                  S5      5      S:X  d   eUR                  SSSS9  [	        UR                  S5      5      S:X  d   e[        R                  " [        5         UR                  SSSS9  SSS5        [	        UR                  S5      5      S:X  d   eg! , (       d  f       N/= f)z5Test that we can append additional alias-entity pairsr6   r-   r0   r+  rO   r   r   rN   r   r   r,   r   rT   r\   rU   r   r/   rZ   rV   rP   r/  r   N)
r   r8   r^   ra   rx   r<  append_aliasr9   r:   r;   r   s     r$   test_append_aliasr]  ?  s*   CIIA>D 	OO4bO<OO4bO<OO4asO; 	NNdD\#sNTNN4&NF t((34999 	IdsC t((34999 
k	"	$3G 
# t((34999	 
#	"s   D
D'zignore:\[W036c                 r   [        U R                  SS9nUR                  SSS/S9  UR                  SSS/S9  UR                  S	S
S/S9  UR                  SSS	/SS/S9  UR                  SS/S/S9  [        R
                  " [        5         UR                  SSSS9  SSS5        g! , (       d  f       g= f)zLTest that append an alias will throw an error if prior probs are exceeding 1r6   r-   r0   r+  rO   r   r   rN   r   r   r,   r   r   r\   rU   r   r/   rZ   r[  N)r   r8   r^   ra   r9   r_   r`   r\  r   s     r$   test_append_invalid_aliasr_  ]  s     CIIA>D 	OO4bO<OO4bO<OO4asO; 	NNdD\#sNTNN4&NF 
z	"	$3G 
#	"	"s   B((
B6c                 J  ^ SmU4S jnU R                  S5        SSS.SSS./nU R                  S5      nUR                  U5        S	S
0nU R                  SUSS9nUR                  U5        U R                  5         UR                  R                  S5      T:X  d   eSnU " U5      nUR                   Hl  nUR                  n	UR                  n
UR                  R                  5       nUR                   H'  nUR                  U	:X  d  M  UR                  U
:X  a  M'   e   Mn     g)z9Test that Span.as_doc preserves the existing entity linksr6   c                    > [        U TS9nUR                  SSS/S9  UR                  SSS/S9  UR                  SS/S	/S
9  UR                  SS/S/S
9  U$ )Nr-   r0   r   r6   rO   r   r   Bostongffffff?rU   Denverg333333?r   r   s     r$   r   .test_preserving_links_asdoc.<locals>.create_kbu  sh    MJt"QC@t!A3?XseLXseLr#   rj   GPErb  rr   rc  rk   
incl_priorFr   Tr  r   nO(She lives in Boston. He lives in Denver.N)ru   rv   r   r   modelget_dimry   r~   kb_id_r}   as_doc)r%   r   r   r   r  r   r~   r   r   	orig_text
orig_kb_idsent_docs_entr   s                @r$   test_preserving_links_asdocrr  p  s    M LLH-H-H LL(E	x E"FLLdLKM#NN&&t,=== 6D
d)CxxHH	ZZ
88??$]]EzzY&||z111 #	 r#   c                 r   SnU " U5      n[        [        UR                  5      5      S:X  d   e[        USSSSS9nU/Ul        [        [        UR                  5      5      S:X  d   e[        UR                  5      S   R                  S:X  d   e[        UR                  5      S   R
                  S:X  d   eg	)
+Test that doc.ents preserves KB annotationsri  r   r,   r   LOCr0   rs   kb_idr6   N)rx   listry   r   label_rl  )r%   r~   r   
boston_ents       r$   test_preserving_links_entsr{    s    5D
d)CtCHH~!###c1auD9J|CHtCHH~!###>!##u,,,>!##t+++r#   c                    SnU " U5      n[        [        UR                  5      5      S:X  d   eUR                  R                  R                  S5      nUR                  R                  R                  S5      nX4SS4/Ul        [        [        UR                  5      5      S:X  d   e[        UR                  5      S   R                  S:X  d   e[        UR                  5      S   R                  S:X  d   eg)	rt  ri  r   ru  r0   r,   r   r6   N)rx   rx  ry   r8   r&  addry  rl  )r%   r~   r   locq1s        r$   test_preserving_links_ents_2r    s    5D
d)CtCHH~!###
))




&C					t	$B!Q CHtCHH~!###>!##u,,,>!##t+++r#   CRuss Cochran captured his first major title with his son as caddie.r   r   r   )Q7381115r   r   )r6   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )"   +   ARTr   +Russ Cochran has been publishing comic art.@Russ Cochran was a member of University of Kentucky's golf team.)r  3   ru  zThe weather is nice today.)r6   r   r   r   r   r   )r   r  r  r   c                    ^^ [        5       n SmSU R                  R                  ;  d   e/ m[         H2  u  pU " U5      nTR	                  [
        R                  " X25      5        M4     U4S jnU R                  SSSS0S9n[        U[        5      (       d   eUR                  U5        SUR                  R                  ;   d   eSUR                  R                  R                  ;   d   eU R                  U4S jS	9nUR                  R                  S
5      T:X  d   eUR                  R                  S
5      UR                  R                  :X  d   e[!        S5       H  n0 nU R#                  TXhS9  M     WS   S:  d   eU R                  SSS9  SSS0SS0/S./n	U R                  SSS9n
U
R%                  U	5        / n[         H;  u  pU " U5      nUR&                   H  nUR	                  UR(                  5        M      M=     U[*        :X  d   e[-        5        nU R/                  U5        [0        R2                  " U5      nUR4                  U R4                  :X  d   eSUR                  R                  ;   d   eUR7                  S5      nSUR                  R                  ;   d   eSUR                  R                  R                  ;   d   e/ n[         H;  u  pU" U5      nUR&                   H  nUR	                  UR(                  5        M      M=     U[*        :X  d   e S S S 5        / SQnU R9                  U5       Vs/ s H  o3R;                  [<        /5      PM     nnU R9                  U5       Vs/ s H  o3R;                  [<        /5      PM     nnU Vs/ s H
  o" U5      PM     sn Vs/ s H  o3R;                  [<        /5      PM     nn[?        UU5        [?        UU5        U RA                  T5      nSU;   d   eSU;   d   eSU;   d   eSU;   d   eSU;   d   eSU;   d   eSU;   d   eSUS   ;   d   eUS   S:  d   eUS   S:  d   eg ! , (       d  f       GN9= fs  snf s  snf s  snf s  snf ) Nr,   r   c                    > [        U TS9nUR                  SS/ SQS9  UR                  SS/ SQS9  UR                  SSS/S	S	/S
9  U$ Nr-   r   r   r   rO   r  r   r         ?rU   r   r   s     r$   r   4test_overfitting_IO_gold_entities.<locals>.create_kb  _      MJz*Mz*M  *-* 	 	

 r#   r   Tuse_gold_entsr   r  c                     > T $ r!   r"   r   s   r$   r   3test_overfitting_IO_gold_entities.<locals>.<lambda>  r   r#   r   rh  2   r   MbP?rj   r   r   rm   r   r   rr   rk   r   )r  r   r  r  nel_macro_pnel_macro_rnel_macro_fnel_micro_pnel_micro_rnel_micro_fr   r   )!r   r8   r&  r   r   r   r   ru   
isinstancer   r   r7   r   rj  rk  r.   r   r   rv   ry   rl  GOLD_entitiesr   r@   r   load_model_from_path
pipe_namesget_pipepipeto_arrayr   r   r   )r%   r~   r   r   r   r   r   r   r   r   r   predictionsr   rg   nlp2entity_linker2doc2textsbatch_deps_1batch_deps_2no_batch_depsevalr   r   s                         @@r$   !test_overfitting_IO_gold_entitiesr    s]   
)CMSYY..... N&$ig//@A ' LLdOT+B ! M m\2222#,,44444))//77777 ,BCI&&t,===&&t,0@0@0U0UUUU2Y

>y
@  /"U*** LLdL+ &(9GY;O'PQH LLL@E	x  K&$i88Cszz*  ' -''' 
7G((1#..000TZZ/////7^1199999^..44<<<<< *D:Dyy""3::. ! !+ m+++ 
 E :=%I#LL)-LI9<%I#LL)-LIQV:WQV3t9QV:WX:W3\\9+.:WMX|,}-<<'DD   D   D   D   D   D   t###t,----""""""O 
, JI:WXs%   DQQ)8Q.Q33Q8
Q&c                  "  ^ [        5       n SmSU R                  R                  ;  d   e/ n[         H2  u  p#U " U5      nUR	                  [
        R                  " XC5      5        M4     U4S jnU R                  SSS9nU R                  SSSS	0S
9nUR                  U5        / n[         Hf  u  p(UR	                  [
        R                  " U R                  U5      U5      5        UR                  S5       H  n	UR                  U	S   5        M     Mh     U R                  5       n
[        S5       H  n0 nU R                  XUS9  M     WS   S:  d   eUS   S:  d   eU R                  SSS9  SnU " U5      nUR                  n[!        U5      S:X  d   eUS   R"                  S:X  d   eUS   R$                  S:X  d   eUS   R&                  S:w  d   e[)        5        nU R+                  U5        [,        R.                  " U5      nUR0                  U R0                  :X  d   eU" U5      nUR                  n[!        U5      S:X  d   eUS   R"                  S:X  d   eUS   R$                  S:X  d   eUS   R&                  S:w  d   e S S S 5        U R3                  U5      nSU;   d   eSU;   d   eSU;   d   eSU;   d   eSU;   d   eSUS   ;   d   eSUS   ;   d   eUS   S:  d   eUS   S:  d   eUS   S:  d   eg ! , (       d  f       N= f)Nr,   r   c                    > [        U TS9nUR                  SS/ SQS9  UR                  SS/ SQS9  UR                  SSS/S	S	/S
9  U$ r  r   r   s     r$   r   /test_overfitting_IO_with_ner.<locals>.create_kbF  r  r#   nerTr   r   r  Fr  rW   rN   r  r   r  rj   r  r6   r   r   r   r:  r  r  ents_fr   r   )r   r8   r&  r   r   r   r   ru   r   make_docget	add_labelr   r   r   ry   rx   r~   ry  rl  r   r@   r   r  r  r   )r%   r   r~   r   r   r   r  r   annotationsr   r   r   r   	test_textry   rg   r  r  ents2r  r   s                       @r$   test_overfitting_IO_with_nerr  :  s7   
)CMSYY..... N&$ig//@A ' ,,uD,
)CLLdOU+C ! M #N'g//T0BKPQ??:.CMM#a&! / (  I 2Y

>
@  %=5   /"U*** LLdL+ VI
i.C88Dt9>>7<<>)))7>>X%%%7>>U""" 
7G((1#..000I		5zQQx}}...Qx(***Qx%''' 
 <<'DD   D   tt###d"""t,----tO,,,,"""""">A- 
s   B(L  
Lc                  @   Sn [        5        nUS-  n[        5       nSUR                  R                  ;  d   e[	        UR                  U S9nUR                  SS/ SQS9  UR                  SS/S	/S
9  SUR                  R                  ;   d   eUR                  U5        [        5       nSUR                  R                  ;  d   eUR                  R                  R                  S5        SUR                  R                  ;   d   eSUR                  R                  ;  d   eUR                  SSS9nUR                  [        U5      5        SUR                  R                  ;   d   eSUR                  R                  ;   d   e S S S 5        g ! , (       d  f       g = f)Nr,   r7   r   r-   r   r   rO   r   r   rU   
RandomWordr   Tr   )r   r   r8   r&  r   r^   ra   r@   r}  ru   r   r   )r   rg   kb_dirnlp1r   r  r   s          r$   test_kb_serializationr    s[   M	74y!3!3333

Oz*M^zlSVRWXTZZ/////Vy4::#5#5555

|,tzz11111!3!3333 oDAWV_-TZZ/////tzz11111) 
s   E8F
FzNeeds fixing)reasonc                  t   [        5       n [        U R                  SS9nUR                  SS/ SQS9  UR	                  S5      (       a   eUR                  SS/S/S	9  UR	                  S5      (       d   e[        R                  " U5      n[        R                  " U5      nUR	                  S5      (       d   eg 
Nr,   r-   r   r   r   rO   r   r   rU   )	r   r   r8   r^   rb   ra   r   dumpsloads)r%   kb_1datakb_2s       r$   test_kb_pickler    s     )CCIIA>DOO:BjOI"">2222NN:,seNT~....<<D<<D~....r#   c                     S n [        5       nUR                  S5        UR                  SSS9nUR                  U 5        UR                  SS/:X  d   eUR                  R                  S5      (       d   e[        R                  " U5      n[        R                  " U5      nUR                  SS/:X  d   eUR                  S5      nUR                  R                  S5      (       d   eg )Nc                 f    [        U SS9nUR                  SS/ SQS9  UR                  SS/S/S	9  U$ r  r   r7  s     r$   r   "test_nel_pickle.<locals>.create_kb  =    e!<
Zb
K
>ZLQTPUV	r#   r  r   Tr   r   )
r   ru   r   r  r7   rb   r   r  r  r  )r   nlp_1entity_linker_1r  nlp_2entity_linker_2s         r$   test_nel_pickler    s     IE	NN5nn_4n@O9%7777,,^<<<<<<DLLE7777nn_5O,,^<<<<r#   c                     [        5       n [        U R                  SS9nUR                  SS/ SQS9  UR                  SS/ S	QS9  UR	                  S
S/S/S9  UR	                  SS/S/S9  UR	                  SSS/SS/S9  UR                  S
5      (       d   eUR                  5       n[        U R                  SS9nUR                  S
5      (       a   eUR                  U5      nUR                  5       UR                  5       :X  d   eUR                  UR                  :X  d   eUR                  5       UR                  5       :X  d   eUR                  S5      UR                  S5      :X  d   eUR                  S5      UR                  S5      :X  d   eUR                  S
5      (       d   eUR                  5       UR                  5       :X  d   eUR                  5       UR                  5       :X  d   e[        UR                  S
5      5      [        UR                  S
5      5      :X  d   e[        UR                  S5      5      [        UR                  S5      5      :X  d   eg )Nr,   r-   r   r   r   rO   Q66r   rM   r   r   rU   Boeingr  
Randomnessr\   rZ   )r   r   r8   r^   ra   rb   to_bytes
from_bytesr=   r.   r   r   rc   re   rx   r<  )r%   r  kb_bytesr  s       r$   test_kb_to_bytesr    sD   
)CCIIA>DOO:BjOIOO5q	OBNN:,seNTNNUGC5NINNeZ%8c
   ~....}}HCIIA>D"">2222??8$D!!#t'='='????$$(A(AAAA""$(?(?(AAAA??:&$//**EEEE??5!T__U%;;;;~....  "d&;&;&====!!#t'='='????t((89S!!.1>    t((673!!,/<   r#   c                     S n [        5       nUR                  S5        UR                  SSS9nUR                  U 5        UR                  R	                  S5      (       d   eUR
                  SS/:X  d   eUR                  5       n[        5       nUR                  S5        UR                  SSS9  UR
                  SS/:X  d   eUR                  S5      R                  R	                  S5      (       a   eUR                  U5      nUR                  S5      R                  nUR	                  S5      (       d   eUR                  S5      / SQ:X  d   e[        UR                  SSS	9S
5        g )Nc                 f    [        U SS9nUR                  SS/ SQS9  UR                  SS/S/S	9  U$ r  r   r7  s     r$   r   $test_nel_to_bytes.<locals>.create_kb  r  r#   r  r   Tr   r   r   r   r   r   )r   ru   r   r7   rb   r  r  r  r  r   r*   r   )r   r  r  	nlp_bytesr  r  s         r$   test_nel_to_bytesr    sO    IE	NN5nn_4n@O9%,,^<<<<7777 IIE	NN5	NN?N.7777~~o.11@@PPPPY'E>>/*--D~....??:&*444:^Dcr#   c            	      B   / n [        5       nU" S5      n[        USSSSS9[        USSS	S
S9/Ul        U" S5      n[        USSSSS9[        USSS	S
S9/Ul        U R                  [	        X25      5        U" S5      n[        USSSSS9[        USSS	SS9/Ul        U" S5      n[        USSSSS9[        USSS	SS9/Ul        U R                  [	        XT5      5        U" S5      n[        USSS	SS9/Ul        U" S5      n[        USSS	SS9/Ul        U R                  [	        Xv5      5        [        5       R                  U S/S9nUS   S   S   S:X  d   eUS   S   S   S:X  d   eUS   S	   S   S:X  d   eUS   S	   S   S:X  d   eUS   S:X  d   eUS   S:X  d   eg )NzJulia lives in London happily.r   r6   r   r   rv  r,   r   ru  r   Q70zShe loves London.rN   Q13r:  zLondon is great.)negative_labelsr   pr  rr   r  gUUUUUU?r  )r   r   ry   r   r   r   score_links)	r   r%   ref1pred1ref2pred2ref3pred3scoress	            r$   test_scorer_linksr    s   N
)C/0DT1axt4T1auD1DI 01EUAq6UAqT2EJ '%./"#DT1axt4T1auE2DI #$EUAq5UAqU3EJ '%./!"DdAqU;<DI"#Eua%u=>EJ'%./X!!.5'!JF"#H-c2e;;;"#H-c2e;;;"#E*3/5888"#E*3/5888- E)))- E)))r#   zname,configr   spacy.EntityLinker.v1)@architecturestok2veczspacy.EntityLinker.v2c                   ^^ Sm[        5       n/ m[         H;  u  p4UR                  U5      nTR                  [        R
                  " XT5      5        M=     U4S jnUR                  U SU0S9nUS   S:X  a  [        U[        5      (       d   eO[        U[        5      (       d   eUR                  U5        UR                  U4S jS9n[        S	5       H  n	0 n
UR                  TXS
9  M     g )Nr,   c                    > [        U TS9nUR                  SS/ SQS9  UR                  SS/ SQS9  UR                  SSS/S	S	/S
9  U$ r  r   r   s     r$   r   ,test_legacy_architectures.<locals>.create_kbN  s]    MJz*Mz*M  *-* 	 	

 r#   rj  r  r  r  c                     > T $ r!   r"   r   s   r$   r   +test_legacy_architectures.<locals>.<lambda>_  r   r#   r   rN   r   )r   r   r  r   r   r   ru   r  r   r   r   r   r   r   )namer  r%   r~   r   r   r   r   r   r   r   r   r   s              @@r$   test_legacy_architecturesr  <  s     M
)CN&ll4 g//@A '	 LLw.?L@M#::-9999-6666#,BCI1X

>y
@ r#   r   	CHARACTERKirbyrr   r   KorbyISisCOLORpinkc                   ^^ SSSS00S// SQS.4/n[        5       nSm/ mU H2  u  p4U" U5      nTR                  [        R                  " XT5      5        M4     UR	                  S	5      nUR                  U 5        T H  nU" UR                  5      Ul        M     UR                  S	5        U4S
 jnUR	                  SSS0SS9n	U	R                  U5        U	R                  SL d   eUR                  U4S jS9n
[        S5       H  n0 nUR                  TXS9  M     UR	                  SSS9  UR                  T5        g )NzKirby is pink)r   r   Q613241r   )r   r   r  )r6   r   r   r   r,   rk   c                    > [        U TS9nUR                  SS/ SQS9  UR                  SS/S/5        UR                  SS/ S	QS9  UR                  SS/S/5        U$ )
Nr-   r  r   r   rO   r  r/   r  )r  rN   r   r   s     r$   r   $test_no_gold_ents.<locals>.create_kb  s`    MJyrLwcU3vBjIvx#/r#   r   r  FTrg  c                     > T $ r!   r"   r   s   r$   r   #test_no_gold_ents.<locals>.<lambda>  r   r#   r   rN   r   rj   r   )r   r   r   r   ru   rv   	predictedremove_piper   r  r   r   r   r   )r   r   r%   r~   r   r   r   egr   r   r   r   r   r   r   s                @@r$   test_no_gold_entsr  f  sW     9c"2301(	
	J )CMN&$ig//@A '
 LL(E	x  R\\* 
 OON# LL% 8t ! M #&&%///,BCI1X

>y
@ 
 LLdL+ LL r#   ig%  c                    ^	^
 [        5       n [        U R                  SS/SS/SS/S9n[        U R                  / SQ/ S	Q/ S
QS9n[        X5      nU/m	Sm
U
4S jnU R	                  SSS9nUR                  U5        U R                  U	4S jS9n[        S5       H  n0 nU R                  T	XhS9  M     U R	                  SSS9  U R                  T	5        g )Nr  123456TFB-CHARACTER
B-CARDINAL)wordsspacesry   )r  123456)TFF)r	  r
  r
  r,   c                 l   > [        U TS9nUR                  SS/ SQS9  UR                  SS/S/5        U$ )Nr-   r  r   r   rO   r  r/   r   r   s     r$   r   -test_tokenization_mismatch.<locals>.create_kb  s:    MJyrLwcU3r#   r   r   c                     > T $ r!   r"   r   s   r$   r   ,test_tokenization_mismatch.<locals>.<lambda>  r   r#   r   rN   r   rj   r   )
r   r   r8   r   ru   r   r   r   r   r   )r%   doc1r  r  r   r   r   r   r   r   r   s            @@r$   test_tokenization_mismatchr    s    
)C		!e}\*	D 		%#8	D 
	BTNM LLtL<M#,BCI1X

>y
@  LLdL+LL r#   c                      [         R                  " [        5         [        SS5        SSS5        g! , (       d  f       g= f)z;Test whether instantiation of abstract KB base class fails.Nr,   )r9   r_   r  r   r"   r#   r$   test_abstract_kb_instantiationr    s$    	y	!dA 
"	!	!s   1
?zmeet_threshold,configmeet_thresholdr  c                 6  ^ ^^ [        5       nUR                  S5        SnS/nSSS00n/ SQnSmU" U5      n[        R                  " XtXVS.5      /mUU 4S	 jnUR                  S
SSUS.S9n	U	R	                  U5        UR                  U4S jS9  UR                  SS
S9n
U
R                  SSS0/S./5        U" U5      n[        UR                  5      S:X  d   eT (       a  UR                  S   R                  T:X  d   e[        R                  (       d   egg)zTests abstention threshold.
meet_threshold (bool): Whether to configure NEL setup so that confidence threshold is met.
config (Dict[str, Any]): NEL architecture config.
rj   z&Mahler's Symphony No. 8 was beautiful.r   r   r   r   )	r6   r   r   r   r   r   r   r   r   r   c                 z   > [        U SS9nUR                  TS/ SQS9  UR                  ST/T(       a  SOS/S	9  U$ )
Nr,   r-   r   r   rO   r   r6   g{Gz?rU   r   )r8   r   	entity_idr  s     r$   r   !test_threshold.<locals>.create_kb  sK    A>yrL[ .1D9 	 	

 r#   r   TgGz?)	thresholdrj  r  c                     > T $ r!   r"   r   s   r$   r    test_threshold.<locals>.<lambda>	  s    r#   r   rk   r   r   rm   mahlerrr   r6   r   N)r   ru   r   r   r   r   rv   rx   ry   rl  r   r:  )r  r  r%   r~   rW   r   r   r   r   r   r   r  r   s   `          @@r$   test_thresholdr     s-    )CLL3D !Hgs^$E.KI
d)CS	
N	 LL!F3 ! M
 #NN 6N7 LLL@E	((8K7LMNO
d)Csxx=A.<388A;*RR,BRBRRRBR*r#   c                      [        5       n U " S5      nUSS nSUl        U/Ul        U " S5      n[        5       nU" X/S5        g)zCThe forward pass of the span maker may have a doc with no entities.za b cr   r6   Xzx y zFN)r   ry  ry   r   )r%   r  r   r  
span_makers        r$   "test_span_maker_forward_with_emptyr$    sL    
)Cw<D
q)CCJDIw<D "#J|U#r#   )dtypingr   r   r   r   r   r9   numpy.testingr   spacyr	   r
   r   spacy.attrsr   spacy.compatr   spacy.kbr   r   r   r   spacy.lang.enr   spacy.mlr   spacy.ml.models.entity_linkerr   spacy.pipeliner   spacy.pipeline.legacyr   spacy.pipeline.tok2vecr   spacy.scorerr   spacy.tests.utilr   spacy.tokensr   r   spacy.trainingr   
spacy.utilr   spacy.vocabr   fixturer%   r*   markissuerI   rh   r   parametrizeboolr   r   r   r   r   r   r   r   r  r  r  r  r  r#  r)  r4  rP  rS  rY  r]  filterwarningsr_  rr  r{  r  r   r  r  r  r  xfailr  r  r  r  r  r  r  r  r  rA   r   r$  r"   r#   r$   <module>r>     s[   7 7  & * * !  O O !  : ' 1 8  ) " " "   '
 4( (2 45 5* 4* *6 43dE]C0/$ 0/ D 0/f$!N02fU:
 Y
 	@
77-1  4	) 	)**0"K@:%z&!OH:< ,-H .H$ ,-%2 .%2P
,," K#>?'(@	BC 4#>?'91	34 3#>?'(1	34 H#>?'9@	BC
 ""+	-.%
, Ag#TUp24 .)
/ *
/ .)= *=,B<(*X 	-DQfgh	-DQfghAAD  7	34	01D	)W+PQ
9!
9!x 4$! $!N 	#:G\]^	"9F[\]-S4 -Sc3h -S-S`$r#   