o
    i73                     @   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 d dlmZmZ d dlmZ ddlmZmZ ejdd Zejd	d
 Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejje dddd Zejje dddd Z ejje dddd Z!ejje dddd  Z"ejje ddd!d" Z#ejje ddd#d$ Z$ejje ddd%d& Z%ejje ddd'd( Z&ejje ddd)d* Z'ejje ddd+d, Z(ejje ddd-d. Z)ejje ddd/d0 Z*ejje ddd1d2 Z+ejje ddd3d4 Z,ejje ddd5d6 Z-ejje ddd7d8 Z.ejje ddd9d: Z/ejje ddejje d;dd<d= Z0ejje ddej1d>e j2d?d@dAdBg fe j2d?d@dAe j2d?d@dAgdg fe j2d?d@dAe j2d?d@dAfdg fe j2d?d@dAe j2d?d@dAdCd dDdEgfee j2d?d@dAe j2d?d@dAfdFe j2d?d@dAiddFgfgdGdH Z3ejje dddIdJ Z4ejje dddKdL Z5dS )M    N)	Adam
ArgsKwargsLinearModelTensorFlowWrapperget_current_opskeras_subclasstensorflow2xpxp2tensorflow)has_cupy_gpuhas_tensorflow)to_categorical   )check_input_convertersmake_tempdirc                   C      dS )N    r   r   r   ^/home/ubuntu/.local/lib/python3.10/site-packages/thinc/tests/layers/test_tensorflow_wrapper.pyn_hidden      r   c                   C   r   )Ni  r   r   r   r   r   
input_size   r   r   c                   C   r   )N
   r   r   r   r   r   	n_classes   r   r   c                   C   r   )N   r   r   r   r   r   answer$   r   r   c                 C   s   t  }|jd| fdS )Nr   )shape)r   alloc)r   opsr   r   r   X)   s   r   c                 C   s   t  }t|| g|dS )Nr   )r   r   	asarray1i)r   r   r   r   r   r   Y/   s   r"   c              
   C   s^   dd l }|j|jjj| |fd|jj |jjj| dd|jj |jjjdddg}|S )Nr   input_shaperelu)
activationr   softmax)
tensorflowkeras
SequentiallayersDenseLayerNormalization)r   r   tftf_modelr   r   r   r/   5   s   

	r/   c                 C   s   t | S N)r   )r/   r   r   r   modelE   s   r1   zneeds TensorFlow)reasonc                  C   sX   dd l } t }|jdddd}t|}t|| jsJ t||d}|j||s*J d S )Nr   r      T)zeros)r   )	r(   r   alloc2fr
   
isinstanceTensorr	   xparray_equal)r.   r   	xp_tensor	tf_tensornew_xp_tensorr   r   r   ,test_tensorflow_wrapper_roundtrip_conversionJ   s   r=   c                  C   st   dd l } | j| jjjdddg}tt|tsJ t	t
 ttdd W d    d S 1 s3w   Y  d S )Nr   r   r   r#   r   r3   )r(   r)   r*   r+   r,   r6   r   r   pytestraises
ValueErrorr   )r.   keras_modelr   r   r   9test_tensorflow_wrapper_construction_requires_keras_modelV   s   "rC   c                 C   sB   |  |d us	J t| jd dksJ | |  d usJ d S )Nr    )predictstrshims
from_bytesto_bytes)r1   r   r"   r   r   r   #test_tensorflow_wrapper_built_model`   s   rJ   c                 C   s   |  | d S r0   )rE   r1   r   r   r   r   test_tensorflow_wrapper_predictj   s   rL   c                 C   sv   t  }t }tdD ]!}| |dd\}}||}|| |jd  }	||	 | | q
| | }
|
|ks9J d S )Nd   Tis_trainr   )r   r   rangeasarrayr   finish_updaterE   argmaxr1   r   r"   r   	optimizerr   iguessesbackprop	d_guesses	predictedr   r   r   &test_tensorflow_wrapper_train_overfitso   s   
r[   c                    s  dd l  t }g }t }tdD ].}| |dd\}}	||}|| |jd  }
|	|
  fdd| jd jD }|| q| 	| | jd jd u sNJ tt
|D ]-}|dkr[qTd}|| }||d  }t||D ]\}}||k  rzd}ql|du sJ qTd S )	Nr   r3   TrN   c                    s   g | ]}  |qS r   )identity).0varr.   r   r   
<listcomp>   s    z@test_tensorflow_wrapper_accumulate_gradients.<locals>.<listcomp>Fr   )r(   r   r   rP   rQ   r   rG   	gradientsappendrR   lenzipnumpyany)r1   r   r"   r   rU   ra   r   rV   rW   rX   rY   
shim_grads
found_diff
curr_grads
prev_gradscurrprevr   r_   r   ,test_tensorflow_wrapper_accumulate_gradients   s2   

rm   c                    s   dd l d|ft }td|j t|dgddG  fdddjj t  }t	 }t
dD ]!}|| d	d
\}	}
||	}	|	| |	jd  }|
| || q9||  }||kshJ ||  ||  |kszJ d S )Nr   r   zfoo.v1r    r   r"   r$   c                       s4   e Zd Z fddZdjfddZ  ZS )zJtest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModelc                    sF   t  | jdi | jjjddd| _jjjddd| _d S )Nr   in_dense)namer$   	out_denser'   )rp   r&   r   )super__init__r)   r+   r,   ro   rq   )selfkwargs)CustomKerasModel	__class__r$   r   r.   r   r   rs      s   zStest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModel.__init__returnc                 S   s   |  |}| |S r0   )ro   rq   )rt   inputsxr   r   r   call   s   

zOtest_tensorflow_wrapper_serialize_model_subclass.<locals>.CustomKerasModel.call)__name__
__module____qualname__rs   r7   r{   __classcell__r   rv   r$   r   r.   rw   r   rv      s    	rv   2   TrN   )r(   r   r   r5   r   r!   r)   r   r   r   rP   rQ   r   rR   rE   rS   rH   rI   )r   r"   r   r   r   r   r1   rU   rV   rW   rX   rY   rZ   r   r   r   0test_tensorflow_wrapper_serialize_model_subclass   s,    

r   c                  C   s   dd l } G dd d| jj}tt t|  W d    n1 s#w   Y  tdt	ddgt	dgddd	id
G dd d| jj}t| }|
| }|jd jjd	ks]J t|tsdJ d S )Nr   c                   @      e Zd Zdd ZdS )zWtest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.UndecoratedModelc                 S      |S r0   r   rt   ry   r   r   r   r{         z\test_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.UndecoratedModel.callNr|   r}   r~   r{   r   r   r   r   UndecoratedModel       r   	TestModel              ?r   lossbinary_crossentropy)r   r"   r$   compile_argsc                   @   r   )zPtest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.TestModelc                 S   r   r0   r   r   r   r   r   r{      r   zUtest_tensorflow_wrapper_keras_subclass_decorator_compile_args.<locals>.TestModel.callNr   r   r   r   r   r      s    )r(   r)   r   r?   r@   rA   r   r   re   arrayrH   rI   rG   _modelr   r6   )r.   r   r   r1   r   r   r   =test_tensorflow_wrapper_keras_subclass_decorator_compile_args   s"   

r   c                  C   s   dd l } G dd d| jj}tt t|  W d    n1 s#w   Y  tdt	ddgt	dgddG d	d d| jj}t
t| tsMJ d S )
Nr   c                   @   r   )zJtest_tensorflow_wrapper_keras_subclass_decorator.<locals>.UndecoratedModelc                 S   r   r0   r   r   r   r   r   r{      r   zOtest_tensorflow_wrapper_keras_subclass_decorator.<locals>.UndecoratedModel.callNr   r   r   r   r   r      r   r   r   r   r   r   rn   c                   @   r   )zCtest_tensorflow_wrapper_keras_subclass_decorator.<locals>.TestModelc                 S   r   r0   r   r   r   r   r   r{     r   zHtest_tensorflow_wrapper_keras_subclass_decorator.<locals>.TestModel.callNr   r   r   r   r   r      s    )r(   r)   r   r?   r@   rA   r   r   re   r   r6   )r.   r   r   r   r   r   0test_tensorflow_wrapper_keras_subclass_decorator   s   r   c           
      C   s   dd l }tdtddgtdgddG dd d|jj}t|dd	d
}t|jd j	ds2J |jd j	j
}d|jv s@J d|jv sGJ i }	|	|	d< tt t|d|	d
 W d    n1 sew   Y  || }d S )Nr   r   r   r   r   rn   c                       s&   e Zd Zd fdd	Zdd Z  ZS )zWtest_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModelFc                    s0   t  |  |du sJ |dd d usJ d S )NTother)rr   rs   get)rt   customru   r   r   r   rs     s   z`test_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModel.__init__c                 S   r   r0   r   r   r   r   r   r{     r   z\test_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs.<locals>.TestModel.call)F)r|   r}   r~   rs   r{   r   r   r   r   r   r     s    T9  )r   eg_argsr   key)r(   r   re   r   r)   r   r   hasattrrG   r   r   argsru   r?   r@   rA   rH   rI   )
r   r"   r   r   r   r.   r   r1   args_kwargsobjr   r   r   Dtest_tensorflow_wrapper_keras_subclass_decorator_capture_args_kwargs	  s    r   c                 C   s   |   }|d us
J d S r0   )copy)r1   r   r   r   r   &test_tensorflow_wrapper_can_copy_model/  s   r   c                 C   sN   t | jd }d|v sJ d|v sJ d|v sJ d|v sJ d|v s%J d S )Nr   layer_normalizationdensezTotal paramszTrainable paramszNon-trainable params)rF   rG   )r1   r   summaryr   r   r   %test_tensorflow_wrapper_print_summary5  s   r   c                 C   s"   |   }|d us
J | | d S r0   )rI   rH   )r1   r   model_bytesr   r   r    test_tensorflow_wrapper_to_bytesA  s   r   c                 C   sT   t  }|d }| | | |}|d usJ W d    d S 1 s#w   Y  d S )Nzmodel.h5)r   to_disk	from_disk)r1   r   r"   r   tmp_path
model_fileanother_modelr   r   r   $test_tensorflow_wrapper_to_from_diskI  s   

"r   c                 C   s,   |  | |  }| |}|d usJ d S r0   )rE   rI   rH   )r1   r   r   r   r   r   r   "test_tensorflow_wrapper_from_bytesR  s   

r   c                 C   s   t  }t }| |j | | d usJ W d    n1 s"w   Y  tdD ] }| |\}}||}|| |j	d  }	||	 | 
| q+| |j | | }
W d    n1 sdw   Y  |
|ksoJ d S )Nr   r   )r   r   
use_paramsaveragesrE   rS   rP   begin_updaterQ   r   rR   rT   r   r   r   "test_tensorflow_wrapper_use_paramsZ  s   
r   c                 C   s   t | }|  d S r0   )r   to_cpur/   r1   r   r   r   test_tensorflow_wrapper_to_cpum  s   r   zneeds GPU/cupyc                 C   s   |  d d S )Nr   )to_gpurK   r   r   r   test_tensorflow_wrapper_to_gpus  s   r   zdata,n_args,kwargs_keys)r   r3   f)dtyper   )abr   r   cc           	      C   s`   dd l }|j|jjjdddg}t|}|jd }||| dd\}}t||| |||j d S )Nr   r   r>   r#   convert_inputsTrN   )	r(   r)   r*   r+   r,   r   attrsr   r7   )	datan_argskwargs_keysr.   rB   r1   r   r"   rX   r   r   r   &test_tensorflow_wrapper_convert_inputsy  s   
r   c                 C   s>   G dd dt }t| |d}t||sJ | dksJ d S )Nc                   @   r   )zAtest_tensorflow_wrapper_thinc_model_subclass.<locals>.CustomModelc                 S   r   )Nr   r   )rt   r   r   r   fn  r   zDtest_tensorflow_wrapper_thinc_model_subclass.<locals>.CustomModel.fnN)r|   r}   r~   r   r   r   r   r   CustomModel  r   r   )model_classr   )r   r   r6   r   )r/   r   r1   r   r   r   ,test_tensorflow_wrapper_thinc_model_subclass  s   r   c                 C   s   t | dd}|jdksJ d S )Ncool)
model_name)r   rp   r   r   r   r   ,test_tensorflow_wrapper_thinc_set_model_name  s   r   )6re   r?   	thinc.apir   r   r   r   r   r   r   r	   r
   thinc.compatr   r   
thinc.utilr   utilr   r   fixturer   r   r   r   r   r"   r/   r1   markskipifr=   rC   rJ   rL   r[   rm   r   r   r   r   r   r   r   r   r   r   r   r   parametrizer4   r   r   r   r   r   r   r   <module>   s    ,









	
	


"
1


%






  &6


