U
    3dx                     @   s*  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
 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mZmZmZ d dlmZmZmZmZ d dlmZ d	d
 Z e j!"dej#ej$ge j!"dej%ej&gdd Z'dd Z(e j!"dddgd d dgd ddggd d dgd ddggdddgfd d dgd ddggd d d dgd dddggdddgfd d dgd ddggd d dgd ddggdfd ej)dgd ej)ej)ggd ej)dgd ej)ej)ggdddgfd d gdej)gdd gd dgej)ej)gej)dggd d d gddej)gddd gd d dgej)ej)ej)gej)ej)dggddgfdd dgd ddggdd d d dgd ddddgge*dddgfge j!"dej&ej%ge j!"dej#ej$gdd Z+e j!"dddgd d dgd ddggd d dgd ddggddgfd d dgd ddggd d dgd ddgd ddggddgfd d dgd ddggd d dgd ddggdfd ej)dgd ej)ej)ggd ej)dgd ej)ej)ggddgfd d dej)dd gd dej)ej)ej)dggd d dej)dd gd d dej)dd gd dej)ej)ej)dggddgfdd dgd d dggdd dgd d dgd d dgd d dgge*ddgfge j!"dej&ej%ge j!"dej#ej$gdd Z,dd Z-e j!"dej&ej%gdd  Z.e j!"d!ej/d"dd#d$d d%ej/d&dd#d$d d%fej/d"dd#d$d d%ej0e%ej1d'ej)d(ej/d&dd#d)d*gd$d+fgd,d- Z2d.d/ Z3d0d1 Z4e j!"d2d dge j!"dej&ej%gd3d4 Z5d5d6 Z6d7d8 Z7d9d: Z8d;d< Z9d=d> Z:d?d@ Z;e j!"dej#ej$ge j!"d2d ddge j!"dAej%ej&ge j!"dBd ej<ej=dCfej)ej>ej?dDfge j!"dEdDdCgdFdG Z@dHdI ZAdJdK ZBdLdM ZCdNdO ZDe j!"dej#ej$gdPdQ ZEdS )R    N)linalg)assert_array_almost_equalassert_array_equal)RandomState)make_classification)	mean_variance_axisincr_mean_variance_axisinplace_column_scaleinplace_row_scaleinplace_swap_rowinplace_swap_columnmin_max_axiscount_nonzerocsc_median_axis_0)assign_rows_csrinplace_csr_row_normalize_l1inplace_csr_row_normalize_l2csr_row_norms)assert_allclosec               	   C   s.  t dddd\} }d| d< d| d< d| d< t| }d|d< d| d< tt t|dd	 W 5 Q R X t|}t|}t	j
t	j
ft	jt	jft	jt	jft	jt	jfg}|D ]~\}}| |}||fD ]b}	|	|}	t|	dd	\}
}|
j|kst|j|kstt|
t	j|dd	 t|t	j|dd	 qqd S )
N      r   random_stater   r         r      r   r   axisr   sp
lil_matrixpytestraises	TypeErrorr   
csr_matrix
csc_matrixnpfloat32float64int32int64astypedtypeAssertionErrorr   meanvarX_X_lilX_csrX_cscexpected_dtypesinput_dtypeoutput_dtypeZX_testX_sparseX_meansX_vars r@   H/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/utils/tests/test_sparsefuncs.pytest_mean_variance_axis0   s2    








rB   r0   sparse_constructorc                 C   s   t jd}t jdd| d}|jt |jd ddd}t j||df< ||}||jd 	| }t
||dd\}}|t | jk std S )	Nr   g      Y@)i  r   )
fill_valueshaper0   
   F)replace)weightsr!   )r*   randomr   fullchoiceZarangerE   nanrandr/   r   ZfinfoZepsr1   )r0   rC   rngr5   Zmissing_indicessample_weightr6   r3   r@   r@   rA   "test_mean_variance_axis0_precision@   s    rP   c               	   C   s.  t dddd\} }d| d< d| d< d| d< t| }d|d< d| d< tt t|d	d
 W 5 Q R X t|}t|}t	j
t	j
ft	jt	jft	jt	jft	jt	jfg}|D ]~\}}| |}||fD ]b}	|	|}	t|	dd
\}
}|
j|kst|j|kstt|
t	j|dd
 t|t	j|dd
 qqd S )Nr   r   r   r   r   r   r   r   r   r    r"   r4   r@   r@   rA   test_mean_variance_axis1T   s2    








rQ   Xwr5   rH   r   r   r   g      ?g       @c                 C   s|  d}||  |}|| |}tjt| d |d}tj||d}	tj|tjd}
t||||	|
d d\}}}t||||	|
|d\}}}|j|kst|j|kst|j|kstt	||d\}}t
|| t
|| t
|| t
|| t
|| t|||||d d\}}}t||||||d\}}}t
|| t
|| t
|| |j|ksXt|j|ksht|j|ksxtd S )Nr   r   r0   r5   r!   	last_meanlast_varlast_nrH   r5   r!   )r/   r*   zerosrE   
zeros_liker.   r   r0   r1   r   r   rR   r5   rH   rC   r0   r!   Z	Xw_sparser=   rU   rV   rW   Zmeans0Zvars0Zn_incr0Zmeans_w0Zvars_w0Z	n_incr_w0Zmeans_simpleZvars_simpleZmeans1Zvars1Zn_incr1Zmeans_w1Zvars_w1Z	n_incr_w1r@   r@   rA   +test_incr_mean_variance_axis_weighted_axis1v   sj    #		




		


r\   c                 C   sv  d}||  |}|| |}tjt| d|d}t|}	tj|tjd}
t||||	|
d d\}}}t||||	|
|d\}}}|j|kst|j|kst|j|kstt	||d\}}t
|| t
|| t
|| t
|| t
|| t|||||d d\}}}t||||||d\}}}t
|| t
|| t
|| |j|ksRt|j|ksbt|j|ksrtd S )Nr   r   rS   rT   rX   )r/   r*   rY   sizerZ   r.   r   r0   r1   r   r   r[   r@   r@   rA   +test_incr_mean_variance_axis_weighted_axis0   sj     
		




		


r^   c               
      s  dD ]} t jdd d| dkr@ fddtD }nfddt D }| dkrjt  nt }t |}t j|t jd}t |d }t |}| d	kr|j	n|}t
|}t
|}tt t| |||d
 W 5 Q R X tt t|| |||d W 5 Q R X t|| \}}	t|| |||d\}
}}t||
 t|	| t|j|  | t
|}t|| \}}	t||
 t|	| t|j|  | t |}| d	kr|j	n|}t
|}t
|}t
|}t jt jft jt jft jt jft jt jfg}|D ]\}}||fD ]}||}||}||}t|| \}}	t|| |||d\}
}}|
j|kstt|j|kstt||
 t|	| t|j|  | qqqd S )N)r   r   r   2   rF   c                    s   g | ]}j d d dqS r   r   )r]   randint.0i)
n_featuresrN   r@   rA   
<listcomp>A  s     z0test_incr_mean_variance_axis.<locals>.<listcomp>c                    s   g | ]}j d d dqS r`   ra   rc   )	n_samplesrN   r@   rA   rg   C  s     rS   r   )r5   r!   rU   rV   r!   rU   rV   rW   )r*   rI   r   rangerY   rZ   r.   arrayZ
atleast_2dTr#   r$   r(   r%   r&   r'   r   r   r   r   rE   r)   vstackr+   r,   r-   r/   r0   r1   )r!   Zdata_chunksrU   rV   rW   r5   r7   r8   r>   r?   ZX_means_incrZX_vars_incrZn_incrr9   r:   r;   r<   r=   r@   )rf   rh   rN   rA   test_incr_mean_variance_axis;  s    




           

















rn   c              	   C   s  d\}}t jd}| |||}t |}t |}t j|jt jd}t|||d}t	|fddi|\}	}
}t
t j| dd|	 t
t j| dd|
 tt t	|fddi| W 5 Q R X t|d	d
 ||d}tt t	|fddi| W 5 Q R X d	S )zCheck that we raise proper error when axis=1 and the dimension mismatch.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/pull/18655
    )<   r   *   rS   )rU   rV   rW   r!   r   r    r   N)r*   rI   r   rM   rY   rZ   rE   r.   dictr   r   r2   toarrayr3   r%   r&   
ValueError)rC   rh   rf   rN   r5   rU   rV   rW   kwargsZmean0Zvar0r6   r@   r@   rA   )test_incr_mean_variance_axis_dim_mismatch  s    

rv   zX1, X2r   皙?csr)densityformatr      )r{   r   )rD   rp   ry   r   )rz   c           
      C   s   d}t | jd t | jd  }}t j| jd t jd}t| ||||d\}}}t|||||d\}}}t| |g}	t|t j|	j	|d t|t j
|	j	|d t|t jt |	j	 dd d S )Nr   r   rS   ri   r    )r*   rY   rE   r.   r   r#   rm   r   ZnanmeanAZnanvarr   isnan)
X1X2r!   rU   rV   rW   updated_meanupdated_var	updated_nr5   r@   r@   rA   6test_incr_mean_variance_axis_equivalence_mean_variance  s*    "        r   c            	      C   s   d} t jddddd }t jddddd }t|jd t|jd  }}tj|jd tjd}t|| |||d\}}}t|| |||d\}}}t|| t|| t|| d S )Nr   r   r   rw   r|   rS   ri   )	r#   rI   tocsrr*   rY   rE   r.   r   r   )	r!   r   r   rU   rV   rW   r   r   r   r@   r@   rA    test_incr_mean_variance_no_new_n  s,    "        

r   c                  C   sz   d} t jddddd }t|jd t|jd  }}d}t|| |||d\}}}t|t|jd |jd  d S )Nr   r   r   rw   r|   r   ri   )	r#   rI   r   r*   rY   rE   r   r   rJ   )r!   r5   rU   rV   rW   r6   Znew_nr@   r@   rA   test_incr_mean_variance_n_float  s    "    r   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}| r|j}|j}t|| | | | d\}}}	t|| | | | d\}
}}t|
| t|| t||	 d S )	Ng     @g     @r   rS      i  i,  ri   )r*   rk   r.   rL   rl   r   copyr   )r!   rC   Z	old_meansZold_variancesZold_sample_countr5   ZX_nanr>   r?   ZX_sample_countZX_nan_meansZ
X_nan_varsZX_nan_sample_countr@   r@   rA   'test_incr_mean_variance_axis_ignore_nan  sF    &

r   c               	   C   s  t dddd\} }d| d< d| d< d| d< t| }tt t|dd	 W 5 Q R X tt t|d
d	 W 5 Q R X tt t|dd	 W 5 Q R X tt t|dd d d d W 5 Q R X tt t|d
d d d d W 5 Q R X tt t|dd d d d W 5 Q R X d S )Nr   r   r   r   r   r   r   r    r   rq   ri   )r   r#   r(   r%   r&   rt   r   r   )r5   r6   r8   r@   r@   rA   test_mean_variance_illegal_axis   sF    
            r   c               	   C   s   t jt jfD ]} tjdddgdddgdddgdddgdddgg| d	}t jdddgt jd	}t jd
|jd f| d	}t jdddgt jd	}t 	|}||d d f 
 ||< t|||| t|| qd S )Nr   r   r   r   	         r   rS      r   )r*   r+   r,   r#   r(   rk   intponesrE   Z	ones_likers   r   r   )r0   r5   ZX_rowsoutZout_rowsexpectr@   r@   rA   test_densify_rows>  s    * 
r   c               	   C   sL  t jd} tddd}| }| }| }| d}||9 }t|| t|| t	| |  t	||  t	||  t
t t| | W 5 Q R X |t j}|t j}| }| }| }||9 }t|| t|| t	| |  t	||  t	||  t
t t| | W 5 Q R X d S )Nr   d      皙?)r*   rI   r   r#   rM   r   tocscrs   r	   r   r%   r&   r'   tolilr/   r+   rN   r5   ZXrZXcZXAZscaler@   r@   rA   test_inplace_column_scaleN  s6    




r   c               	   C   s\  t jd} tddd}| }| }| }| d}||dd9 }t	|| t	|| t
| |  t
||  t
||  tt t| | W 5 Q R X |t j}|t j}| }| }| }||dd9 }t	|| t	|| t
| |  t
||  t
||  tt t| | W 5 Q R X d S )Nr   r   r   r   rq   r   )r*   rI   r   r#   rM   r   r   rs   Zreshaper
   r   r%   r&   r'   r	   r   r/   r+   r   r@   r@   rA   test_inplace_row_scalen  s6    




r   c               	   C   s  t jdddgdddgdddgdddgdddggt jd	} t| }t| }td
| f}|d }|| d | d \| d< | d< t|dd t|dd t	|
 |
  t	| |
  t	| |
  || d | d \| d< | d< t|dd t|dd t	|
 |
  t	| |
  t	| |
  tt t|  W 5 Q R X t jdddgdddgdddgdddgdddggt jd	} t| }t| }td
| f}|d }|| d | d \| d< | d< t|dd t|dd t	|
 |
  t	| |
  t	| |
  || d | d \| d< | d< t|dd t|dd t	|
 |
  t	| |
  t	| |
  tt t|  W 5 Q R X d S )Nr   r   r   r   r   r   r   r   rS   swaprq   )r*   rk   r,   r#   r(   r)   r   get_blas_funcsr   r   rs   r%   r&   r'   r   r+   r5   r8   r9   r   r@   r@   rA   test_inplace_swap_row  sX    * 

* 

r   c               	   C   s  t jdddgdddgdddgdddgdddggt jd	} t| }t| }td
| f}|d }|| d d df | d d df \| d d df< | d d df< t|dd t|dd t	|
 |
  t	| |
  t	| |
  || d d df | d d df \| d d df< | d d df< t|dd t|dd t	|
 |
  t	| |
  t	| |
  tt t|  W 5 Q R X t jdddgdddgdddgdddgdddggt jd	} t| }t| }td
| f}|d }|| d d df | d d df \| d d df< | d d df< t|dd t|dd t	|
 |
  t	| |
  t	| |
  || d d df | d d df \| d d df< | d d df< t|dd t|dd t	|
 |
  t	| |
  t	| |
  tt t|  W 5 Q R X d S )Nr   r   r   r   r   r   r   r   rS   r   rq   r   )r*   rk   r,   r#   r(   r)   r   r   r   r   rs   r%   r&   r'   r   r+   r   r@   r@   rA   test_inplace_swap_column  sX    * 

>>* 

>>r   sparse_formatz.missing_values, min_func, max_func, ignore_nanFTlarge_indicesc                 C   s   t jdddgdd|gdddgd|dgdddgg| d	}||}	|r^|	jd
|	_|	jd
|	_t|	||d\}
}t|
|||d t||||d d S )Nr   r   r   rq   r   r   r   r   rS   r.   )r!   
ignore_nanr    )r*   rk   indicesr/   indptrr   r   )r0   r!   r   Zmissing_valuesZmin_funcZmax_funcr   r   r5   r=   Zmins_sparseZmaxs_sparser@   r@   rA   test_min_max  s     
r   c               	   C   s   t jdddgdddgdddgdddgddd	ggt jd
} t| }t| }tt t	|
 dd W 5 Q R X tt t	|dd W 5 Q R X tt t	|dd W 5 Q R X d S )Nr   r   r   rq   r   r   r   r   r   rS   r    r   )r*   rk   r,   r#   r(   r)   r%   r&   r'   r   r   rt   )r5   r8   r9   r@   r@   rA   test_min_max_axis_errors  s    * 

r   c               
   C   s  t jdddgdddgdddgdddgddd	ggt jd
} t| }t| }| dk}dddddg}|t |d d d f  }dD ]:}tt||d|j|d tt|||d|j|d qt	
t t| W 5 Q R X t	
t t|dd W 5 Q R X t|ddjt|ddjkstt|d|djt|d|djksDtzl|jt j|_|jt j|_t|ddjt|ddjkstt|d|djt|d|djkstW nL tk
r } z,d|jd krt  jdk st|W 5 d }~X Y nX d S )Nr   r   r   rq   r   r   r   r   r   rS         ?g?g333333?g?)r   r   rq   Nr    )r!   rO   r   zaccording to the rule 'safe')r*   rk   r,   r#   r(   r)   r   r   sumr%   r&   r'   rt   r0   r1   r   r/   r.   r   argsr   nbytes)r5   r8   r9   Z	X_nonzerorO   ZX_nonzero_weightedr!   er@   r@   rA   test_count_nonzero"  sJ    * 


 

""r   c               	   C   s>  t jd} | dd}t j|dd}t|}t|}t|| | dd}d||dk < | 	ddd}||  ||< t|}t j|dd}t|}t|| dd	gd
d
gddgddgg}t|}tt|t 
ddg dd	gd
dgddgg}t|}tt|t 
ddg tt tt| W 5 Q R X d S )Nr   r   r_   r    3   g        gffffff?rF   r   rq   r   r   r   g      r   )r*   rI   r   rM   Zmedianr#   r)   r   r   rb   rk   r%   r&   r'   r(   )rN   r5   Zdense_medianZcscZsparse_medianindr@   r@   rA   test_csc_row_medianN  s,    





r   c                  C   s   t d} td}ttfD ]}t jt jfD ]}|dd|}t	
|}t jt jfD ]}|t jkr|j||_|j||_|jj|kst|jj|kst|| |j|kst|tkr| jdC  _tt |jdd|  qVq*qd S )N)rF   r   rF   r   r   r   r    )r*   r   r   r   r   r,   r+   Zrandnr/   r#   r(   r-   r.   r   r   r0   r1   datar   absr   )r   rsZinplace_csr_row_normalizer0   r5   r8   Zindex_dtyper@   r@   rA   test_inplace_normalizep  s&    


r   c                 C   sb   t jddd| dd}t jj|ddd }t|}|j| ks>t| tjkrLd	nd
}t	|||d d S )Nr   rF   rx   rp   )rz   r0   r   r   r    r   gư>gHz>)rtol)
r#   rI   r   Znormr   r0   r1   r*   r+   r   )r0   r5   Zscipy_normsZnormsr   r@   r@   rA   test_csr_row_norms  s    r   )Fr%   Znumpyr*   Zscipy.sparsesparser#   Zscipyr   Znumpy.testingr   r   Znumpy.randomr   Zsklearn.datasetsr   Zsklearn.utils.sparsefuncsr   r   r	   r
   r   r   r   r   r   Zsklearn.utils.sparsefuncs_fastr   r   r   r   Zsklearn.utils._testingr   rB   markZparametrizer+   r,   r(   r)   rP   rQ   rL   rk   r\   r^   rn   rv   rI   ZhstackrJ   r   r   r   r   r   r   r   r   r   r   minmaxZnanminZnanmaxr   r   r   r   r   r   r@   r@   r@   rA   <module>   s   ,"".2(.
D,4(&
"DQ

/  00 ,"