U
    }h@                     @   sh  d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZmZmZ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	dgej ddddgej dd dgdd Z!ej dddgej dd	ddgej dd dgdd Z"dd Z#dd Z$ej dd d!d"gej d#e%d	d$d%d& Z&d'd( Z'ej dd d!d"gd)d* Z(d+d, Z)d-d. Z*d/d0 Z+d1d2 Z,d3d4 Z-d5d6 Z.d7d8 Z/d9d: Z0d;d< Z1d=d> Z2d?d@ Z3dAdB Z4dCdD Z5dEdF Z6dGdH Z7dIdJ Z8ej dKeeee
gdLdM Z9dNdO Z:dS )P    N)
csr_matrix)make_classification)AdditiveChi2SamplerNystroemPolynomialCountSketch
RBFSamplerSkewedChi2Sampler)chi2_kernelkernel_metricspolynomial_kernel
rbf_kernel)assert_allcloseassert_array_almost_equalassert_array_equal),  2   size   Zaxisgamma皙?g      @zdegree, n_components)r     )   r   )   i  coef0c           
      C   s   t tt| ||d}t|| ||dd}|t}|t}t||j}|| }	t	t
|	dksfttj	|	|	d t|	dkstt
|	dkstd S )N)r   degreer   *   )n_componentsr   r   r   random_state皙?outr   )r   XYr   fit_transform	transformnpdotTabsmeanAssertionErrormax)
r   r   r   r   kernelZps_transformX_transY_transkernel_approxerror r3   K/tmp/pip-unpacked-wheel-ig1s1lm8/sklearn/tests/test_kernel_approximation.pytest_polynomial_count_sketch#   s     

r5         ?r   r   r   c           	      C   sl   t d| ||dd}|t}|t}t d| ||dd}|tt}|tt}t|| t|| dS )zZCheck that PolynomialCountSketch results are the same for dense and sparse
    input.
    r   r   )r   r   r   r   r   N)r   r%   r#   r&   r$   r   r   )	r   r   r   Zps_denseZXt_denseZYt_denseZ	ps_sparseZ	Xt_sparseZ	Yt_sparser3   r3   r4   )test_polynomial_count_sketch_dense_sparse@   s(        

    
r7   c                 C   s   t | |jS )N)r'   r(   r)   )r#   r$   r3   r3   r4   _linear_kernelW   s    r8   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||  t||	  t }
d|
d< d}tjt|d	 ||
 W 5 Q R X d S )
Nr   r   r   sample_stepsr   r   r   z!Negative values in data passed tomatch)r#   r'   newaxisr$   sumr   r%   r&   r(   r)   r   r   r   Ztoarraycopypytestraises
ValueErrorfit)ZX_ZY_Zlarge_kernelr.   r&   r/   r0   r1   Z
X_sp_transZ
Y_sp_transY_negmsgr3   r3   r4   test_additive_chi2_sampler[   s$    


rH   methodrE   r%   r&   r:      c                 C   sD   t |d}t|| t d}t ||d}t|| t |j|k dS )zsCheck that the input sample step doesn't raise an error
    and that sample interval doesn't change after fit.
    r9   g      ?)r:   sample_intervalN)r   getattrr#   rK   )rI   r:   transformerrK   r3   r3   r4   'test_additive_chi2_sampler_sample_steps   s    
rN   c               	   C   sF   t  } | t td}tjt|d | jdk	s8t	W 5 Q R X dS )zICheck that we raise a FutureWarning when accessing to `sample_interval_`.zYThe ``sample_interval_`` attribute was deprecated in version 1.3 and will be removed 1.5.r=   N)
r   rE   r#   reescaperB   ZwarnsFutureWarningZsample_interval_r,   )rM   rG   r3   r3   r4   *test_additive_chi2_sampler_future_warnings   s    
rR   c              	   C   s@   t dd}td}tjt|d t|| t W 5 Q R X dS )z8Check that we raise a ValueError on invalid sample_stepsrJ   r9   zHIf sample_steps is not in [1, 2, 3], you need to provide sample_intervalr=   N)r   rO   rP   rB   rC   rD   rL   r#   )rI   rM   rG   r3   r3   r4   -test_additive_chi2_sampler_wrong_sample_steps   s    
rS   c               	   C   s:  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| std
t| stdt  }	|  d |	d< d}
tjt|
d |	|	 W 5 Q R X 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#   r'   r?   logexpr@   r   r%   r&   r(   r)   r   isfiniteallr,   rA   rB   rC   rD   )cZX_cZY_cZ
log_kernelr.   r&   r/   r0   r1   rF   rG   r3   r3   r4   test_skewed_chi2_sampler   s&    2

rZ   c               	   C   sl   t  } t }d|d< tjtdd | | W 5 Q R X tjtdd | t | | W 5 Q R X dS )zEnsures correct error messager;   r<   zX in AdditiveChi2Sampler.fitr=   z"X in AdditiveChi2Sampler.transformN)r   r#   rA   rB   rC   rD   rE   r&   )rM   ZX_negr3   r3   r4   %test_additive_chi2_sampler_exceptions   s    
r[   c                  C   s   d} t tt| d}t| ddd}|t}|t}t||j}|| }t	t
|dksbttj	||d t|dkstt
|d	kstd S )
Ng      $@r   rT   r   )r   r   r   g{Gz?r!   r   r    )r   r#   r$   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   )r   r.   Zrbf_transformr/   r0   r1   r2   r3   r3   r4   test_rbf_sampler   s    

r]   c                 C   sT   t  }tjddgddgddgg| d}|| |jj| ks@t|jj| ksPtdS 	zRCheck that the fitted attributes are stored accordingly to the
    data type of X.r   r   r   rJ         dtypeN)r   r'   arrayrE   random_offset_rb   r,   random_weights_)global_dtyperbfr#   r3   r3   r4   (test_rbf_sampler_fitted_attributes_dtype   s
     
rh   c                  C   s   t dd} tjddgddgddggtjd	}| | t dd}tjddgddgddggtjd	}|| t| j|j t| j|j d
S z?Check the equivalence of the results with 32 and 64 bits input.r   )r   r   r   r   rJ   r_   r`   ra   N)	r   r'   rc   float32rE   float64r   rd   re   )Zrbf32ZX32Zrbf64ZX64r3   r3   r4   "test_rbf_sampler_dtype_equivalence   s    
"

"
rl   c                  C   sD   dgdggddg } }t dd}|| | |jtdks@tdS )	z4Check the inner value computed when `gamma='scale'`.g        r6   r   r   Zscaler\   rJ   N)r   rE   Z_gammarB   Zapproxr,   )r#   yrg   r3   r3   r4   test_rbf_sampler_gamma_scale  s    
rn   c                 C   sT   t  }tjddgddgddgg| d}|| |jj| ks@t|jj| ksPtdS r^   )r   r'   rc   rE   rd   rb   r,   re   )rf   Zskewed_chi2_samplerr#   r3   r3   r4   0test_skewed_chi2_sampler_fitted_attributes_dtype  s
     
ro   c                  C   s   t dd} tjddgddgddggtjd	}| | t dd}tjddgddgddggtjd	}|| t| j|j t| j|j d
S ri   )	r   r'   rc   rj   rE   rk   r   rd   re   )Zskewed_chi2_sampler_32ZX_32Zskewed_chi2_sampler_64ZX_64r3   r3   r4   *test_skewed_chi2_sampler_dtype_equivalence   s    
"

"
  rp   c                  C   sj   ddgddgddgg} t  | |  t | |  t | |  t| } t | |  d S )Nr   r   r   rJ   r_   r`   )r   rE   r&   r   r   r   )r#   r3   r3   r4   test_input_validation2  s    rq   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~ttdt| d}|||}|j|jd dfkstt }|D ]:}td|| d}|||}|j|jd dfkstqd S )Nr   
   rJ   r   r   r   r   r   )r   r.   r   )r'   randomRandomStateuniformr   shaper%   r   r   r(   r)   rE   r&   r,   r8   r
   )rndr#   X_transformedKZtransZkernels_availablekernr3   r3   r4   test_nystroem_approximation>  s     r~   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   rr   r   rs   rt   r\   Zchi2r.   r   r   )r'   rv   rw   rx   r   r%   r   r(   r)   r   r	   )rz   r#   nystroemr{   r|   ZK2r3   r3   r4    test_nystroem_default_parametersY  s    



r   c                  C   s   t jd} | dd}t |gd }d}t||jd d|}||}t	||d}t
|t ||j t t tstd S )Nr   rs      r   d   )r   r   r\   )r'   rv   rw   ZrandZvstackr   ry   rE   r&   r   r   r(   r)   rX   rW   r$   r,   )rngr#   r   Nr{   r|   r3   r3   r4   test_nystroem_singular_kernelm  s    
r   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%   rr   r   g@r   r   r   Z
polynomialr   )r.   r   r   r   )r'   rv   rw   rx   r   r   ry   r%   r   r(   r)   )rz   r#   r|   r   r{   r3   r3   r4    test_nystroem_poly_kernel_params}  s       
r   c            	   
   C   s   t jd} d}| j|dfd}dd }g }t|}t||d d|id	| t|||d  d
 ksltd}ddiddidd
if}|D ]@}tf t	|d d|}t
jt|d || W 5 Q R X qd S )Nr   rs   rJ   r   c                 S   s   | d t| | S )z&Histogram kernel that writes to a log.r   )appendr'   Zminimumr@   )xrm   rU   r3   r3   r4   logging_histogram_kernel  s    
z8test_nystroem_callable.<locals>.logging_histogram_kernelr   rU   )r.   r   Zkernel_paramsr   -Don't pass gamma, coef0 or degree to Nystroemr   r   r   r   r=   )r'   rv   rw   rx   listr   rE   lenr,   r8   rB   rC   rD   )	rz   	n_samplesr#   r   Z
kernel_logrG   paramsparamnyr3   r3   r4   test_nystroem_callable  s(    r   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 ]B}tf d|jd d	|}tjt|d || W 5 Q R X qtd S )N   rr   r   r   r   r   Zprecomputedr   r   r   r   r   r   r   r=   )r'   rv   rw   rx   r   r   ry   r%   r   r(   r)   rB   rC   rD   rE   )	rz   r#   r|   r   r{   rG   r   r   r   r3   r3   r4    test_nystroem_precomputed_kernel  s    
r   c                  C   s:   t ddd\} }tddd}||  |jjdks6tdS )	zCheck 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
    r   r   )r   Z
n_featuresrs   r   ru   )rs   N)r   r   rE   Zcomponent_indices_ry   r,   )r#   _Zfeature_map_nystroemr3   r3   r4   test_nystroem_component_indices  s    
r   	Estimatorc                    sR   |   t}|t}| }| j   fddt|jd D }t|| dS )zCheck get_feature_names_outc                    s   g | ]}  | qS r3   r3   ).0i
class_namer3   r4   
<listcomp>  s     z.test_get_feature_names_out.<locals>.<listcomp>r   N)	rE   r#   r&   get_feature_names_out__name__lowerrangery   r   )r   Zestr/   	names_outexpected_namesr3   r   r4   test_get_feature_names_out  s    

r   c                  C   s|   t jd} | jdd}tdd|}dddg}d	d
dddddddddddddg}|j|d}dd |D }t|| dS )z4Check get_feature_names_out for AdditiveChi2Sampler.r   )r   r   r   r   r9   Zf0f1f2Zf0_sqrtZf1_sqrtZf2_sqrtZf0_cos1Zf1_cos1Zf2_cos1Zf0_sin1Zf1_sin1Zf2_sin1Zf0_cos2Zf1_cos2Zf2_cos2Zf0_sin2Zf1_sin2Zf2_sin2)Zinput_featuresc                 S   s   g | ]}d | qS )Zadditivechi2sampler_r3   )r   suffixr3   r3   r4   r     s     zBtest_additivechi2sampler_get_feature_names_out.<locals>.<listcomp>N)r'   rv   rw   random_sampler   rE   r   r   )r   r#   Zchi2_samplerZinput_namessuffixesr   r   r3   r3   r4   .test_additivechi2sampler_get_feature_names_out  s.    
r   );rO   Znumpyr'   rB   Zscipy.sparser   Zsklearn.datasetsr   Zsklearn.kernel_approximationr   r   r   r   r   Zsklearn.metrics.pairwiser	   r
   r   r   Zsklearn.utils._testingr   r   r   rv   rw   r   r   r#   r$   r@   r?   markZparametrizer5   r7   r8   rH   r   rN   rR   rS   rZ   r[   r]   rh   rl   rn   ro   rp   rq   r~   r   r   r   r   r   r   r   r   r3   r3   r3   r4   <module>   sd   $

( 

