U
    3ds+                     @   s  d dl mZ d dlZd dlmZ d dl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 d d	lmZ d d
lmZ d dlmZ d dlmZ ed Ze ZeejjZeje e_eje e_dd Zdd Zdd Z d8ddZ!dd Z"dd Z#dd Z$dd Z%dd Z&eej'd d!gd"d# Z(e	j)*d$d%d&gd'd( Z+d)d* Z,e	j)*d+d,d-d.d/ge	j)*d0d d1ge	j)*d2d3d,gd4d5 Z-e	j)*d+d,d-d.d/ge	j)*d0d d1ge	j)*d2d3d,gd6d7 Z.dS )9    )sqrtN)
csr_matrix)	neighbors)metrics)roc_auc_score)check_random_state)assert_allclose)assert_array_equal)check_outlier_corruption)parametrize_with_checks)	load_irisc              
   C   s   t jddgddgddgddgddgddgddgddgg| d}tjdd	}||j}t|j| t |d d t 	|dd  kst
tjd
dd|}ddg ddg  }t| | t||| d S )N            dtypen_neighborsg      ?)contaminationr      )npasarrayr   LocalOutlierFactorfitnegative_outlier_factor_r	   Z_fit_XminmaxAssertionError_predictfit_predict)global_dtypeXclfZscoreZexpected_predictions r'   D/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/neighbors/tests/test_lof.pytest_lof#   s    2(r)   c           	      C   s   t d}d|ddj| dd }|d d }|jddd	d
j| dd}tj|dd  |f }tdgd dgd  }tjdd	|}|
| }t||dkstd S )Nr   g333333?x   Fcopyd   r      )   r   )lowhighsizer   r/   r   TnoveltygGz?)r   Zrandnastypeuniformr   Zr_arrayr   r   r   decision_functionr   r!   )	r$   rngr%   X_trainZ
X_outliersX_testZy_testr&   y_predr'   r'   r(   test_lof_performance9   s     r=   c                 C   s&  t jddgddgddgg| d}tjdddd|}tjddd|}dtd d	td  }d	td d	d
td  d	ddtd     }t|j |||g t|j |||g t|ddgg |g t|ddgg |g t|d	d	gg |g t|d	d	gg |g d S )Nr   r   r   皙?Tr   r   r4   r   r4          @g      ?g      @)	r   r   r   r   r   r   r   r   score_samples)r$   r:   clf1clf2Zs_0Zs_1r'   r'   r(   test_lof_valuesP   s"       0rE   *   c                 C   s   t j|}|dj| dd}|dj| dd}tj|dd}tj||dd}tjddd	}|	| |
 }||}	tjdd
ddd}
|
	| |

 }|
|}t|| t|	| dS )z!Tests LOF with a distance matrix.)
   r.   Fr+   )r   r.   Z	euclidean)metricr   Tr@   bruteZprecomputed)r   	algorithmrH   r4   N)r   randomZRandomStateZrandom_sampler5   r   Zpairwise_distancesr   r   r   r"   predictr   )r$   Zrandom_stater9   r%   YZDXXZDYXZlof_XZpred_X_XZpred_X_YZlof_DZpred_D_XZpred_D_Yr'   r'   r(   test_lof_precomputedd   s(    

   


rN   c               	   C   s   t j} tjdd| }|j| jd d ks0ttjdd}d}tj	t
t|d ||  W 5 Q R X |j| jd d kstd S )Ni  r   r   r   z*n_neighbors will be set to (n_samples - 1)match)irisdatar   r   r   Zn_neighbors_shaper!   pytestZwarnsUserWarningreescape)r%   r&   msgr'   r'   r(   test_n_neighbors_attribute~   s    rY   c           	      C   s   t jddgddgddgg| d}t jddgg| d}tjdddd|}tjddd|}||}||}||}||}t|||j  t|||j  t|| d S )	Nr   r   r   rA   r>   Tr?   r@   )	r   r   r   r   r   rB   r8   r   Zoffset_)	r$   r:   r;   rC   rD   Zclf1_scoresZclf1_decisionsZclf2_scoresZclf2_decisionsr'   r'   r(   test_score_samples   s.       



rZ   c               
   C   s   t j} t }||  dD ]2}d|}tjt|d t	|| W 5 Q R X qtjdd}d}tjt|d t	|d W 5 Q R X d S )N)rL   r8   rB   z&{} is not available when novelty=FalserO   Tr3   z.fit_predict is not available when novelty=Truer#   )
rQ   rR   r   r   r   formatrT   ZraisesAttributeErrorgetattr)r%   r&   methodrX   r'   r'   r(   test_novelty_errors   s    

r_   c                 C   sN   t j| }t }|| |j}tjdd}|| |j}t|| d S )NTr3   )rQ   rR   r5   r   r   r   r   r   )r$   r%   Zclf_1Zscores_1Zclf_2Zscores_2r'   r'   r(   test_novelty_training_scores   s    

r`   c                  C   s   ddgddgddgg} t jdd}||  t|ds:tt|dsHtt|dsVtt|drdtt jd	d}||  t|dstt|drtt|drtt|drtd S )
Nr   r   Tr3   rL   r8   rB   r#   F)r   r   r   hasattrr!   )r%   r&   r'   r'   r(   test_hasattr_prediction   s    

rb   Tr3   c                 C   s   ||  d S )Nr'   )Z	estimatorcheckr'   r'   r(   test_novelty_true_common_tests   s    rd   expected_outliers   5   c                 C   s^   t j}|jd }t| | }tj|d}||}t|dk}|| krZ|j	}t
|| | d S )Nr   )r   r   )rQ   rR   rS   floatr   r   r#   r   sumr   r
   )re   r%   Z	n_samplesr   r&   r<   Znum_outliersZy_decr'   r'   r(   test_predicted_outlier_number   s    

rj   c                  C   sX   t tj} tjdd}||  ||  ||  ||  tjdd}|	|  d S )NTr3   F)
r   rQ   rR   r   r   r   rL   rB   r8   r#   )r%   Zlofr'   r'   r(   test_sparse   s    




rk   rJ   autoZ	ball_treeZkd_treerI   r4   Fr   g      ?c                 C   sp   t jj| dd}tjd|||d}|| |jj| ks<tdD ]*}t	||r@t
|||}|j| ks@tq@dS )zECheck that the fitted attributes are stored using the data type of X.Fr+   r   )r   rJ   r   r4   )rB   r8   N)rQ   rR   r5   r   r   r   r   r   r!   ra   r]   )r$   rJ   r   r4   r%   Zisor^   r<   r'   r'   r(   !test_lof_input_dtype_preservation  s       

rm   c                 C   s   t jdd }t jdd }tj||gddtj}tj| ||d}|jtjdd}|| tj| ||d}|jtj	dd}	||	 t
|j|j d	D ]8}
t||
rt||
|}t||
|	}t
||d
d qdS )z?Check the equivalence of the results with 32 and 64 bits input.N2   r   )Zaxis)rJ   r4   r   Tr+   )rB   r8   rL   r#   g-C6*?)Zatol)rQ   rR   r   Zconcatenater5   Zfloat32r   r   r   Zfloat64r   r   ra   r]   )rJ   r4   r   ZinliersZoutliersr%   Zlof_32ZX_32Zlof_64ZX_64r^   Z	y_pred_32Z	y_pred_64r'   r'   r(   test_lof_dtype_equivalence  s.      
  

rp   )rF   )/mathr   Znumpyr   Zscipy.sparser   Zsklearnr   rV   rT   r   Zsklearn.metricsr   Zsklearn.utilsr   Zsklearn.utils._testingr   r	   Zsklearn.utils.estimator_checksr
   r   Zsklearn.datasetsr   r9   rQ   Zpermutationtargetr2   permrR   r)   r=   rE   rN   rY   rZ   r_   r`   rb   r   rd   markZparametrizerj   rk   rm   rp   r'   r'   r'   r(   <module>   sP   


