
    h'                        S SK r S SKrS SKJrJrJrJrJrJrJ	r	J
r
JrJrJrJrJrJrJr  S SKJr  S SKJrJrJrJr  S SKJr  S SKJrJr  S SKJr  S SKJ r   S	S
K!J"r"J#r#  \" 5       /r$\(       a  \$RK                  \" 5       5        \(       a  \$RK                  \" 5       5        \(       a  SS/r&OS/r&\$ V Vs/ s H'  n \&  H  nU(       a  \'" U \5      (       d  M  X4PM     M)     snn r(S r)\RT                  RW                  \(       + SS9\RT                  RY                  SS/5      S 5       5       r-\RT                  RW                  \(       + SS9\RT                  RY                  SS/5      S 5       5       r.\RT                  RW                  \(       + SS9\RT                  RY                  S\(5      \RT                  RY                  SS/5      S 5       5       5       r/\RT                  RW                  \(       + SS9S 5       r0\RT                  RW                  \(       + SS9S 5       r1\RT                  RW                  \(       + SS9\RT                  RY                  S\ Rd                  " SSS9S/ 4\ Rd                  " SSS9\ Rd                  " SSS9/S	/ 4\ Rd                  " SSS9\ Rd                  " SSS94S	/ 4\ Rd                  " SSS9\ Rd                  " SSS9S.S SS/4\" \ Rd                  " SSS9\ Rd                  " SSS94S \ Rd                  " SSS905      S	S /4/5      S! 5       5       r3\RT                  RW                  \(       + SS9S" 5       r4gs  snn f )#    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                    U R                  U5      u  pEXC-
  UR                  S   -  nU" U5      nU R                  U5        [        R                  " UR                  5       5      n[        S5       HU  n	U R                  U5      u  pE[        R                  " UR                  5       5      n
U" XC-
  5      nU R                  U5        MW     W
U:  d   eg)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totals              a/home/james-whalen/.local/lib/python3.13/site-packages/thinc/tests/layers/test_pytorch_wrapper.pycheck_learns_zero_outputr3   5   s    ##A&JB6RXXa[
 C	B	99RVVXD3Z''*
		"&&(#BF^C 	 
 4<<    zneeds PyTorch)reasonznN,nI,nO)r         c                 B   [        X!5      R                  5       n[        R                  " X4SS9nU[        R                  R                  UR                  S9R                  UR                  5      -  n[        S5      n[        R                  " X4SS9n[        X5XF5        g )Nfdtypesizeg{Gz?)r   
initializer#   zerosrandomuniformr=   reshaper!   r   r3   )nNnInOr'   r)   r(   r*   s          r2   test_pytorch_unwrappedrF   D   s|     2N%%'ERHC(A		166		*	2	2177	;;A
d)CRHC(AU.r4   c                    SS K n[        UR                  R                  X5      5      R	                  5       n[        S5      n[        R                  " X4SS9nU[        R                  R                  UR                  S9R                  UR                  5      -  n[        R                  " X4SS9nUR                  U5      u  p[        U[        R                  5      (       d   eUR                  X4:X  d   eX-
  UR                  S   -  n
U	" U
5      nUR!                  U5        UR                  X4:X  d   e[#        XEXg5        [        UR%                  U5      [        R                  5      (       d   eg )Nr   MbP?r9   r:   r<   )torch.nnr	   nnr   r>   r   r#   r?   r@   rA   r=   rB   r!   r    
isinstancendarrayr"   r3   predict)rC   rD   rE   torchr'   r(   r)   r*   r+   r,   r-   r.   s               r2   test_pytorch_wrapperrO   O   s)    588??223>>@E
e*CRHC(A		166		*	2	2177	;;ARHC(A##A&JBb%--((((88x6RXXa[
 C	B	88xU.emmA&6666r4   	ops_mixedc                    SS K nU u  pV[        UR                  5         [        5       nUR                  R                  X35      nUR                  R                  R                  UR                  SS5        [        5       n[        [        5       [        UR                  U5      U[        USS9S9R                  5       5      n	[!        U["        5      (       a  S[$        R&                  " 5       ;   d   e[)        S5      n
UR*                  R-                  X4S	S
9nXR*                  R.                  R1                  UR2                  S9R5                  UR6                  5      -  nUR*                  R-                  X4S	S
9nU	R                  X5        U	R9                  U5      u  p[!        XR*                  R:                  5      (       d   eUR6                  X4:X  d   eX-
  UR6                  S   -  nU" U5      nU	R=                  U
5        UR6                  X4:X  d   e[?        XX5        [!        U	RA                  U5      UR*                  R:                  5      (       d   e S S S 5        g ! , (       d  f       g = f)Nr   g      "@g      &@g      @)enabled
init_scale)mixed_precisiongrad_scalerpytorchrH   r9   r:   r<   )!rI   r   namer   rJ   r   inituniform_weightr   r   r   r
   tor   r>   rK   r   r   getr   xpr?   r@   rA   r=   rB   r!   r    rL   r"   r3   rM   )rP   rC   rD   rE   rN   opsrT   pytorch_layerdevicer'   r(   r)   r*   r+   r,   r-   r.   s                    r2    test_pytorch_wrapper_thinc_inputra   d   s    $C		/ 	}33S$?)+F  ( /-+ jl	
 c7## 1 1 3333%jFFLL"L-	VV]]"""/77@@FFLL"L-''*
"ffnn----xxB8###v!$C[C xxB8### Q2%--*CFFNN;;;;C 
		s   H;I##
I1c                      SS K n [        R                  " SSS9n[        U5      n[	        X R
                  5      (       d   e[        U5      n[        R                  " X5      (       d   eg )Nr   r   r6   r9   r:   )rN   r#   r?   r   rK   Tensorr   array_equal)rN   	xp_tensortorch_tensornew_xp_tensors       r2   !test_pytorch_roundtrip_conversionri      sU    F#.II&LlLL1111\*MY6666r4   c                     SS K n [        U R                  R                  SS5      5      nUR	                  5       n[        U R                  R                  SS5      5      R                  U5        [        5        nUS-  nUR                  U5        [        U R                  R                  SS5      5      R                  U5      nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nr   r   r6   r'   )	rI   r	   rJ   r   to_bytes
from_bytesr   to_disk	from_disk)rN   r'   model_bytespath
model_path	new_models         r2   test_pytorch_wrapper_roundtriprs      s    588??1a01E.."K588??1a()44[A	4G^
j!"588??1a#89DD[Q	J'	 
s   8AC
C+zdata,n_args,kwargs_keysrc   r9   r:      )abru   rv   cc                     SS K n[        UR                  R                  SS5      5      nUR                  S   nU" X@SS9u  pg[        XgXX#R                  5        g )Nr   r6   r7   convert_inputsT)is_train)rI   r	   rJ   r   attrsr   rd   )datan_argskwargs_keysrN   r'   ry   r*   backprops           r2   test_pytorch_convert_inputsr      sM     588??1a01E[[!12N t<KA1k<<Pr4   c                  J  ^^^ SS K mS mS mUUU4S jn U " 5       nUR                  5       nU " 5       R                  U5        [        5        nUS-  nUR	                  U5        U " 5       R                  U5      nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nr   c                     [        U 5      $ N)r   )r'   s    r2   	serialize4test_pytorch_wrapper_custom_serde.<locals>.serialize   s    ,U33r4   c                     [        XU5      $ r   )r   )r'   state_bytesr`   s      r2   deserialize6test_pytorch_wrapper_custom_serde.<locals>.deserialize   s    .u6JJr4   c                  N   > [        TR                  R                  SS5      TT S9$ )Nr   r6   )serialize_modeldeserialize_model)r   rJ   r   )r   r   rN   s   r2   	get_model4test_pytorch_wrapper_custom_serde.<locals>.get_model   s(     HHOOAq!%)
 	
r4   r'   )rI   rk   rl   r   rm   rn   )	r   r'   ro   rp   rq   rr   r   r   rN   s	         @@@r2   !test_pytorch_wrapper_custom_serder      s    4K
 KE.."KK;'	4G^
j!K**;7	J'	 
s   >B
B")5r#   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appendTORCH_MIXED_PRECISIONrK   XP_OPS_MIXEDr3   markskipifparametrizerF   rO   ra   ri   rs   r?   r   r   )r^   mixeds   00r2   <module>r      s]        " ) R R 9 > / 7
*
MM')
MM&( "DM"G &JsG, SL&  	M/:i[1/ 2 ;/ 	M/:i[17 2 ;7& 	M/:l3i[1&< 2 4 ;&<R 	M/:7 ;7 	M/:
( ;
( 	M/: 
V3	'B/
++fC
(%++fC*H	I1bQ
++fC
(%++fC*H	I1bQ{{6-EKKc4R	SUVY\^aXbc	U[[s3U[[s5STWZ\a\g\ghnvy\zV{	|~  CF  BG  	HQ ;Q 	M/:( ;(gs   5MM