o
    i5                  
   @   s  d dl mZmZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZmZ d dlmZmZmZ e	 Zejjg dg dg d	gd
dZejjg dg dg dgd
dZdd Zdedededeeef fddZejje ddejdg ddd Zdd ZdS )    )TuplecastN)assert_allclose)ModelNumpyOps
Softmax_v2)Floats2dInts1d)	has_torchtorch2xpxp2torch)         r   )      r   r   )	      r      fdtype)5w6.?gUכZ?gc<?r   )Y1a ?gM?gˀ珽?r   )gRC?g}Ⱥ?g0?g%7Ŷ?c                  C   s   t dd} | tt | tdd\}}tjtdd |tj	t W d    n1 s-w   Y  | tdd\}}|tj	t}tj
|dksLJ d S )NFnormalize_outputsis_trainzbackprop is not supportedmatchT        )r   
initializeinputsoutputspytestraises
ValueErrorOPSxp
zeros_likeall)model_backpropdX r/   S/home/ubuntu/.local/lib/python3.10/site-packages/thinc/tests/layers/test_softmax.py"test_unnormalized_softmax_backprop   s   
r1   r+   Xtargetsreturnc                 C   s   dd l }t| d}t| d}| jd }t|dd}t| }|| | }	|	| }
|j }||
|}|  tt	t
|jjj|
ddtt	t
t|j|jfS )	Nr   Wbsoftmax_temperatureT)requires_grad)dim)torchr   	get_paramattrslongnnCrossEntropyLossbackwardr   r   r   
functionalsoftmaxTensorgrad)r+   r2   r3   r;   WtbttemperatureXtYt_goldXWbt	XWbt_templossoutputr/   r/   r0   torch_softmax_with_temperature%   s    


rO   zneeds PyTorch)reasonrH   )g      ?g      ?g       @c           
      C   s   t | dd dd d}tjjddddd	dd
}tdg}tjjd
dd	| }||| t|||\}}||dd\}}||| }	t	||dd t	|	|dd d S )Nc                 S   s   | j j|d ddS )Nr   r   r   )r(   eyeopsshaper/   r/   r0   <lambda>B   s    z*test_softmax_temperature.<locals>.<lambda>c                 S   s   | j j|ddS )Nr   r   )r(   zerosrR   r/   r/   r0   rU   C   s    )rH   init_Winit_br9   r   g?r   r   
   r   Tr   g-C6?)atol)
r   r'   r(   arangereshape	asarray1irQ   r!   rO   r   )
rH   r+   r2   r3   Y_goldYtdXtYr-   r.   r/   r/   r0   test_softmax_temperature=   s   rb   c                  C   s   t jtdd tddd W d    n1 sw   Y  tdd} d| jd< | tt t jtdd | tdd W d    d S 1 sFw   Y  d S )	Nzsoftmax temperature.*zeror   Fr    )r   rH   r   r7   r   )r$   r%   r&   r   r=   r!   r"   r#   )r+   r/   r/   r0   !test_reject_incorrect_temperatureT   s   

"rc   )typingr   r   numpyr$   numpy.testingr   	thinc.apir   r   r   thinc.typesr   r	   
thinc.utilr
   r   r   r'   r(   asarrayr"   r#   r1   rO   markskipifparametrizerb   rc   r/   r/   r/   r0   <module>   s<    "


