a
    �ù»j”  ã                
   @   s¶  d dl Zd dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ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mZ d d	lmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d d
l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ej. /de(e) e* e, ¡dd„ ƒZ0dd„ Z1dd„ Z2ej. /dej3ej4ej5ej6f¡dd„ ƒZ7ej. /dej3ej4ej5ej6f¡dd„ ƒZ8ej. /dd¡dd„ ƒZ9ej. /dg d¢¡dd„ ƒZ:ej. /dej5ej6f¡ej. /de*¡d d!„ ƒƒZ;d"d#„ Z<d$d%„ Z=d&d'„ Z>d(d)„ Z?ej. /de+e, ¡d*d+„ ƒZ@d,d-„ ZAej. /d.d/d0g¡d1d2„ ƒZBd3d4„ ZCd5d6„ ZDej. /d7g d8¢¡ej. /d9g d8¢¡ej. /dg d:¢¡ej. /d;eEd<ƒ¡d=d>„ ƒƒƒƒZFd?d@„ ZGej. /dAejHg dB¢ej3dC�ejHdDd<gej4dC�ge Iej4¡fejHg dB¢ej3dC�ejHdDd<gej6dC�ge Iej6¡fejHg dB¢ej3dC�ejHdEdFgeJdC�ge IeJ¡fg¡dGdH„ ƒZKe L¡ dIdJ„ ƒZMej. /dej5ej6g¡dKdL„ ƒZNej. /dMg dN¢¡ej. /dOg dP¢¡ej. /dQg dR¢¡dSdT„ ƒƒƒZOej. /dej5ej6g¡dUdV„ ƒZPdWdX„ ZQdYdZ„ ZRed[d\„ ƒZSd]d^„ ZTd_d`„ ZUdadb„ ZVdcdd„ ZWej.j/deejHge*¢dfgdgdh„ e*D ƒ di�ej.j/djejHge*¢dfgdkdh„ e*D ƒ di�dldm„ ƒƒZXej. /de*¡dndo„ ƒZYej.j/dpejHge*¢dfgdqdh„ e*D ƒ di�drds„ ƒZZej. /dtdudvg¡dwdx„ ƒZ[dydz„ Z\dS ){é    N)ÚlinalgÚsparse)Úeigh)Úeigsh)Úmake_low_rank_matrixÚmake_sparse_spd_matrix)Úgen_batches)Ú_init_arpack_v0)Úassert_allcloseÚassert_allclose_dense_sparseÚassert_almost_equalÚassert_array_almost_equalÚassert_array_equalÚskip_if_32bit)Ú_approximate_modeÚ_deterministic_vector_sign_flipÚ_incremental_mean_and_varÚ_randomized_eigshÚ_safe_accumulator_opÚ	cartesianÚdensityÚrandomized_svdÚ	row_normsÚsafe_sparse_dotÚsoftmaxÚstable_cumsumÚsvd_flipÚweighted_mode)ÚCOO_CONTAINERSÚCSC_CONTAINERSÚCSR_CONTAINERSÚDOK_CONTAINERSÚLIL_CONTAINERSÚ_modeÚsparse_containerc                 C   sF   t j d¡}|jddd�}d|d< d|d< t| |ƒƒt|ƒksBJ ‚d S )Nr   é
   ©r%   é   ©Úsize)é   é   )r'   é   )ÚnpÚrandomÚRandomStateÚrandintr   )r$   ÚrngÚX© r3   úFE:\soccer\ml_env\Lib\site-packages\sklearn/utils/tests/test_extmath.pyÚtest_density/   s
    r5   c                  C   sh   t j d¡} | jddd�}t  |j¡}dD ]8}t||ƒ\}}t|||d�\}}t||ƒ t||ƒ q*d S )Nr   r%   r&   r(   )Nr   r*   ©Úaxis)	r-   r.   r/   r0   ÚonesÚshaper#   r   r   )r1   ÚxÚweightsr7   ÚmodeÚscoreZmode2Zscore2r3   r3   r4   Útest_uniform_weights<   s    
r>   c                  C   sž   d} t j d¡}|j| dd�}| |j¡}| |d d …d d…f< |d d …d d…f  d7  < t||dd�\}}t|| ƒ t| 	¡ |d d …d d…f  
d¡ƒ d S )Né   r   ©éd   r%   r(   r'   r*   r6   )r-   r.   r/   r0   Úrandom_sampler9   r   r   r   ZravelÚsum)Zmode_resultr1   r:   Úwr<   r=   r3   r3   r4   Útest_random_weightsJ   s    
rE   Údtypec              	   C   sr  d}d}d}d}| t jkrdnd}t  | ¡} t|||ddd�j| d	d
�}|j||fksZJ ‚tj|d	d�\}}}	|j| d	d
�}|j| d	d
�}|	j| d	d
�}	dD �]Î}
t|||
dd�\}}}| j	dkrî|j| ksÐJ ‚|j| ksÞJ ‚|j| ksìJ ‚n4|jt j
ksþJ ‚|jt j
k�sJ ‚|jt j
k�s"J ‚|j||fk�s6J ‚|j|fk�sHJ ‚|j||fk�s\J ‚t|d |… ||d� tt  |d d …d |…f |	d |…d d …f ¡t  ||¡|d� tD ]¶}||ƒ}t|||
dd�\}}}| j	dk�r|j| k�sòJ ‚|j| k�sJ ‚|j| k�sJJ ‚n6|jj	dk�s&J ‚|jj	dk�s8J ‚|jj	dk�sJJ ‚t|d |… |d |… |d� �q´qœd S )NrA   éô  r'   r%   é   ç        r   ©Ú	n_samplesÚ
n_featuresÚeffective_rankZtail_strengthÚrandom_stateF©Úcopy©Zfull_matrices)ÚautoÚLUÚQR©Úpower_iteration_normalizerrN   Úf©Údecimal)r-   Úfloat32rF   r   Úastyper9   r   Úsvdr   ÚkindÚfloat64r   Údotr    )rF   rK   rL   ÚrankÚkrY   r2   ÚUÚsÚVtÚ
normalizerZUaÚsaZVaÚcsr_containerr3   r3   r4   Ú'test_randomized_svd_low_rank_all_dtypes\   sf    
ûú
ÿ
6ÿÿrh   c                 C   sÄ   t j d¡}t  t jg d¢| d�¡}t j |j|jd�¡d }|| |j	 }t
|ddd�\}}|jd	kslJ ‚t|d
dgƒ |jdksˆJ ‚t t¡� t
|ddd� W d  ƒ n1 s¶0    Y  dS )z@Test that `_randomized_eigsh` returns the appropriate componentsé*   )ç      ð?ç       ÀrI   ç      @©rF   r(   r   r+   Úmodule)Ún_componentsÚ	selection)r+   rl   rk   )é   r+   ÚvalueN)r-   r.   r/   ÚdiagÚarrayr   ZqrÚnormalr9   ÚTr   r   ÚpytestZraisesÚNotImplementedError)rF   r1   r2   Zrand_rotÚeigvalsÚeigvecsr3   r3   r4   Útest_randomized_eigsh¬   s    r{   ra   )r%   é2   rA   éÇ   éÈ   c              	   C   sœ  d}t |dd�}t|| dddd�\}}t|| dddddd	�\}}t|||  |d
 fd�\}}| ¡ ddd… }	||	 }|dd…|	f }|j| fks–J ‚t||dd� t||dd� |j|| fksÄJ ‚t |¡j}
t	||
ƒ\}}t	||
ƒ\}}t	||
ƒ\}}t||dd� t||dd� | |k �r˜t
|dd�}t|| ddd|d�\}}| ¡ ddd… }	||	 }t||dd� |dd…|	f }t	||
ƒ\}}t||dd� dS )a&  Check that `_randomized_eigsh` is similar to other `eigsh`

    Tests that for a random PSD matrix, `_randomized_eigsh` provides results
    comparable to LAPACK (scipy.linalg.eigh) and ARPACK
    (scipy.sparse.linalg.eigsh).

    Note: some versions of ARPACK do not support k=n_features.
    r~   r   )rN   rn   é   )ro   rp   Ún_iterrN   é   rT   )ro   r€   Zn_oversamplesrN   rV   rp   r*   )Zsubset_by_indexNéÿÿÿÿr?   rX   rq   ZLA)ÚwhichÚtolÚmaxiterÚv0r%   é   )r   r   r   Zargsortr9   r   r-   Z
zeros_likerv   r   r	   r   )ra   rL   r2   ry   rz   Z
eigvals_qrZ
eigvecs_qrZeigvals_lapackZeigvecs_lapackÚindicesZ
dummy_vecsÚ_r†   Zeigvals_arpackZeigvecs_arpackr3   r3   r4   Ú(test_randomized_eigsh_compared_to_othersÃ   sR    
ÿ
ù
ÿ

ÿ
rŠ   zn,rank))r%   rH   r@   )rA   éP   )rG   r%   )rG   éú   )rG   i�  c                 C   s¢   || k sJ ‚t j d¡}| | |¡}||j }t|||d�\}}tt jj|dd�t  	|j
¡ƒ t|j| t  t  	|j
¡¡ƒ |t  |¡ |j }t||dd� dS )a  Check that randomized_eigsh is able to reconstruct a low rank psd matrix

    Tests that the decomposition provided by `_randomized_eigsh` leads to
    orthonormal eigenvectors, and that a low rank PSD matrix can be effectively
    reconstructed with good accuracy using it.
    éE   )ro   rN   r   r6   r?   rX   N)r-   r.   r/   Úrandnrv   r   r   r   Únormr8   r9   rs   )Únr`   r1   r2   ÚAÚSÚVZA_reconstructr3   r3   r4   Ú&test_randomized_eigsh_reconst_low_rank  s    
r”   rg   c                 C   s
  t j d¡ dd¡}| t ju r$d}nd}|j| dd�}|d jdd	�}t|t|d
d�|ƒ tt  	|¡t|ƒ|ƒ t j
t jfD ]ˆ}||| d�}|t ju rº|jj|dd�|_|jj|dd�|_|jj|ksÊJ ‚|jj|ksÚJ ‚t|t|d
d�|ƒ tt  	|¡t|ƒ|ƒ q|d S )Nri   rA   rq   r'   FrO   r+   r*   r6   T)Zsquaredrm   )r-   r.   r/   rŽ   rZ   r[   rC   r   r   ÚsqrtÚint32Úint64Zindptrrˆ   rF   )rF   rg   r2   Ú	precisionZsq_normZcsr_index_dtypeZXcsrr3   r3   r4   Útest_row_norms0  s"    

r™   c            
      C   s¼   d} d}d}d}t | ||ddd�}|j| |fks4J ‚tj|dd	�\}}}d
D ]j}t||d|dd�\}}}t |d |… | ¡ ¡ dksŠJ ‚t|||dd�\}}	}t|d |… |	dd� qLd S )NrA   rG   r'   r%   çš™™™™™¹?r   rJ   FrQ   ©rR   ÚnonerS   rT   ©r€   rV   rN   g{®Gáz„?rU   r,   rX   ©	r   r9   r   r\   r   r-   ÚabsÚmaxr   ©
rK   rL   r`   ra   r2   r‰   rc   re   rf   Zsapr3   r3   r4   Ú'test_randomized_svd_low_rank_with_noiseL  s,    û
ÿ"ÿr¢   c            
      C   s¾   d} d}d}d}t | ||ddd�}|j| |fks4J ‚tj|dd	�\}}}d
D ]l}t||d|dd�\}}}t |d |… | ¡ ¡ dksŠJ ‚t||d|dd�\}}	}t|d |… |	dd� qLd S )NrA   rG   r'   r%   rj   r   rJ   FrQ   r›   r�   rš   r,   rX   rž   r¡   r3   r3   r4   Ú!test_randomized_svd_infinite_ranku  s,    û
ÿ"
ÿr£   c               	   C   s\  d} d}d}d}t | ||ddd�}|j| |fks4J ‚t||dd	dd
�\}}}t||dddd
�\}}	}
t||dddd
�\}}}tj|d	d�\}}}t||d |… dd� t|	|d |… dd� t||d |… dd� tt ||¡t |d d …d |…f |d |…d d …f ¡dd� tt ||
¡t |d d …d |…f |d |…d d …f ¡dd� t|	|ƒ d S )NrA   rG   rq   r%   g      à?r   rJ   r,   F)r€   Ú	transposerN   TrR   rQ   rX   r+   )r   r9   r   r   r\   r   r-   r_   )rK   rL   r`   ra   r2   ÚU1Ús1ÚV1ÚU2Ús2ÚV2ZU3Zs3ZV3ZU4Zs4ZV4r3   r3   r4   Ú)test_randomized_svd_transpose_consistencyž  s,    û>>r«   c               	   C   s‚  t j d¡} tddd| d�}|d| jdd|jd	� 7 }d}t||dd
dd�\}}}|| t  |¡ |¡¡ }t	j
|dd�}t||dd
dd�\}}}|| t  |¡ |¡¡ }t	j
|dd�}t  || ¡dksÐJ ‚dD ]¨}	t||d|	dd�\}}}|| t  |¡ |¡¡ }t	j
|dd�}dD ]^}
t|||
|	dd�\}}}|| t  |¡ |¡¡ }t	j
|dd�}dt  || ¡k�sJ ‚�qqÔd S )Nri   rA   rG   r|   ©rM   rN   r,   r   r+   r(   rœ   r�   Zfro)Úordr�   )rS   rT   rR   )r'   r%   r|   é   )r-   r.   r/   r   r0   r9   r   r_   rs   r   r�   rŸ   )r1   r2   ro   rb   rc   rd   r‘   Zerror_2Zerror_20re   ÚiÚerrorr3   r3   r4   Ú.test_randomized_svd_power_iteration_normalizer¾  sH    
ÿ
ÿûûr±   c                 C   sx   t j d¡}tddd|d�}d}| |ƒ}d | j¡}tjtj	|d��  t
||d	d
d� W d   ƒ n1 sj0    Y  d S )Nri   r|   r�   r%   r¬   r'   zCCalculating SVD of a {} is expensive. csr_matrix is more efficient.)Úmatchr*   rœ   )r€   rV   )r-   r.   r/   r   ÚformatÚ__name__rw   Úwarnsr   ZSparseEfficiencyWarningr   )r$   r1   r2   ro   Zwarn_msgr3   r3   r4   Ú#test_randomized_svd_sparse_warningsë  s    ÿÿr¶   c                  C   s  t j d¡} d}d}|  ||¡}tj|dd�\}}}t||dd�\}}tt  || |¡|dd� |j	}	tj|	dd�\}}}t||d	d�\}
}tt  |
| |¡|	dd� t||d	d�\}}tt  || |¡|	dd� t||dd�\}}tt  || |¡|	dd� d S )
NéÏ  r�   r%   FrQ   ©Zu_based_decisionr?   rX   T)
r-   r.   r/   rŽ   r   r\   r   r   r_   rv   )ÚrsrK   rL   r2   rb   r’   rd   r¥   r§   ZXTr¨   rª   ZU_flip1ZV_flip1ZU_flip2ZV_flip2r3   r3   r4   Útest_svd_flipü  s    rº   zn_samples, n_features)r,   rq   )rq   r,   c                 C   sÄ   t j |¡}| | |¡}tj|dd�\}}}t||dd�\}}t jt  |¡dd�}	||	t  	|j
d ¡f dk ¡ svJ ‚t||dd�\}}
t jt  |
¡dd�}|
t  	|
j
d ¡|f dk ¡ sÀJ ‚d S )NFrQ   Tr¸   r   r6   r*   )r-   r.   r/   rŽ   r   r\   r   ÚargmaxrŸ   Úaranger9   Úall)rK   rL   Zglobal_random_seedr¹   r2   rb   r‰   rd   r¥   Zmax_abs_U1_row_idx_for_colrª   Zmax_abs_V2_col_idx_for_rowr3   r3   r4   Útest_svd_flip_max_abs_cols  s    $r¾   c                  C   s²   t  ddgddgg¡} t| dddd�\}}}tdƒD ]x}t| dd|d�\}}}t||ƒ t||ƒ tt  || |¡| ƒ tt  |j|¡t  d¡ƒ tt  |j|¡t  d¡ƒ q4d S )	Ng       @rI   rj   r+   Té)   ©Ú	flip_signrN   r%   )r-   rt   r   Úranger   r_   rv   Úeye)ÚaÚu1r¦   Zv1ÚseedÚu2r©   Zv2r3   r3   r4   Útest_randomized_svd_sign_flip$  s    

rÈ   c            	      C   sˆ   dd„ } t  d¡ dd¡}t|dddd	�\}}}| ||ƒ\}}|sFJ ‚|rNJ ‚t|ddddd
�\}}}| ||ƒ\}}|s|J ‚|r„J ‚d S )Nc                 S   sL   t  | ¡jdd�| jdd�k ¡ }t  |¡jdd�|jdd�k ¡ }||fS )z˜
        returns bool tuple indicating if the values maximising np.abs
        are positive across all rows for u and across all columns for v.
        r   r6   r*   )r-   rŸ   r    r½   )ÚuÚvÚu_basedÚv_basedr3   r3   r4   Úmax_loading_is_positive5  s    ""zMtest_randomized_svd_sign_flip_with_transpose.<locals>.max_loading_is_positiver‹   r%   r‚   r,   Tr   rÀ   )rÁ   r¤   rN   )r-   r¼   Úreshaper   )	rÍ   ZmatZ	u_flippedr‰   Z	v_flippedrË   rÌ   Zu_flipped_with_transposeZv_flipped_with_transposer3   r3   r4   Ú,test_randomized_svd_sign_flip_with_transpose0  s    	
ÿÿrÏ   r�   )r|   rA   é,  Úm)r%   r�   r|   rÆ   r'   c                 C   s¨   t j |¡}| | |¡}t||ddd�\}}}t||ddd�\}	}
}|j|	jksTJ ‚t||	ddd� |j|
jkstJ ‚t||
ddd� |j|jks”J ‚t||ddd� d S )NZgesddr   )Zsvd_lapack_driverrN   Zgesvdgü©ñÒMbP?)ÚatolÚrtol)r-   r.   r/   Úrandr   r9   r
   )r�   rÑ   ra   rÆ   r1   r2   rÅ   r¦   Zvt1rÇ   r©   Zvt2r3   r3   r4   Ú!test_randomized_svd_lapack_driverQ  s    rÕ   c                  C   s¸   t  g d¢¡t  ddg¡t  ddg¡f} t  g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g¡}t| ƒ}t||ƒ t  d¡}t|d d …t jf t|fƒƒ d S )N©r*   r+   r,   rq   r'   r?   rH   )r*   rq   r?   )r*   rq   rH   )r*   r'   r?   )r*   r'   rH   )r+   rq   r?   )r+   rq   rH   )r+   r'   r?   )r+   r'   rH   )r,   rq   r?   )r,   rq   rH   )r,   r'   r?   )r,   r'   rH   r,   )r-   rt   r   r   r¼   Únewaxis)ZaxesZtrue_outÚoutr:   r3   r3   r4   Útest_cartesiank  s(    (ôÿ

rÙ   zarrays, output_dtyperÖ   rm   rq   r:   Úyc                 C   s   t | ƒ}|j|ksJ ‚dS )z8Check that the cartesian product works with mixed types.N)r   rF   )ZarraysZoutput_dtypeÚoutputr3   r3   r4   Útest_cartesian_mix_types‰  s    rÜ   c                   C   s   t j d¡S )Nri   )r-   r.   r/   r3   r3   r3   r4   r1   ¡  s    r1   c           
      C   sŠ   d}|   dd¡ |¡| }|   |jd ¡| }t|ddd|d�\}}}tj||dd�}tj|d |dd�|d  }	t||ƒ t||	ƒ d S )Nr%   éè  r�   r   ©Úsample_weight©r;   r7   r+   )rÔ   r[   r9   r   r-   Úaverager   )
r1   rF   Zmultr2   rß   ÚmeanÚvarr‰   Úexpected_meanÚexpected_varr3   r3   r4   Ú2test_incremental_weighted_mean_and_variance_simple¦  s    
ræ   râ   )r   ç    ÐcAg    ÐcÁrã   )r*   ç:Œ0âŽyE>g     jø@zweight_loc, weight_scale))r   r*   )r   rè   )r*   rè   )r%   r*   )rç   r*   c                 C   sº   dd„ }d}|j |||d d�}|j | ||d�}ttj||dd�}	ttj||	 d |dd�}
||||	|
ƒ |j | ||d�}t |d ¡}ttj|dd�}	ttj|dd�}
||||	|
ƒ d S )	Nc           
   	   S   sŒ   | j d }d|d d |d d |d d |fD ]V}d\}}}t||ƒD ]$}	t| |	 |||||	 d�\}}}qHt||ƒ t||dd	� q0d S )
Nr   r*   r%   rq   r+   )r   r   r   rÞ   ç�íµ ÷Æ°>)rÒ   )r9   r   r   r
   )
r2   rß   rä   rå   r�   Ú
chunk_sizeÚ	last_meanZlast_weight_sumZlast_varÚbatchr3   r3   r4   Ú_assert¼  s    
*
û
z<test_incremental_weighted_mean_and_variance.<locals>._assert)rA   r�   r   )ÚlocÚscaler)   rà   r+   r6   )ru   r   r-   rá   r8   râ   rã   )râ   rã   Z
weight_locZweight_scaler1   rí   r)   Úweightr2   rä   rå   Zones_weightr3   r3   r4   Ú+test_incremental_weighted_mean_and_variance³  s    	ÿrñ   c              	   C   sø   t  g d¢¡}t  g d¢¡}t jg d¢t jd�}t  d¡}t  d¡}t  g d¢g d¢g d	¢g¡ | ¡}t  d
t jd
d
gt jd
ddgddt jdgdddt jgg¡ | ¡}t|||||d�\}}	}
t|||||d�\}}}t||ƒ t||	ƒ t||
ƒ d S )N©ç     ¸€@ró   ró   ró   ©ç     �°@rõ   rõ   rõ   ©r+   r+   r+   r+   rm   r,   rq   ©éª   rø   rø   rø   ©é®  rú   rú   rú   ©rÐ   rÐ   rÐ   rÐ   rø   rú   rÐ   rÞ   )r-   rt   r–   r8   r[   Únanr   r
   )rF   Ú	old_meansÚold_variancesZold_weight_sumZsample_weights_XZsample_weights_X_nanr2   ÚX_nanÚX_meansÚX_variancesÚX_countÚX_nan_meansÚX_nan_variancesÚX_nan_countr3   r3   r4   Ú6test_incremental_weighted_mean_and_variance_ignore_nanÞ  s@    

ÿþüÿù	
ÿû

r  c            
      C   sÖ   t  g d¢g d¢g d¢g d¢g¡j} d}| d |…d d …f }| |d …d d …f }|jdd�}|jdd�}t j|jd |jd t jd�}t||||ƒ\}}}	t	|| jdd�dƒ t	|| jdd�dƒ t	|	| jd ƒ d S )N)iX  iÖ  rø   rú   rÐ   r+   r   r6   r*   rm   r?   )
r-   rt   rv   râ   rã   Úfullr9   r–   r   r   )
r‘   ÚidxZX1ZX2rý   rþ   Úold_sample_countZfinal_meansZfinal_variancesZfinal_countr3   r3   r4   Ú)test_incremental_variance_update_formulas  s&    üÿÿ
r
  c               	   C   sÐ   t  g d¢¡} t  g d¢¡}t jg d¢t jd�}t  g d¢g d¢g d¢g¡}t  dt jddgt jdd	d	gd	d	t jd
gd
d
d
t jgg¡}t|| ||ƒ\}}}t|| ||ƒ\}}	}
t||ƒ t|	|ƒ t|
|ƒ d S )Nrò   rô   rö   rm   r÷   rù   rû   rø   rú   rÐ   )r-   rt   r–   rü   r   r
   )rý   rþ   r	  r2   rÿ   r   r  r  r  r  r  r3   r3   r4   Ú-test_incremental_mean_and_variance_ignore_nan  s(    üÿ	ÿ
ÿ


r  c                  C   s   dd„ } dd„ }dd„ }dd„ }d	}d
}d}t jdt jd�}t jdt jd�}t j|d
 |f|t jd�}	t j|d
 |f|t jd�}
t  |	|
f¡}t  | |ƒ||ƒ ¡ ¡ |ks°J ‚|	dd d …f t  |¡|d
   }}}t	|
j
d ƒD ]$}||
|d d …f |||ƒ\}}}qä||j
d k�sJ ‚t  |jdd�| ¡ ¡ dk�sBJ ‚t  | |ƒ| ¡ ¡ |k�sbJ ‚|	dd d …f t  |¡ }}t j||d
 t jd�}t	|
j
d ƒD ]6}t|
|d d …f  d|
j
d f¡|||ƒ\}}}�q¢t||j
d ƒ t|jdd�|ƒ |t  | |ƒ| ¡ ¡ k�sJ ‚d S )Nc                 S   s   | j dd�S )Nr   r6   )rã   )r‘   r3   r3   r4   Únp_var=  s    z=test_incremental_variance_numerical_stability.<locals>.np_varc                 S   s:   | j d }| d jdd�| }| jdd�| d }|| S )Nr   r+   r6   )r9   rC   )r2   r�   Zexp_x2Zexpx_2r3   r3   r4   Úone_pass_varB  s    
zCtest_incremental_variance_numerical_stability.<locals>.one_pass_varc                 S   s*   | j dd�}|  ¡ }tj || d dd�S )Nr   r6   r+   )râ   rP   r-   )r2   râ   ÚYr3   r3   r4   Útwo_pass_varK  s    zCtest_incremental_variance_numerical_stability.<locals>.two_pass_varc                 S   sJ   |d }|t |ƒ }| | ||  }|| | | | |  |  }|||fS )Nr*   )Úfloat)r:   rë   Zlast_varianceZlast_sample_countZupdated_sample_countZsamples_ratioZupdated_meanZupdated_variancer3   r3   r4   Únaive_mean_variance_updateS  s    ÿÿzQtest_incremental_variance_numerical_stability.<locals>.naive_mean_variance_updater~   r+   i'  g    „×—Arm   gñhãˆµøä>r   r6   ré   r*   )r-   rt   r^   Úlogr  ZvstackrŸ   r    ZzerosrÂ   r9   râ   r–   r   rÎ   r   r   )r  r  r  r  r„   rL   rK   Úx1Zx2ZA0ÚA1r‘   râ   rã   r�   r¯   r3   r3   r4   Ú-test_incremental_variance_numerical_stability9  s8    	"&"$ $ÿr  c                  C   s\  t j d¡} |  dd¡}|j\}}dD �].}t  d|jd |¡}|d |jd kr`t  ||g¡}t|d d… |dd … ƒD ]Ú\}}|||…d d …f }|dkrà|jdd�}	|j	dd�}
|jd }t j
|jd |jd t jd	�}n&t||	|
|ƒ}|\}	}
}||jd 7 }t j|d |… dd�}t j	|d |… dd�}t|	|d
ƒ t|
|d
ƒ t||ƒ qzq&d S )Nr·   r|   r%   )é   r�   é%   r   r‚   r*   r6   rm   r?   )r-   r.   r/   rŽ   r9   r¼   ZhstackÚziprâ   rã   r  r–   r   r   r   )r1   r2   rK   rL   Z
batch_sizeZstepsr¯   Újrì   Zincremental_meansZincremental_variancesZincremental_countZsample_countÚresultZcalculated_meansZcalculated_variancesr3   r3   r4   Útest_incremental_variance_ddof‚  s0    

"
 ÿ
r  c                  C   s„   t j d¡ dd¡} t jt  | ¡dd�}t| ƒ}t j|dd�}t||ƒ t  | t	| j
d ƒ|f ¡}t| ||d d …t jf  ƒ d S )Né$   r'   r*   r6   r   )r-   r.   r/   rŽ   r»   rŸ   r   r   ÚsignrÂ   r9   r×   )ÚdataZmax_abs_rowsZdata_flippedZmax_rowsZsignsr3   r3   r4   Útest_vector_sign_flip¢  s    
r  c                  C   sL   t j d¡} |  dd¡}t  |¡}t j|dd� d¡}tt|ƒ|| ƒ d S )Nr   r,   r'   r*   r6   )r‚   r*   )	r-   r.   r/   rŽ   ÚexprC   rÎ   r   r   )r1   r2   Zexp_XZ	sum_exp_Xr3   r3   r4   Útest_softmax­  s
    
r!  c                  C   sÔ   t tg d¢ƒt g d¢¡ƒ tj d¡ d¡} t t	¡� t| ddd� W d   ƒ n1 s\0    Y  tj d¡j
ddd�}t t|dd	�tj|dd	�ƒ t t|d
d	�tj|d
d	�ƒ t t|dd	�tj|dd	�ƒ d S )NrÖ   r   i † )rÓ   rÒ   r  rÝ   )r'   r'   r'   r(   r6   r*   r+   )r   r   r-   Zcumsumr.   r/   rÔ   rw   rµ   ÚRuntimeWarningr0   )Úrr‘   r3   r3   r4   Útest_stable_cumsumµ  s    ,r$  ÚA_containerZdensec                 C   s   g | ]
}|j ‘qS r3   ©r´   ©Ú.0Ú	containerr3   r3   r4   Ú
<listcomp>Å  ó    r*  )ZidsÚB_containerc                 C   s   g | ]
}|j ‘qS r3   r&  r'  r3   r3   r4   r*  Ê  r+  c                 C   sX   t j d¡}| d¡}| d¡}t  ||¡}| |ƒ}||ƒ}t||dd�}t||ƒ d S )Nr   ©é   r%   )r%   r�   T©Údense_output©r-   r.   r/   rB   r_   r   r
   )r%  r,  r1   r‘   ÚBÚexpectedÚactualr3   r3   r4   Útest_safe_sparse_dot_2dÂ  s    

r5  c                 C   sˆ   t j d¡}| d¡}| d¡}t  ||¡}| |ƒ}t||ƒ}t||ƒ | d¡}| d¡}t  ||¡}| |ƒ}t||ƒ}t||ƒ d S )Nr   )r+   r,   rq   r'   r?   )r?   rH   )r+   r,   )rq   r'   r,   r?   r1  )rg   r1   r‘   r2  r3  r4  r3   r3   r4   Útest_safe_sparse_dot_ndÚ  s    






r6  r)  c                 C   s   g | ]
}|j ‘qS r3   r&  r'  r3   r3   r4   r*  ò  r+  c                 C   sv   t j d¡}| d¡}| d¡}t  ||¡}t| |ƒ|ƒ}t||ƒ | d¡}t  ||¡}t|| |ƒƒ}t||ƒ d S )Nr   r%   r-  )r%   r.  r1  )r)  r1   r2  r‘   r3  r4  r3   r3   r4   Útest_safe_sparse_dot_2d_1dï  s    



r7  r0  TFc                 C   sv   t j d¡}tjddd|d�}tjddd|d�}| |¡}t||| d�}t |¡|  ks\J ‚| rh| ¡ }t||ƒ d S )Nr   r.  r%   rš   )r   rN   r�   r/  )	r-   r.   r/   r   r_   r   ÚissparseZtoarrayr   )r0  r1   r‘   r2  r3  r4  r3   r3   r4   Ú!test_safe_sparse_dot_dense_output  s    
r9  c                  C   s4   t jddgt jd�} t| ddd�}t|ddgƒ d	S )
a  Make sure sklearn.utils.extmath._approximate_mode returns valid
    results for cases where "class_counts * n_draws" is enough
    to overflow 32-bit signed integer.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20774
    i¸‚ rÝ   rm   i¨a  r   )Zclass_countsZn_drawsr1   i®`  rŒ   N)r-   rt   r–   r   r   )r2   Úretr3   r3   r4   Útest_approximate_mode  s    r;  )]Únumpyr-   rw   Zscipyr   r   Zscipy.linalgr   Zscipy.sparse.linalgr   Zsklearn.datasetsr   r   Zsklearn.utilsr   Zsklearn.utils._arpackr	   Zsklearn.utils._testingr
   r   r   r   r   r   Zsklearn.utils.extmathr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsklearn.utils.fixesr   r   r    r!   r"   r#   ÚmarkZparametrizer5   r>   rE   r–   r—   rZ   r^   rh   r{   rŠ   r”   r™   r¢   r£   r«   r±   r¶   rº   r¾   rÈ   rÏ   rÂ   rÕ   rÙ   rt   rF   ÚobjectrÜ   Zfixturer1   ræ   rñ   r  r
  r  r  r  r  r!  r$  r5  r6  r7  r9  r;  r3   r3   r3   r4   Ú<module>   sÐ    @ 
þ
	
O

Gþ
)) -

!&
þ&
þ$þ÷þ


ÿ&
$
H 
ý
ý

ý

