B
    i\                 @   s  d Z ddlmZ ddlmZ ddlZddlZddlmZ ddl	m
Z
 ddl	mZ ddlZddlmZ G d	d
 d
ejZdd Zdd ZG dd dejeZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dejeZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZ G d'd( d(eZ!G d)d* d*ejeZ"G d+d, d,ejeZ#G d-d. d.e#Z$G d/d0 d0e#Z%G d1d2 d2e#Z&G d3d4 d4e#Z'G d5d6 d6e#Z(G d7d8 d8e#Z)G d9d: d:ejeZ*G d;d< d<e*Z+G d=d> d>e*Z,G d?d@ d@e*Z-G dAdB dBe*Z.G dCdD dDe*Z/G dEdF dFejeZ0G dGdH dHejeZ1G dIdJ dJejeZ2G dKdL dLe2Z3G dMdN dNe2Z4G dOdP dPe2Z5G dQdR dRe2Z6G dSdT dTejeZ7G dUdV dVe7Z8G dWdX dXe7Z9G dYdZ dZejeZ:G d[d\ d\e:Z;G d]d^ d^e:Z<G d_d` d`e:Z=G dadb dbe:Z>G dcdd dde:Z?G dedf dfe:Z@G dgdh dhejeZAG didj djeAZBG dkdl dleAZCG dmdn dneAZDG dodp dpeAZEG dqdr dreAZFG dsdt dteAZGG dudv dveAZHG dwdx dxeAZIG dydz dzeAZJG d{d| d|eAZKG d}d~ d~ejeZLG dd deLZMG dd deLZNdd ZOePdkrddlQZQeReQjS eT  e
jUdd dS )z6Test module for evaluating expressions under PyTables.    )print_function)absolute_importN)common)unittest)PyTablesTestCase)rangec               @   s8   e Zd Ze Ze Ze Z	e
 ZejddZdS )Record   )itemsizeN)__name__
__module____qualname__tablesInt32ColZcolInt32Int64ColZcolInt64Z
Float32ColZ
colFloat32Z
Float64ColZ
colFloat64Z
ComplexColZ
colComplex r   r   ;lib/python3.7/site-packages/tables/tests/test_expression.pyr      s
   r   c             C   sF   i }x<t | D ].\}}t|dr6|||| ||< q|||< qW |S )N__len__)six	iteritemshasattr)npvarsstartstopstepnpvars_namevarr   r   r   get_sliced_vars'   s    
r   c       
      C   sP   i }dd |D }t |||||< x(t| D ]\}}	|	t|||< q.W |S )Nc             S   s   g | ]}t d qS )N)slice).0Zdimr   r   r   
<listcomp>3   s    z$get_sliced_vars2.<locals>.<listcomp>)r   r   r   __getitem__tuple)
r   r   r   r   shapemaindimr   Zslicesr   r   r   r   r   get_sliced_vars21   s    r&   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
ExprTestCase)
      c       
         s*  t t|   d| _t| j}tjd|dd| j | _	}tj|d| dd| j | _
}tjd| d| dd| j | _}tj|dd| j | _}|||d| _| jj}| jd	kr| j|d
|| _	| j|d|| _
| j|d|| _| j|d|| _n| jdkr| jj|d
tj|j| jd| _	| jj|dtj|j| jd| _
| jj|dtj|j| jd| _| jj|dtj|j| jd| _|| j	d d < || j
d d < || jd d < n@| jdkrt| j}d|d< | jj|d
tj|j|d| _	| jj|dtj|j|d| _
| jj|dtj|j|d| _| jj|dtj|j|d| _| j	| | j
| | j| | j| np| jdkrtjj||||gd| jdd  fd  d}| j|d|}	|	jj| _	|	jj | _
|	jj!| _|	jj"| _#| j	| j
| jd| _$d S )Nz2 * a*b + cr   int32)dtype   int64   )abcArrayr/   r0   r1   r1CArray)atomr$   EArrayColumnz%si4,%si8,%si4,%si8      t)%superr'   setUpexprnpprodr$   arangereshaper/   r0   r1   emptyr3   r   h5filerootkindcreate_arraycreate_carrayr   Atom
from_dtyper+   listcreate_earrayappendrec
fromarrayscreate_tablecolsZf0f1f2Zf3dvars)
selfNr/   r0   r1   r3   rD   r$   rar:   )	__class__r   r   r<   @   sn    "&





zExprTestCase.setUpc             C   s`   t | j| j}| }t| j| j}tjrHtdt	| tdt	| | 
t||d dS )z0Checking that expression is correctly evaluated.zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   Exprr=   rT   evalr   r   verboseprintrepr
assertTrueareArraysEqual)rU   r=   r3   r2r   r   r   test00_simple}   s    zExprTestCase.test00_simplec             C   s   t | j| j}|| j | }| jdkr:|dd }t| j| j}t	j
rjtdt| tdt| | t	||d dS )z=Checking that expression is correctly evaluated (`out` param)NumPyNzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r   rY   r=   rT   
set_outputr3   rZ   rE   r   r   r[   r\   r]   r^   r_   )rU   r=   r3   r`   r   r   r   
test01_out   s    
zExprTestCase.test01_outc       	      C   s   t | j| j}t| j}|d |d d  }}}|||| | }tj	| j|j
d}|||| }| | |  tjrtdt| tdt| | t||d dS )zkChecking that expression is correctly evaluated when slice is
        outside of data samples (`out` param)r8   r,   N)r$   r+   zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r   rY   r=   rT   maxr$   set_inputs_rangerZ   r>   zerosr+   ZassertListEqualtolistr   r[   r\   r]   r^   r_   )	rU   r=   Zmaxshaper   r   r   r3   rg   r`   r   r   r   
test02_out   s    
zExprTestCase.test02_out)	r   r   r   r$   r<   ra   rd   ri   __classcell__r   r   )rX   r   r'   ;   s
   =r'   c               @   s   e Zd ZdZdS )	ExprNumPyrb   N)r   r   r   rE   r   r   r   r   rk      s   rk   c               @   s   e Zd ZdZdS )	ExprArrayr2   N)r   r   r   rE   r   r   r   r   rl      s   rl   c               @   s   e Zd ZdZdS )
ExprCArrayr4   N)r   r   r   rE   r   r   r   r   rm      s   rm   c               @   s   e Zd ZdZdS )
ExprEArrayr6   N)r   r   r   rE   r   r   r   r   rn      s   rn   c               @   s   e Zd ZdZdS )
ExprColumnr7   N)r   r   r   rE   r   r   r   r   ro      s   ro   c                   s\   e Zd Z f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  ZS )MixedContainersTestCasec                s  t t|   d| _| jj}| j|d}t| j	}tj
d|dd| j	}tj
|d| dd| j	}tj
d| d| dd| j	}tj
d| d	| dd| j	}tj
d	| d
| dd| j	}td | _}	td | _}
||||||	|
d| _| }|| _|| _| j|d|| _| j|| _| jj|dtj|j| j	d| _|| jd d < | j|| _t| j	}d|d< | jj|dtj|j|d| _ | j !| | j || _"i }| j	dd  }x<t#||||||fD ]$\}}tj$%|jj&||d| < qW | j'|d|}| j	d }|j(}xNt)|D ]B}x2t#||||||fD ]\}}|| |d| < qPW |!  q6W |*  |j+j,| _-|j+j.| _/| j| j| j| j | j-| j| jd| _0d S )Nz2 * a*b + c**2+d**2+e-f+goutsr   r*   )r+   r,   r-   r.   r9      )r/   r0   r1   rS   efgr0   r1   )r5   r$   rS   r8   zf%dr:   )1r;   rp   r<   r=   rC   rD   Zcreate_groupr>   r?   r$   r@   rA   intrt   int16ru   r   copyr/   rndarF   r0   rarrrG   r   rH   rI   r+   r1   rcarrrJ   rK   rS   rL   rearr	enumerateZColZfrom_sctypetyperO   rowr   flushrP   Zf4rs   Zf5rcolrT   )rU   rD   rq   rV   r/   r0   r1   rS   rs   rt   ru   ry   ZeshapeZrtypeZcolshapeicolr:   Znrowsr   Znrow)rX   r   r   r<      sX       
 


zMixedContainersTestCase.setUpc             C   sh   t | j| j}| }t| j| j}tjrPtdt	||j
 tdt	||j
 | t||d dS )z(Checking expressions with mixed objects.zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   rY   r=   rT   rZ   r   r   r[   r\   r]   r+   r^   r_   )rU   r=   r3   r`   r   r   r   test00a_simple  s    z&MixedContainersTestCase.test00a_simplec             C   s|   d}t || j}| }t|| j}tjrPtdt||j	 tdt||j	 | 
|j|jkor|j	|j	kor||kd dS )z7Checking that scalars in expression evaluate correctly.z	2 * f + gzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   rY   rT   rZ   r   r   r[   r\   r]   r+   r^   r$   )rU   expr_strr=   r3   r`   r   r   r   test00b_simple_scalars  s    z.MixedContainersTestCase.test00b_simple_scalarsc             C   s   t | j| j}x| j| j| j| j| jfD ]}t	j
rBtdt| || | }t|t| jsp|dd }t| j| j}t	j
rtdt||j tdt||j | t	||d q*W dS )z5Checking expressions with mixed objects (`out` param)zChecking output container:NzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r   rY   r=   rT   ry   rz   r{   r|   r   r   r[   r\   r~   rc   rZ   
isinstancer   r]   r+   r^   r_   )rU   r=   r3   r`   r   r   r   test01a_out!  s    
z#MixedContainersTestCase.test01a_outc             C   s   t | jdkrdS d}t|| j}x| j| j| j| j| j	fD ]|}t
jrVtdt| || | }|d }t|| j}t
jrtdt||j tdt||j | t
||d q>W dS )	z>Checking expressions with mixed objects (`out` param, scalars)r8   Nz	2 * f + gzChecking output container:r   zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)lenr$   r   rY   rT   ry   rz   r{   r|   r   r   r[   r\   r~   rc   rZ   r   r]   r+   r^   r_   )rU   r   r=   r3   r`   r   r   r   test01b_out_scalars3  s     
z+MixedContainersTestCase.test01b_out_scalarsc             C   s   | j | jd  }}}t| j| j}|||| | }t| j	|||}t| j|}t
jrtdt||j tdt||j | t
||d dS )z0Checking mixed objects and start, stop, step (I)r8   zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r   r   rY   r=   rT   rf   rZ   r   r   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test02a_sssH  s    z#MixedContainersTestCase.test02a_sssc             C   s   d| j d | j  }}}t| j| j}|||| | }t| j	|||}t| j|}t
jrtdt||j tdt||j | t
||d dS )z1Checking mixed objects and start, stop, step (II)r   zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r$   r   r   rY   r=   rT   rf   rZ   r   r   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test02b_sssW  s    z#MixedContainersTestCase.test02b_sssc             C   s   | j | j| j  }}}t| j| j}|||| | }t	| j
|||}t| j|}tjrtdt||j tdt||j | t||d dS )z2Checking mixed objects and start, stop, step (III)zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r   r   r   rY   r=   rT   rf   rZ   r   r   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test02c_sssf  s    z#MixedContainersTestCase.test02c_sssc             C   s   dd | j | j| jfD \}}}t| j| j}|||| | }t	| j
|||}t| j|}tjrtdt||j tdt||j | t||d dS )z*Checking start, stop, step as numpy.int64.c             S   s   g | ]}t |qS r   )r>   r-   )r    r   r   r   r   r!   x  s    z6MixedContainersTestCase.test03_sss.<locals>.<listcomp>zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r   r   r   rY   r=   rT   rf   rZ   r   r   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   
test03_sssu  s    z"MixedContainersTestCase.test03_sss)r   r   r   r<   r   r   r   r   r   r   r   r   rj   r   r   )rX   r   rp      s   Crp   c               @   s   e Zd ZdZd\ZZZdS )MixedContainers0)r8   )r   r8   r8   N)r   r   r   r$   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZd\ZZZdS )MixedContainers1)r(   )r.      r,   N)r   r   r   r$   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZd\ZZZdS )MixedContainers2)r(   rr   )r,   	   r.   N)r   r   r   r$   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZd\ZZZdS )MixedContainers3)r(   r.   r,   )r,   r8   N)r   r   r   r$   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )UnalignedObjectc             C   s   t jddd}t jddd}| }| }t j||||g}|d }|d }| |jjd | |jjd d}t	
|}	|	 }
t|}tjrtd	t|
|
j td
t||j | t|
|d dS )z,Checking expressions with unaligned objects.r(   int8)r+   r*   rQ   rR   Fz	2 * a + bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r>   rB   r@   rx   rM   rN   assertEqualflagsalignedr   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   a0a1a2a3rW   r/   r0   sexprr=   r3   r`   r   r   r   ra     s$    
zUnalignedObject.test00_simplec             C   s   t jddd}t jddddd}| }| }t j||||g}|d }|d	 }| |jj	d
 | |jj	d
 d}t
|}	|	 }
t|}tjrtdt|
|
j tdt||j | t|
|d dS )z8Checking expressions with unaligned objects (MD version))r(   r9   r   )r+   (   r*   r(   r9   rQ   rR   Fz	2 * a + bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r>   rB   r@   rA   rx   rM   rN   r   r   r   r   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r   rW   r/   r0   r   r=   r3   r`   r   r   r   	test01_md  s$    
zUnalignedObject.test01_mdN)r   r   r   ra   r   r   r   r   r   r     s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )NonContiguousObjectc             C   s   t jddd}|ddd }|d }| |jjd | |jjd d}t|}| }t|}t	j
rtd	t||j td
t||j | t	||d dS )z0Checking expressions with non-contiguous objectsr(   r*   )r+   Nr,   FTz	2 * a + bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   r@   r   r   
contiguousr   r   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r/   r0   r   r=   r3   r`   r   r   r   ra     s    
z!NonContiguousObject.test00_simplec             C   s   t jddddd}|ddd }|d }| |jjd | |jjd	 d
}t|}|	 }t	|}t
jrtdt||j tdt||j | t
||d dS )z@Checking expressions with non-contiguous objects (MD version, I)r   r*   )r+   r(   r9   Nr,   FTz	2 * a + bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   r@   rA   r   r   r   r   r   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r/   r0   r   r=   r3   r`   r   r   r   
test01a_md  s    
zNonContiguousObject.test01a_mdc             C   s   t jddddd}|dddddf }|d }| |jjd | |jjd	 d
}t|}|	 }t	|}t
jrtdt||j tdt||j | t
||d dS )zAChecking expressions with non-contiguous objects (MD version, II)r   r*   )r+   r(   r9   Nr,   FTz	2 * a + bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   r@   rA   r   r   r   r   r   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r/   r0   r   r=   r3   r`   r   r   r   
test01b_md  s    
zNonContiguousObject.test01b_mdN)r   r   r   ra   r   r   r   r   r   r   r     s   r   c                   sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )	ExprError)r(   c                s~   t t|   t| j}tj|dd| j| _tj|dd| j| _	tj|dd| j| _
tj|dd| j| _d S )Nr*   )r+   r-   )r;   r   r<   r>   r?   r$   r@   rA   r/   r0   r1   rB   r3   )rU   rV   )rX   r   r   r<     s    zExprError.setUpc             C   sH   | j | jd | _ d}| j| j | jd}t||}| t|j	 dS )z/Checking that inconsistent shapes are detected.)r8   z	a * b + c)r/   r0   r1   N)
r0   rA   r$   r/   r1   r   rY   assertRaises
ValueErrorrZ   )rU   r=   vars_r   r   r   _test00_shape   s
    zExprError._test00_shapec             C   s:   | j d| _ d}| j| j | jd}| ttj|| dS )z7Checking that uint64 arrays in expression are detected.Zuint64z	a * b + c)r/   r0   r1   N)r0   Zviewr/   r1   r   NotImplementedErrorr   rY   )rU   r=   r   r   r   r   test02_uint64)  s    zExprError.test02_uint64c             C   sL   G dd dt j}| jdd|}d}|| j| jd}| tt j|| dS )z0Checking that tables in expression are detected.c               @   s   e Zd Ze Ze ZdS )z#ExprError.test03_table.<locals>.RecN)r   r   r   r   r   col1r   col2r   r   r   r   Rec4  s   r   /r/   z	a * b + c)r/   r0   r1   N)	r   IsDescriptionrC   rO   r0   r1   r   	TypeErrorrY   )rU   r   r:   r=   r   r   r   r   test03_table1  s
    zExprError.test03_tablec             C   s   G dd dt j}| jdd|}d}|jjj}|| j| jd}t 	||}|
 }| |dk	 |jj}|| j| jd}| tt j	|| dS )z5Checking that nested cols in expression are detected.c               @   s&   e Zd Ze ZG dd dejZdS )z+ExprError.test04_nestedcols.<locals>.Nestedc               @   s   e Zd Ze ZdS )z0ExprError.test04_nestedcols.<locals>.Nested.col2N)r   r   r   r   r   col3r   r   r   r   r   C  s   r   N)r   r   r   r   r   r   r   r   r   r   r   r   Nested@  s   r   r   r/   z	a * b + c)r/   r0   r1   N)r   r   rC   rO   rP   r   r   r0   r1   rY   rZ   r^   r   r   )rU   r   r:   r=   r/   r   r3   r   r   r   test04_nestedcols=  s    
zExprError.test04_nestedcolsc             C   s>   | j ddt }d}|| j| jd}| ttj|| dS )z2Checking that VLArrays in expression are detected.r   r/   z	a * b + c)r/   r0   r1   N)	rC   Zcreate_vlarrayr   r   r0   r1   r   r   rY   )rU   Zvlar=   r   r   r   r   test05_vlarrayS  s    zExprError.test05_vlarray)r   r   r   r$   r<   r   r   r   r   r   rj   r   r   )rX   r   r     s   
	r   c               @   s   e Zd Zdd ZdS )BroadcastTestCasec             C   st  | j | j| jf}tjt|d dd|d }tjt|d dd|d }tjt|d dd|d }| jj}|j	d dkr| j
|d|}n| jj|dt |j	d}| |dk	 | j
|d	|}| |dk	 | j
|d
|}| |dk	 td}	|	 }
td}tjr\td| j | j| j tdt|
|
j tdt||j | t|
|d dS )z!Checking broadcast in expression.r   i4)r+   r8   r,   r   )r5   r$   Nb1c1z2 * a1 + b1-c1z2 * a + b-czTested shapes:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)shape1shape2shape3r>   r@   r?   rA   rC   rD   r$   rF   rK   r   r   r^   rY   rZ   r   r[   r\   r]   r+   r_   )rU   shapesr/   r0   r1   rD   r   r   r   r=   r3   r`   r   r   r   ra   _  s.    """
zBroadcastTestCase.test00_simpleN)r   r   r   ra   r   r   r   r   r   ]  s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast0)r   r.   r9   )r.   r9   )r9   N)r   r   r   r   r   r   r   r   r   r   r   ~  s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast1)r,   r.   r9   )r.   r9   )r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast2)r.   r9   )r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast3)r9   )r.   r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast4)r8   )r.   r9   )r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )
Broadcast5)r8   )r.   r8   )r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )DiffLengthTestCasec                s  t | jt | jt | jf}tjt|d dd|d }tjt|d dd|d }tjt|d dd|d }t	d}|
 }tdd |D  t fd	dt|D }x(t|D ]\}}	t|	 kr||	d< qW tjt|d dd|d }| |d
k	 tjt|d dd|d }| |d
k	 tjt|d dd|d }| |d
k	 t
d}
tjrtd| j| j| j tdt||j tdt|
|
j | t||
d d
S )z/Checking different length inputs in expression.r   r   )r+   r8   r,   z2 * a + b-cc             S   s   g | ]}t |qS r   )r   )r    r$   r   r   r   r!     s    z4DiffLengthTestCase.test00_simple.<locals>.<listcomp>c                s$   g | ]\}}t | kr|d  qS )r   )r   )r    r   r$   )maxdimr   r   r!     s    NzTested shapes:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)rJ   r   r   r   r>   r@   r?   rA   r   rY   rZ   re   minr}   r   r^   r   r[   r\   r]   r+   r_   )rU   r   r/   r0   r1   r=   r3   Zminlenr   r$   r`   r   )r   r   ra     s0    """
"""z DiffLengthTestCase.test00_simpleN)r   r   r   ra   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )DiffLength0)r   )r(   )r)   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )DiffLength1)r.   )r(   )r)   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )DiffLength2)r.   r9   )r,   r.   r9   )r9   r.   r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )DiffLength3)r8   r.   r9   )r,   r.   r9   )r9   r.   r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )DiffLength4)r   r.   r9   )r,   r.   r9   )r9   r.   r9   N)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TypesTestCasec       	      C   s   t dddg}t dddg}| jj}| j|d|}| |dk	 | j|d|}| |dk	 td}| }td}t	j
rtdt||j tdt||j | t	||d	 dS )
z Checking booleans in expression.TFr   Nr   za | bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   arrayrC   rD   rF   r^   r   rY   rZ   r   r[   r\   r]   r+   r_   )	rU   r/   r0   rD   r   r   r=   r3   r`   r   r   r   test00_bool  s    
zTypesTestCase.test00_boolc             C   s*  x"dD ]}t jrtd| tdddg|}tdddg|}| jj}| j|d|}| j|d	|}td}| 	t
|tj td
}| }	tdddgd}tdddgd}td}
t jrtdt|	|	j tdt|
|
j | |	j|
j | 	t |	|
d |  |  qW dS )z9Checking int8,uint8,int16,uint16 and int32 in expression.)r   Zuint8rw   Zuint16r*   zChecking type:r8   r,   r.   r9   rr   r   r   ztwo * a1-b1r*   z	two * a-bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r[   r\   r>   r   rC   rD   rF   r*   r^   r   Zintegerr   rY   rZ   r]   r+   r   r_   remove)rU   r+   r/   r0   rD   r   r   Ztwor=   r3   r`   r   r   r   test01_shortint  s.    


zTypesTestCase.test01_shortintc       
      C   s  xdD ]}t jrtd| tdddg|}tdddg|}| jj}| j|d|}| j|d	|}t	d
}|
 }tdddgd}tdddgd}t
d}	t jrtdt||j tdt|	|	j | |j|	j | t ||	d |  |  qW dS )z(Checking uint32 and int64 in expression.)Zuint32r-   zChecking type:r8   r,   r.   r9   rr   r   r   z	2 * a1-b1r-   z2 * a-bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r[   r\   r>   r   rC   rD   rF   r   rY   rZ   r]   r+   r   r^   r_   r   )
rU   r+   r/   r0   rD   r   r   r=   r3   r`   r   r   r   test02_longint  s*    

zTypesTestCase.test02_longintc       
      C   s  xdD ]}t jrtd| tdddg|}tdddg|}| jj}| j|d|}| j|d	|}t	d
}|
 }tdddg|}tdddg|}t
d}	t jrtdt||j tdt|	|	j | |j|	j | t ||	d |  |  qW dS )z+Checking float32 and float64 in expression.)Zfloat32float64zChecking type:r8   r,   r.   r9   rr   r   r   z	2 * a1-b1z2 * a-bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r[   r\   r>   r   rC   rD   rF   r   rY   rZ   r]   r+   r   r^   r_   r   )
rU   r+   r/   r0   rD   r   r   r=   r3   r`   r   r   r   test03_float4  s*    

zTypesTestCase.test03_floatc       
      C   s  xdD ]}t jrtd| tdddg|}tdddg|}| jj}| j|d	|}| j|d
|}t	d}|
 }tdddgd}tdddgd}t
d}	t jrtdt||j tdt|	|	j | |j|	j | t ||	d |  |  qW dS )z0Checking complex64 and complex128 in expression.)Z	complex64
complex128zChecking type:r8   y               @y      @       @r.   y              @y      @      ?r   r   z	2 * a1-b1r   z2 * a-bzComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)r   r[   r\   r>   r   rC   rD   rF   r   rY   rZ   r]   r+   r   r^   r_   r   )
rU   r+   r/   r0   rD   r   r   r=   r3   r`   r   r   r   test04_complexO  s*    

zTypesTestCase.test04_complexc       	      C   s   t dddgd}t dddgd}| jj}| j|d|}| |dk	 | j|d	|}| |dk	 td
}| }td}t	j
rtdt||j tdt||j | t	||d dS )zChecking strings in expression.r/   ZbdZcdSZbdcdZccdcr   Nr   z(a1 > b'a') | ( b1 > b'b')z(a > b'a') | ( b > b'b')zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   r   rC   rD   rF   r^   r   rY   rZ   r   r[   r\   r]   r+   r_   )	rU   r/   r0   rD   r   r   r=   r3   r`   r   r   r   test05_stringj  s    
zTypesTestCase.test05_stringN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )FunctionsTestCasec       	      C   s   t dddg}t dddg}| jj}| j|d|}| |dk	 | j|d|}| |dk	 td	}| }t 	|t 
| }tjrtd
t||j tdt||j | t||d dS )z+Checking some math functions in expression.g?g?g333333?g?g      ?r   Nr   zsin(a1) * sqrt(b1)zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r>   r   rC   rD   rF   r^   r   rY   rZ   ZsinZsqrtr   r[   r\   r]   r+   r_   )	rU   r/   r0   rD   r   r   r=   r3   r`   r   r   r   ra     s    
zFunctionsTestCase.test00_simpleN)r   r   r   ra   r   r   r   r   r     s   r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )MaindimTestCasec             C   s  t | j}tjt|dd|}| }| }| jj}d|| j	< | jj
|dt |d}| jj
|dt |d}| jj
|dt |d}|| || || td}	|	 }
td	}tjrtd
| tdt|
|
j tdt||j | t|
|d dS )z3Checking other dimensions than 0 as main dimension.r   )r+   r   r   )r5   r$   r   r   z2 * a1 + b1-c1z2 * a + b-czTested shape:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.N)rJ   r$   r>   r@   r?   rA   rx   rC   rD   r%   rK   r   r   rL   rY   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r$   r/   r0   r1   rD   r   r   r   r=   r3   r`   r   r   r   ra     s0    






zMaindimTestCase.test00_simplec             C   sP  t | j}tjt|dd|}| }| }| jj}d|| j	< | jj
|dt |d}| jj
|dt |d}| jj
|dt |d}| jj
|dt |d}	|| || || |	| td	}
|
|	 |
  td
}tjr0td| tdt|	dd |	j tdt||j | t|	dd |d dS )z8Checking other dimensions than 0 as main dimension (out)r   )r+   r   r   )r5   r$   r   r   r3   z2 * a1 + b1-c1z2 * a + b-czTested shape:zComputed expression:NzShould look like:z$Evaluate is returning a wrong value.)rJ   r$   r>   r@   r?   rA   rx   rC   rD   r%   rK   r   r   rL   rY   rc   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r$   r/   r0   r1   rD   r   r   r   r3   r=   r`   r   r   r   rd     s8    








zMaindimTestCase.test01_outc             C   sh  t | j}tjt|dd|}| }| }| jj}|dd }d|| j	< d|d< | jj
|dt |d}| |j	| j	 | jj
|dt |d}| |j	d | jj
|dt |d}	| jj
|d	t |d}
|| || |	| |
| td
}| }
td}tjrPtd| tdt|
|
j tdt||j | t|
|d dS )z-Checking different main dimensions in inputs.r   )r+   Nr   r   )r5   r$   r   r   r3   z2 * a1 + b1-c1z2 * a + b-czTested shape:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)rJ   r$   r>   r@   r?   rA   rx   rC   rD   r%   rK   r   r   r^   r   rL   rY   rZ   r   r[   r\   r]   r+   r_   )rU   r$   r/   r0   r1   rD   r   r   r   r   r3   r=   r`   r   r   r   test02_diff_in_maindims  s>    







z'MaindimTestCase.test02_diff_in_maindimsc             C   s  t | j}tjt|dd|}| }| }| jj}|dd }d|| j	< d|d< | jj
|dt |d}| |j	| j	 | jj
|dt |d}| jj
|dt |d}	| jj
|d	t |d}
| |
j	d || || |	| |
| td
}||
 |  td}tjrbtd| tdt|
dd |
j tdt||j | t|
dd |d dS )z1Checking different maindims in inputs and output.r   )r+   Nr   r   )r5   r$   r   r   r3   z2 * a1 + b1-c1z2 * a + b-czTested shape:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)rJ   r$   r>   r@   r?   rA   rx   rC   rD   r%   rK   r   r   r^   r   rL   rY   rc   rZ   r   r[   r\   r]   r+   r_   )rU   r$   r/   r0   r1   rD   r   r   r   r   r3   r=   r`   r   r   r   test03_diff_in_out_maindims   s@    








z+MaindimTestCase.test03_diff_in_out_maindimsc             C   sD  t | j}tjt|dd|}| }| }| jj}|dd }d|| j	< d|d< | jj
|dt |d}| |j	| j	 | jj
|dt |d}| jj
|dt |d}	| jj
|d	t |d}
| |
j	d || || || || |	| |	| |
| td
}||
 | t|j dS )z=Checking different maindims and lengths in inputs and output.r   )r+   Nr   r   )r5   r$   r   r   r3   z2 * a1 + b1-c1)rJ   r$   r>   r@   r?   rA   rx   rC   rD   r%   rK   r   r   r^   r   rL   rY   rc   r   r   rZ   )rU   r$   r/   r0   r1   rD   r   r   r   r   r3   r=   r   r   r   #test04_diff_in_out_maindims_lengths&  s8    










z3MaindimTestCase.test04_diff_in_out_maindims_lengthsN)r   r   r   ra   rd   r   r   r   r   r   r   r   r     s
   "%&r   c               @   s   e Zd ZdZdZdS )Maindim0r8   )r8   r,   N)r   r   r   r%   r$   r   r   r   r   r   J  s   r   c               @   s   e Zd ZdZdZdS )Maindim1r8   )r,   r.   N)r   r   r   r%   r$   r   r   r   r   r   O  s   r   c               @   s   e Zd ZdZdZdS )Maindim2r8   )r,   r.   r9   N)r   r   r   r%   r$   r   r   r   r   r   T  s   r   c               @   s   e Zd ZdZdZdS )Maindim3r,   )r,   r.   r9   N)r   r   r   r%   r$   r   r   r   r   r   Y  s   r   c               @   s   e Zd Zdd ZdS )AppendModeTestCasec             C   sX  ddg}t jt |dd|}| }| }d|d< | jj}| jj|dt	 |d}| jj|d	t	 |d}| jj|d
t	 |d}| jj|dt	 |d}	|
| |
| |
| | j
s|	
| td}
|
j|	| j
d |
  td}tjr8td| tdt|	dd |	j tdt||j | t|	dd |d dS )z&Checking append mode in `set_output()`r.   r,   r   )r+   r   r8   r   )r5   r$   r   r   r3   z2 * a1 + b1-c1)Zappend_modez2 * a + b-czTested shape:zComputed expression:NzShould look like:z$Evaluate is returning a wrong value.)r>   r@   r?   rA   rx   rC   rD   rK   r   r   rL   rY   rc   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r$   r/   r0   r1   rD   r   r   r   r3   r=   r`   r   r   r   test01_appenda  s:    





z AppendModeTestCase.test01_appendN)r   r   r   r   r   r   r   r   r   _  s   r   c               @   s   e Zd ZdZdS )AppendModeTrueTN)r   r   r   rL   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )AppendModeFalseFN)r   r   r   rL   r   r   r   r   r     s   r   c                   s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )iterTestCasec       	         s   t t|   t| j}tjt|dd|}|	 }|	 }|||d| _
d|| j< | jj}| jj|dt |d}| jj|dt |d}| jj|dt |d}|| || || |||d| _d	| _d S )
Nr   )r+   )r/   r0   r1   r   r   )r5   r$   r   r   z2 * a + b-c)r;   r   r<   rJ   r$   r>   r@   r?   rA   rx   r   r%   rC   rD   rK   r   r   rL   rT   r   )	rU   r$   r/   r0   r1   rD   r   r   r   )rX   r   r   r<     s&    




ziterTestCase.setUpc             C   s   t | j| j}tdd |D }t| j| j}tj	rtt
d| j| j t
dt|dd |j t
dt||j | t|dd |d dS )zChecking the __iter__ iterator.c             S   s   g | ]}|qS r   r   )r    r   r   r   r   r!     s    z,iterTestCase.test00_iter.<locals>.<listcomp>zTested shape, maindim:zComputed expression:NzShould look like:z$Evaluate is returning a wrong value.)r   rY   r   rT   r>   r   rZ   r   r   r[   r\   r$   r%   r]   r+   r^   r_   )rU   r=   r3   r`   r   r   r   test00_iter  s    ziterTestCase.test00_iterc             C   s   | j d dd  }}}t| j| j}|||| tdd |D }t| j	|||| j
| j}t| j|}tjrtd| j
| j tdt|dd |j tdt||j | t|dd |d dS )	z/Checking the __iter__ iterator (with ranges, I)r   Nc             S   s   g | ]}|qS r   r   )r    r   r   r   r   r!     s    z,iterTestCase.test01a_sss.<locals>.<listcomp>zTested shape, maindim:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)range_r   rY   r   rT   rf   r>   r   r&   r   r$   r%   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test01a_sss  s    ziterTestCase.test01a_sssc             C   s   | j d | j d d  }}}t| j| j}|||| tdd |D }t| j	|||| j
| j}t| j|}tjrtd| j
| j tdt|dd |j tdt||j | t|dd |d	 dS )
z0Checking the __iter__ iterator (with ranges, II)r   r,   Nc             S   s   g | ]}|qS r   r   )r    r   r   r   r   r!     s    z,iterTestCase.test01b_sss.<locals>.<listcomp>zTested shape, maindim:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)r   r   rY   r   rT   rf   r>   r   r&   r   r$   r%   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test01b_sss  s    ziterTestCase.test01b_sssc             C   s   | j \}}}t| j| j}|||| tdd |D }t| j	|||| j
| j}t| j|}tjrtd| j
| j tdt|dd |j tdt||j | t|dd |d dS )z1Checking the __iter__ iterator (with ranges, III)c             S   s   g | ]}|qS r   r   )r    r   r   r   r   r!     s    z,iterTestCase.test01c_sss.<locals>.<listcomp>zTested shape, maindim:zComputed expression:NzShould look like:z$Evaluate is returning a wrong value.)r   r   rY   r   rT   rf   r>   r   r&   r   r$   r%   rZ   r   r[   r\   r]   r+   r^   r_   )rU   r   r   r   r=   r3   r   r`   r   r   r   test01c_sss  s    ziterTestCase.test01c_sss)	r   r   r   r<   r   r   r   r   rj   r   r   )rX   r   r     s
   r   c               @   s   e Zd ZdZdZdZdS )iter0r   )r   )r8   r,   r8   N)r   r   r   r%   r$   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )iter1r   )r.   )r8   r,   r8   N)r   r   r   r%   r$   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )iter2r   )r.   r,   )r   r.   r,   N)r   r   r   r%   r$   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )iter3r8   )r.   r,   )r   r.   r,   N)r   r   r   r%   r$   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )iter4r,   )r.   r,   r8   )r8   r.   r,   N)r   r   r   r%   r$   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdZdZdS )iter5r,   )r8   r,   rr   )r   r9   r,   N)r   r   r   r%   r$   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )setOutputRangeTestCasec             C   sF  t | j}| j\}}}tjt|dd|}| }| }| jj	}| j
|d|}	| |	dk	 | j
|d|}
| |
dk	 | j
|d|}td}|| |||| |  td}|dtt||| ||||< tjr&td	| td
t|dd |j tdt||j | t|dd |d dS )z(Checking the range selection for output.r   )r+   r   Nr   r3   za1-b1-1za-b-1zTested shape:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.)rJ   r$   r   r>   r@   r?   rA   rx   rC   rD   rF   r^   r   rY   rc   set_output_rangerZ   r   r   r   r[   r\   r]   r+   r_   )rU   r$   r   r   r   r/   r0   rrD   r   r   r3   r=   r`   r   r   r   ra     s.    


"
z$setOutputRangeTestCase.test00_simplec          	   C   s  t | j}| j\}}}tjt|dd|}| }| }d|| j< | j	j
}| j	j|dt |d}	| j	j|dt |d}
| j	j|dt |d}|	| |
| || td}|| |||| |  td	}ttd
g| j }tt|||}||t|||f ||td|f  tjrxtd| tdt|d
d
 |j tdt||j | t|d
d
 |d d
S )z5Checking the range selection for output (maindim > 0)r   )r+   r   r   )r5   r$   r   r3   za1-b1-1za-b-1NzTested shape:zComputed expression:zShould look like:z$Evaluate is returning a wrong value.) rJ   r$   r   r>   r@   r?   rA   rx   r%   rC   rD   rK   r   r   rL   rY   rc   r   rZ   r#   r   r   r   __setitem__r"   r   r[   r\   r]   r+   r^   r_   )rU   r$   r   r   r   r/   r0   r   rD   r   r   r3   r=   r`   Zlsllr   r   r   test01_maindim,  s>    







z%setOutputRangeTestCase.test01_maindimN)r   r   r   ra   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange0r   )r(   )r   r8   r,   N)r   r   r   r%   r$   r   r   r   r   r   r   S  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange1r   )r(   )r   r(   r,   N)r   r   r   r%   r$   r   r   r   r   r   r   Y  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange2r   )r(   )r8   r(   r,   N)r   r   r   r%   r$   r   r   r   r   r   r   _  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange3r   )r(   r8   )r8   r(   r.   N)r   r   r   r%   r$   r   r   r   r   r   r   e  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange4r   )r(   r,   )r8   r(   r.   N)r   r   r   r%   r$   r   r   r   r   r   r   k  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange5r   )rr   r.   r8   )r8   rr   r8   N)r   r   r   r%   r$   r   r   r   r   r   r   q  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange6r8   )r,   rr   )r8   r.   r,   N)r   r   r   r%   r$   r   r   r   r   r   r   w  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange7r8   )r,   rr   r8   )r8   r.   r,   N)r   r   r   r%   r$   r   r   r   r   r   r   }  s   r   c               @   s   e Zd ZdZdZdZdS )setOutputRange8r,   )r8   r.   rr   )r8   rr   r,   N)r   r   r   r%   r$   r   r   r   r   r   r    s   r  c               @   s   e Zd ZdZdZdZdS )setOutputRange9r.   )r8   r.   r9   rr   )r8   rr   r.   N)r   r   r   r%   r$   r   r   r   r   r   r    s   r  c               @   s   e Zd Zdd Zdd ZdS )VeryLargeInputsTestCasec       	      C   sV  | j }tddk	r&tjdddd}n.tddk	rFtjdddd}ntjddd}| jj}| jj|dtjd	d
||d}| |dk	 | jj|dtjdd
||d}| |dk	 | jj|dtjd	d
||d}t	d}|
| |  |dd }tjddd}tjr>td| tdt||j tdt||j | t||d dS )zChecking very large inputs.ZbloscNr8   F)	complevelcomplibshufflelzo)r  r  r/   r.   )dflt)r5   r$   filtersr0   r,   r3   za * b-6ir(   r   )r+   zTested shape:zTen last rows:zShould look like:z$Evaluate is returning a wrong value.)r$   r   which_lib_versionFiltersrC   rD   rG   ZFloat64Atomr^   rY   rc   rZ   r>   rg   r   r[   r\   r]   r+   r_   )	rU   r$   r	  rD   r/   r0   r3   r=   r`   r   r   r   ra     s<    












z%VeryLargeInputsTestCase.test00_simplec             C   s  | j }|d dkr$tjr td dS tddk	rDtjdddd}ntjddd	}| jj}| jj	|d
tj
dd||d}| |dk	 | jj	|dtj
dd||d}| |dk	 | jj	|dtj
dd||d}td}t|}tjrtd| td| tdd | |dd dS )z-Checking very large inputs (__iter__ version)r   i   zSkipping this *very* long testNr  r8   F)r  r  r  )r  r  r/   )r  )r5   r$   r	  r0   r,   r3   r.   za-b + 1zTested shape:zCummulated sum:zShould look like:z$Evaluate is returning a wrong value.)r$   r   r[   r\   r   r
  r  rC   rD   rG   Z	Int32Atomr^   rY   sumr   )rU   r$   r	  rD   r/   r0   r3   r=   r   r   r   test01_iter  s6    












z#VeryLargeInputsTestCase.test01_iterN)r   r   r   ra   r  r   r   r   r   r    s   &r  c               @   s   e Zd ZdZdS )VeryLargeInputs1)i   N)r   r   r   r$   r   r   r   r   r    s   r  c               @   s   e Zd ZdZdS )VeryLargeInputs2)l       N)r   r   r   r$   r   r   r   r   r    s   r  c              C   s<  t  } d}x(t|D ]}| t t | t t | t t | t t | t t	 | t t
 | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t | t t  | t t! | t t" | t t# | t t$ | t t% | t t& | t t' | t t( | t t) | t t* | t t+ | t t, | t t- | t t. | t t/ | t t0 | t t1 | t t2 | t t3 | t t4 t5j6r| t t7 qW | S )zCReturn a test suite consisting of all the test cases in the module.r8   )8r   Z	TestSuiter   ZaddTestZ	makeSuiterk   rl   rm   rn   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   Zheavyr  )ZtheSuiteZniterr   r   r   r   suite  sl    r  __main__)ZdefaultTest)V__doc__Z
__future__r   r   Znumpyr>   r   Ztables.testsr   Ztables.tests.commonr   r   ZTestCaser   Z	six.movesr   r   r   r   r&   ZTempFileMixinr'   rk   rl   rm   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   sysZ
parse_argvargvZprint_versionsmainr   r   r   r   <module>   s   	

q F6@L!$  2&ZFP=
