
    h                        S SK JrJrJrJr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JrJrJr  SSKJr  SS	KJr  SS
KJr  \" S\\\4   S9r\r\
R6                  " S5      SSSSS.S\S\S\\   S\\   S\\   S\\   S\\\4   4S jj5       rS\\\4   S\S\S\\\4   4S jr   SS\S\\\4   S\\   S\\   SS4
S jjr!g)     )AnyCallableDictOptionalTupleTypeVarUnioncast   )registry)uniform_init)Model)Floats1dFloats2dInts1dInts2d)partial   )ints_getitem)chainInT)boundzHashEmbed.v1N)seedcolumninitializerdropoutnOnVr   r   r   r   returnc          
      J   X2S.nUc  [         nUb  XVS'   [        S[        [        [        U5      SS0XSS.US9nUc  UR
                  UR                  S'   Ub!  [        [        [        S	S5      U45      U5      nX7R                  S
'   [        [        [        [        4   U5      $ )u  
An embedding layer that uses the “hashing trick” to map keys to distinct values.
The hashing trick involves hashing each key four times with distinct seeds,
to produce four likely differing values. Those values are modded into the
table, and the resulting vectors summed to produce a single result. Because
it’s unlikely that two different keys will collide on all four “buckets”,
most distinct keys will receive a distinct vector under this scheme, even
when the number of vectors in the table is very low.
)r   r   Ndropout_rate	hashembedE)r   r   nI)initparamsdimsattrsr   r   r   )r   r   forwardr   r%   idr(   r   r   slicer
   r   OutT)r   r   r   r   r   r   r(   models           P/home/james-whalen/.local/lib/python3.13/site-packages/thinc/layers/hashembed.py	HashEmbedr/      s    & (.<E" 'nT;'T{-E |#hhF
 lE!TNF#;<eD"KKc4i %((    r-   idsis_trainc                   ^ ^	^
^^ [        [        T R                  S5      5      mTR                  S   nTR                  S   n[	        U5      S:X  a&  T R
                  R                  SUTR                  S9nOT R
                  R                  USS9nUR                  S   mT R                  S   nT R
                  R                  X5      U-  m
T R
                  R                  TT
5      nS m	U(       aN  T R                  R                  S5      n[        [        T R
                  R                  U4U5      5      m	T	b  UT	-  nS[        S	[         4U	U
U UU4S
 jjnXX4$ )Nr#   r   r   dtypeuint64r   r!   	d_vectorsr   c                 |  > Tb  U T-  n TR                   R                  " T	R                  6 nTR                   R                  TR                  SS9n[        UR                  S   5       H"  nTR                   R                  XU   U 5        M$     TR                  SU5        TR                   R                  T5      nU$ )Nir4   r   r#   )	opsalloc2fshape	as_contigTrangescatter_addinc_gradalloc1i)
r7   dEkeysTr9   dX	drop_maskkeysr-   nNvectorss
        r.   backpropforward.<locals>.backpropP   s     "IYY.		##DFF##6u{{1~&AII!!"Ah	: 'sBYYr"	r0   )r
   r   	get_paramr<   lenr:   r;   r5   r=   r(   hash
gather_addgetr   get_dropout_maskr,   r   )r-   r1   r2   r   r   outputr   r   rJ   rF   rG   rH   rI   s   `        @@@@r.   r)   r)   ;   s-    8U__S12G	q	B	q	B
3x1} 99,,Q'--,Hii!!#X!6YYq\KK'yy~~c(2-%%gt4	',{{~'FGXuyy'A'A2%'QRI$)#	D 	V 	 	 r0   XYc                     U " UR                   UR                  S5      UR                  S5      45      nUR                  SU5        g )Nr   r   r#   )r:   get_dim	set_param)r   r-   rS   rT   r#   s        r.   r%   r%   ^   s9     	EIId 3U]]45HIJA	OOCr0   )NN)"typingr   r   r   r   r   r   r	   r
   configr   initializersr   r-   r   typesr   r   r   r   utilr   array_getitemr   r   r   r,   layersintfloatr/   boolr)   r%    r0   r.   <module>rc      sM   M M M  '  6 6  ' e501 
 
  &*#()()() 3-	()
 SM() (#() e_() 39() !()V  %+ 7; 
4> L 	  ~	
 
r0   