U
    ½mœdýŽ  ã                
   @   sÖ  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	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 d dlmZmZ d dlmZ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% d dlm&Z& d dl'm(Z(m)Z) dd„ Z*dd„ Z+d d!„ Z,d"d#„ Z-d$d%„ Z.e	j/ 0d&ej1ej2ej3ej4f¡d'd(„ ƒZ5e	j/ 0d&ej1ej2ej3ej4f¡d)d*„ ƒZ6e	j/ 0d+d,¡d-d.„ ƒZ7e	j/ 0d/d0d1d2d3d4d5g¡d6d7„ ƒZ8e	j/ 0d&ej3ej4f¡d8d9„ ƒZ9d:d;„ Z:d<d=„ Z;d>d?„ Z<d@dA„ Z=dBdC„ Z>dDdE„ Z?dFdG„ Z@dHdI„ ZAe	j/ 0dJdKdLdMg¡e	j/ 0dNdKdLdMg¡e	j/ 0d+dOdPdKg¡e	j/ 0dQeBdRƒ¡dSdT„ ƒƒƒƒZCdUdV„ ZDe	j/ 0dWejEdXdYdZgej1d[�ejEd\dRgej2d[�ge Fej2¡fejEdXdYdZgej1d[�ejEd\dRgej4d[�ge Fej4¡fejEdXdYdZgej1d[�ejEd]d^geGd[�ge FeG¡fg¡d_d`„ ƒZHdadb„ ZIe	 J¡ dcdd„ ƒZKe	j/ 0d&ej3ej4g¡dedf„ ƒZLe	j/ 0dgd dhdig¡e	j/ 0djdXdkdlg¡e	j/ 0dmdndodpdqdrg¡dsdt„ ƒƒƒZMe	j/ 0d&ej3ej4g¡dudv„ ƒZNdwdx„ ZOdydz„ ZPed{d|„ ƒZQd}d~„ ZRdd€„ ZSd�d‚„ ZTdƒd„„ ZUe	j/j0d…ejEejVgd†d‡gdˆ�e	j/j0d‰ejEejVgd†d‡gdˆ�dŠd‹„ ƒƒZWdŒd�„ ZXe	j/j0d…ejEejVgd†d‡gdˆ�dŽd�„ ƒZYe	j/ 0d�d‘d’g¡d“d”„ ƒZZdS )•é    N)Úsparse)Úlinalg)Úeigsh)Úexpit)Úgen_batches)Ú_init_arpack_v0)Úassert_almost_equal)Úassert_allclose)Úassert_allclose_dense_sparse)Úassert_array_equal)Úassert_array_almost_equal)Úskip_if_32bit)Ú_modeÚ_eigh)ÚdensityÚ_safe_accumulator_op)Úrandomized_svdÚ_randomized_eigsh)Ú	row_norms)Úweighted_mode)Ú	cartesian)Úlog_logistic)Úsvd_flip)Ú_incremental_mean_and_var)Ú_deterministic_vector_sign_flip)Úsoftmax)Ústable_cumsum)Úsafe_sparse_dot)Úmake_low_rank_matrixÚmake_sparse_spd_matrixc                  C   s|   t j d¡} | jddd�}d|d< d|d< t |¡}t |¡}t |¡}t |¡}||||fD ]}t	|ƒt	|ƒks^t
‚q^d S )Nr   é
   ©r    é   ©Úsize)é   é   )r"   é   )ÚnpÚrandomÚRandomStateÚrandintr   Ú
csr_matrixZ
csc_matrixZ
coo_matrixÚ
lil_matrixr   ÚAssertionError)ÚrngÚXZX_csrZX_cscZX_cooZX_lilZX_© r1   úY/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/utils/tests/test_extmath.pyÚtest_density&   s    



r3   c               	   C   sD   t  dddgdddgg¡} tjtdd�� t| dd	� W 5 Q R X d
S )zGCheck that future warning is raised when user enters keyword arguments.r%   r&   r'   é   r"   é   z^Additional keyword arguments are deprecated in version 1.2 and will be removed in version 1.4.©Úmatch)ÚaN)r(   ÚarrayÚpytestÚwarnsÚFutureWarningr   )Z
test_arrayr1   r1   r2   Útest_density_deprecated_kwargs5   s    ýr=   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*   r+   ÚonesÚshaper   r   r   )r/   ÚxÚweightsr?   ÚmodeÚscoreZmode2Zscore2r1   r1   r2   Útest_uniform_weightsB   s    
rF   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 )Nr5   r   ©éd   r    r#   r"   r%   r>   )r(   r)   r*   r+   Úrandom_samplerA   r   r   r   ZravelÚsum)Zmode_resultr/   rB   ÚwrD   rE   r1   r1   r2   Útest_random_weightsP   s    
rL   c              	   C   sh  d}d}d}d}| t jkrdnd}t  | ¡} t|||ddd�j| d	d
�}|j||fksZt‚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Ðt‚|j| ksÞt‚|j| ksìt‚n4|jt jksþt‚|jt jk�st‚|jt jk�s"t‚|j||fk�s6t‚|j|fk�sHt‚|j||fk�s\t‚t|d |… ||d� tt  |d d …d |…f |	d |…d d …f ¡t  ||¡|d� t |¡}t	|||
dd�\}}}| j
dk�r|j| k�sìt‚|j| k�süt‚|j| k�sDt‚n6|jj
dk�s t‚|jj
dk�s2t‚|jj
dk�sDt‚t|d |… |d |… |d� qœd S )NrH   éô  r"   r    é   ç        r   ©Ú	n_samplesÚ
n_featuresÚeffective_rankZtail_strengthÚrandom_stateF©Úcopy©Zfull_matrices)ÚautoÚLUÚQR©Úpower_iteration_normalizerrT   Úf©Údecimal)r(   Úfloat32Údtyper   ÚastyperA   r.   r   Úsvdr   ÚkindÚfloat64r   Údotr   r,   )ra   rQ   rR   ÚrankÚkr_   r0   ÚUÚsÚVtÚ
normalizerZUaÚsaZVar1   r1   r2   Úcheck_randomized_svd_low_rankb   sv    
û ú
   ÿ
* 
 ÿ
   ÿrn   ra   c                 C   s   t | ƒ d S ©N)rn   ©ra   r1   r1   r2   Ú'test_randomized_svd_low_rank_all_dtypes°   s    rq   c              	   C   s´   t j d¡}t  t jddddg| d�¡}t j |j|jd�¡d }|| |j	 }t
|d	d
d�\}}|jdkspt‚t|ddgƒ |jdksŒt‚t t¡� t
|d	dd� W 5 Q R X dS )z@Test that `_randomized_eigsh` returns the appropriate componentsé*   ç      ð?g       ÀrO   g      @rp   r#   r   r&   Úmodule)Ún_componentsÚ	selection)r&   )r4   r&   ÚvalueN)r(   r)   r*   Údiagr9   r   ZqrÚnormalrA   ÚTr   r.   r   r:   ZraisesÚNotImplementedError)ra   r/   r0   Zrand_rotÚeigvalsÚeigvecsr1   r1   r2   Útest_randomized_eigshµ   s    r~   rh   )r    é2   rH   éÇ   éÈ   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–t‚t||dd� t||dd� |j|| fksÄt‚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   )rT   rt   é   )ru   rv   Ún_iterrT   é   rZ   )ru   rƒ   Zn_oversamplesrT   r\   rv   r%   )Zsubset_by_indexNéÿÿÿÿr5   r^   r4   ZLA)ÚwhichÚtolÚmaxiterÚv0r    é   )r   r   r   ZargsortrA   r.   r   r(   Z
zeros_likerz   r   r   r   )rh   rR   r0   r|   r}   Z
eigvals_qrZ
eigvecs_qrZeigvals_lapackZeigvecs_lapackÚindicesZ
dummy_vecsÚ_r‰   Zeigvals_arpackZeigvecs_arpackr1   r1   r2   Ú(test_randomized_eigsh_compared_to_othersÌ   sf        ÿ
ù
 ÿ

     ÿ
r�   zn,rank)r    rN   rG   )rH   éP   )rM   r    )rM   éú   )rM   i�  c                 C   s¢   || k st ‚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   )ru   rT   r   r>   r5   r^   N)r.   r(   r)   r*   Úrandnrz   r   r   r   Únormr@   rA   rx   )Únrg   r/   r0   ÚAÚSÚVZA_reconstructr1   r1   r2   Ú&test_randomized_eigsh_reconst_low_rank  s    
r—   c                 C   s  t j d¡ dd¡}| t jkr$d}nd}|j| dd�}|d jdd	�}t|t|d
d�|ƒ tt  	|¡t|ƒ|ƒ t j
t jfD ]Š}tj|| d�}|t jkr¼|jj|dd�|_|jj|dd�|_|jj|ksÌt‚|jj|ksÜt‚t|t|d
d�|ƒ tt  	|¡t|ƒ|ƒ q|d S )Nrr   rH   r4   r"   FrU   r&   r%   r>   T)Zsquaredrp   )r(   r)   r*   r‘   r`   rb   rJ   r   r   ÚsqrtÚint32Úint64r   r,   Zindptrr‹   ra   r.   )ra   r0   Ú	precisionZsq_normZcsr_index_dtypeZXcsrr1   r1   r2   Útest_row_norms9  s"    

rœ   c            
      C   s¼   d} d}d}d}t | ||ddd�}|j| |fks4t‚tj|dd	�\}}}d
D ]j}t||d|dd�\}}}t |d |… | ¡ ¡ dksŠt‚t|||dd�\}}	}t	|d |… |	dd� qLd S )NrH   rM   r"   r    çš™™™™™¹?r   rP   FrW   ©rX   ÚnonerY   rZ   ©rƒ   r\   rT   g{®Gáz„?r[   r'   r^   ©
r   rA   r.   r   rc   r   r(   ÚabsÚmaxr   ©
rQ   rR   rg   rh   r0   rŒ   rj   rl   rm   Zsapr1   r1   r2   Ú'test_randomized_svd_low_rank_with_noiseT  s:    û    ÿ"   ÿr¥   c            
      C   s¾   d} d}d}d}t | ||ddd�}|j| |fks4t‚tj|dd	�\}}}d
D ]l}t||d|dd�\}}}t |d |… | ¡ ¡ dksŠt‚t||d|dd�\}}	}t	|d |… |	dd� qLd S )NrH   rM   r"   r    rs   r   rP   FrW   rž   r    r�   r'   r^   r¡   r¤   r1   r1   r2   Ú!test_randomized_svd_infinite_rank}  s<    û    ÿ"    ÿr¦   c               	   C   s\  d} d}d}d}t | ||ddd�}|j| |fks4t‚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 )NrH   rM   r4   r    g      à?r   rP   r'   F)rƒ   Ú	transposerT   TrX   rW   r^   r&   )	r   rA   r.   r   r   rc   r   r(   rf   )rQ   rR   rg   rh   r0   ÚU1Ús1ÚV1ÚU2Ús2ÚV2ZU3Zs3ZV3ZU4Zs4ZV4r1   r1   r2   Ú)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Ðt‚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t‚�qqÔd S )Nrr   rH   rM   r   ©rS   rT   r'   r   r&   r#   rŸ   r    Zfro)Úordr„   )rY   rZ   rX   )r"   r    r   é   )r(   r)   r*   r   r+   rA   r   rf   rx   r   r’   r¢   r.   )r/   r0   ru   ri   rj   rk   r”   Zerror_2Zerror_20rl   ÚiÚerrorr1   r1   r2   Ú.test_randomized_svd_power_iteration_normalizerÆ  sX        ÿ    ÿûûr´   c               
   C   sv   t j d¡} tddd| d�}d}tjtjfD ]D}||ƒ}d |j¡}t	j
tj|d�� t||d	d
d� W 5 Q R X q,d S )Nrr   r   r„   r    r¯   r"   zCCalculating SVD of a {} is expensive. csr_matrix is more efficient.r6   r%   rŸ   )rƒ   r\   )r(   r)   r*   r   r   r-   Z
dok_matrixÚformatÚ__name__r:   r;   ZSparseEfficiencyWarningr   )r/   r0   ru   ÚclsZwarn_msgr1   r1   r2   Ú#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    FrW   )Zu_based_decisionr5   r^   T)
r(   r)   r*   r‘   r   rc   r   r   rf   rz   )ÚrsrQ   rR   r0   ri   r•   rk   r¨   rª   ZXTr«   r­   ZU_flip1ZV_flip1ZU_flip2ZV_flip2r1   r1   r2   Útest_svd_flip  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       @rO   rs   r&   Té)   ©Ú	flip_signrT   r    )r(   r9   r   Úranger   rf   rz   Úeye)r8   Úu1r©   Zv1ÚseedÚu2r¬   Zv2r1   r1   r2   Útest_randomized_svd_sign_flip  s    

rÄ   c            	      C   sˆ   dd„ } t  d¡ dd¡}t|dddd	�\}}}| ||ƒ\}}|sFt‚|rNt‚t|ddddd
�\}}}| ||ƒ\}}|s|t‚|r„t‚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   r>   r%   )r(   r¢   r£   Úall)ÚuÚvÚu_basedÚv_basedr1   r1   r2   Úmax_loading_is_positive,  s    ""zMtest_randomized_svd_sign_flip_with_transpose.<locals>.max_loading_is_positiverŽ   r    r…   r'   Tr   r½   )r¾   r§   rT   )r(   ÚarangeÚreshaper   r.   )	rÊ   ÚmatZ	u_flippedrŒ   Z	v_flippedrÈ   rÉ   Zu_flipped_with_transposeZv_flipped_with_transposer1   r1   r2   Ú,test_randomized_svd_sign_flip_with_transpose'  s&    	    ÿ ÿrÎ   r“   r   rH   é,  Úmr    r„   rÂ   r"   c                 C   s¨   t j |¡}| | |¡}t||ddd�\}}}t||ddd�\}	}
}|j|	jksTt‚t||	ddd� |j|
jkstt‚t||
ddd� |j|jks”t‚t||ddd� d S )NZgesddr   )Zsvd_lapack_driverrT   Zgesvdgü©ñÒMbP?)ÚatolÚrtol)r(   r)   r*   Úrandr   rA   r.   r	   )r“   rÐ   rh   rÂ   r/   r0   rÁ   r©   Zvt1rÃ   r¬   Zvt2r1   r1   r2   Ú!test_randomized_svd_lapack_driverH  s    rÔ   c                  C   sÒ   t  dddg¡t  ddg¡t  ddg¡f} t  dddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgg¡}t| ƒ}t||ƒ t  d¡}t|d d …t jf t|fƒƒ d S )Nr%   r&   r'   r4   r"   r5   rN   )r(   r9   r   r   rË   Únewaxis)ZaxesZtrue_outÚoutrB   r1   r1   r2   Útest_cartesianb  s(    *ôÿ

r×   zarrays, output_dtyper%   r&   r'   rp   r4   rB   Úyc                 C   s   t | ƒ}|j|kst‚dS )z8Check that the cartesian product works with mixed types.N)r   ra   r.   )ZarraysZoutput_dtypeÚoutputr1   r1   r2   Útest_cartesian_mix_types€  s    rÚ   c                  C   sL   dd„ } t  ddd¡}tt|ƒ| |ƒƒ t  ddg¡}tt|ƒdd	gƒ d S )
Nc                 S   s   t  t| ƒ¡S ro   )r(   Úlogr   )rB   r1   r1   r2   Únaive_log_logisticš  s    z1test_logistic_sigmoid.<locals>.naive_log_logisticéþÿÿÿr&   r   g      YÀg      Y@iœÿÿÿr   )r(   Zlinspacer   r   r9   )rÜ   rB   Z	extreme_xr1   r1   r2   Útest_logistic_sigmoid˜  s
    rÞ   c                   C   s   t j d¡S )Nrr   )r(   r)   r*   r1   r1   r1   r2   r/   ¤  s    r/   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©rC   r?   r&   )rÓ   rb   rA   r   r(   Úaverager   )
r/   ra   Zmultr0   rá   ÚmeanÚvarrŒ   Úexpected_meanÚexpected_varr1   r1   r2   Ú2test_incremental_weighted_mean_and_variance_simple©  s    ÿ
rè   rä   ç    ÐcAg    ÐcÁ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    r4   r&   )r   r   r   rà   ç�íµ ÷Æ°>)rÑ   )rA   r   r   r	   )
r0   rá   ræ   rç   r“   Ú
chunk_sizeÚ	last_meanZlast_weight_sumZlast_varÚbatchr1   r1   r2   Ú_assertÂ  s    
*
û
z<test_incremental_weighted_mean_and_variance.<locals>._assert)rH   r„   r   )ÚlocÚscaler$   râ   r&   r>   )ry   r   r(   rã   r@   rä   rå   )rä   rå   Z
weight_locZweight_scaler/   rï   r$   Úweightr0   ræ   rç   Zones_weightr1   r1   r2   Ú+test_incremental_weighted_mean_and_variance¸  s"    
 
  ÿró   c              	   C   s  t  ddddg¡}t  ddddg¡}t jddddgt jd�}t  d¡}t  d¡}t  ddddgddddgd	d	d	d	g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&   rp   r'   r4   éª   é®  rÏ   rà   )r(   r9   r™   r@   rb   Únanr   r	   )ra   Ú	old_meansÚold_variancesZold_weight_sumZsample_weights_XZsample_weights_X_nanr0   ÚX_nanÚX_meansÚX_variancesÚX_countÚX_nan_meansÚX_nan_variancesÚX_nan_countr1   r1   r2   Ú6test_incremental_weighted_mean_and_variance_ignore_nanä  sH    

 ÿþüÿù	    ÿû

r  c            
   
   C   sî   t  dddddgdddddgdddddgdddddg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 )NiX  iÖ  rö   r÷   rÏ   r&   r   r>   r%   rp   r5   )
r(   r9   rz   rä   rå   ÚfullrA   r™   r   r   )
r”   ÚidxZX1ZX2rù   rú   Úold_sample_countZfinal_meansZfinal_variancesZfinal_countr1   r1   r2   Ú)test_incremental_variance_update_formulas	  s,    üÿ   ÿ
r  c               	   C   sè   t  ddddg¡} t  ddddg¡}t jddddgt jd�}t  ddddgddddgddddg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&   rp   rö   r÷   rÏ   )r(   r9   r™   rø   r   r	   )rù   rú   r  r0   rû   rü   rý   rþ   rÿ   r   r  r1   r1   r2   Ú-test_incremental_mean_and_variance_ignore_nan#  s4    (üÿ	   ÿ
   ÿ


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°t‚|	dd d …f t  	|¡|d
   }}}t
|
jd ƒD ]$}||
|d d …f |||ƒ\}}}qä||jd k�st‚t  |jdd�| ¡ ¡ dk�sBt‚t  | |ƒ| ¡ ¡ |k�sbt‚|	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t‚d S )Nc                 S   s   | j dd�S )Nr   r>   )rå   )r”   r1   r1   r2   Únp_varC  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&   r>   )rA   rJ   )r0   r“   Zexp_x2Zexpx_2r1   r1   r2   Úone_pass_varH  s    
zCtest_incremental_variance_numerical_stability.<locals>.one_pass_varc                 S   s*   | j dd�}|  ¡ }tj || d dd�S )Nr   r>   r&   )rä   rV   r(   )r0   rä   ÚYr1   r1   r2   Útwo_pass_varQ  s    zCtest_incremental_variance_numerical_stability.<locals>.two_pass_varc                 S   sJ   |d }|t |ƒ }| | ||  }|| | | | |  |  }|||fS )Nr%   )Úfloat)rB   rí   Zlast_varianceZlast_sample_countZupdated_sample_countZsamples_ratioZupdated_meanZupdated_variancer1   r1   r2   Únaive_mean_variance_updateY  s    ÿÿzQtest_incremental_variance_numerical_stability.<locals>.naive_mean_variance_updater�   r&   i'  g    „×—Arp   gñhãˆµøä>r   r>   rë   r%   )r(   r9   re   rÛ   r  Zvstackr¢   r£   r.   Zzerosr¿   rA   rä   r™   r   rÌ   r   r   )r  r	  r  r  r‡   rR   rQ   Úx1Zx2ZA0ÚA1r”   rä   rå   r“   r²   r1   r1   r2   Ú-test_incremental_variance_numerical_stability?  s>    	"&"$    ÿ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%   r>   rp   r5   )r(   r)   r*   r‘   rA   rË   ZhstackÚziprä   rå   r  r™   r   r   r   )r/   r0   rQ   rR   Z
batch_sizeZstepsr²   Újrî   Zincremental_meansZincremental_variancesZincremental_countZsample_countÚresultZcalculated_meansZcalculated_variancesr1   r1   r2   Útest_incremental_variance_ddofˆ  s6    

"
    ÿ
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%   r>   r   )r(   r)   r*   r‘   Zargmaxr¢   r   r   Úsignr¿   rA   rÕ   )ÚdataZmax_abs_rowsZdata_flippedZmax_rowsZsignsr1   r1   r2   Ú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%   r>   )r…   r%   )	r(   r)   r*   r‘   ÚexprJ   rÌ   r   r   )r/   r0   Zexp_XZ	sum_exp_Xr1   r1   r2   Útest_softmax³  s
    
r  c               	   C   sÄ   t tdddgƒt dddg¡ƒ tj d¡ d¡} t t	¡� t| ddd� W 5 Q R X 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&   r'   r   i † )rÒ   rÑ   r  rß   )r"   r"   r"   r#   r>   )r   r   r(   Zcumsumr)   r*   rÓ   r:   r;   ÚRuntimeWarningr+   )Úrr”   r1   r1   r2   Útest_stable_cumsum»  s     r  ÚA_array_constrZdenser   )ZidsÚB_array_constrc                 C   sX   t j d¡}| d¡}| d¡}t  ||¡}| |ƒ}||ƒ}t||dd�}t||ƒ d S )Nr   ©é   r    )r    r„   T©Údense_output©r(   r)   r*   rI   rf   r   r	   )r   r!  r/   r”   ÚBÚexpectedÚactualr1   r1   r2   Útest_safe_sparse_dot_2dÈ  s    

r*  c                  C   sŒ   t j d¡} |  d¡}|  d¡}t  ||¡}t |¡}t||ƒ}t||ƒ |  d¡}|  d¡}t  ||¡}t |¡}t||ƒ}t||ƒ d S )Nr   )r&   r'   r4   r"   r5   )r5   rN   )r&   r'   )r4   r"   r'   r5   )	r(   r)   r*   rI   rf   r   r,   r   r	   )r/   r”   r'  r(  r)  r1   r1   r2   Útest_safe_sparse_dot_ndÜ  s    








r+  c                 C   s~   t j d¡}| d¡}| d¡}t  ||¡}| |ƒ}t||ƒ}t||ƒ | d¡}t  ||¡}| |ƒ}t||ƒ}t||ƒ d S )Nr   r    r"  )r    r#  r&  )r   r/   r'  r”   r(  r)  r1   r1   r2   Útest_safe_sparse_dot_2d_1dð  s    





r,  r%  TFc                 C   sv   t j d¡}tjddd|d�}tjddd|d�}| |¡}t||| d�}t |¡|  ks\t‚| rh| ¡ }t	||ƒ d S )Nr   r#  r    r�   )r   rT   r„   r$  )
r(   r)   r*   r   rf   r   Úissparser.   Ztoarrayr
   )r%  r/   r”   r'  r(  r)  r1   r1   r2   Ú!test_safe_sparse_dot_dense_output  s    
r.  )[Únumpyr(   Zscipyr   r   Zscipy.sparse.linalgr   Zscipy.specialr   r:   Zsklearn.utilsr   Zsklearn.utils._arpackr   Zsklearn.utils._testingr   r	   r
   r   r   r   Zsklearn.utils.fixesr   r   Zsklearn.utils.extmathr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsklearn.datasetsr   r   r3   r=   rF   rL   rn   ÚmarkZparametrizer™   rš   r`   re   rq   r~   r�   r—   rœ   r¥   r¦   r®   r´   r¸   r»   rÄ   rÎ   r¿   rÔ   r×   r9   ra   ÚobjectrÚ   rÞ   Zfixturer/   rè   ró   r  r  r  r  r  r  r  r  r,   r*  r+  r,  r.  r1   r1   r1   r2   Ú<module>   sò   N


Gúþ

)) -!(
þ(
þ&þ÷þ


 ÿ'
$
H  
 ÿ 
 ÿ 
 ÿ
