Ë
    ›¾j  ã            
       óü   — d dl mZmZmZ d dlZddlmZ ddlmZ ddl	m
Z
mZ eZe
Z ej                  d«      d dœd	ed
edeeef   fd„«       Zdeeef   dededeeef   fd„Z	 ddeeef   dee   dee   ddfd„Zy)é    )ÚCallableÚOptionalÚTupleNé   )Úregistry)ÚModel)ÚFloats2dÚInts2dz
uniqued.v1)ÚcolumnÚlayerr   Úreturnc          	      ó\   — t        d| j                  › d�t        t        | gdddœd|i¬«      S )a  Group inputs to a layer, so that the layer only has to compute for the
    unique values. The data is transformed back before output, and the same
    transformation is applied for the gradient. Effectively, this is a cache
    local to each minibatch.
    zuniqued(ú)N)ÚnOÚnIr   )ÚinitÚlayersÚdimsÚattrs)r   ÚnameÚforwardr   )r   r   s     ú^/home/spazio/kingdom_calls/work5/transenv/lib/python3.12/site-packages/thinc/layers/uniqued.pyÚuniquedr      s<   € ô Ø
�5—:‘:�,˜aÐ ÜÜØˆwØ Ñ%Ø˜Ð ôð ó    ÚmodelÚXÚis_trainc                 óX  ‡‡‡‡‡— | j                   d   }| j                  d   Š|j                  dk  r	 ‰||«      S |d d …|f   }t        |t        j
                  «      s|j                  «       }‰j                  j                  j                  |ddd¬«      \  }}ŠŠ| j                  j                  ‰dd«      Š||   } ‰||«      \  }Š|‰   j                  |j                  d   f|j                  dd  z   «      }	t        |j                  «      Šdt        d	t        fˆˆˆˆˆfd
„}
|	|
fS )Nr   r   r   T)Úreturn_indexÚreturn_inverseÚreturn_countséÿÿÿÿé   ÚdYr   c                 óÂ   •—  ‰j                   j                  ‰Ž }‰j                   j                  |‰j                   j                  ‰«      | «        ‰|«      }|‰z  ‰   S )N)ÚopsÚalloc2fÚscatter_addÚ	asarray_i)r$   ÚdY_uniqÚ	d_uniquesÚ	bp_Y_uniqÚcountsÚinvr   Ú
uniq_shapes      €€€€€r   Úbackpropzforward.<locals>.backprop/   sX   ø€ Ø#�%—)‘)×#Ñ# ZÐ0ˆØ�	‰	×Ñ˜g u§y¡y×':Ñ':¸3Ó'?ÀÔDÙ˜gÓ&ˆ	à˜FÑ" CÑ(Ð(r   )r   r   ÚsizeÚ
isinstanceÚnumpyÚndarrayÚgetr&   ÚxpÚuniqueÚ	reshape2iÚreshapeÚshapeÚtupleÚOutTÚInT)r   r   r   r   ÚkeysÚ	uniq_keysÚindÚX_uniqÚY_uniqÚYr0   r,   r-   r.   r   r/   s              @@@@@r   r   r      s  ü€ Ø—+‘+˜hÑ'€FØ�L‰L˜‰O€EØ‡v�v�‚zÙ�Q˜Ó!Ð!ØŠQ�ˆY‰<€DÜ�dœEŸM™MÔ*Ø�x‰x‹zˆØ"'§)¡)§,¡,×"5Ñ"5Ø˜4°ÀDð #6ó #Ñ€Iˆs�C˜ð �Y‰Y× Ñ  ¨¨QÓ/€FØˆs‰V€FÙ˜f hÓ/Ñ€FˆIØˆs‰×Ñ˜QŸW™W Q™Z˜M¨F¯L©L¸¸Ð,<Ñ<Ó=€AÜ�v—|‘|Ó$€Jð)”Tð )œc÷ )ñ )ð ˆhˆ;Ðr   rC   c                 ó  — | j                   d   }|j                  ||¬«       |j                  d«      r!| j                  d|j	                  d«      «       |j                  d«      r"| j                  d|j	                  d«      «       y y )Nr   )r   rC   r   r   )r   Ú
initializeÚhas_dimÚset_dimÚget_dim)r   r   rC   r   s       r   r   r   9   so   € ð �L‰L˜‰O€EØ	×Ñ�q˜AÐÔØ‡}�}�TÔØ�‰�d˜EŸM™M¨$Ó/Ô0Ø‡}�}�TÔØ�‰�d˜EŸM™M¨$Ó/Õ0ð r   )NN)Útypingr   r   r   r3   Úconfigr   r   r   Útypesr	   r
   r=   r<   r   Úintr   Úboolr   r   © r   r   ú<module>rO      sÑ   ðß ,Ñ ,ã å Ý ß $à€Ø€ð €‡��ÓØ+,ò �5ð  Sð °°s¸D°yÑ1Aò ó ðð �5˜˜d˜Ñ#ð ¨ð °tð ÀÀdÈHÀnÑ@Uó ð8 KOñ1Ø��d�Ñð1Ø (¨¡ð1Ø9AÀ$¹ð1à	ô1r   