
    i0A                     z   d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZmZ  e
d      Z e
d      Z e
d	      Z e
d
      Zeeef   Zeeeee   ee   f   Z G d deeeeef         Z G d de      Z ej>                  d      ddddde deee      deeeef      defd       Z! ej>                  d      dddddde deee      deeeef      dee   def
d       Z" ej>                  d      ddddddde deee      deeeef      dee   de#defd        Z$ G d! d"e      Z% ej>                  d#      ddd$de deee      de%fd%       Z& ej>                  d&      dddd'de deee      dee   de%fd(       Z' ej>                  d)      ddddddde deee      deeeef      dee   de#de%fd*       Z( G d+ d,e      Z) ej>                  d-      dd.de de)fd/       Z* G d0 d1e      Z+ ej>                  d2      dd3d4de d5e de+fd6       Z,defd7Z-defd8Z.g d9Z/y):    )abstractmethod)
AnyDictGenericListOptionalSequenceTupleTypeVarUnioncast   )registry)Floats2dInts1d)get_array_moduleto_categoricalLossTGradTGuessTTruthTc                   z    e Zd ZdZdeddfdZdededee	e
f   fdZededede	fd	       Zededede
fd
       Zy)Lossa  Base class for classes computing the loss / gradient. The class can
    be initialized with settings if needed. It provides get_loss and
    get_grad as separate methods to allow calculating them separately. It
    also provides a __call__ method that returns a tuple of both.
    kwargsreturnNc                      y N )selfr   s     [/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/thinc/loss.py__init__zLoss.__init__"   s        guessestruthsc                 J    | j                  ||      | j                  ||      fS r   get_gradget_lossr   r#   r$   s      r    __call__zLoss.__call__$   #    }}Wf-t}}Wf/MMMr"   c                      y)a}  Get the gradient of the loss. Note that the built-in loss functions
        compute the gradient with respect to the pre-activation logits, not the
        post-softmax probabilities. This is because thinc's softmax layer uses
        the identity function as its backward pass, so the softmax derivative
        is absorbed into the loss gradient for numerical stability.
        Nr   r)   s      r    r'   zLoss.get_grad'   s     	r"   c                      y r   r   r)   s      r    r(   zLoss.get_loss1   s    BEr"   )__name__
__module____qualname____doc__r   r!   r   r   r
   r   r   r*   r   r'   r(   r   r"   r    r   r      s     322N N N5;N N   5   EEE5E Er"   r   c                      e Zd ZU eee      ed<   eeeef      ed<   e	eef   ed<   ddddddde
deee      deeeef      d	ee   d
ef
dZdedeeef   fdZdededeeef   fdZdededefdZdededefdZdedefdZy)CategoricalCrossentropynamesmissing_value
_name_to_iTN        	normalizer4   r5   
neg_prefixlabel_smoothingr9   r:   r;   c                    || _         || _        || _        || _        || _        |%t        |      D ci c]  \  }}||
 c}}| _        y i | _        y c c}}w r   )r9   r4   r5   r:   r;   	enumerater6   )r   r9   r4   r5   r:   r;   inames           r    r!   z CategoricalCrossentropy.__init__:   s[     #
*$.6?6FG71dtQwGDO DO Hs   Ar#   r   c                    t        |      }g }d }| j                  r1|j                  t        |      t        | j                        fd      }| j                  }t        |t              rLt        |      }t        |      rt        |d   t              r+t        |      D ]  \  }}||k(  s|j                  |        n| j                  d}	t        |	      t        |      D ]  \  }}||k(  r$| j                  d   ||<   |j                  |       /|s2| j                  s?|j                  | j                        s[|t        | j                        d  ||<   | j                  ||      }
d||<   d||   |
<    |D cg c]  }| j                  |    }}|j                  |d      }t        ||      }nt!        |||      }|j"                  |j"                  k7  r4t%        t'        t(        |      |j*                  d   | j,                        }n| j,                  rt        d      |||z  }d||dk(  <   d	||dk(  <   ||z  }||fS c c}w )
Nfdtyper   zCannot calculate loss from list of strings without names. You can pass the names as a keyword argument when you create the loss object, e.g. CategoricalCrossentropy(names=['dog', 'cat'])r>   )	n_classesr;   zLabel smoothing is only applied, when truths have type List[str], List[int] or Ints1d, but it seems like Floats2d was provided.r   )r   r4   oneslenr5   
isinstancelistintr=   append
ValueErrorr:   
startswithr6   asarray
_make_mask_make_mask_by_valuendimr   r   r   shaper;   )r   r$   r#   xpmissingnegatives_maskr5   r>   valuemsg	neg_indexr?   masks                r    convert_truthsz&CategoricalCrossentropy.convert_truthsM   sK   g&::WWc&k3tzz?%C3WON**fd#&\F6{fQi-$-f$5 .5 M1#NN1-. zz)Q  )o-$-f$5 >5 M1(,

1F1I#NN1-! $ % 0 0 A(-c$//.B.D(EF1I(,q	(BI01N1-;=N1-i8> AGGdood3GFGZZcZ2Fgw/D&vwFD;;',,&#VV$!--+ $ 4 4F ## $  %n$F#$F6R< 34N>R/0N"Dt|5 Hs   >Ir$   c                 L    | j                  ||      }|| j                  |      fS r   r'   _get_loss_from_gradr   r#   r$   d_truths       r    r*   z CategoricalCrossentropy.__call__   s*     --011':;;r"   c                    | j                  ||      \  }}t        |      }|j                  |j                  k7  r(d|j                   d|j                   d}t        |      |j	                  |dkD        s|j	                  |dk        rd}t        |      |j	                  |dkD        s|j	                  |dk        rd}t        |      ||z
  }||z  }| j
                  r||j                  d   z  }|S )NzBCannot calculate CategoricalCrossentropy loss: mismatched shapes:  vs .r   r   zVCannot calculate CategoricalCrossentropy loss with guesses outside the [0,1] interval.z[Cannot calculate CategoricalCrossentropy loss with truth values outside the [0,1] interval.)rZ   r   rR   rL   anyr9   )r   r#   r$   targetrY   rS   err
differences           r    r'   z CategoricalCrossentropy.get_grad   s    **67;f%==FLL(VW^WdWdVeeijpjvjviwwxyCS/!66'A+"&&1"5jCS/!66&1*
!3oCS/!v%
d
>>#gmmA&66Jr"   c                 H    | j                  ||      }| j                  |      S r   r\   r^   s       r    r(   z CategoricalCrossentropy.get_loss   s#    --0''00r"   r_   c                 (    |dz  j                         S )N   )sum)r   r_   s     r    r]   z+CategoricalCrossentropy._get_loss_from_grad   s    
!!r"   )r.   r/   r0   r   r	   str__annotations__r   rJ   r   boolfloatr!   r   r
   rZ   IntsOrFloatsOrStrsr*   r'   r(   r]   r   r"   r    r3   r3   5   s!   HSM""E#s(O,,S#X
 )-37$(!$! ! &	!
  c3h0! SM! !&?h ?58AS;T ?B<<);<	x	< 2D  $1 12D 1 1"8 " "r"   r3   zCategoricalCrossentropy.v1TNr9   r4   r5   r9   r4   r5   r   c                     t        | ||      S )Nrp   r3   rp   s      r    $configure_CategoricalCrossentropy_v1rs      s     #5 r"   zCategoricalCrossentropy.v2r9   r4   r5   r:   r:   c                      t        | |||      S )Nrt   rr   rt   s       r    $configure_CategoricalCrossentropy_v2rv      s     ##	 r"   zCategoricalCrossentropy.v3r7   r8   r;   c                 "    t        | ||||      S Nr8   rr   r8   s        r    $configure_CategoricalCrossentropy_v3ry      s      ##' r"   c                       e Zd Zdddddddedeee      deeeef      dee   d	e	f
d
Z
dee   dee   deee   e	f   fdZdee   dee   dee   fdZdee   dee   de	fdZdee   de	fdZy)SequenceCategoricalCrossentropyTNr7   r8   r9   r4   r5   r:   r;   c                <    t        d||||      | _        || _        y )NFr8   )r3   ccr9   )r   r9   r4   r5   r:   r;   s         r    r!   z(SequenceCategoricalCrossentropy.__init__   s(     *'!+
 #r"   r#   r$   r   c                 P    | j                  ||      }| j                  |      }||fS r   r\   )r   r#   r$   gradslosss        r    r*   z(SequenceCategoricalCrossentropy.__call__   s.     gv.''.d{r"   c                    d}t        |      t        |      k7  rt        |      t        |      }g }t        ||      D ]C  \  }}| j                  j	                  ||      }| j
                  r||z  }|j                  |       E |S )Nz]Cannot calculate SequenceCategoricalCrossentropy loss: guesses and truths must be same length)rG   rL   zipr}   r'   r9   rK   )	r   r#   r$   re   nd_scoresyhyd_yhs	            r    r'   z(SequenceCategoricalCrossentropy.get_grad   s     nw<3v;&S/!L&) 	"EB77##B*D~~	OOD!		"
 r"   c                 D    | j                  | j                  ||            S r   )r]   r'   r)   s      r    r(   z(SequenceCategoricalCrossentropy.get_loss  s      ''gv(FGGr"   r   c                 T    d}|D ]   }|| j                   j                  |      z  }" |S )Nr7   )r}   r]   )r   r   r   grads       r    r]   z3SequenceCategoricalCrossentropy._get_loss_from_grad  s4     	6DDGG//55D	6r"   )r.   r/   r0   rm   r   r	   rk   r   rJ   rn   r!   r   ro   r
   r   r*   r'   r(   r]   r   r"   r    r{   r{      s
    )-37$(!$# # &	#
  c3h0# SM# #$)3;<N3O	tH~u$	%)3;<N3O	hH)H3;<N3OH	H
();  r"   r{   z"SequenceCategoricalCrossentropy.v1r9   r4   c                     t        | |      S )Nr   r{   r   s     r    ,configure_SequenceCategoricalCrossentropy_v1r     s     +YeLLr"   z"SequenceCategoricalCrossentropy.v2r9   r4   r:   c                     t        | ||      S )Nr   r   r   s      r    ,configure_SequenceCategoricalCrossentropy_v2r     s     +5Z r"   z"SequenceCategoricalCrossentropy.v3c                 "    t        | ||||      S rx   r   r8   s        r    ,configure_SequenceCategoricalCrossentropy_v3r   %  s      +#' r"   c                   d    e Zd ZdddefdZdededeeef   fdZdededefd	Z	dededefd
Z
y)
L2DistanceTr9   r9   c                    || _         y r   r   )r   r9   s     r    r!   zL2Distance.__init__8  s	    "r"   r#   r$   r   c                 J    | j                  ||      | j                  ||      fS r   r&   r)   s      r    r*   zL2Distance.__call__;  r+   r"   c                     |j                   |j                   k7  r(d|j                    d|j                    d}t        |      ||z
  }| j                  r||j                   d   z  }|S )N1Cannot calculate L2 distance: mismatched shapes: ra   rb   r   )rR   rL   r9   )r   r#   r$   re   rf   s        r    r'   zL2Distance.get_grad>  sh    ==FLL(Egmm_TXY_YeYeXffghCS/!v%
>>#gmmA&66Jr"   c                     |j                   |j                   k7  r(d|j                    d|j                    d}t        |      | j                  ||      }|dz  j                         S )Nr   ra   rb   ri   )rR   rL   r'   rj   )r   r#   r$   re   r_   s        r    r(   zL2Distance.get_lossG  sa    ==FLL(Egmm_TXY_YeYeXffghCS/!--0
!!r"   N)r.   r/   r0   rm   r!   r   r
   rn   r*   r'   r(   r   r"   r    r   r   7  sl    ,0 #T #N N( NuXu_?U N ( x " "( "u "r"   r   zL2Distance.v1r   c                     t        |       S )Nr   )r   r   s    r    configure_L2Distancer   P  s    	**r"   c                   ~    e Zd ZddddedefdZdeded	eeef   fd
Zdeded	efdZ	deded	efdZ
deded	efdZy)CosineDistanceTFr9   ignore_zerosr9   r   c                     || _         || _        y r   r   )r   r9   r   s      r    r!   zCosineDistance.__init__V  s    "(r"   r#   r$   r   c                 J    | j                  ||      | j                  ||      fS r   r&   r)   s      r    r*   zCosineDistance.__call__Z  r+   r"   c                 f   |j                   |j                   k7  r(d|j                    d|j                    d}t        |      t        |      }|dz   }|dz   }|j                  j	                  |dd      }|j                  j	                  |dd      }||z  }	||z  j                  dd      |	z  }
|
S )N7Cannot calculate cosine similarity: mismatched shapes: ra   rb   :0yE>r   Taxiskeepdims)rR   rL   r   linalgnormrj   )r   r#   r$   re   rS   r   r   norm_yhnorm_y	mul_normscosines              r    get_similarityzCosineDistance.get_similarity]  s    ==FLL(KGMM?Z^_e_k_k^llmnCS/!g&t^TM))..!d.;D9f$	q&1t4y@r"   c                 H   |j                   |j                   k7  r(d|j                    d|j                    d}t        |      t        |      }| j                  r$|j	                  |      j                  d      dk(  }|dz   }|dz   }|j                  j                  |dd	      }|j                  j                  |dd	      }	||	z  }
||z  j                  dd	      |
z  }||
z  |||d
z  z  z  z
  }| j                  rd|<   | j                  r||j                   d   z  }| S )Nr   ra   rb   r   r   r   r   Tr   ri   )	rR   rL   r   r   absrj   r   r   r9   )r   r#   r$   re   rS   zero_indicesr   r   r   r   r   r   r   s                r    r'   zCosineDistance.get_gradl  s)   ==FLL(KGMM?Z^_e_k_k^llmnCS/! g&66&>--1-5:Lt^TM))..!d.;D9f$	q&1t4y@I&B!O"<=!"D>>'--**Dur"   c                    |j                   |j                   k7  r(d|j                    d|j                    d}t        |      t        |      }| j                  ||      }|j	                  |dz
        }| j
                  r)|j	                  |      j                  d      dk(  }d||<   | j                  r||j                   d   z  }|j                         }|S )Nr   ra   rb   r   r   r   )rR   rL   r   r   r   r   rj   r9   )	r   r#   r$   re   rS   r   lossesr   r   s	            r    r(   zCosineDistance.get_loss  s    ==FLL(KGMM?Z^_e_k_k^llmnCS/!g&$$Wf5
#66&>--1-5:L#$F< >>gmmA..Fzz|r"   N)r.   r/   r0   rm   r!   r   r
   rn   r*   r   r'   r(   r   r"   r    r   r   U  s    ,0u )T ) )N N( NuXu_?U Nh  U  ( x 4 ( u r"   r   zCosineDistance.v1Fr   r   c                     t        | |      S )Nr   )r   r   s     r    configure_CosineDistancer     s     ILIIr"   c                 `    t        |       }|j                  | j                  d      }d||<   |S )NrA   rB   r   )r   rF   rR   )r#   rT   rS   rY   s       r    rO   rO     s0    	'	"B777==7,DDMKr"   c                     t        |      }|j                  |j                  d      }|4| j                  dk(  r
d|| |k(  <   |S |j	                  | d      }d|||k(  <   |S )NrA   rB   r   r7   rD   r   )r   rF   rR   rQ   argmax)r$   r#   r5   rS   rY   labelss         r    rP   rP     sr    	'	"B777==7,D ;;!,/D=() K YYvBY/F,/D=()Kr"   )r{   r3   r   r   )0abcr   typingr   r   r   r   r   r	   r
   r   r   r   configr   typesr   r   utilr   r   r   r   r   r   IntsOrFloatsrJ   rk   ro   r   r3   r   rm   rs   rv   rn   ry   r{   r   r   r   r   r   r   r   rO   rP   __all__r   r"   r    <module>r      s       # 2				VX%&68Xc]HSMIJ F7665%/0 F4w"d w"t -. %)/3	 HSM" E#s(O,	
  / -. %)/3 $ HSM" E#s(O,	
   / -. %)/3 $  HSM" E#s(O,	
    /"2d 2j 56MM&.x}&=M$M 7M 56 %) $	 HSM" 	
 % 7 56 %)/3 $  HSM" E#s(O,	
   % 7"" "2 !.2 +t +z + "+@T @F $%EJJ-1JJ &JH 8  r"   