a
    ;ZèaÁ/  ã                	   @   sô  d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dl	mZmZmZ ej d ¡ZejddZejddZeejdddd…ejf  Zeejdddd…ejf  Zej ddd g¡dd„ ƒZ ej deeeƒg¡ej deeeƒg¡ej dg d¢¡ej dg d¢¡ej dg d¢¡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„ Z-d6d7„ Z.dS )8é    N)Ú
csr_matrix)Úassert_array_equal)Úassert_array_almost_equal)Úkernel_metrics)Ú
RBFSampler)ÚAdditiveChi2Sampler)ÚSkewedChi2Sampler)ÚNystroem)ÚPolynomialCountSketch)Úmake_classification)Úpolynomial_kernelÚ
rbf_kernelÚchi2_kernel)i,  é2   ©Úsizeé   ©ZaxisÚdegreeéÿÿÿÿc                 C   sP   t jtd| › dd& t| d}| tt¡ W d   ƒ n1 sB0    Y  d S )Nzdegree=z should be >=1.©Úmatch)r   )ÚpytestÚraisesÚ
ValueErrorr
   ÚfitÚXÚY)r   Úps_transform© r   úFlib/python3.9/site-packages/sklearn/tests/test_kernel_approximation.pyÚ<test_polynomial_count_sketch_raises_if_degree_lower_than_one   s    
r!   r   r   Úgamma)çš™™™™™¹?r   ç      @©r   é   é   Úcoef0)r   r   r$   c                 C   sœ   t | ||||d}td|||dd}| | ¡}| |¡}t ||j¡}	||	 }
t t |
¡¡dksfJ ‚tj|
|
d t 	|
¡dks†J ‚t |
¡dks˜J ‚d S )N)r"   r   r(   iˆ  é*   )Ún_componentsr"   r(   r   Úrandom_stateçš™™™™™©?©Úoutr#   )
r   r
   Úfit_transformÚ	transformÚnpÚdotÚTÚabsÚmeanÚmax)r   r   r"   r   r(   Úkernelr   ÚX_transÚY_transÚkernel_approxÚerrorr   r   r    Útest_polynomial_count_sketch"   s    

ÿ

r<   c                 C   s   t  | |j¡S )N)r1   r2   r3   )r   r   r   r   r    Ú_linear_kernel=   s    r=   c                  C   sÜ  t d d …tjd d …f } ttjd d …d d …f }d|  | | |  }|jdd}tdd}| t ¡}| t¡}t ||j	¡}t
||dƒ | tt ƒ¡}| ttƒ¡}	t||jƒ t||	jƒ t ¡ }
d|
d< d}tjt|d	 | |
¡ W d   ƒ n1 sþ0    Y  td
d}t d¡}tjt|d	 | t ¡ W d   ƒ n1 sL0    Y  g d¢}|D ]:}t|d}|jd u s€J ‚| t ¡ |jd usbJ ‚qbd}td
|d}|j|ks¾J ‚| t ¡ |j|ksØJ ‚d S )Nr&   r   r'   )Úsample_stepsr   r   ©r   r   z!Negative values in data passed tor   é   zHIf sample_steps is not in [1, 2, 3], you need to provide sample_intervalr%   g333333Ó?)r>   Úsample_interval)r   r1   Únewaxisr   Úsumr   r/   r0   r2   r3   r   r   r   ÚAÚcopyr   r   r   ÚreÚescaper   rA   Zsample_interval_)ZX_ZY_Zlarge_kernelr7   r0   r8   r9   r:   Z
X_sp_transZ
Y_sp_transÚY_negÚmsgZsample_steps_availabler>   rA   r   r   r    Útest_additive_chi2_samplerA   sF    


(
ÿ*


rJ   c                  C   sP  d} |  d t d< t|  d d …tjd d …f }t |  tjd d …d d …f }t |¡d t |¡d  t d¡ t || ¡ }t |jdd¡}t| ddd}| t¡}| 	t ¡}t 
||j¡}t||d	ƒ t |¡ ¡ sâJ d
ƒ‚t |¡ ¡ søJ dƒ‚t  ¡ }	|  d |	d< d}
tjt|
d | 	|	¡ W d   ƒ n1 sB0    Y  d S )Ng¸…ëQ¸ž?g       @r?   r&   r   éè  r)   )Z
skewednessr*   r+   r   zNaNs found in the Gram matrixz)NaNs found in the approximate Gram matrixz2X may not contain entries smaller than -skewednessr   )r   r   r1   rB   ÚlogZexprC   r   r/   r0   r2   r3   r   ÚisfiniteÚallrE   r   r   r   )ÚcZX_cZY_cZ
log_kernelr7   r0   r8   r9   r:   rH   rI   r   r   r    Útest_skewed_chi2_sampler€   s&    2ÿ

rP   c                  C   s”   t ƒ } t ¡ }d|d< tjtdd |  |¡ W d  ƒ n1 sD0    Y  tjtdd$ |  t¡ |  |¡ W d  ƒ n1 s†0    Y  dS )zEnsures correct error messager   r?   zX in AdditiveChi2Sampler.fitr   Nz"X in AdditiveChi2Sampler.transform)r   r   rE   r   r   r   r   r0   )ZtransformerZX_negr   r   r    Ú%test_additive_chi2_sampler_exceptions¨   s    (
rQ   c                  C   s˜   d} t tt| d}t| ddd}| t¡}| t¡}t ||j¡}|| }t 	t 
|¡¡dksbJ ‚tj	||d t |¡dks‚J ‚t 
|¡d	ks”J ‚d S )
Ng      $@©r"   rK   r)   )r"   r*   r+   g{®Gáz„?r-   r#   r,   )r   r   r   r   r/   r0   r1   r2   r3   r4   r5   r6   )r"   r7   Zrbf_transformr8   r9   r:   r;   r   r   r    Útest_rbf_sampler´   s    

rS   c                  C   sj   ddgddgddgg} t ƒ  | ¡ | ¡ tƒ  | ¡ | ¡ tƒ  | ¡ | ¡ t| ƒ} tƒ  | ¡ | ¡ d S )Nr   r&   r'   r@   é   é   )r   r   r0   r   r   r   )r   r   r   r    Útest_input_validationÇ   s    rV   c                  C   sþ   t j d¡} | jdd}t|jd d |¡}t|ƒ}tt  	||j
¡|ƒ td| d}| |¡ |¡}|j|jd dfks~J ‚tdt| d}| |¡ |¡}|j|jd dfks´J ‚tƒ }|D ]:}td|| d}| |¡ |¡}|j|jd dfks¾J ‚q¾d S )Nr   ©é
   r@   r   ©r*   r&   ©r*   r+   )r*   r7   r+   )r1   ÚrandomÚRandomStateÚuniformr	   Úshaper/   r   r   r2   r3   r   r0   r=   r   )Úrndr   ÚX_transformedÚKZtransZkernels_availableZkernr   r   r    Útest_nystroem_approximationÓ   s     rb   c                  C   sŽ   t j d¡} | jdd}tdd}| |¡}t|d d}t  ||j¡}t	||ƒ tddd}| |¡}t
|d	d}t  ||j¡}t	||ƒ d S )
Nr)   rW   r   rX   rY   rR   Zchi2©r7   r*   r   )r1   r[   r\   r]   r	   r/   r   r2   r3   r   r   )r_   r   Únystroemr`   ra   ZK2r   r   r    Ú test_nystroem_default_parametersî   s    



re   c                  C   s†   t j d¡} |  dd¡}t  |gd ¡}d}t||jd d |¡}| |¡}t	||d}t
|t  ||j¡ƒ t  t  t¡¡s‚J ‚d S )Nr   rX   é   r&   éd   )r"   r*   rR   )r1   r[   r\   ZrandZvstackr	   r^   r   r0   r   r   r2   r3   rN   rM   r   )Úrngr   r"   ÚNr`   ra   r   r   r    Útest_nystroem_singular_kernel  s    
rj   c                  C   s^   t j d¡} | jdd}t|ddd}td|jd ddd	}| |¡}tt  	||j
¡|ƒ d S )
Né%   rW   r   gÍÌÌÌÌÌ@r#   ©r   r(   Z
polynomialr   )r7   r*   r   r(   )r1   r[   r\   r]   r   r	   r^   r/   r   r2   r3   )r_   r   ra   rd   r`   r   r   r    Ú test_nystroem_poly_kernel_params  s    ÿ
rm   c            	   	   C   sä   t j d¡} d}| j|dfd}dd„ }g }t|ƒ}t||d d|id	 |¡ t|ƒ||d  d
 kslJ ‚d}ddiddidd
if}|D ]T}tf t|d dœ|¤Ž}t	j
t|d | |¡ W d   ƒ qŠ1 sÔ0    Y  qŠd S )Nr)   rX   r@   r   c                 S   s   |  d¡ t | |¡ ¡ S )z&Histogram kernel that writes to a log.r   )Úappendr1   ZminimumrC   )ÚxÚyrL   r   r   r    Úlogging_histogram_kernel%  s    
z8test_nystroem_callable.<locals>.logging_histogram_kernelr   rL   )r7   r*   Zkernel_paramsr&   ú-Don't pass gamma, coef0 or degree to Nystroemr"   r(   r   rc   r   )r1   r[   r\   r]   Úlistr	   r   Úlenr=   r   r   r   )	r_   Ú	n_samplesr   rq   Z
kernel_logrI   ÚparamsÚparamÚnyr   r   r    Útest_nystroem_callable  s(    ýüry   c            	   	   C   sÐ   t j d¡} | jdd}t|ddd}td|jd d	}| |¡}tt  	||j
¡|ƒ d
}ddiddiddif}|D ]V}tf d|jd d	œ|¤Ž}tjt|d | |¡ W d   ƒ qt1 sÀ0    Y  qtd S )Né   rW   r   r&   r#   rl   Zprecomputedr   rc   rr   r"   r   r(   r   r   )r1   r[   r\   r]   r   r	   r^   r/   r   r2   r3   r   r   r   r   )	r_   r   ra   rd   r`   rI   rv   rw   rx   r   r   r    Ú test_nystroem_precomputed_kernel<  s    
r{   c                  C   s:   t ddd\} }tddd}| | ¡ |jjdks6J ‚dS )	zÓCheck that `component_indices_` corresponds to the subset of
    training points used to construct the feature map.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20474
    rg   rf   )ru   Z
n_featuresrX   r   rZ   )rX   N)r   r	   r   Zcomponent_indices_r^   )r   Ú_Zfeature_map_nystroemr   r   r    Útest_nystroem_component_indicesP  s    þ
r}   )/rF   Znumpyr1   Zscipy.sparser   r   Zsklearn.utils._testingr   r   Zsklearn.metrics.pairwiser   Zsklearn.kernel_approximationr   r   r   r	   r
   Zsklearn.datasetsr   r   r   r   r[   r\   rh   Zrandom_sampler   r   rC   rB   ZmarkZparametrizer!   r<   r=   rJ   rP   rQ   rS   rV   rb   re   rj   rm   ry   r{   r}   r   r   r   r    Ú<module>   sN   
?(