3
dM                 @   s  d dl mZ 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mZmZmZ d dlmZmZ d dlmZmZmZ d dlmZ d dlZdd	lmZ ejd
d Zdd Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%d d! Z&d"d# Z'd$d% Z(d&d' Z)d(d) Z*d*d+ Z+d,d- Z,d.d/ Z-d0d1 Z.d2d3 Z/d4d5 Z0ej1j2d6d7j3 d8d9 Z4d:d; Z5ej1j6e d<d=d>d? Z7d@dA Z8dBdC Z9dDdE Z:dFdG Z;dHdI Z<dJdK Z=dLdM Z>dNdO Z?dPdQ Z@dS )R    )CounterN)AdamCupyOpsDropoutLinearModelRelu)ShimSoftmaxchainchange_attr_values)concatenateset_dropout_rate)use_ops
with_debugwrap_model_recursive)has_cupy_gpu   )make_tempdirc               C   s   t  S )N)r    r   r   P/var/www/html/virt/lib64/python3.6/site-packages/thinc/tests/model/test_model.pymodel_with_no_args   s    r   c             C   s   t | dd S )Nc             S   s   | dd fS )Nc             S   s   | S )Nr   )dYr   r   r   <lambda>   s    z0create_model.<locals>.<lambda>.<locals>.<lambda>r   )Xr   r   r   r      s    zcreate_model.<locals>.<lambda>)r   )namer   r   r   create_model   s    r   c             C   s   t | jt std S )N)
isinstanceopsr   AssertionError)r   r   r   r   test_model_defaults_to_cpu   s    r    c             C   s    t  }t  }|j|jkstd S )N)r   idr   )r   Zmodel1model2r   r   r   test_models_get_different_ids   s    r#   c           P   C   s  G dd dt } td}tddd dd dtjdd d	|d d
ddi| d g||gd}|jdsht|jdjdks|t|jdd kstt	j
t |jd W d Q R X t	j
t |jd W d Q R X |jdtjd |jdst|jdjdkst|j|jdftjdi$ tj|jdtjds>tW d Q R X tj|jdtjdsft|jd sxt|jd stt	j
t |jd W d Q R X |jd|jjd |jd|jjd t	j
t |jdtjd W d Q R X |jds
t|jddkstt	j
t |jd W d Q R X t	j
t |jd W d Q R X |jdsnt|jdjdkst|jd stt	j
t |jd W d Q R X |jdd kstt	j
t |jd W d Q R X |jd| |jdst|jdjdkstt	j
t |jdtd W d Q R X d|jksRtd|jksbt|jd dksvtt	j
t |jd  W d Q R X d|jd< |j }|jdkstd S ) Nc               @   s   e Zd ZdZdS )ztest_model_init.<locals>.MyShimtestshimN)__name__
__module____qualname__r   r   r   r   r   MyShim#   s   r(   atestc             S   s   | dd fS )Nc             S   s   | S )Nr   )r   r   r   r   r   )   s    z3test_model_init.<locals>.<lambda>.<locals>.<lambda>r   )r   r   r   r   r   )   s    z!test_model_init.<locals>.<lambda>
   )nInO)Wb)r)   r/   foobar)dimsparamsrefsattrsshimslayersr.   r/   r   xyz   r   r,   r-   cZbaz)r+   )r+   )r+   )r+   )r+   )r+   )r+   )r9   r   ) r	   r   r   numpyzerosZ	has_paramr   	get_paramshapepytestraisesKeyError	set_paramZ
use_paramsr!   ZonesZarray_equalZhas_gradZget_gradr   alloc1fset_grad
ValueErrorZinc_gradhas_dimget_dimhas_refget_refr   set_refr5   copy)r(   model_amodelZ
model_copyr   r   r   test_model_init"   sv    (
rN   c           !   C   s<  G dd dt } td}tddd dd dd d d	|d d
ddi| d g||gd}tjt |jdd W d Q R X |jdddd |jd|jj	d |j
d|jj	d |jdst|jddksttjt |jdd W d Q R X tjt |jdd W d Q R X tjt |jdddd W d Q R X d S )Nc               @   s   e Zd ZdZdS )z"test_model_set_dim.<locals>.MyShimr$   N)r%   r&   r'   r   r   r   r   r   r(   d   s   r(   r)   r*   c             S   s   | dd fS )Nc             S   s   | S )Nr   )r   r   r   r   r   j   s    z6test_model_set_dim.<locals>.<lambda>.<locals>.<lambda>r   )r   r   r   r   r   j   s    z$test_model_set_dim.<locals>.<lambda>r9   )r,   r-   )r.   r/   )r)   r/   r0   r1   )r2   r3   r4   r5   r6   r7   r,   r+   T)forcer.   r8      )r	   r   r   r?   r@   rE   set_dimrB   r   rC   rD   rF   r   rG   rA   )r(   rL   rM   r   r   r   test_model_set_dimc   s0    rR   c              C   sP   t d} | jt kst| jdd  | jdks2t| jdd  | jdksLtd S )Ntmpparam1param2)rT   )rT   rU   )r   Zparam_namestupler   rB   )rM   r   r   r   test_param_names   s    rW   c              C   sZ   t d} | jt kst| jd| jjdd | jd| jjddd  | jdksVtd S )NrS   rT         )rT   )r   Z
grad_namesrV   r   rB   r   Zalloc2frD   )rM   r   r   r   test_grad_names   s
    rZ   c              C   s   t dd} | jdkstd S )Nr9      r-   r,   )r-   r,   )r   Z	dim_namesr   )rM   r   r   r   test_dim_names   s    
r\   c           
   C   s   t d} t d}t d}| jj| | jt ks4t| jd| | jdksNt| jd|ks`t|jj| tj	t
 | jd W d Q R X | jd| | jd|kst| j| ||jkst| jd std S )NparentchildkidZgrandkidZ	grandkind)r_   )r   r7   appendZ	ref_namesrV   r   rJ   rI   r?   r@   rA   remove_noderH   )r]   r^   Z
grandchildr   r   r   test_model_set_reference   s     
rb   c              C   sz   t d} | jdd kst| jdd | jddks8t| jdd ksJt| jdd ks\t| j  | jdd k	svtd S )Nr9   r,   rX   Zboor.   )r   Zmaybe_get_dimr   rQ   Zmaybe_get_refZmaybe_get_param
initialize)rM   r   r   r   test_maybe_methods   s    rd   c          
   C   s$   t  }| j|d  W d Q R X d S )Nthinc_model)r   to_disk)r   pathr   r   r   test_model_can_save_to_disk   s    rh   c          
   C   sF   t  "}| j|d  | j|d }W d Q R X | j |j ksBtd S )Nre   )r   rf   	from_diskto_bytesr   )r   rg   m2r   r   r   test_model_can_load_from_disk   s    rl   c             C   s4   |d }| j | | j|}| j |j ks0td S )Nre   )rf   ri   rj   r   )r   Zpathy_fixturerg   rk   r   r   r   +test_model_can_roundtrip_with_path_subclass   s    

rm   c             C   sL   | }d|_ d|jd< t|ddddi |jd dks:td|jksHtd S )NtargetFhas_varT)ro   errorrp   )r   r5   r   r   )r   rM   r   r   r   test_change_attr_values   s    
rq   c              C   s8   t  } | jd dkstt| d | jd dks4td S )Ndropout_rateg        g?)r   r5   r   r   )rM   r   r   r   test_set_dropout   s    
rs   c             C   s4   | }d|_ d|jd< t|d |jd dks0td S )Ndropoutg        rr   g?)r   r5   r   r   )r   rM   r   r   r   test_set_dropout_2   s
    

ru   c              C   sB   t jddd i& tddtdd } | dks4tW d Q R X d S )N+c             S   s   | j |j fS )N)r   )r)   r/   r   r   r   r      s    z test_bind_plus.<locals>.<lambda>r)   )r   r/   )r)   r/   )r   define_operatorsr   r   )mr   r   r   test_bind_plus   s    ry   c              C   sX   t jddd i< tddtdd tdd tdd } | jdksJtW d Q R X d S )	Nrv   c             S   s   | S )Nr   )r)   r/   r   r   r   r      s    z!test_plus_chain.<locals>.<lambda>r)   )r   r/   r:   d)r   rw   r   r   r   )rx   r   r   r   test_plus_chain   s    (r{   c              C   s|   t jtdd} t jtdd}|j  | j  | j  |j  t jtd	d} t jtd
d}|j  | j  | j  |j  dS )zGTest we can create a model in a child thread with overloaded operators.rv   r   )rn   args*rY   N)rv   r   )r}   rY   )rv   rY   )r}   r   )	threadingThread_overload_plusstartjoin)Zworker1Zworker2r   r   r   $test_overload_operators_in_subthread   s    r   c          	   C   sx   t dd}t dd}tj| dd i* tj| | dkrD|| }n|| }W d Q R X |dksbttjj i ksttd S )Nr)   )r   r/   c             S   s   | j |j  S )N)r   )r)   r/   r   r   r   r   
  s    z _overload_plus.<locals>.<lambda>rv   ab)r   r   rw   timesleepr   _context_operatorsget)operatorr   m1rk   valuer   r   r   r     s    



r   c           :   C   sf  t dd} t dd}tjj i ks&ttjddd i  | | }tjt | | }W d Q R X tjddd i tjt | | }W d Q R X | | }tjd	d
d i, tjt | | }W d Q R X | | }W d Q R X tjt | | }W d Q R X | | }W d Q R X | | }tjt | | }W d Q R X W d Q R X |dksNttjj i ksbtd S )Nr)   )r   r/   rv   c             S   s   | j |j  S )N)r   )r)   r/   r   r   r   r     s    z/test_nested_operator_contexts.<locals>.<lambda>r}   c             S   s   | j |j  S )N)r   )r)   r/   r   r   r   r     s    -c             S   s   | j |j  S )N)r   )r)   r/   r   r   r   r      s    r   )	r   r   r   r   r   rw   r?   r@   	TypeError)r   rk   r   r   r   r   test_nested_operator_contexts  s.    

r   opz+ - * @ / // % ** << >> & ^ |c          k   C   s  t  }t  }tj| dd i | dkr4|| }ntjt || }W d Q R X | dkrd|| }ntjt || }W d Q R X | dkr|| }ntjt || }W d Q R X | dkr|j|}n tjt |j|}W d Q R X | dkr|| }ntjt || }W d Q R X | dkr*|| }ntjt || }W d Q R X | d	kr\||A }ntjt ||A }W d Q R X | d
kr|| }ntjt || }W d Q R X | dkr|| }ntjt || }W d Q R X | dkr||> }ntjt ||> }W d Q R X | dkr$||? }ntjt ||? }W d Q R X | dkrV||@ }ntjt ||@ }W d Q R X | d	kr||A }ntjt ||A }W d Q R X | dkr||B }ntjt ||B }W d Q R X W d Q R X tjj i kst	d S )Nc             S   s   | j |j  S )N)r   )r)   r/   r   r   r   r   2  s    z$test_all_operators.<locals>.<lambda>rv   r   r}   @/z//^%z**z<<z>>&|)
r   r   rw   r?   r@   r   
__matmul__r   r   r   )r   r   rk   r   r   r   r   test_all_operators.  sx    





















r   c              C   s   g } dd }d}xvt | dk rg }x4tdD ](}tj|| |fd}|j| |d7 }q,W x|D ]}|j  q^W x|D ]}|j  qtW qW t | t tt| kst	dS )	z<Create a bunch of threads and assert they all get unique IDsc             S   s   | j td| dj d S )NZworker)r   )r`   r   r!   )Zid_listindexr   r   r   get_model_id  s    z3test_unique_id_multithreading.<locals>.get_model_idr   i  2   )rn   r|   rY   N)
lenranger~   r   r`   r   r   listsetr   )Zlist_of_idsr   counterworkersiwr   r   r   test_unique_id_multithreading  s    


r   zneeds CuPy GPU)reasonc              C   s|  t jd dd l} tdV d}d}| j \\}}\}}tt||dt||dt }|jj	|}|jj	|}|jj	|}|jj	|}|j
|d d |d d d td	}d
}	xtdD ]}
|jj|	||dd}x4|D ],\}}|j|\}}|||  |j| qW d}d}xV|jj|	||D ]B\}}|j|}||jdd|jddkj 7 }||jd 7 }q$W qW W d Q R X d S )Nml_datasetsr   Zcupy    g?)r-   rt   r9   )r   YgMbP?   r   T)shufflerY   )Zaxis)r?   importorskipr   r   mnistr   r   r
   r   Zasarrayrc   r   r   Z
multibatchZbegin_updateZfinish_updateZpredictZargmaxsumr>   )r   Zn_hiddenrt   train_Xtrain_Ydev_Xdev_YrM   Z	optimizerZ
batch_sizer   Zbatchesr   r   ZYhbackpropcorrecttotalr   r   r   test_model_gpu  s:    



 r   c              C   s  t d} t d}t| |}t| }tddd | || |g| || dd}|j| | |jd |ksdt|jd |ksvt|jd	 |kst|jd
|kst|jd|kst|jd|kst|jd |kst|jd jd |kst|jd jd |kstd S )Nr9   r*   c             S   s   | dd fS )Nc             S   s   | S )Nr   )r   r   r   r   r     s    z5test_replace_node.<locals>.<lambda>.<locals>.<lambda>r   )r   r   r   r   r     s    z#test_replace_node.<locals>.<lambda>)relu1relu2relu3)r7   r4   r   rY   r   r   r   r   r[   )r   r   r   r   replace_noder7   r   rI   )r   r   Z
relu_chainZrelu1_debugdebugr   r   r   test_replace_node  s&    

r   c              C   s   dd } | dg }| d|g}t |}| d|g}|jd| t||}d|_|j|| |jd jd |ksrt|jd jd jd |kst|jd jd|kstd S )	Nc             S   s   t | dd |dS )Nc             S   s   dS )N.r   )rM   r   is_trainr   r   r   r     s    zOtest_replace_node_with_indirect_node_ref.<locals>.dummy_model.<locals>.<lambda>)r7   )r   )r   r7   r   r   r   dummy_model  s    z=test_replace_node_with_indirect_node_ref.<locals>.dummy_modelyxr/   r)   r   rY   )r   rJ   r   r   r   r7   r   rI   )r   r   r   Zy_debugr/   r)   r   r   r   (test_replace_node_with_indirect_node_ref  s    	

r   c                 s   t jd dd l} | j \\}}\}}t   fdd} fdd} fdd}t }tt |||d	}	t||	|	}
|
j|d d
 |d d
 d |
|d d
 dd\}}||d d
   ddddkst	d S )Nr   r   c                 s    d  d7  < d S )NinitrY   r   )_)countsr   r   on_init  s    z test_with_debug.<locals>.on_initc                 s    d  d7  < d S )NforwardrY   r   )r   )r   r   r   
on_forward   s    z#test_with_debug.<locals>.on_forwardc                 s    d  d7  < d S )Nr   rY   r   )r   )r   r   r   on_backprop  s    z$test_with_debug.<locals>.on_backprop)r   r   r   r9   )r   r   F)r   r   r   rX   )r   r   r   )
r?   r   r   r   r   r   r   r   rc   r   )r   r   r   r   r   r   r   r   relur   chainedr   r   r   )r   r   test_with_debug  s    
r   c                 s   dd  t d} t| | }t| fdd}|jdks:t|jd |ksLt|jd jd jdksft|jd jd jd | kst|jd jd	 jdkst|jd jd	 jd | kstd S )
Nc             S   s   t | dd |dS )Nc             S   s   dS )N.r   )rM   r   r   r   r   r   r     s    z:test_recursive_wrap.<locals>.dummy_model.<locals>.<lambda>)r7   )r   )r   r7   r   r   r   r     s    z(test_recursive_wrap.<locals>.dummy_modelr9   c                s    d| j  d| gS )Nzdummy())r   )rM   )r   r   r   r   "  s    z%test_recursive_wrap.<locals>.<lambda>zdummy(relu>>relu)r   zdummy(relu)rY   )r   r   r   r   r   r7   )r   r   Zchained_debugr   )r   r   test_recursive_wrap  s    
r   c                 s(  dd  t d} t| | }t||| }t| fdd}d}x$|j D ]}|jjdrF|d7 }qFW |d	ksnt|jd jd jd jd jd
kst|jd jd jd jd jd
kst|jd jd jd jd jd
kst|jd jd jd jd jd
kst|jd jd jd
ks$td S )Nc             S   s   t | dd |dS )Nc             S   s   dS )N.r   )rM   r   r   r   r   r   r   /  s    zAtest_recursive_double_wrap.<locals>.dummy_model.<locals>.<lambda>)r7   )r   )r   r7   r   r   r   r   .  s    z/test_recursive_double_wrap.<locals>.dummy_modelr9   c                s    d| j  d| gS )Nzdummy(r   )r   )rM   )r   r   r   r   5  s    z,test_recursive_double_wrap.<locals>.<lambda>r   dummyrY   r[   zdummy(relu)r   )	r   r   r   r   walkr   
startswithr   r7   )r   r   concatZconcat_wrappedZn_debugrM   r   )r   r   test_recursive_double_wrap-  s     
&&&(r   c              C   s>   t d} t d}t| | }t||}|jd|  t|t d S )Nr9   r   )r   r   rJ   r   r   )r   r   r   Zchained2r   r   r   test_wrap_non_child_referencesJ  s    

r   c              C   sh   t d} t d}t| |}t||}t|jdd||| |gksDtt|jdd| |||gksdtd S )Nr9   Zdfs_pre)orderZdfs_post)r   r   r   r   r   )r   r   Zinner_chainr   r   r   r   test_walk_dfsT  s    

 r   c           
   C   s2   t d} tjtdd | jdd W d Q R X d S )Nr9   zInvalid order)matchZdfs_post_order)r   )r   r?   r@   rE   r   )r   r   r   r   test_walk_bfs_post_order_failsb  s    r   c           
   C   s   G dd dt } td}| d }tddd dddtjdd d
|d dddi|g||gd}tddd dddtjdd d
|d dddi|g||gd}td}t||||}|j }|j|j	  |j
dkst|jd |jd kstt|jd jd t|jd jd kstd S )Nc               @   s    e Zd ZdZdd Zdd ZdS )z)test_model_copy_with_loop.<locals>.MyShimr$   c             S   s   t S )N)r   )selfr   r   r   rj   l  s    z2test_model_copy_with_loop.<locals>.MyShim.to_bytesc             S   s   d S )Nr   )r   bytesr   r   r   
from_byteso  s    z4test_model_copy_with_loop.<locals>.MyShim.from_bytesN)r%   r&   r'   r   rj   r   r   r   r   r   r(   i  s   r(   r)   r*   c             S   s   | dd fS )Nc             S   s   | S )Nr   )r   r   r   r   r   v  s    z=test_model_copy_with_loop.<locals>.<lambda>.<locals>.<lambda>r   )r   r   r   r   r   v  s    z+test_model_copy_with_loop.<locals>.<lambda>r9   )r,   r-   r+   )r.   r/   )r)   r/   r0   r1   )r2   r3   r4   r5   r6   r7   Ztest2c             S   s   | dd fS )Nc             S   s   | S )Nr   )r   r   r   r   r     s    z=test_model_copy_with_loop.<locals>.<lambda>.<locals>.<lambda>r   )r   r   r   r   r     s    ztest>>relu>>test>>test2r   r   r[   )r+   )r+   )r	   r   r   r;   r<   r   r   rK   	from_dictto_dictr   r   r7   r!   r6   )r(   rL   Zworking_shimZlayerZlayer2r   rM   r"   r   r   r   test_model_copy_with_looph  s8    	r   )Acollectionsr   r?   r~   r   Z	thinc.apir   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zthinc.compatr   r;   utilr   Zfixturer   r   r    r#   rN   rR   rW   rZ   r\   rb   rd   rh   rl   rm   rq   rs   ru   ry   r{   r   r   r   markZparametrizesplitr   r   Zskipifr   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sX    A 		R'!
