o
    i5                     @   s  d dl Z d dlmZ 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 d dlmZmZ d dlmZ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+ej)*d&ed'd( Z,d)d* Z-ej)*d+g d,ej)*d-dd.gej)*d/d0d1gd2d3 Z.ej)*d+g d,ej)*d-dd.gej)*d/d0d1gd4d5 Z/d6d7 Z0dS )9    N)sqrt)metrics	neighbors)	load_iris)roc_auc_score)check_random_state)assert_allcloseassert_array_equal)check_outlier_corruptionparametrize_with_checks)CSR_CONTAINERSc              
   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sEJ 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_predictfit_predict)global_dtypeXclfZscoreZexpected_predictions r&   Z/home/kim/smarthome/.venv/lib/python3.10/site-packages/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sTJ d S )Nr   333333?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#   rngr$   X_trainZ
X_outliersX_testZy_testr%   y_predr&   r&   r'   test_lof_performance4   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_valuesK   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_precomputed_   s"   




rN   c                  C   s   t j} tjdd| }|j| jd d ksJ tjdd}d}tjt	t
|d ||  W d    n1 s:w   Y  |j| jd d ksKJ d S )N  r   r   r   z*n_neighbors will be set to (n_samples - 1)match)irisdatar   r   r   Zn_neighbors_shapepytestwarnsUserWarningreescape)r$   r%   msgr&   r&   r'   test_n_neighbors_attributey   s   r[   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*    



r\   c               	   C   s  t j} t }||  dD ]<}d| d}d|}tjt|d}t	|| W d    n1 s2w   Y  t
|jjts@J |t|jjv sJJ qtjdd}d}d	}tjt|d}t	|d
 W d    n1 slw   Y  t
|jjtszJ |t|jjv sJ d S )N)rL   r8   rB   z''LocalOutlierFactor' has no attribute ''z&{} is not available when novelty=FalserP   Tr3   z3'LocalOutlierFactor' has no attribute 'fit_predict'z.fit_predict is not available when novelty=Truer"   )rR   rS   r   r   r   formatrU   raisesAttributeErrorgetattr
isinstancevalue	__cause__str)r$   r%   methodZ	outer_msgZ	inner_msgZ	exec_infor&   r&   r'   test_novelty_errors   s&   

rg   c                 C   sN   t j| }t }|| |j}tjdd}|| |j}t|| d S )NTr3   )rR   rS   r5   r   r   r   r   r   )r#   r$   Zclf_1Zscores_1Zclf_2Zscores_2r&   r&   r'   test_novelty_training_scores   s   

rh   c                  C   s   ddgddgddgg} t jdd}||  t|dsJ t|ds$J t|ds+J t|dr2J t jd	d}||  t|dsDJ t|drKJ t|drRJ t|drYJ d S )
Nr   r   Tr3   rL   r8   rB   r"   F)r   r   r   hasattr)r$   r%   r&   r&   r'   test_hasattr_prediction   s   

rj   Tr3   c                 C   s   ||  d S )Nr&   )Z	estimatorcheckr&   r&   r'   test_novelty_true_common_tests   s   rl   expected_outliers   5   c                 C   sb   t j}|jd }t| | }tj|d}||}t|dk}|| kr/|j	}t
|| | d S d S )Nr   )r   r   )rR   rS   rT   floatr   r   r"   r   sumr   r
   )rm   r$   Z	n_samplesr   r%   r<   Znum_outliersZy_decr&   r&   r'   test_predicted_outlier_number   s   

rr   csr_containerc                 C   sX   | t j}tjdd}|| || || || tjdd}|| d S )NTr3   F)	rR   rS   r   r   r   rL   rB   r8   r"   )rs   r$   lofr&   r&   r'   test_sparse   s   




ru   c                  C   s^  t d} d}tjt|d tjdd| dd }W d   n1 s&w   Y  tjdd| dd }|jdks?J d}tjt|d |j	ddd W d   n1 sZw   Y  |j	ddd\}}|j
d	ksoJ |j
d	ksvJ d
}tjt|d |j	| dd W d   n1 sw   Y  |j	| dd\}}|j
dksJ |j
dksJ dS )zCheck that we raise a proper error message when n_neighbors == n_samples.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/17207
    )   rv   z[Expected n_neighbors < n_samples_fit, but n_neighbors = 1, n_samples_fit = 1, n_samples = 1rP   r   r   Nr   z[Expected n_neighbors < n_samples_fit, but n_neighbors = 2, n_samples_fit = 2, n_samples = 2)r   r   z\Expected n_neighbors <= n_samples_fit, but n_neighbors = 3, n_samples_fit = 2, n_samples = 7r   )rv   r   )r   ZonesrU   r_   
ValueErrorr   r   r   Zn_samples_fit_Z
kneighborsrT   )r$   rZ   rt   Z	distancesindicesr&   r&   r'   $test_lof_error_n_neighbors_too_large
  s6   
ry   rJ   )autoZ	ball_treeZkd_treerI   r4   Fr   g      ?rz   c                 C   sp   t jj| dd}tjd|||d}|| |jj| ksJ dD ]}t||r5t	|||}|j| ks5J 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)
rR   rS   r5   r   r   r   r   r   ri   ra   )r#   rJ   r   r4   r$   Zisorf   r<   r&   r&   r'   !test_lof_input_dtype_preservation6  s   

r{   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 ]}
t||
rjt||
|}t||
|	}t
||d
d qNd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)rR   rS   r   Zconcatenater5   Zfloat32r   r   r   Zfloat64r   r   ri   ra   )rJ   r4   r   ZinliersZoutliersr$   Zlof_32ZX_32Zlof_64ZX_64rf   Z	y_pred_32Z	y_pred_64r&   r&   r'   test_lof_dtype_equivalenceJ  s*   


r~   c               
   C   s   t jd} | t dgd t jdddd| dd g}|d	d
}d}tjddd}t	j
tt|d || W d   dS 1 sIw   Y  dS )z
    Check that LocalOutlierFactor raises a warning when duplicate values
    in the training data cause inaccurate results.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27839
    r   r>   i  r)   i  )numrO   r-   r   r   znDuplicate values are leading to incorrect results. Increase the number of neighbors for more accurate results.r   )r   r   rP   N)r   rK   Zdefault_rngpermutationZhstackZlinspaceZreshaper   r   rU   rV   rW   rX   rY   r"   )r9   xr$   	error_msgrt   r&   r&   r'   test_lof_duplicate_samplesk  s    		"r   )rF   )1rX   mathr   numpyr   rU   Zsklearnr   r   Zsklearn.datasetsr   Zsklearn.metricsr   Zsklearn.utilsr   Zsklearn.utils._testingr   r	   Zsklearn.utils.estimator_checksr
   r   Zsklearn.utils.fixesr   r9   rR   r   targetr2   permrS   r(   r=   rE   rN   r[   r\   rg   rh   rj   r   rl   markZparametrizerr   ru   ry   r{   r~   r   r&   r&   r&   r'   <module>   sR   



,