U
    ?h                     @   s`   d Z ddlZddlmZmZ ddlmZmZ ddl	Z	edG dd deZ
edkr\e	  dS )	zExample: sum each row using guvectorize

See Numpy documentation for detail about gufunc:
    http://docs.scipy.org/doc/numpy/reference/c-api.generalized-ufuncs.html
    N)guvectorizecuda)skip_on_cudasimCUDATestCasez&ufunc API unsupported in the simulatorc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestGUFuncScalarc           	      C   s   t dgddddd }tjdtjdd	d
}tjd	|jd}tjd	|jd}t|}tj|dd}|||d ||}|	| |	| t
|jd D ]8}| || ||  k | || ||  k qd S )Nzvoid(int32[:], int32[:])z(n)->()r   targetc                 S   s0   d}t | jd D ]}|| | 7 }q||d< d S )Ng        r   rangeshape)inpouttmpi r   \/var/www/html/venv/lib/python3.8/site-packages/numba/cuda/tests/cudapy/test_gufunc_scalar.pysum_row   s    z;TestGUFuncScalar.test_gufunc_scalar_output.<locals>.sum_rowi,  dtyped      F)copyr   r   )r   nparangeint32reshapeemptyr   r   	to_deviceZcopy_to_hostr
   r   
assertTruesum)	selfr   r   Zout1Zout2Zdev_inpZdev_out1Zdev_out2r   r   r   r   test_gufunc_scalar_output   s     	


z*TestGUFuncScalar.test_gufunc_scalar_outputc                 C   sR   t dgddddd }| |dd tdtj}| |||d	  d S )
Nzvoid(int32, int32[:])z()->()r   r   c                 S   s   | d |d< d S )N   r   r   )r   r   r   r   r   twice:   s    z=TestGUFuncScalar.test_gufunc_scalar_output_bug.<locals>.twice
      r#   )r   assertEqualr   r   astyper   ZassertPreciseEqual)r!   r$   argr   r   r   test_gufunc_scalar_output_bug8   s
    
z.TestGUFuncScalar.test_gufunc_scalar_output_bugc           	   	   C   s  t dgddddd }td}tjdtjd	d
d}tjdtjd	d
d}||||}td
D ]D}tdD ]6}||||f  |||f  }| ||||f k qrqftjdtjd	}tjdtjd	}||||}tdD ]4}|||  ||  }| ||| k||| f qtjd
tjd	}tjdtjd	d
d}tjdtjd	d
d}||||}td
D ]Z}tdD ]J}|| |||f  |||f  }| ||||f k||||f f qvqjd S )Nz1void(float32, float32[:], float32[:], float32[:])z(),(t),(t)->(t)r   r   c                 S   s0   t |jd D ]}| ||  ||  ||< qd S Nr   r	   )axyr   r   r   r   r   saxpyC   s    z>TestGUFuncScalar.test_gufunc_scalar_input_saxpy.<locals>.saxpyr#   r%   r      )r   r   Zfloat32r   r   r
   r   )	r!   r/   AXYr   jr   expr   r   r   test_gufunc_scalar_input_saxpyB   s6     

 z/TestGUFuncScalar.test_gufunc_scalar_input_saxpyc              	   C   s   t dgddddd }td}tdtj}|||}tj|||  t|}t	
|}| |jtj | t}||| W 5 Q R X | d	t|j d S )
Nzvoid(int32, int32[:], int32[:])z(),(t)->(t)r   r   c                 S   s$   t |jD ]}| ||  ||< q
d S )N)r
   size)r,   br   r   r   r   r   foof   s    z5TestGUFuncScalar.test_gufunc_scalar_cast.<locals>.foor#   r%   zdoes not support .astype())r   r   Zint64r   r(   r   testingZassert_equalarrayr   r   r'   r   ZassertRaises	TypeErrorZassertInstr	exception)r!   r9   r,   r8   r   daZraisesr   r   r   test_gufunc_scalar_caste   s    




z(TestGUFuncScalar.test_gufunc_scalar_castc                 C   s  t dgddddd }tjddd	d
gtjd}tjdgtjd}tjd
tjd}| }|| }||||d tj|| tjddd	d
gd tjddd
}tjddgtjd}tjdtjd}| }|d |d  |d< |d |d  |d< |||| tj|| d S )Nz void(int32[:],int32[:],int32[:])z(n),()->(n)r   r   c                 S   s,   t | jd D ]}| | |d  ||< qd S r+   r	   )r-   r.   resr   r   r   r   gufunc|   s    zFTestGUFuncScalar.test_gufunc_old_style_scalar_as_array.<locals>.gufunc   r#   r      r   r   r%   )r#   rD   r   )	r   r   r;   r   Zzerosr   r:   Zassert_almost_equalr   )r!   rB   r,   r8   rA   expectedr   r   r   %test_gufunc_old_style_scalar_as_arrayz   s&    
$z6TestGUFuncScalar.test_gufunc_old_style_scalar_as_arrayN)__name__
__module____qualname__r"   r*   r6   r@   rF   r   r   r   r   r      s
   *
#r   __main__)__doc__numpyr   Znumbar   r   Znumba.cuda.testingr   r   Zunittestr   rG   mainr   r   r   r   <module>   s    