o
    i'                     @   s  d dl Z d dlZd dlmZmZmZmZmZ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mZmZ d dlmZ d dlmZmZ d dlmZ d dlm Z  d	d
l!m"Z"m#Z# e gZ$erje$%e  erre$%e  eryddgZ&ndgZ&dd e$D Z'dd Z(ej)j*e ddej)+ddgdd Z,ej)j*e ddej)+ddgdd Z-ej)j*e ddej)+de'ej)+ddgdd Z.ej)j*e dddd Z/ej)j*e dddd Z0ej)j*e ddej)+d e j1d!d"d#d$g fe j1d!d"d#e j1d!d"d#gd	g fe j1d!d"d#e j1d!d"d#fd	g fe j1d!d"d#e j1d!d"d#d%d d&d'gfee j1d!d"d#e j1d!d"d#fd(e j1d!d"d#id	d(gfgd)d* Z2ej)j*e ddd+d, Z3dS )-    N)SGD
ArgsKwargsCupyOpsLinearMPSOpsNumpyOpsPyTorchWrapperPyTorchWrapper_v2PyTorchWrapper_v3Reluchainget_current_opstorch2xpuse_opsxp2torch)context_pools)has_cupy_gpu	has_torchhas_torch_amphas_torch_mps_gpu)r
   )default_deserialize_torch_modeldefault_serialize_torch_model)PyTorchGradScaler)get_torch_default_device   )check_input_convertersmake_tempdirFTc                 C   s,   g | ]}t D ]}|rt|tr||fqqS  )TORCH_MIXED_PRECISION
isinstancer   ).0opsmixedr   r   [/home/ubuntu/.local/lib/python3.10/site-packages/thinc/tests/layers/test_pytorch_wrapper.py
<listcomp>-   s    r$   c                 C   s   |  |\}}|| |jd  }||}| | t| }tdD ]}	|  |\}}t| }
||| }| | q$|
|k sFJ dS )z*Check we can learn to output a zero vectorr   d   N)begin_updateshapefinish_updatenumpyabssumrange)modelsgdXYYhget_dXdYhdXprevitotalr   r   r#   check_learns_zero_output5   s   
r8   zneeds PyTorch)reasonznN,nI,nO)r         c                 C   sh   t || }tj| |fdd}|tjj|jd|j7 }t	d}tj| |fdd}t
|||| d S )Nfdtypesizeg{Gz?)r   
initializer)   zerosrandomuniformr@   reshaper'   r   r8   )nNnInOr-   r/   r.   r0   r   r   r#   test_pytorch_unwrappedD   s   rI   c                 C   s   dd l }t|j|| }td}tj| |fdd}|tjj	|j
d|j7 }tj| |fdd}||\}}	t|tjsBJ |j| |fksKJ || |jd  }
|	|
}|| |j| |fksfJ t|||| t||tjsxJ d S )Nr   MbP?r<   r=   r?   )torch.nnr   nnr   rA   r   r)   rB   rC   rD   r@   rE   r'   r&   r   ndarrayr(   r8   predict)rF   rG   rH   torchr-   r.   r/   r0   r1   r2   r3   r4   r   r   r#   test_pytorch_wrapperO   s   
rP   	ops_mixedc              
   C   s  dd l }| \}}t|j t }|j||}|jj|jdd t	 }t
t t|||t|ddd }	t|trFdt v sFJ td}
|jj||fd	d
}||jjj|jd|j7 }|jj||fd	d
}|	|| |	|\}}t||jjsJ |j||fksJ || |jd  }||}|	|
 |j||fksJ t|	|
|| t|	 ||jjsJ W d    d S 1 sw   Y  d S )Nr   g      "@g      &@g      @)enabled
init_scale)mixed_precisiongrad_scalerpytorchrJ   r<   r=   r?   )!rK   r   namer   rL   r   inituniform_weightr   r   r   r	   tor   rA   r   r   r   getr   xprB   rC   rD   r@   rE   r'   r&   rM   r(   r8   rN   )rQ   rF   rG   rH   rO   r!   rT   pytorch_layerdevicer-   r.   r/   r0   r1   r2   r3   r4   r   r   r#    test_pytorch_wrapper_thinc_inputd   sF   

"r`   c                  C   sJ   dd l } tjddd}t|}t|| jsJ t|}t||s#J d S )Nr   r   r:   r<   r=   )rO   r)   rB   r   r   Tensorr   array_equal)rO   	xp_tensortorch_tensornew_xp_tensorr   r   r#   !test_pytorch_roundtrip_conversion   s   rg   c                  C   s   dd l } t| jdd}| }t| jdd| t #}|d }|| t| jdd|}|| W d    d S 1 sFw   Y  d S )Nr   r   r:   r-   )	rK   r   rL   r   to_bytes
from_bytesr   to_disk	from_disk)rO   r-   model_bytespath
model_path	new_modelr   r   r#   test_pytorch_wrapper_roundtrip   s   
"rp   zdata,n_args,kwargs_keysra   r<   r=      )abrr   rs   cc                 C   sN   dd l }t|jdd}|jd }||| dd\}}t||| |||j d S )Nr   r:   r;   convert_inputsT)is_train)rK   r   rL   r   attrsr   rb   )datan_argskwargs_keysrO   r-   ru   r0   backpropr   r   r#   test_pytorch_convert_inputs   s
   
r|   c                     s   dd l dd dd   fdd} |  }| }|  | t }|d }|| |  |}|| W d    d S 1 sDw   Y  d S )	Nr   c                 S   s   t | S N)r   )r-   r   r   r#   	serialize   s   z4test_pytorch_wrapper_custom_serde.<locals>.serializec                 S   s   t | ||S r}   )r   )r-   state_bytesr_   r   r   r#   deserialize   s   z6test_pytorch_wrapper_custom_serde.<locals>.deserializec                      s   t jdd dS )Nr   r:   )serialize_modeldeserialize_model)r
   rL   r   r   r   r~   rO   r   r#   	get_model   s
   z4test_pytorch_wrapper_custom_serde.<locals>.get_modelr-   )rK   rh   ri   r   rj   rk   )r   r-   rl   rm   rn   ro   r   r   r#   !test_pytorch_wrapper_custom_serde   s   
"r   )4r)   pytest	thinc.apir   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   thinc.backendsr   thinc.compatr   r   r   r   thinc.layers.pytorchwrapperthinc.shims.pytorchr   r   thinc.shims.pytorch_grad_scalerr   
thinc.utilr   utilr   r   XP_OPSappendr   XP_OPS_MIXEDr8   markskipifparametrizerI   rP   r`   rg   rp   rB   r|   r   r   r   r   r#   <module>   sb    D
	)


  &6	