o
    i                     @   s  d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	 d dl
mZ ejddgddd Zejg d	dd
d Zdd Zejde e gejdg ddd Zejde e gdd Zejde e gejddddddgfddddddgfddddg dfddddg dfdddddgfddddg dfddddg d fddddg d!fgd"d# Zd$d% Zejjd&d' Zd(d) Zejje d*d+d,d- ZdS ).    N)LSTMNumpyOpsOpsPyTorchLSTMfix_random_seedwith_padded)	has_torch      )paramsc                 C      | j S Nparamrequest r   P/home/ubuntu/.local/lib/python3.10/site-packages/thinc/tests/layers/test_lstm.pynI
      r   )r	         	   c                 C   r   r   r   r   r   r   r   nO   r   r   c                  C   s
  t  } tdtdtdg}| |}|j}|j}|jdks#J |d dks+J |d dks3J |d dks;J |d dksCJ |d	 dksKJ |d
 dksSJ |d dks[J |d dkscJ | |}|d jdksqJ |d jdkszJ |d jdksJ d S )N)      )   r   )r   r   )r      r   r   r   r	   r   r   r   r
   r   )r   numpyzeroslist2paddeddata	size_at_tshapepadded2list)opsseqspaddedarrr"   unpaddedr   r   r   test_list2padded   s$   

r*   r%   znO,nI))r	   r   )r   r   )d      )r   r
   c                 C   s   t t||dd }| D ]}| |_|dd usJ |dd us&J q| D ];}|drQ|d}|j|d | |d  |d | |d   fksQJ |drf|d}|jddd|fksfJ q+d S )Nr	   depthr   HC0r   r   )r   r   
initializewalkr%   	has_param	get_paramr#   )r%   r   r   modelnoder   r   r   r   test_LSTM_init_with_sizes)   s    

&


r6   c           	      C   s   d}d}t jddgddgddggdd}tt||j|gd}| D ]}| |_q$||gd	d
\}}||}t |jt |gjksFJ d S )Nr	   r   皙?g      ?fdtypeXTis_train)	r   asarrayr   r   r0   r1   r%   vstackr#   )	r%   r   r   r=   r4   r5   ysbackprop_ysdXsr   r   r   test_LSTM_fwd_bwd_shapes_simple>   s    "rE   znO,nI,depth,bi,lengthsF       r   r   T)r   r   r   )r   r   r      )r   r	   
   r   )r   r   r   )r   r   r   c                    sz    fdd|D }t t| ||dj|d}| D ]}| |_q||dd\}	}
|
|	}t|jt|jks;J d S )Nc                    s   g | ]}t j| fd dqS )r9   r:   )r   ones).0lengthr   r   r   
<listcomp>Z   s    z.test_BiLSTM_fwd_bwd_shapes.<locals>.<listcomp>)r.   bir<   Tr>   )r   r   r0   r1   r%   r   rA   r#   )r%   r   r   r.   rO   lengthsXsr4   r5   rB   rC   rD   r   rM   r   test_BiLSTM_fwd_bwd_shapesK   s    rR   c                     s6  t d d} d}dd }tt| | ddgddgddgg}ddgddgddgg} fd	d
|D } fdd
|D } ||  |\}}tdd
 t||D } |\}}dd
 t||D }||}	 |  |\}}dd
 t||D }||}	tdd
 t||D }
||
ksJ ||
fd S )Nr   r   c                 S   s   |d| 8 }||d fS )NgMbP?r   r   )keyweightsgradientr   r   r   sgdi   s   ztest_LSTM_learns.<locals>.sgdr7   g?g333333?g?c                    "   g | ]} j j|d ddqS r9   r:   )r	   r%   r@   reshape)rK   xr4   r   r   rN   p      " z$test_LSTM_learns.<locals>.<listcomp>c                    rW   rX   rZ   )rK   yr]   r   r   rN   q   r^   c                 S       g | ]\}}|| d    qS r   sumrK   yhr_   r   r   r   rN   t        c                 S      g | ]\}}|| qS r   r   rd   r   r   r   rN   v       c                 S   rg   r   r   rd   r   r   r   rN   z   rh   c                 S   r`   ra   rb   rd   r   r   r   rN   |   rf   )r   r   r   r0   begin_updaterc   zipfinish_update)r   r   rV   r=   YYhsbp_Yhsloss1dYhsrD   loss2r   r]   r   test_LSTM_learnsc   s*   
rr   c                     s
  d} d d}d}dt jjdd|| d}t |d}g }d}tt|   }|j||D ]%}t	|}|rFt
| fdd	|D }n	 fd
d	|D }|| q/t }	|D ]}
|t	|
\}}q[t }|| }td|||	 |||	  ||	 | f  d S )N   i     rI   )scalelocsizer	   Fc              	      s.   g | ]}t jt jd dt fddqS g        r8   r9   r:   r   r@   randomuniformint)rK   _r   seq_lenr   r   rN          z+test_benchmark_LSTM_fwd.<locals>.<listcomp>c              	      s.   g | ]}t jt jd dt| fddqS rx   ry   )rK   r   rM   r   r   rN      r   z>--- %i samples in %s seconds (%f samples/s, %.7f s/sample) ---)r   rz   normalmaximumr   r   r0   r%   	minibatchlistmaxappendtimeitdefault_timerri   print)r   n_batch
batch_sizerP   batchesuniform_lengthsr4   batch_lengthsbatchstartrQ   rB   bp_ysend	n_samplesr   r~   r   test_benchmark_LSTM_fwd   s>   
r   c                  C   s"   t tdddd } |   d S )Nr   T)rO   )r   r   r0   r]   r   r   r   test_lstm_init   s   r   zneeds PyTorch)reasonc                  C   s(   t tdddd } | jdksJ d S )Nr   r   r-   zwith_padded(noop))r   r   r0   namer]   r   r   r   test_pytorch_lstm_init   s   r   )r   r   pytest	thinc.apir   r   r   r   r   r   thinc.compatr   fixturer   r   r*   markparametrizer6   rE   rR   rr   skipr   r   skipifr   r   r   r   r   <module>   sF     




)