o
    ۾i                     @   sd   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r0e	  dS 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 ]}| || ||  k | || ||  k qOd 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   ^/home/ubuntu/.local/lib/python3.10/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_devicecopy_to_hostr
   r   
assertTruesum)	selfr   r   out1out2dev_inpdev_out1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   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 ]"}tdD ]}||||f  |||f  }| ||||f k q9q3tjdtjd	}tjdtjd	}||||}tdD ]}|||  ||  }| ||| k||| f qptjd
tjd	}tjdtjd	d
d}tjdtjd	d
d}||||}td
D ]+}tdD ]$}|| |||f  |||f  }| ||||f k||||f f qqd 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   float32r   r   r
   r    )	r"   r6   AXYr   jr   expr   r   r   test_gufunc_scalar_input_saxpyB   s:   

 &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 d    n1 sOw   Y  | 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)r3   br   r   r   r   r   foof   s   z5TestGUFuncScalar.test_gufunc_scalar_cast.<locals>.foor)   r+   zdoes not support .astype())r   r   int64r   r.   r   testingassert_equalarrayr   r   r-   r   assertRaises	TypeErrorassertInstr	exception)r"   rA   r3   r@   r   da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g dtjd}tjd	gtjd}tjd
tjd}| }|| }||||d tj|| tjg d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 r2   r	   )r4   r5   resr   r   r   r   gufunc|   s   zFTestGUFuncScalar.test_gufunc_old_style_scalar_as_array.<locals>.gufunc)   r)   r      r   r)   rQ   r   r+   )r)   rQ   r   rP   )	r   r   rE   r   zerosr   rC   assert_almost_equalr   )r"   rO   r3   r@   rN   expectedr   r   r   %test_gufunc_old_style_scalar_as_arrayz   s&   
 z6TestGUFuncScalar.test_gufunc_old_style_scalar_as_arrayN)__name__
__module____qualname__r(   r1   r>   rM   rU   r   r   r   r   r      s    *
#r   __main__)__doc__numpyr   numbar   r   numba.cuda.testingr   r   unittestr   rV   mainr   r   r   r   <module>   s     