
    ܙd?                     J   d dl Z d dlZd dlZd dlmc mZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZ d Zd Z G d de          Z G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de          Zedk    r e j                     dS dS )    N)voidfloat32int64jitguvectorize)GUVectorize)tagTestCasec           
          | j         \  }}|j         \  }}t          |          D ]R}t          |          D ]@}d|||f<   t          |          D ]'}|||fxx         | ||f         |||f         z  z  cc<   (ASdS )zdocstring for matmulcorer   N)shaperange)	ABCmnpijks	            @lib/python3.11/site-packages/numba/tests/npyufunc/test_gufunc.py
matmulcorer      s    7DAq7DAq1XX - -q 	- 	-AAadG1XX - -!Q$1QT7Qq!tW,,-	-- -    c                     | |z  |z   |d<   d S Nr    )axyouts       r   axpyr!      s    UaZCFFFr   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	
TestGUFunccpuc                 ~   d}t          j        |dz  dz  t           j                                      |dd          }t          j        |dz  dz  t           j                                      |dd          } |||          }t	          j        ||          }t           j                            ||dd           d S )	Ni        dtype   h㈵>:0yE>rtolatol)nparanger   reshapeutmatrix_multiplytestingassert_allclose)selfgufunc	matrix_ctr   r   r   Golds          r   check_matmul_gufunczTestGUFunc.check_matmul_gufunc   s    	Ii!ma'rz:::BB9aQRSSIi!ma'rz:::BB9aQRSSF1aLL!!Q''

""1dD"AAAAAr   c                 &   t          t          d| j                  }|                    t          d d d d f         t          d d d d f         t          d d d d f         f           |                                }|                     |           d S N(m,n),(n,p)->(m,p)target)r   r   r@   addr   build_ufuncr;   r7   r8   s     r   test_gufunczTestGUFunc.test_gufunc(   s    Z)=$(K1 1 1

GAAAqqqDM7111aaa4='!!!QQQ$-@AAA##%%  (((((r   c                      t          t          t          d d d d f         t          d d d d f         t          d d d d f                   gd| j                  t                    }|                     |           d S r=   )r   r   r   r@   r   r;   rC   s     r   test_guvectorize_decorz!TestGUFunc.test_guvectorize_decor0   s    1d7111QQQ3<111wqqqs|LLM1$(K1 1 11;= = 	  (((((r   c                 6   t          t          d| j                  }|                    d           |                                }t          j        dt
          j                  } ||||          }t
          j        	                    |||z  |z              d S )N(), (), () -> ()r?   z(intp, intp, intp, intp[:])
   r(   )
r   r!   r@   rA   rB   r0   r1   intpr5   assert_equal)r7   r8   r   r    s       r   test_ufunc_likezTestGUFunc.test_ufunc_like7   s     T#5dkJJJ

0111##%%Ib(((fQ1oo

QUQY/////r   c                 l   t          dgd          d             }t          j        d          } ||d          }t          j        |d          }t          j                            ||           t          j        |          } |||d           t          j                            ||           d S )Nzf8[:],f8[:](n)->(n)c                 d    d}t          | j        d                   D ]}|| |         z  }|||<   d S r   r   r   r   resaccr   s       r   	my_cumsumz'TestGUFunc.test_axis.<locals>.my_cumsumF   F    C171:&&  qtA r         r   axisr    rZ   )r   r0   onescumsumr5   rK   
zeros_like)r7   rT   r   r   expectedout_kws         r   	test_axiszTestGUFunc.test_axisD   s    	m_j	1	1	 	 
2	1	 GHIaa   9QQ'''

8,,,q!!	!a((((

11111r   c                 V   t          t          d d          t          t          d d          fgd          d             }|                     d|j                   |                     d|j                   |                     d|j                   |                     d|j                   d S )N(n),()->(n)c                 \    t          | j        d                   D ]}| |         |z   ||<   dS )docstring for gufuncr   NrP   )r   r   rR   r   s       r   r8   z)TestGUFunc.test_docstring.<locals>.gufuncX   s>     171:&& " "1A" "r   z numba.tests.npyufunc.test_gufuncr8   z)TestGUFunc.test_docstring.<locals>.gufuncre   )r   r   assertEqual
__module____name____qualname____doc__rC   s     r   test_docstringzTestGUFunc.test_docstringW   s    	uQQQxaaa12M	B	B	" 	" 
C	B	"
 	;V=NOOO6?333DfFYZZZ/@@@@@r   N)
rh   rg   ri   r@   r;   rD   rF   rL   ra   rk   r   r   r   r#   r#      s{        FB B B) ) )) ) )0 0 02 2 2&
A 
A 
A 
A 
Ar   r#   c                       e Zd ZdZdZdS )TestGUFuncParallelFparallelNrh   rg   ri   _numba_parallel_test_r@   r   r   r   rm   rm   d           !FFFr   rm   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	TestDynamicGUFuncr$   c                    d }t          t          d| j        d          }d}t          j        |dz  dz  t          j                                      |dd          }t          j        |dz  d	z  t          j                                      |dd	          }t          j        |dz  d	z  t          j                                      |dd	          } |||||           t          j        |dz  dz  t          j                                      |dd          }t          j        |dz  d	z  t          j                                      |dd	          }t          j        |dz  d	z  t          j                                      |dd	          }	 |||||	           |                     t          |j
                  d           d S )
Nc                     t          j        ||          } | |||           t          j                            ||dd           d S )Nr+   r,   r-   )r3   r4   r0   r5   r6   )r8   r   r   r   r:   s        r   r;   zBTestDynamicGUFunc.test_dynamic_matmul.<locals>.check_matmul_gufuncn   sJ    %a++DF1aOOOJ&&q$T&EEEEEr   r>   Tr@   
is_dynamicrI   r&   r'   r(   r*   )r   r   r@   r0   r1   r   r2   r   rf   lentypes)
r7   r;   r8   r9   Ai64Bi64Ci64r   r   r   s
             r   test_dynamic_matmulz%TestDynamicGUFunc.test_dynamic_matmull   s   	F 	F 	F
 Z)=$(KDB B B	yQ*"(;;;CCIqRSTTyQ*"(;;;CCIqRSTTyQ*"(;;;CCIqRSTTFD$555Ii!ma'rz:::BB9aQRSSIi!ma'rz:::BB9aQRSSIi!ma'rz:::BB9aQRSSFAq!,,,V\**A.....r   c                     d }t          t          d| j        d          }t          j        dt          j                  } |||           d S )Nc                 <   t          j        d|j                  }t          j        d|j                  } | ||||            | ||||           ||z  |z   }t           j                            ||           t           j                            ||           d S )NrI   r(   r    )r0   zerosr)   r5   rK   )r8   r   r    r`   goldens        r   check_ufunc_outputzETestDynamicGUFunc.test_dynamic_ufunc_like.<locals>.check_ufunc_output   s    (2QW---CXb000FF1aC   F1a''''UQYFJ##C000J##FF33333r   rH   Trv   rI   r(   )r   r!   r@   r0   r1   rJ   )r7   r   r8   r   s       r   test_dynamic_ufunc_likez)TestDynamicGUFunc.test_dynamic_ufunc_like   sb    	4 	4 	4 T#5dk(,. . .Ib(((61%%%%%r   c                 ^   t          d| j        d          d             }|                     |j                   t	          j        dt          j                                      dd          }t	          j        dt          j                  } |||           t          |j
        d	                   D ]6}|                     ||         ||                                                    7d
}|                     t          |          5   ||           ddd           dS # 1 swxY w Y   dS )w
        Note that scalar output is a 0-dimension array that acts as
        a pointer to the output location.
        (n)->()Tr@   nopythonc                 d    d}t          | j        d                   D ]}|| |         z  }||d<   d S Ng        r   r   rP   inpr    tmpr   s       r   sum_rowz=TestDynamicGUFunc.test_dynamic_scalar_output.<locals>.sum_row   s@    C39Q<((  s1vCGGGr   0u  r(   '     r   z)Too few arguments for function 'sum_row'.N)r   r@   
assertTruerw   r0   r1   int32r2   r   r   r   rf   sumassertRaisesRegex	TypeError)r7   r   r   r    r   msgs         r   test_dynamic_scalar_outputz,TestDynamicGUFunc.test_dynamic_scalar_output   si    
Yt{T	B	B	B	 	 
C	B	 	*+++iRX...66ua@@huBH---S sy|$$ 	3 	3ASVSVZZ\\22229##Is33 	 	GCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   	D""D&)D&c                    t          d          d             }t          j        d          }t          j        |d          }t          j        |          } |||d           t          j                            ||           t          j        |          } |||d           t          j                            ||           d S )NrN   c                 d    d}t          | j        d                   D ]}|| |         z  }|||<   d S r   rP   rQ   s       r   rT   z.TestDynamicGUFunc.test_axis.<locals>.my_cumsum   rU   r   rV   r   rY   r[   )r   r0   r\   r]   r^   r5   rK   )r7   rT   r   r_   r   r`   s         r   ra   zTestDynamicGUFunc.test_axis   s    	Z	 	 	 	 
!	 	 GH9QQ'''M(##	!QQ

8,,,q!!	!a((((

11111r   c                    t          d          d             }g d}|D ],}t          ||          }|                     |d|d           -t          j        g d          }t          j        g d          } |||           |                     |t          j        g d                     |                     |j        d           |                     t                    5 }|
                    |           d d d            n# 1 swxY w Y   |                     t          |j                  d	           |                     t                    5 }|                    |           d d d            n# 1 swxY w Y   |                     t          |j                  d	           |                     t                    5 }|                    |d
dg           d d d            n# 1 swxY w Y   |                     t          |j                  d	           |                     t                    5 }|                    ||           d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )NrN   c                 d    d}t          | j        d                   D ]}|| |         z  }|||<   d S r   rP   rQ   s       r   r8   z8TestDynamicGUFunc.test_gufunc_attributes.<locals>.gufunc   rU   r   )	signature
accumulateatouterreducereduceatzdynamic gufunc not exporting ""   r&   r   r'   r   r   r   r   r   r      rI   z-Reduction not defined on ufunc with signaturer   r&   z?method outer is not allowed in ufunc with non-trivial signature)r   hasattrr   r0   arrayassertPreciseEqualrf   r   assertRaisesRuntimeErrorr   str	exceptionr   r   r   r   )r7   r8   attrsattrcontainsr   rR   raisess           r   test_gufunc_attributesz(TestDynamicGUFunc.test_gufunc_attributes   s^   	Z	 	 	 	 
!	 	 QPP 	U 	UDvt,,HOOHHTTT&STTTTH\\\""h|||$$q#RXmmm%<%<===
 	):666|,, 	!a   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!V-..0_```|,, 	MM!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	V-..0_```|,, 	'OOA1v&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'V-..0_```y)) 	VLLA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	V-..0qrrrrrsH   #DD	D	E44E8;E8G&&G*-G*3IIIc                 F   t          d          d             }|                     |j                   t          j        g d          }t          j        g d          }t          j        g d          } ||||           |                     |t          j        g d                     |                     |j                   |                     |                    |          d           |                     |                    |          t          j        g d                     |                     |	                    d	d
gd
dg          t          j        d
dgddgg                     |                     |
                    |d	dg          t          j        ddg                     t          j        g d          }t          j        d
dg          }|                    |d	d
g|           |                     |t          j        g d                     d S )Nz	(),()->()c                     | |z   |d<   d S r   r   )r   r   rR   s      r   rA   z6TestDynamicGUFunc.test_gufunc_attributes2.<locals>.add   s    UCFFFr   r   )r'   r   r&   r   r   )r*   r*   r*   r*   rI   r   r   r   r&   r      )r&   r'   r   r'   )r   assertIsNoner   r0   r   r   rf   r   r   r   r   r   )r7   rA   r   brR   r   r   s          r   test_gufunc_attributes2z)TestDynamicGUFunc.test_gufunc_attributes2   s   	[	!	!	 	 
"	!	 	#-(((H\\\""H\\\""h|||$$Aq#RXlll%;%;<<< 	#-(((A+++q 1 128MMM3J3JKKK		1a&1a& 9 928aVaQRVDT;U;UVVVQA 7 71a&9I9IJJJH\\\""HaVq1a&!28LLL#9#9:::::r   N)
rh   rg   ri   r@   r}   r   r   ra   r   r   r   r   r   rs   rs   i   sw        F/ / /.& & &(  <2 2 2(&s &s &sP; ; ; ; ;r   rs   c                   4    e Zd ZdZdZd Zd Zd Zd Zd Z	dS )	TestGUVectorizeScalarz<
    Nothing keeps user from out-of-bound memory access
    r$   c                 j   t          dgd| j        d          d             }t          j        dt          j                                      dd	          } ||          }t          |j        d
                   D ]6}|                     ||         ||         	                                           7dS )r   zvoid(int32[:], int32[:])r   Tr   c                 d    d}t          | j        d                   D ]}|| |         z  }||d<   d S r   rP   r   s       r   r   z9TestGUVectorizeScalar.test_scalar_output.<locals>.sum_row  sB     C39Q<((  s1vCGGGr   r   r(   r   r   r   N)
r   r@   r0   r1   r   r2   r   r   rf   r   )r7   r   r   r    r   s        r   test_scalar_outputz(TestGUVectorizeScalar.test_scalar_output  s     
019 K$
8 
8 
8	 	
8 
8	 iRX...66ua@@gcll sy|$$ 	3 	3ASVSVZZ\\2222	3 	3r   c                     t          dgd| j        d          d             }t          j        dt          j                                      dd	          } ||d
          }|                     |d
z  |           d S )Nzint32[:], int32[:], int32[:]rc   Tr   c                 h    t          | j        d                   D ]}| |         |d         z  ||<   d S r   rP   r   r   r    r   s       r   fooz4TestGUVectorizeScalar.test_scalar_input.<locals>.foo-  sB     39Q<(( ' 'Q!A$A' 'r   rX   r(   rI   r   r&   )r   r@   r0   r1   r   r2   r   )r7   r   r   r    s       r   test_scalar_inputz'TestGUVectorizeScalar.test_scalar_input+  s    	45} K$
8 
8 
8	' 	'
8 
8	' ibh///77A>>c#qkk 	a-----r   c                    d } t          dgd| j                  |          }t          j        d                              t          j                  } ||d          }t          j        |          } ||d|           t          j                            ||           t          j        d                              t          j                  	                    dd          } ||d          }t          j        |          }t          |j        d                   D ]} |||         d||                    t          j                            ||           d S )	Nc                 V    t          | j                  D ]}|| |         dz   z  ||<   d S )Nr   )r   sizer   s       r   pyfunczATestGUVectorizeScalar.test_scalar_input_core_type.<locals>.pyfunc;  s;    38__ * *c!fqj)A* *r   int32[:], int32, int32[:]rc   r?   rI   r&   rW   r   )r   r@   r0   r1   astyper   r^   r5   rK   r2   r   r   )r7   r   	my_gufuncarrgotr_   axs          r   test_scalar_input_core_typez1TestGUVectorizeScalar.test_scalar_input_core_type:  sY   	* 	* 	*4K!< = -'+{4 4 44:< <	
 imm""28,,iQ=%%sAx   

X... imm""28,,44R;;iQ=%%q)** 	- 	-BF3r7Ax|,,,,

X.....r   c                     |                      t                    5 }t          dgd| j                  d             }d d d            n# 1 swxY w Y   |                     dt          |j                             d S )Nr   z(n),(n)->(n)r?   c                     d S Nr   )r   r   cs      r   r   zGTestGUVectorizeScalar.test_scalar_input_core_type_error.<locals>.pyfuncX  	     r   z2scalar type int32 given for non scalar argument #2r   r   r   r@   rf   r   r   r7   r   r   s      r   !test_scalar_input_core_type_errorz7TestGUVectorizeScalar.test_scalar_input_core_type_errorV  s    y)) 	V56 $- - - - -	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	MV-..	0 	0 	0 	0 	0   "A		AAc                     |                      t                    5 }t          dgd| j                  d             }d d d            n# 1 swxY w Y   |                     dt          |j                             d S )Nzint32[:], int32[:]z
(m,n)->(n)r?   c                     d S r   r   )r   r   s     r   r   z8TestGUVectorizeScalar.test_ndim_mismatch.<locals>.pyfunca  r   r   z,type and shape signature mismatch for arg #1r   r   s      r   test_ndim_mismatchz(TestGUVectorizeScalar.test_ndim_mismatch_  s    y)) 	V./ $- - - - -	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	GV-..	0 	0 	0 	0 	0r   N)
rh   rg   ri   rj   r@   r   r   r   r   r   r   r   r   r   r     sp          F3 3 32. . ./ / /80 0 00 0 0 0 0r   r   c                       e Zd ZdZdZdS )TestGUVectorizeScalarParallelFrn   Nro   r   r   r   r   r   i  rq   r   r   c                        e Zd Zd Zd Zd ZdS )TestGUVectorizePicklingc                    t          dgd          d             }t          j        |          }t          j        |          }|                     |j        |j                   |                     |j        |j                   |                     |j        |j                   |                     |j        j	        |j        j	                   | 
                    |j                   |                                 | 
                    |j                   |                      |d           |d                     t          j        d          }|                      ||           ||                     dS )zNon-dynamic gufunc.
        zf8,f8[:]()->()c                     | dz  |d d <   d S Nr&   r   r   r    s     r   doublezFTestGUVectorizePickling.test_pickle_gufunc_non_dyanmic.<locals>.doubler      UCFFFr         ?rI   N)r   pickledumpsloadsrf   _frozenidentityrw   gufunc_builder_sigsr   disable_compiler   r0   r1   )r7   r   serclonedr   s        r   test_pickle_gufunc_non_dyanmicz6TestGUVectorizePickling.test_pickle_gufunc_non_dyanmico  sb    
j\8	,	,	 	 
-	,	 l6""c"" 	888&/:::*F,=>>>.4.4	6 	6 	6 	'''   ''' 	sVVC[[999immsVVC[[99999r   c                 Z   t          dd          d             }t          j        |          }t          j        |          }|                     |j        |j                   |                     |j        |j                   |                     |j        |j                   |                     |j        j	        |j        j	                   | 
                    |j                   t          j        d          }t          j        d          } |d|            |d|           |                     ||           t          j        d          }t          j        |          }t          j        |          } |||            |||           |                     ||           dS )	z:Dynamic gufunc w/o prepopulating before pickling.
        r   r   r   c                     | dz  |d d <   d S r   r   r   s     r   r   zLTestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_init.<locals>.double  r   r   r   r   rI   N)r   r   r   r   rf   r   r   rw   r   r   assertFalser0   r   r   r1   r^   )r7   r   r   r   expectr   r   s          r   $test_pickle_gufunc_dyanmic_null_initz<TestGUVectorizePickling.test_pickle_gufunc_dyanmic_null_init  s    
X	*	*	*	 	 
+	*	 l6""c"" 	888&/:::*F,=>>>.4.4	6 	6 	6 	((( !hqkkss,,,imms##mC  ss,,,,,r   c                    t          dd          d             }t          j        d          }t          j        d          } |d|           t          j        d          }t          j        |          }t          j        |          } |||           t          j        |          }t          j        |          }|                     |j	        |j	                   |                     |j
        |j
                   |                     |j        |j                   |                     |j        j        |j        j                   |                     |j	                   |                                 |                     |j	                   t          j        d          }t          j        d          } |d|            |d|           |                     ||           t          j        |          }t          j        |          } |||            |||           |                     ||           dS )	zDynamic gufunc prepopulated before pickling.

        Once unpickled, we disable compilation to verify that the gufunc
        compilation state is carried over.
        r   r   r   c                     | dz  |d d <   d S r   r   r   s     r   r   zNTestGUVectorizePickling.test_pickle_gufunc_dynamic_initialized.<locals>.double  r   r   r   r   rI   N)r   r0   r   r1   r^   r   r   r   rf   r   r   rw   r   r   r   r   r   r   )r7   r   r   r   r   r   r   s          r   &test_pickle_gufunc_dynamic_initializedz>TestGUVectorizePickling.test_pickle_gufunc_dynamic_initialized  s5    
X	*	*	*	 	 
+	*	 !hqkksimms##mC  s l6""c"" 	888&/:::*F,=>>>.4.4	6 	6 	6 	((( 	   '''!hqkkss,,,s##mC  ss,,,,,r   N)rh   rg   ri   r   r   r   r   r   r   r   r   n  sB        : : :: -  -  -D/- /- /- /- /-r   r   __main__)unittestr   numpyr0   numpy.core.umath_testscoreumath_testsr3   numbar   r   r   r   r   numba.np.ufuncr   numba.tests.supportr	   r
   r   r!   r#   rm   rs   r   r   r   rh   mainr   r   r   <module>r     s         # # # # # # # # # 8 8 8 8 8 8 8 8 8 8 8 8 8 8 & & & & & & - - - - - - - -- - -  FA FA FA FA FA FA FA FAR       
`; `; `; `; `; `; `; `;FZ0 Z0 Z0 Z0 Z0H Z0 Z0 Z0z    $9   
o- o- o- o- o-h o- o- o-d zHMOOOOO r   