U
    Ovf‰@  ã                	   @   sÌ  U d dl Z d dlZd dlmZmZ d dl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mZmZmZmZ d dlmZmZmZmZmZ egZee ed< egZee ed< ee ZegZee ed	< egZ ee ed
< ee  Z!dSdd„Z"dd„ Z#d\Z$Z%e&e$e% d ƒZ'e"e$e%e'ƒ\Z(Z)ej* +dddgddgfddgddgfddgddgfg¡dd„ ƒZ,dd„ Z-d d!„ Z.d"d#„ Z/d$d%„ Z0d&d'„ Z1ej* +d(e¡d)d*„ ƒZ2ej* +d(e¡d+d,„ ƒZ3d-d.„ Z4d/d0„ Z5d1d2„ Z6d3d4„ Z7d5d6„ Z8d7d8„ Z9d9d:„ Z:d;d<„ Z;d=d>„ Z<d?d@„ Z=dAdB„ Z>ej* +dCe!¡dDdE„ ƒZ?ej* +dFdG¡ej* +dHdG¡ej* +dCe!¡ej* +dIdJdKg¡dLdM„ ƒƒƒƒZ@ej* +dCe!¡ej* +dNejAejAfejBejBfejCejBfejDejBff¡dOdP„ ƒƒZEej* +dCe!¡dQdR„ ƒZFdS )Té    N)ÚAnyÚList)ÚDataDimensionalityWarning)Úeuclidean_distances)ÚGaussianRandomProjectionÚSparseRandomProjectionÚ_gaussian_random_matrixÚ_sparse_random_matrixÚjohnson_lindenstrauss_min_dim)Úassert_allcloseÚassert_allclose_dense_sparseÚassert_almost_equalÚassert_array_almost_equalÚassert_array_equalÚall_sparse_random_matrixÚall_dense_random_matrixÚall_SparseRandomProjectionÚall_DenseRandomProjectionc                 C   sP   t j |¡}tj| |¡|j| |d|j||dff| |fd}| ¡ | ¡ fS )N©Úsize)Úshape)	ÚnpÚrandomÚRandomStateÚspZ
coo_matrixZrandnÚrandintÚtoarrayZtocsr)Ú	n_samplesÚ
n_featuresÚ
n_nonzerosÚrandom_stateÚrngZdata_coo© r"   úH/tmp/pip-unpacked-wheel-qu3nn_q2/sklearn/tests/test_random_projection.pyÚmake_sparse_random_data%   s    þþø
r$   c                 C   s   t  | ¡s| S |  ¡ S d S ©N)r   Úissparser   )Zmatrixr"   r"   r#   Údensify4   s    
r'   )é
   éè  g      Y@zn_samples, epséd   én   çÍÌÌÌÌÌì?çš™™™™™ñ?éZ   çš™™™™™¹?ç        é2   iØÿÿÿçš™™™™™É?c              	   C   s&   t  t¡ t| |d W 5 Q R X d S )N©Úeps)ÚpytestÚraisesÚ
ValueErrorr
   )r   r4   r"   r"   r#   Útest_invalid_jl_domainE   s    	r8   c                	   C   sT   t  t¡ tddg ddg d W 5 Q R X ttjjdddd	t dd
¡d d S )Né   r*   é   r,   r3   é   r(   )r(   r(   r   ç      à?)r5   r6   r7   r
   r   r   r   Úfullr"   r"   r"   r#   Útest_input_size_jl_min_dimR   s    " 
ÿr>   c              
   C   s@   dddddg}|D ](\}}t  t¡ | ||ƒ W 5 Q R X qd S )N)r   r   )éÿÿÿÿr;   )r;   r?   )r;   r   )r?   r   ©r5   r6   r7   ©Úrandom_matrixÚinputsÚn_componentsr   r"   r"   r#   Úcheck_input_size_random_matrix^   s    rE   c                 C   s6   ddddg}|D ] \}}| ||ƒj ||fkst‚qd S )N)r;   é   )rF   r;   )rF   rF   )r;   r;   )r   ÚAssertionErrorrA   r"   r"   r#   Úcheck_size_generatede   s    
þrH   c                 C   s<   t | ddddƒ}tdt |¡dƒ tdtj |¡dƒ d S )Ni'  r;   r   ©r    r9   ç      ð?)r'   r   r   ÚmeanZlinalgZnorm)rB   ÚAr"   r"   r#   Úcheck_zero_mean_and_unit_normn   s    rM   c              
   C   s:   d\}}dD ](}t  t¡ | |||d W 5 Q R X qd S )N)rF   r(   )g      ð¿r0   r-   ©Údensityr@   )rB   rD   r   rO   r"   r"   r#   Ú%check_input_with_sparse_random_matrixx   s    rP   rB   c                 C   s   t | ƒ t| ƒ t| ƒ d S r%   )rE   rH   rM   )rB   r"   r"   r#   Ú$test_basic_property_of_random_matrix€   s    rQ   c                 C   s"   t | ƒ tj| dd}t|ƒ d S )NrJ   rN   )rP   Ú	functoolsÚpartialrM   )rB   Zrandom_matrix_denser"   r"   r#   Ú+test_basic_property_of_sparse_random_matrixˆ   s    rT   c                  C   sF   d} d}t | |dd}tdt |¡dƒ ttj|ddd|  dƒ d S )	Nr*   r)   r   rI   r0   r:   r;   ©Zddof)r   r   r   rK   Úvar)rD   r   rL   r"   r"   r#   Útest_gaussian_random_matrix‘   s
    rW   c               	   C   sî  d} d}dD ]Ú}d| }t | ||dd}t|ƒ}t |¡}t |¡t | ¡ |ksXt‚t |¡ t | ¡ |ksvt‚|dkr’t |¡dks°t‚nd	|ksžt‚t |¡d
ks°t‚tt |d	k¡dd|  dd tt |t |¡t | ¡ k¡dd|  dd tt |t |¡ t | ¡ k¡dd|  dd ttj	|d	kdddd|  d | dd ttj	|t |¡t | ¡ kddddd|   d d|  dd ttj	|t |¡ t | ¡ kddddd|   d d|  dd qd S )Nr*   iô  )g333333Ó?rJ   r;   r   )rO   r    rJ   r:   r0   r9   )ÚdecimalrU   )
r	   r'   r   ÚuniqueÚsqrtrG   r   r   rK   rV   )rD   r   rO   ÚsrL   Úvaluesr"   r"   r#   Útest_sparse_random_matrixŸ   sP    
   ÿ
	  
 ÿ 
 ÿ, ý"ýr]   c               
   C   sD   d} dddgg}t D ]*}t t¡ || d |¡ W 5 Q R X qd S )NÚautor   r;   r:   ©rD   )Úall_RandomProjectionr5   r6   r7   Úfit)rD   Zfit_dataÚRandomProjectionr"   r"   r#   Ú0test_random_projection_transformer_invalid_inputØ   s
    rc   c               
   C   s4   t D ]*} t t¡ | dd t¡ W 5 Q R X qd S )Nr^   r_   )r`   r5   r6   r7   Ú	transformÚdata)rb   r"   r"   r#   Ú test_try_to_transform_before_fità   s    rf   c               
   C   sR   t dddƒ\} }tD ]8}|ddd}d}tjt|d | | ¡ W 5 Q R X qd S )Nr)   r*   r^   r/   )rD   r4   z~eps=0.100000 and n_samples=1000 lead to a target dimension of 5920 which is larger than the original space with n_features=100)Úmatch)r$   r`   r5   r6   r7   ra   )re   Ú_rb   ÚrpZexpected_msgr"   r"   r#   Ú.test_too_many_samples_to_find_a_safe_embeddingæ   s    ÿrj   c            
      C   sª   t dddƒ\} }d}t| dd}| ¡ }|dk}|| }tD ]h}|d|d	d
}| | ¡}t|dd}| ¡ }|| }|| }	|	 ¡ d| k st‚d| |	 ¡ k s<t‚q<d S )Né   iˆ  i˜:  r2   T)Zsquaredr0   r^   r   )rD   r4   r    r;   )r$   r   Zravelr`   Úfit_transformÚmaxrG   Úmin)
re   rh   r4   Zoriginal_distancesZnon_identicalrb   ri   Ú	projectedZprojected_distancesZdistances_ratior"   r"   r#   Ú(test_random_projection_embedding_qualityô   s    
rp   c                  C   sž   t D ]”} | dddd}| t¡ t| t¡tjƒs6t‚t 	t¡}t| |¡tjƒsVt‚| dddd}| t¡}t| t¡tjƒs„t‚t 
| |¡¡st‚qd S )Nr(   Tr   )rD   Zdense_outputr    F)r   ra   re   Ú
isinstancerd   r   ZndarrayrG   r   Ú
csr_matrixr&   )ZSparseRandomProjri   Zsparse_datar"   r"   r#   Ú+test_SparseRandomProj_output_representation  s    


rs   c               
   C   sd  t D ]X} | dddd t¡}|jdks,t‚|jdks:t‚| tkr^|jdksPt‚t|j	ddƒ |j
jdtfksrt‚| t¡}|jtdfksŽt‚| t¡}t||ƒ | ddd}| t¡}t||ƒ t t¡  | td d …d	d
…f ¡ W 5 Q R X | tkr| dddd}| t¡}|jtdfks&t‚|j
jdtfks<t‚|j
jdk sNt‚d|j
jk st‚qd S )Nr^   r   r<   )rD   r    r4   r+   g¸…ëQ¸ž?r:   )r    r4   r;   rF   r*   gü©ñÒMbP?)rD   rO   r    és   éU   )r`   ra   re   rD   rG   Ún_components_r   rO   r   Zdensity_Úcomponents_r   r   rd   r   r   rl   r5   r6   r7   Znnz)rb   ri   Zprojected_1Zprojected_2Zrp2Zprojected_3ro   r"   r"   r#   Ú2test_correct_RandomProjection_dimensions_embedding'  s0    





$
rx   c               
   C   sT   d} t d| t| d ƒƒ\}}tD ].}t t¡ || d d |¡ W 5 Q R X q d S )Né   rF   é   r;   r_   )r$   Úintr`   r5   Zwarnsr   ra   )r   re   rh   rb   r"   r"   r#   Ú1test_warning_n_components_greater_than_n_featuresQ  s
    r|   c                  C   sj   d} t d| t| d ƒƒ\}}tD ]D}|ddd |¡}|ddd t |¡¡}tt|jƒt|jƒƒ q d S )Nry   rF   rz   r9   r;   )rD   r    )	r$   r{   r`   ra   r   rr   r   r'   rw   )r   re   rh   rb   Zrp_denseZ	rp_sparser"   r"   r#   Útest_works_with_sparse_dataZ  s    ÿ ÿr}   c                   C   s   t ddddkst‚dS )zyTest Johnson-Lindenstrauss for small eps.

    Regression test for #17111: before #19374, 32-bit systems would fail.
    r*   çñhãˆµøä>r3   l   JžWN)r
   rG   r"   r"   r"   r#   Ú"test_johnson_lindenstrauss_min_dimh  s    r   Úrandom_projection_clsc                    sV   | dd}|  t¡ | ¡ }| j ¡ ‰ tj‡ fdd„t|jƒD ƒt	d}t
||ƒ d S )Nr:   r_   c                    s   g | ]}ˆ › |› ‘qS r"   r"   )Ú.0Úi©Zclass_name_lowerr"   r#   Ú
<listcomp>w  s     z<test_random_projection_feature_names_out.<locals>.<listcomp>)Údtype)ra   re   Zget_feature_names_outÚ__name__Úlowerr   ÚarrayÚrangerv   Úobjectr   )r€   Úrandom_projectionZ	names_outZexpected_names_outr"   rƒ   r#   Ú(test_random_projection_feature_names_outp  s    


þrŒ   r   )r:   é	   r(   é   r)   r   Úcompute_inverse_componentsTFc              
   C   sâ   d}||||d}t | || | d d |d\}}||fD ]¢}	t ¡   tjddtd | |	¡}
W 5 Q R X |r–t|d	ƒs~t‚|j}|j	||fks–t‚| 
|
¡}|j	|	j	ks°t‚| |¡}t|
d
ƒrÌ|
 ¡ }
t|
|ddd q:d S )Nr(   )rD   r   r    r*   r;   rI   Úignorez>The number of components is higher than the number of features)ÚmessageÚcategoryÚinverse_components_r   gH¯¼šò×z>g»½×Ùß|Û=)ZrtolÚatol)r$   ÚwarningsÚcatch_warningsÚfilterwarningsr   rl   ÚhasattrrG   r“   r   Zinverse_transformrd   r   r   )r   r   r€   r   Zglobal_random_seedrD   r‹   ZX_denseZX_csrÚXro   Zinv_componentsZprojected_backZprojected_againr"   r"   r#   Útest_inverse_transform~  s<    ýü

û


rš   zinput_dtype, expected_dtypec                 C   sT   t j d¡}| dd¡}| dd}| | |¡¡}|jj|ksBt‚|j|ksPt‚d S )Né*   é   é¸  r   rI   )	r   r   r   Úrandrl   Úastyperw   r…   rG   )r€   Zinput_dtypeZexpected_dtyper!   r™   ri   Ztransformedr"   r"   r#   Ú"test_random_projection_dtype_match±  s    
r    c                 C   st   d}t j d¡}| dd¡}| dd}| dd}| | t j¡¡}| | t j¡¡}t|||d t	|j
|j
ƒ d S )Nr~   r›   rœ   r   r   rI   )r”   )r   r   r   rž   rl   rŸ   Úfloat32Úfloat64r   r   rw   )r€   r”   r!   r™   Zrp_32Zrp_64Zprojection_32Zprojection_64r"   r"   r#   Ú,test_random_projection_numerical_consistencyÈ  s    

r£   )r   )GrR   r•   Útypingr   r   Znumpyr   r5   Zscipy.sparseÚsparser   Zsklearn.exceptionsr   Zsklearn.metricsr   Zsklearn.random_projectionr   r   r   r	   r
   Zsklearn.utils._testingr   r   r   r   r   r   Ú__annotations__r   Zall_random_matrixr   r   r`   r$   r'   r   r   r{   r   re   Zdata_csrÚmarkZparametrizer8   r>   rE   rH   rM   rP   rQ   rT   rW   r]   rc   rf   rj   rp   rs   rx   r|   r}   r   rŒ   rš   r¡   r¢   Zint32Zint64r    r£   r"   r"   r"   r#   Ú<module>   sˆ    
ýþ
	


9*	
/



üþ	