o
    iR                    @   s$  d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: ej;<d Z=e> Z?e=@e?jAjBZCe?jDeC e?_De?jAeC e?_AeE ZFe=@eFjAjBZCeFjDeC eF_DeFjAeC eF_AeGe2e3 e4 e5 e7 e8 ZHeHejIf ZJdZKeLeMjNeOeMejPQ  ZRddddejSfZTe0ejUe_Ue0ejVe_VdgZWddeXfddZYdeXdeZfddZ[dd Z\d d!e\gZ]ej^_d"d#d$gej^_d%d&d'gej^_deReW d(d) Z`ej^_d*d+d,gej^_deReW ej^_d-g d.ej^_d/ejaej%ejbejcgd0d1 Zdej^_d2ejaej%ejegd3d4 Zfd5d6 Zgej^hd7d8d9 Zid:d; Zjej^_d<d=d>gd?d@ Zkej^_d<d=d>gdAdB Zlej^_dCe5dDdE Zmej^hd7ej^_dFe*e(gej^_dCe5dGdH Znej^hd7ej^_dCe5dIdJ Zoej^_dCe5dKdL Zpej^_dMe7e2 e6 dNdO Zqej^hd7ej^_dCe5dPdQ ZrdRdS Zs	 ddWdXZtej^_dYeKej^_dZe]	[	U	\	U	 dd]d^Zu	[	U	\	U	 dd_d`Zvdadb Zwej^_dYeKej^_dZe]	[	U	\	V	 ddcddZxej^_dYeKej^_dZe]ej^_deg dfdgdh Zyej^_dYeKej^_dZe]didj Zzdkdl Z{dmdn Z|dodp Z}ej^_dCe5dqdr Z~ej^_dYg dsdtdu Zej^_dYdgeedvdwgeWR dxdyg dzd{ Zd|d} Z	 dd~dZdd Z	 dddZdd Z	 dddZ	 dddZdd Z	 dddZej^hd7	 dddZdd Zdd Zdd Zej^_dg dej^_ddd!gej^_dCe5d	ddZdd Zej^_dg dej^_ddd!gej^_dCe5d	ddZej^_dejaejbej%ejcgej^_dCe5dd Zej^_dejaejbej%ejcgej^_dddgej^_dYddgdd Zej^_dejaejbej%ejcgej^_dddgej^_dYddgdd Zdd Zej^_deLeMejPd NejPd eMdge eW 	T			Ud
ddZe0edej^_deLeMejPd eMdg 			U	UdddZdd Zej^_dejPd eW ej^_dCe5	dddZdd Zej^_dCe5dd Zdd ZddĄ ZddƄ Zej^_dYeKddȄ Zej^_dYeKddʄ Zdd̄ Zej^_dYeKdd΄ Zej^_dYeKddЄ Zej^_dddgej^_dYeKddՄ Zddׄ Zej^_dCe5ddل Zej^hdڡdd܄ Zddބ Zdd Zej^_dej;jd\dddddfej;d\dTdwddfej;ddUdwddfej;d\dUdwddfej;d\dUdddgdU idfej;d\dUdddfgdd Ze0edej^_deLeMejPd eMdg 			U	dddZdd Zdd Zej^_dejaddifej%ddifejci fejbi fejddifejddifejddifgdd Zdd Zdd Zdd Zej^_dejad\deb gej^_dYeKdd Zej^_dej%d\dec gej^_dYeKd d ZdS (      N)product)issparse)config_contextdatasetsmetrics	neighbors)clone)EfficiencyWarningNotFittedError)DistanceMetric)PAIRWISE_BOOLEAN_FUNCTIONSpairwise_distances)BOOL_METRICS)!assert_compatible_argkmin_results assert_compatible_radius_results)LeaveOneOutcross_val_predictcross_val_scoretrain_test_split)VALID_METRICS_SPARSEKNeighborsRegressor)KNeighborsMixin_check_precomputed_is_sorted_by_datasort_graph_by_row_values)make_pipeline)assert_allcloseassert_array_equalignore_warnings)BSR_CONTAINERSCOO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDIA_CONTAINERSDOK_CONTAINERSLIL_CONTAINERS)check_random_state)	ball_treebrutekd_treeauto            ZDM_euclideanmetricc                 C   s*   | dd dkrt j| dd |dS | S )a  
    Helper function for properly building a type-specialized DistanceMetric instances.

    Constructs a type-specialized DistanceMetric instance from a string
    beginning with "DM_" while allowing a pass-through for other metric-specifying
    strings. This is necessary since we wish to parameterize dtype independent of
    metric, yet DistanceMetric requires it for construction.

    Nr-   ZDM_dtype)r   Z
get_metric)r/   r1    r2   `/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/neighbors/tests/test_neighbors.py_parse_metricc   s   
r4   
n_featuresc              	   C   s   t jd}| dkr%tddtddtddtt jdtd||dgS | dkr2t||d	gS | d
krN|||}||j dt |  }t|dgS i gS )z/Return list of DistanceMetric kwargs for tests.r+   	minkowski      ?)pr,   r-   )r8   w
seuclidean)VZmahalanobis)VI)nprandomRandomStatedictinfrandTeye)r/   r5   rngAr<   r2   r2   r3   _generate_test_params_forr   s   
rG   c                 C   sB   t jdd d|  }W d   |d S 1 sw   Y  |d S )zWeight function to replace lambda d: d ** -2.
    The lambda function is not valid because:
    if d==0 then 0^-2 is not valid.ignore)divide      ?Nr,   )r=   errstate)distretvalr2   r2   r3   _weight_func   s   

rN   uniformdistancez/n_samples, n_features, n_query_pts, n_neighbors)d   rQ   
   rQ   )     rQ   r+   query_is_trainFTc              	   C   s  t || }tjd}|||j| dd}|r|n
|||j| dd}	g }
g }tD ]6}t|tr@| tj	kr@d|v r@t
d tj|||d}|| |
|j|	dd ||j|	dd q+tt|d	 D ]V}t| }t|d	  }|
| }|| d ||d	  d }}|| d	 ||d	  d	 }}t||d
| dd t||d
| d| dd t||d
| d| ddd qjd S )Nr   FcopytreeCNeither KDTree nor BallTree support 32-bit distance metric objects.n_neighbors	algorithmr/   return_distanceTr+   The 'zE' algorithm returns differentindices depending on 'return_distances'.err_msg' and 'z&' algorithms return different indices.z(' algorithms return different distances.gư>)ra   Zatol)r4   r=   r>   r?   rB   astype
ALGORITHMS
isinstancer   float32pytestskipr   NearestNeighborsfitappend
kneighborsrangelenr   r   )global_dtype	n_samplesr5   n_query_ptsr[   rU   r/   	local_rngXqueryZresults_nodistresultsr\   neighinext_algorithmZindices_no_dist	distancesZnext_distancesindicesZnext_indicesr2   r2   r3   test_unsupervised_kneighbors   sX   


r{   z"n_samples, n_features, n_query_pts)rQ   rQ   rR   )rS   rT   rQ   zn_neighbors, radius))r+   rQ   )2   i  )rQ   rS   NeighborsMixinSubclassc              	   C   sR  t || }t|trd|jv rtd d|jv rtd tjd}|	||j
| dd}	|jd|d	}
|	||j
| dd}g }t|trJ|n|}tD ]*}t|trc| tjkrcd
|v rctd ||||d}||	|
 ||| qNtt|d D ]%}t| }t|d  }|| ||d  }}t||d| d| dd qd S )N
ClassifierzGMetrics of type `DistanceMetric` are not yet supported for classifiers.ZRadiusVMetrics of type `DistanceMetric` are not yet supported for radius-neighbor estimators.r   FrV   r-   sizerX   rY   r\   r/   r+   r_   rb   z*' algorithms return different predictions.r`   )r4   re   r   __name__rg   rh   r=   r>   r?   rB   rc   randint
issubclassr   rd   rf   rj   rk   predictrm   rn   r   )ro   rp   r5   rq   r/   r[   radiusr}   rr   rs   yrt   Zpredict_resultsZ	parameterr\   rv   rw   rx   ZpredictionsZnext_predictionsr2   r2   r3   ,test_neigh_predictions_algorithm_agnosticity   sH   



r   KNeighborsMixinSubclassc                 C   s   t dj| dd}t jddd}tjdd}|| ||\}}|dd}|t|t	|fD ]}||| ||\}	}
t
||	 t||
 q3d S )	NrR   r-   FrV   r-   rR   r   r+   r[   )rE   random_samplerc   r   r   ri   rj   rl   ZBallTreeZKDTreer   r   )ro   r   rs   r   Znbrs_fiddist1ind1nbrsdatadist2ind2r2   r2   r3   test_unsupervised_inputsI  s   


r   c                  C   s~   dgg} t  }tt ||  W d    n1 sw   Y  tt ||  W d    d S 1 s8w   Y  d S )Nr+   )r   ri   rg   raisesr
   kneighbors_graphradius_neighbors_graph)rs   Z
neighbors_r2   r2   r3   !test_not_fitted_error_gets_raisedf  s   "r   zignore:EfficiencyWarningc              	   C   s  t jd}|d}|d}| ||\}}dD ]}tjdd}|| t|||\}	}
tjdddd	}|| t|||\}}t|	| t	|
| tjdd
dd	}|| t|||\}}t|	| t	|
| t||d\}	}
t||d\}}t|	| t	|
| t
t t||| W d   n1 sw   Y  qt |jd }|D ]'}|dd}d |_|_||||}d|_||||}t|| qdS )z;Tests unsupervised NearestNeighbors with a distance matrix.*   rR   r.   r-   r.   )rl   r-   r   r(   precomputedrZ   r*   Nr   	euclideanr/   r+   )r=   r>   r?   r   r   ri   rj   getattrr   r   rg   r   
ValueErrorarangeshaper   r[   r   r/   )make_train_test
estimatorsrE   rs   YDXXDYXmethodZnbrs_XZdist_XZind_XZnbrs_DZdist_DZind_DtargetEstestZpred_XZpred_Dr2   r2   r3   check_precomputedo  sN   











r   c                  C   s*   dd } t jt jt jt jg}t| | d S )Nc                 S   s   t | t || fS N)r   r   )X_trainX_testr2   r2   r3   r     s   
z/test_precomputed_dense.<locals>.make_train_test)r   KNeighborsClassifierr   RadiusNeighborsClassifierRadiusNeighborsRegressorr   )r   r   r2   r2   r3   test_precomputed_dense  s   r   fmtZcsrZlilc                    &    fdd}t jt jg}t|| d S )Nc                    :   t jdd| }|j| dd |j|dd fS )Nr.   r   rP   mode)r   ri   rj   r   asformatr   r   nnr   r2   r3   r        z4test_precomputed_sparse_knn.<locals>.make_train_test)r   r   r   r   r   r   r   r2   r   r3   test_precomputed_sparse_knn  
   
r   c                    r   )Nc                    r   )Nr+   r   rP   r   )r   ri   rj   r   r   r   r   r2   r3   r     r   z7test_precomputed_sparse_radius.<locals>.make_train_test)r   r   r   r   r   r2   r   r3   test_precomputed_sparse_radius  r   r   csr_containerc                 C   s   | t ddd}t|sJ d|d< t|rJ | g dg dg dg dg}t|s1J g d	g d
g d}}}| |||fdd}t|sNJ d S )NrR   r+   rT   r   r,   r   r+   r,   )r-   r   r   )r-   r.   r   r+   r   r,   )r   r.   r,   r,   )r   r+   r+   r+   )r   r,   r,   r.   r-   r-   )r   )r=   r   reshaper   )r   rs   r   rz   Zindptrr2   r2   r3   test_is_sorted_by_data  s    r   functionc                 C   s   |t t jddd}t|rJ | |}t|sJ t jdjddd}| }d||dk< ||}t|r>J | |}t|sHJ d S )Nr   rR   r,   rR   rR   r   r   r+   )r=   absr>   r?   randnr   r   toarray)r   r   rs   ZXtmaskr2   r2   r3   test_sort_graph_by_row_values  s   r   c                 C   s   | t t jddd}t|rJ | }t|j|ju s#J | }t|ddj|ju s3J | }t|ddj|jusCJ | }t	|j|jusQJ t|
 dd tjtdd t|
 dd W d    d S 1 stw   Y  d S )Nr   rR   FrV   Tz%Use copy=True to allow the conversionmatch)r=   r   r>   r?   r   r   rW   r   r   r   Ztocscrg   r   r   )r   ZX_rs   r2   r2   r3   "test_sort_graph_by_row_values_copy  s   "r   c                 C   s  | t t jddd}t|rJ tjtdd t	|dd W d    n1 s-w   Y  tjtdd t	|ddd W d    n1 sKw   Y  tjtdd t
| W d    n1 sfw   Y  t  td t	|dd	d W d    d S 1 sw   Y  d S )
Nr   rR   zwas not sorted by row valuesr   TrV   )rW   Zwarn_when_not_sortederrorF)r=   r   r>   r?   r   r   rg   warnsr	   r   r   warningscatch_warningssimplefilter)r   rs   r2   r2   r3   %test_sort_graph_by_row_values_warning%  s   


"r   sparse_containerc                 C   s   | t t jddd}tjtdd t| W d    n1 s%w   Y  tjtdd t	| W d    d S 1 sAw   Y  d S )Nr   rR   zformat is not supportedr   )
r=   r   r>   r?   r   rg   r   	TypeErrorr   r   )r   rs   r2   r2   r3   /test_sort_graph_by_row_values_bad_sparse_format9  s   

"r   c                 C   s<  t g dg dg dg}| |}tjddd}|| |jd dd |jt g dgd	d t g d
g dg dg}| |}|| d}tjt|d |jd dd W d    n1 sdw   Y  t g dg dg dg}| |}d}tjt|d |j|dd W d    d S 1 sw   Y  d S )N)               @rJ   )r   r         @)rJ   r   r   r+   r   r[   r/   r   r   r   r   r,   )r   r   r   )r   r   r   zB2 neighbors per samples are required, but some samples have only 1r   )      @r   rJ   )g       r   r   z>Negative values in data passed to precomputed distance matrix.)	r=   arrayr   ri   rj   rl   rg   r   r   )r   rL   Zdist_csrrv   msgr2   r2   r3   test_precomputed_sparse_invalidE  s&   

"r   c                  C   sz   t jd} | dd}t|dd}| jddd}tjtjtj	tj
fD ]}t| ||}t|dd||}t|| q#d S )	Nr      r,   r   r   r-   r   r   )r=   r>   r?   rB   r   r   r   r   r   r   r   r   r   )rE   rs   Dr   r   Zmetric_scoreZprecomp_scorer2   r2   r3   !test_precomputed_cross_validation_  s   r   r   rT         ?c              
   C   s  t j|}|||j| dd}|||j| dd}tD ]}	g }
tD ]]}tj|||	d}|	| |j
|dd}|j
|dd\}}t|||D ]!\}}}| }|| |d d < || |d d < || |d d < qI|
||f tt t|t t| q$tt|
d D ]4}tt t|
| d t t|
|d  d  tt t|
| d t t|
|d  d  qqd S )NFrV   )r   r\   r8   r]   Tr+   r   )r=   r>   r?   rB   rc   Prd   r   ri   rj   radius_neighborszipZargsortrk   r   Zconcatenatelistrm   rn   )ro   rp   r5   rq   r   random_staterE   rs   testr8   ru   r\   rv   r   rL   inddrw   i1jr2   r2   r3   "test_unsupervised_radius_neighborsp  s8   
 r   r\   weights(   rR   c                 C   s   t j|}d|||j| dd d }	|	d jdddk t}
|
t}tj	|||d}|
|	|
 dd|d| d  }||	d | | }t||
d |  |
|	| ||	d | | }t||d |  d S )	Nr,   FrV   r+   Zaxisr   r[   r   r\   h㈵>)r=   r>   r?   rB   rc   sumintstrr   r   rj   r   r   )ro   r\   r   rp   r5   
n_test_ptsr[   r   rE   rs   r   y_strknnepsilony_predr2   r2   r3   test_kneighbors_classifier  s   
r  c                 C   s   t j|}d|||j| dd d }|d jdddk t}tj|d}	|		||t
 dd|d| d  }
|	|d | |
 }t||d |  d S )	Nr,   FrV   r+   r   r   r   r   )r=   r>   r?   rB   rc   r   r   r   r   rj   floatr   r   )ro   rp   r5   r   r[   r   rE   rs   r   r   r   r  r2   r2   r3   'test_kneighbors_classifier_float_labels  s   	r  c              	   C   s(  t g dg dg dg dg dg dgj| dd}t g d	}tjd
dd}||| ||}t g dg dg dg dg dg dgd }t|| |||t ||}t|| tjdddd}||| |t g dg dg}t g dg dg}t	|| d S )N)r   r,   r   )r   r,   r+   )r,   r   r   )r,   r,   r   )r   r   r,   )r   r   r+   FrV   )r.   r.   rT   rT   r+   r+   r-   r+   )r[   r8   )r+   r,   r   r   r   )r,   r+   r   r   r,   rP   )r[   r8   r   )r,   r,   r,   r   r+   r   )r   g?g333333?)
r=   r   rc   r   r   rj   predict_probar   r   r   )ro   rs   r   clsZy_probZ	real_probr2   r2   r3   (test_kneighbors_classifier_predict_proba  s<   &




r  c                 C   s   t j|}d|||j| dd d }	|	d jdd|k t}
|
t}tj	|||d}|
|	|
 dd|d| d  }||	d | | }t||
d |  |
|	| ||	d | | }t||d |  d S )Nr,   FrV   r+   r   r   r   r\   r   )r=   r>   r?   rB   rc   r   r   r   r   r   rj   r   r   )ro   r\   r   rp   r5   r   r   r   rE   rs   r   r   rv   r   r  r2   r2   r3    test_radius_neighbors_classifier  s   
r
  outlier_label)r   Nc                 C   s   t jddgddgg| d}t ddg}d}t jddgddgg| d}t jddgd	d	gg| d}tj}	|	||||d
}
|
|| tt ddg|
| |d u rott	 |
| W d    d S 1 shw   Y  d S d S )NrJ   r   r0   r+   r,   皙?)\(?Gz @ffffff?r   r   r\   r  )
r=   r   r   r   rj   r   r   rg   r   r   )ro   r\   r   r  rs   r   r   z1z2rncclfr2   r2   r3   2test_radius_neighbors_classifier_when_no_neighbors  s&   	"r  c                    s  t jddgddgddgddgddgg| dt g dd}t jd	d	gddgg| d}t jd
d
gd	d	gddgg| d}t ddg}t g d}t ddg}tj|||dd}	|	 t||	| tjt	dd t||	| W d    n1 sw   Y  tjt	dd t
||	|d  W d    n1 sw   Y  tj t jdgdgdgdgdgdgdgdgdgdgg
| dt g d fdd}
tt |
  W d    n1 sw   Y   fdd}tt |  W d    n	1 s	w   Y   ddd }	|	 |	dgd!gg}t|dd d f g d"  ddd }	|	 |	dgd!gg}t|dd d f g d# |	dgd!gg}t|ddg  fd$d%}tt	 |  W d    n	1 s~w   Y  ddgddg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dd }	|	 |	dgd!gg}t|d dd d f g d# |	dgd!gg}t|dd d f ddg ddgddg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ddgd }	|	 |	dgd!gg}t|d dd d f g d& t|d dd d f g d# |	dgd!gg}t|dd d f ddg  fd'd(}tt |  W d    d S 1 sew   Y  d S ))NrJ   r   gGz?g\(\?r  r0   )r+   r,   r+   r+   r,   r  r  r  r+   r,   )r  r+   r,   r   r  r  z+Outlier label -1 is not in training classesr   r-   r.   rT            	   )
r   r,   r,   r+   r+   r+   r-   r-   r-   r-   c                     s     ddggd} |   d S )Nr+   rT   r   r  rj   r  RNCrs   r   r2   r3   check_array_exceptionV     zPtest_radius_neighbors_classifier_outlier_labeling.<locals>.check_array_exceptionc                     s    ddd} |   d S )Nr+   ar  r  r  r  r2   r3   check_dtype_exception^  s   zPtest_radius_neighbors_classifier_outlier_labeling.<locals>.check_dtype_exceptionZmost_frequentr     )r   r   r   r+   )r   r+   r   r   c                     s.    ddd} |   | dgdgg d S )Nr+   r.   r  r$  )rj   r  r  r  r2   r3   check_warningt  s   zHtest_radius_neighbors_classifier_outlier_labeling.<locals>.check_warning)r+   r   r   r   c                     s     dg dd} |   d S )Nr+   r   r  r  r  )r  rs   y_multir2   r3   check_exception  r!  zJtest_radius_neighbors_classifier_outlier_labeling.<locals>.check_exception)r=   r   r   r   rj   r   r   rg   r   UserWarningr   r  r   r   r   )ro   r\   r   r   r  r  correct_labels1Zcorrect_labels2Zoutlier_probar  r   r#  probapredr%  r'  r2   )r  rs   r   r&  r3   1test_radius_neighbors_classifier_outlier_labeling/  s     6$r,  c            	   
   C   s   t ddgddgg} t ddg}d}t ddgddgg}t ddg}t}tD ]6}dd|fD ].}tj|||d	}|| | t jd
d t||	| W d    n1 sZw   Y  q1q*d S )NrJ   r   r+   r,   r  r  rO   rP   r	  rH   )invalid)
r=   r   rN   rd   r   r   rj   rK   r   r   )	rs   r   r   r  r)  weight_funcr\   r   r  r2   r2   r3   .test_radius_neighbors_classifier_zero_distance  s$   r/  c                  C   s   t ddgddgddgddgg} t g d}d}t ddgddgg}t ddg}t ddg}t ddg}tD ]A}dD ]}tj|||d	}	|	| | t||	| q@td
dg||gD ]\}}
tj	d||d}|| | t|
|| qbq<d S )NrJ   r         @)rJ   r7   r   r   皙?皙?g      ?rO   rP   r	  rO   rP   r,   r   )
r=   r   rd   r   r   rj   r   r   r   r   )rs   r   r   zZrnn_correct_labelsZknn_correct_unifZknn_correct_distr\   r   rnnZcorr_labelsr   r2   r2   r3   'test_neighbors_regressors_zero_distance  s0   "r6  c                  C   s|   t dgdgdgg} d}tD ],}tj||d| }|jdggdd}|jdks+J |jt	ks2J t
|d	 d	d
g qdS )zTest whether points lying on boundary are handled consistently

    Also ensures that even with only one query point, an object array
    is returned rather than a 2d array.
    r7   r   gGz@r   r\   r   Fr]   )r+   r   r+   N)r=   r   rd   r   ri   rj   r   r   r1   objectr   )rs   r   r\   r   ru   r2   r2   r3   'test_radius_neighbors_boundary_handling  s   r9  c                 C   s   | t d}|g d tjddddd|}|j|dd	\}}t j|jd
 t	d}t 
d
gt 
d
gt 
d
gt 
d
gg|d d < t j|jd
 t	d}t 
d
gt 
dgt 
dgt 
dgg|d d < t|| t|| d S )N)r.   r.   )r   r   r   r   r   r*      r   )r   r\   Z	leaf_sizer/   Tr]   r   r0   r+   r,   r-   )r=   onesZsetdiagr   ri   rj   r   emptyr   r8  r   r   )r   rs   r   Z
neigh_distZ	neigh_indZexpected_distZexpected_indr2   r2   r3   .test_radius_neighbors_returns_array_of_objects  s   44
r=  )r'   r)   r(   c                 C   s|   t ddgg}t ddgddgddgddgg}d}t ddgg}tj| d|}t |j||dd}t|| d S )Nr   r+   r  r,   r\   F)r[   r^   )r=   r   r   ri   rj   sortrl   r   )r\   Zquery_pointZequidistant_pointskZknn_indicesr   rz   r2   r2   r3   test_query_equidistant_kth_nn  s   "rA  )r)   r'   r(   r   )r(   r   )r(   r   c           
      C   s  t |tj}t|trtd d}tjd}|	|df}|dkr,t
j|tjdd}t
j| |d}|| |j|tjd	d
\}}t|D ]}t|| t||  qG|dkr{tjtdd |j|tjd	dd W d    n1 svw   Y  |j|tjdd	d}	t|	sJ d S )Nr   rR   r   r.   r   rP   r   r   r   T)rs   r   sort_resultszreturn_distance must be Truer   F)rs   r   rC  r^   )rs   r   r   rC  )r4   r=   float64re   r   rg   rh   r>   r?   r   r   r   rA   ri   rj   r   rm   r   r?  r   r   r   )
r\   r/   rp   rE   rs   modelry   rz   iigraphr2   r2   r3   "test_radius_neighbors_sort_results  s2   



rH  c                  C   s  t d} d}d}d}| ||}| dd||f}t||dd\}}}}	d ddtg}
tt|
D ]U\}}
g }t|D ]}tj	|
|d}|
||d d |f  ||| q9t|j}|j|	jkseJ tj	|
|d}|
|| ||}|j|	jksJ t|| q/d S )	Nr   r,   r   r-   r   rO   rP   r   r\   )r&   rB   r   r   rN   r   rd   rm   r   r   rj   rk   r   r=   vstackrC   r   r   )rE   r5   rp   n_outputrs   r   r   r   y_trainy_testr   r\   	y_pred_soor5  Zrnn_mo	y_pred_mor2   r2   r3   *test_RadiusNeighborsClassifier_multioutputQ  s4   
rR  c                 C   s   t j|}d|| | d }||dk9 }|d jdddk t}tD ]>}tj	|dd}	|	
||| dd|d| d  }
tt jf D ]}||d | |
 }|	|}t||d |  qHq%d S )	Nr,   r+   r1  r   r   r*   r[   r\   r   )r=   r>   r?   rB   r   rc   r   SPARSE_TYPESr   r   rj   asarrayr   r   )rp   r5   r   r[   r   rE   rs   r   	sparsematr   r   sparsevZX_epsr  r2   r2   r3   !test_kneighbors_classifier_sparsew  s   
rX  c                  C   sj  t d} d}d}d}| ||}| dd||f}t||dd\}}}}	d ddtg}
tt|
D ]\}}
g }g }t|D ]%}tj	|
|d}|
||d d |f  ||| ||| q;t|j}|j|	jksoJ t||kswJ tj	|
|d}|
|| ||}|j|	jksJ t|| ||}t||ksJ t||D ]	\}}t|| qq/d S )	Nr   rT   r|   r-   rI  rO   rP   rJ  )r&   rB   r   r   rN   r   rd   rm   r   r   rj   rk   r   r  r=   rK  rC   r   rn   r   r   )rE   r5   rp   rL  rs   r   r   r   rM  rN  r   r\   rO  Zy_pred_proba_sorP  r   Zknn_morQ  Zy_pred_proba_moZproba_moZproba_sor2   r2   r3   %test_KNeighborsClassifier_multioutput  s<   


rY  c                 C   s   t j|}d|| | d }t |d d}||  }|d | }t}	tD ]<}
dd|	fD ]4}t	j
|||
d}||| dd|d| d  }||d | | }t t|| dk seJ q1q*d S Nr,   r+   rO   rP   r   r   333333?)r=   r>   r?   rB   sqrtr   maxrN   rd   r   r   rj   r   allr   )rp   r5   r   r[   r   rE   rs   r   y_targetr.  r\   r   r   r   r  r2   r2   r3   test_kneighbors_regressor  s"   r`  c                     s   t d} d}d}d}| ||}| ||}t||dd\}} }ttd dgD ]>\}	}
tj|
|	d}||  |j|dd	}t	
 fd
d|D }||}|j|jksYJ |j|jksaJ t|| q(d S )Nr   rT   r   r.   rI  rO   rJ  Fr]   c                       g | ]}t j | d dqS r   r   r=   mean.0idxrM  r2   r3   
<listcomp>      zGtest_KNeighborsRegressor_multioutput_uniform_weight.<locals>.<listcomp>)r&   rB   r   r   rd   r   r   rj   rl   r=   r   r   r   r   )rE   r5   rp   rL  rs   r   r   r   rN  r\   r   r   	neigh_idx
y_pred_idxr  r2   rh  r3   3test_KNeighborsRegressor_multioutput_uniform_weight  s"   
rm  c                 C   s   t j|}d|| | d }t |d d}||  }t ||gj}|d | }ddt	g}	t
t|	D ]?\}
}	tj||	|
d}||| dd|d| d  }||d | | }|j|jksiJ t t || dk swJ q8d S rZ  )r=   r>   r?   rB   r\  r   r]  rK  rC   rN   r   rd   r   r   rj   r   r   r^  r   )rp   r5   r   r[   r   rE   rs   r   r_  r   r\   r   r   r  r2   r2   r3   %test_kneighbors_regressor_multioutput  s"   
rn  c              	   C   sb  t j|}d|| | d }t |d d}||  }|d | }t}	tD ]>}
dd|	fD ]6}t	j
|||
d}||| dd|d| d  }||d | | }t t|| |d k sgJ q1q*dD ]C}t	j
||dd}||| t d|fd	}d
}tjtt|d ||}W d    n1 sw   Y  t t |sJ qkd S )Nr,   r+   rO   rP   r	  r   r3  r*   g      zNOne or more samples have no neighbors within specified radius; predicting NaN.r   )r=   r>   r?   rB   r\  r   r]  rN   rd   r   r   rj   r   r^  r   fullrg   r   r(  reescapeisnan)rp   r5   r   r   r   rE   rs   r   r_  r.  r\   r   rv   r   r  Z
X_test_nanZempty_warning_msgr+  r2   r2   r3   test_radius_neighbors_regressor  s:    
rs  c                     s   t d} d}d}d}| ||}| ||}t||dd\}} }ttd dgD ]C\}	}
tj|
|	d}||  |j|dd	}t	
 fd
d|D }t	
|}||}|j|jks^J |j|jksfJ t|| q(d S )Nr   rT   r   r.   rI  rO   rJ  Fr]   c                    ra  rb  rc  re  rh  r2   r3   ri  9  rj  zQtest_RadiusNeighborsRegressor_multioutput_with_uniform_weight.<locals>.<listcomp>)r&   rB   r   r   rd   r   r   rj   r   r=   r   r   r   r   )rE   r5   rp   rL  rs   r   r   r   rN  r\   r   r5  rk  rl  r  r2   rh  r3   =test_RadiusNeighborsRegressor_multioutput_with_uniform_weight(  s$   

rt  c                 C   s   t j|}d|| | d }t |d d}||  }t ||gj}|d | }ddt	g}t
t|D ]>\}	}tj||	d}
|
|| dd|d| d  }|
|d | | }|j|jkshJ t t || dk svJ q8d S )Nr,   r+   rO   rP   rJ  r   r[  )r=   r>   r?   rB   r\  r   r]  rK  rC   rN   r   rd   r   r   rj   r   r   r^  r   )rp   r5   r   r   rE   rs   r   r_  r   r\   r5  r   r  r2   r2   r3   )test_RadiusNeighborsRegressor_multioutputC  s   
ru  c              
   C   s4  t j|}d|| | d }|d jdddk t}tD ]x}tj	|dd}	|	
||| tj	|dd}
|

t|d	d
| tD ]S}||}t |	| |kdksYJ |t|d	d
}|tt v rd}tjt|d |
| W d    n1 sw   Y  qCt |
| |kdksJ qCqd S )Nr,   r+   r   g      ?r*   rS  r   r   r   r   ffffff?z3not supported due to its handling of explicit zerosr   )r=   r>   r?   rB   r   rc   r   rT  r   r   rj   r   SPARSE_OR_DENSErd  r   roundr$   r   rg   r   r   )rp   r5   r   r[   r   rE   rs   r   rV  r   Zknn_prerW  X2ZX2_prer   r2   r2   r3    test_kneighbors_regressor_sparseZ  s.    "rz  c                  C   s   t D ][} tjd| d}|tjtj t|tjtj |j	d| d |tjtj t
|tjtjkdks<J tjd| d}|tjtj t
|tj tjkdks]J qd S )Nr+   rS  r  rv  rT   )rd   r   r   rj   irisr   r   r   r   
set_paramsr=   rd  r   rx  )r\   r  Zrgsr2   r2   r3   test_neighbors_irisz  s    &r}  c                  C   s   t jd} t j}| j\}}t|d }td|}t||}| | || | | || f\}}}	}
tj	ddd}|
|||	|
}|
|jtdd||	jtdd|
}||ks]J d S )	NZuint8g?r   r+   r(   rS  FrV   )digitsr   rc   r   r   r   r=   r   r   r   rj   scorer  )rs   r   rp   r5   Ztrain_test_boundarytrainr   r   ZY_trainr   ZY_testr  Zscore_uint8Zscore_floatr2   r2   r3   test_neighbors_digits  s   
$r  c                  C   s  t ddgddgddgg} tj| dddd}t| t |jd  tj| dd	d
}t| g dg dg dg tj| dddd}t| g dg dg dg tj| dd	d
}t| g dg dg dg tj| dddd}t| g dg dg dg d S )Nr   r+   r  rJ   r,   connectivityTr   include_selfrP   r   r   r  r   )r  r   r   r   z?r   rJ   rJ   r   r   rJ   rJ   )r   r  w@r  r   r  )r  r  r   r-   )r+   r+   r+   )	r=   r   r   r   r   r   rD   r   r   rs   rF   r2   r2   r3   test_kneighbors_graph  s&    
$r  r[   )r+   r,   r-   r   r  $   c                 C   N   t j|}|dd}||}ttj|| |d tj|| |d  d S NrR   r   )r=   r>   r?   r   r   r   r   r   r[   r   r   seedrE   rs   Xcsrr2   r2   r3   test_kneighbors_graph_sparse     r  c                  C   s   t ddgddgddgg} tj| dddd	}t| g d
g dg dg tj| ddd}t| g dg dg dg d S )Nr   r+   r  rJ   r,   r7   r  Tr  r  )rJ   rJ   rJ   r  rP   r   r  r  r  )r=   r   r   r   r   r   r   r  r2   r2   r3   test_radius_neighbors_graph  s    r  c                 C   r  r  )r=   r>   r?   r   r   r   r   r   r  r2   r2   r3   "test_radius_neighbors_graph_sparse  r  r  	Estimatorc                 C   s   t d}||}t d}td}| ddd}d}tjt|d || W d	   n1 s2w   Y  d
}tjt|d t|	|| W d	   n1 sSw   Y  | ddd}|	|| d}tjt|d || W d	   n1 s}w   Y  |  }t
d}tjt|d |	tdtd W d	   n1 sw   Y  d}tjt|d |	|d	d	d	d	d	f | W d	   n1 sw   Y  |	|| t
d}tjt|d |g g W d	   d	S 1 sw   Y  d	S )z`Additional parameter validation for *Neighbors* estimators not covered by common
    validation.rR   r,   r   rR   r'   	haversiner   zinstance is not fitted yetr   Nz.Metric 'haversine' not valid for sparse input.r(   r/   r\   z-Haversine distance only valid in 2 dimensionszFound array with 0 sample(s)r   r   zFound array with dim 3zFound array with 0 feature(s))rE   r   r=   r;  rg   r   r   r   r   rj   rp  rq  )r  r   rs   ZXsparseZX3r   r   r   r2   r2   r3   "test_neighbors_validate_parameters  sB   



 
"r  rQ   r*   r(   c                 C   st   t d|f}td}| d|d}d}tjt|d ||| W d   n1 s,w   Y  |jdks8J dS )z
    Validation of all classes extending NeighborsBase with
    Minkowski semi-metrics (i.e. when 0 < p < 1). That proper
    Warning is raised for `algorithm="auto"` and "brute".
    rR   r  )r8   r\   zwMind that for 0 < p < 1, Minkowski metrics are not distance metrics. Continuing the execution with `algorithm='brute'`.r   Nr(   )	rE   r   r=   r;  rg   r   r(  rj   _fit_methodr  r5   r\   rs   r   rE  r   r2   r2   r3   -test_neighbors_minkowski_semimetric_algo_warn  s   
r  r)   r'   c                 C   sl   t d}td}| |dd}d| d}tjt|d ||| W d   dS 1 s/w   Y  dS )	zECheck that we raise a proper error if `algorithm!='brute'` and `p<1`.r  rR   r  )r\   r8   zalgorithm="zv" does not support 0 < p < 1 for the Minkowski metric. To resolve this problem either set p >= 1 or algorithm="brute".r   N)rE   r   r=   r;  rg   r   r   rj   r  r2   r2   r3   .test_neighbors_minkowski_semimetric_algo_error=  s   


"r  c                  C   s   t d} t | }d}tjt|d |j| dd W d   n1 s'w   Y  tjt|d |j	| dd W d   dS 1 sFw   Y  dS )z'Validate parameter of NearestNeighbors.r  zUUnsupported mode, must be one of "connectivity", or "distance" but got "blah" insteadr   Zblahr   N)
rE   r   r   ri   rj   rg   r   r   r   r   )rs   r   r   r2   r2   r3   &test_nearest_neighbors_validate_paramsX  s   
"r  Zpyfuncc              
   C   s   t j|}t|| }g d}|||j| dd}	|||j| dd}
t||}|D ]}t|tr5dn|t	j
d vpCd|v oCd|v }i }|dd}|D ]m}t|trc| t jkrcd	|v rctd
 t	j|||||d}|r|dkrtt ||	 W d    n1 sw   Y  qN|dkrtd d}t |	d d |f }	t |
d d |f }
||	 |j|
dd||< qN|d \}}|d \}}| t jkrdnd}t|||d t|| |s|d \}}t|||d t|| t|||d t|| q,d S )N)r(   r'   r)   FrV   r)   r6   r9   r8   r,   rX   rY   r[   r\   r/   r8   metric_paramsr  Tr]   r(   r'   gHz>g-C6?)rtol)r=   r>   r?   r4   rB   rc   rG   re   r   r   VALID_METRICSpoprf   rg   rh   ri   r   r   rj   sliceascontiguousarrayrl   rD  r   r   )ro   global_random_seedr/   rp   r5   rq   r[   rE   Z
algorithmsr   r   metric_params_listr  Zexclude_kd_treeru   r8   r\   rv   
feature_slZ	brute_dstZ	brute_idxZball_tree_dstZball_tree_idxr  Zkd_tree_dstZkd_tree_idxr2   r2   r3   test_neighbors_metricsg  sf   






r  )categoryr     r:  c              	   C   sV  t j|}|||j|dd}|||j|dd}	| dkr;td d}
t |d d |
f }t |	d d |
f }	| tv rG|dk}|	dk}	t| |}|D ]Z}|	dd}t
j|d| ||d}|| tdd	 |j|	d
d\}}W d    n1 s~w   Y  td
d	 |j|	d
d\}}W d    n1 sw   Y  t|||| qNd S )NFrV   r  r,   r   r8   r(   r  Zenable_cython_pairwise_distTr]   )r=   r>   r?   rB   rc   r  r  r   rG   r  r   ri   rj   r   rl   r   )r/   ro   r  rp   r5   rq   r[   rE   r   r   r  r  r  r8   rv   legacy_brute_dstlegacy_brute_idxpdr_brute_dstpdr_brute_idxr2   r2   r3   test_kneighbors_brute_backend  sF   


r  c                  C   sz   dd } t jddd}tjdd| d}tjdd	| d}|| || ||\}}||\}}t|| d S )
Nc                 S   s   t t | d |d  S )Nr,   )r=   r\  r   )x1Zx2r2   r2   r3   custom_metric  s   z+test_callable_metric.<locals>.custom_metricr   r   r,   r-   r*   rZ   r(   )	r=   r>   r?   rB   r   ri   rj   rl   r   )r  rs   nbrs1nbrs2r   r   r   r   r2   r2   r3   test_callable_metric  s   

r     c                 C   s  t || }t||j| dd}||}t||}|dkrItd}td}	tj|dd}
tj|	|dd}tj	ddd	}|
|
 || d S |D ]?}tj	dd
||d}|dkrjtd d}t|d d |f }|
| || |td v rtj	dd
|d
|}|| qKd S )NFrV   r   r   r   r   r   r-   r   r*   r[   r\   r/   r  r  r,   r(   rZ   )r4   rE   rB   rc   rG   r   r   r   r   ri   rj   rl   r  r=   r  r   )ro   r/   r   rp   r5   rs   r  r  ZX_precomputedZY_precomputedr   r   Znb_pr  r   r  r2   r2   r3   *test_valid_brute_metric_for_auto_algorithm  sF   








r  c                  C   sf   t dd} t ddd}tjddid}tt || | W d    d S 1 s,w   Y  d S )NrT   r   r,   r8   r-   )r  )	rE   rB   r   r   r   rg   r   SyntaxWarningrj   )rs   r   r   r2   r2   r3   test_metric_params_interfaceB  s   "r  c              	   C   s   t jd}|dd}|ddd}tjddd}tjddd}||fD ]$}||| t	
t || | W d    n1 sDw   Y  q%d S )Nr   rT   r,   r+   r)   r>  r'   )r=   r>   r?   rB   r   r   r   r   rj   rg   r   r   r   )r   rE   rs   r   r  r  rE  r2   r2   r3    test_predict_sparse_ball_kd_treeJ  s   r  c                  C   st  t jd} | dd}t| }t | |d }dD ]"}tj|d|ddd	 }tj
d|d	|}t|||	  qdD ]"}tj|||ddd	 }tj
||d
|}t|||	  qBtj
ddd	}|| tt tj|ddd W d    n1 sw   Y  tj
|dd}|| tt tj||dd W d    d S 1 sw   Y  d S )Nr   rT   r$  )	manhattanZ	chebyshevr-   r  T)r/   r   r  r   )r/   r   r  r   r   )r   r/   )r=   r>   r?   rB   r   flattenr?  r   r   r   ri   rj   r   r   rg   r   r   )rE   rs   Z
dist_arrayr   r/   Z
nbrs_graphr  ZX_nbrsr2   r2   r3   test_non_euclidean_kneighborsW  s>   




"r  c                 C   s$   t | D ]\}}t|||  qd S r   )	enumerater   )ZnparrayZ
list_checkr   Zeler2   r2   r3   check_object_arrays{  s   r  c                  C   s4  t D ]} tjd| d}dgdgg}|| dgdgg}||\}}t|dgdgg t|dgdgg |jdgdggdd\}}t|dgddgg t|dgddgg t||	 ddgddgg t|jdgdggd	d
	 t
ddgddgg |jdgdggdd}t|	 ddgddgg qd S )Nr+   rS  r   r,   r7   r   r   rJ   rP   r   )rd   r   ri   rj   rl   r   r   r  r   r   r=   r   r   )r\   r   rs   Z	test_datarL   r   rE   r2   r2   r3   .test_k_and_radius_neighbors_train_is_not_query  s*   
r  c                 C   sF  t jd| d}dgdgg}|| | \}}t|dgdgg t|dgdgg |jd dd\}}t|dgdgg t|dgdgg |jd dd}|d }||fD ]}t|	 ddgddgg t|j
ddg t|jddg qUddgddgddgg}t jd| d}|| t| 	 tg dg dg d	g d S )
Nr+   rS  r   r7   r   r,   r  )rJ   r   rJ   )rJ   rJ   r   )r   ri   rj   rl   r   r   r  r   r   r   r   rz   r=   r   )r\   r   rs   rL   r   rE   kngrG  r2   r2   r3   "test_k_and_radius_neighbors_X_None  s,   



r  c                 C   s  t jd| d}dgdgdgg}|| |j|dd}t| tg dg dg dg t|jg d t|j	g d |j
dgdggd	d
\}}t|ddgddgg t|ddgddgg |j|d	d
}t| tg dg dg dg |jdgdggd	dd}|  t| g dg dg t|j	g d t|jg d td}t jddd}|| | \}}t|td t|dgdgdgg |jdd}t| td t|jtd t|j	g d t|  tg dg dg dg d S )Nr+   rS  r   r-   rP   r   r   r   r7   r   r  )r   r   rJ   rB  r  )r+   r   r   )r   r+   r   r+   )r   r+   r+   r   )r-   r+   r(   r   )r+   r   r+   )r   rJ   r   )rJ   r   r   )r   ri   rj   r   r   r   r=   r   r   rz   r   r  r   Zsort_indicesr;  rl   Zzeros)r\   r   
duplicatesr  rL   r   rE   rs   r2   r2   r3   &test_k_and_radius_neighbors_duplicates  sF   
  


r  c                  C   s   ddgddgg} t j| ddd }t j| ddd }t|d	d
gd
d	gg t|d
d	gd	d
gg t j| ddd }t j| ddd }t|d	d	gd	d	gg t|d
d	gd	d
gg d S )Nr,   r-   r.   rT   r+   T)r  FrJ   r   r   )r   r   r   r   r   )rs   r  Zkng_not_selfrE   Zrng_not_selfr2   r2   r3   !test_include_self_neighbors_graph  s   r  c                 C   s   t jddddd\}}t||\}}}}tjd| d}||| ||}||\}}	|j|dd	 }
|j
dd	 ||| ||}||\}}|j|dd	 }t|| t|| t|	| t|
| d S )
Nr:  rT   r   rp   r5   n_redundantr   r-   rS  rP   r   n_jobs)r   make_classificationr   r   r   rj   r   rl   r   r   r|  r   r   )r\   rs   r   r   r   rM  rN  r  rL   r   rG  
y_paralleldist_parallelind_parallelgraph_parallelr2   r2   r3   test_same_knn_parallel   s$   





r  c                 C   s   t jddddd\}}t||\}}}}tjd| d}||| ||}||\}}	|j|dd	 }
|j
d	d
 ||| ||}||\}}|j|dd	 }t|| tt|D ]}t|| ||  t|	| ||  qbt|
| d S )Nr:  rT   r   r  rR   r7  rP   r   r-   r  )r   r  r   r   r   rj   r   r   r   r   r|  r   rm   rn   r   )r\   rs   r   r   r   rM  rN  r  rL   r   rG  r  r  r  r  rw   r2   r2   r3   #test_same_radius_neighbors_parallel  s&   



r  backend	threadingZlokyc           	      C   s   t | < tjddddd\}}t||\}}}}tjd|dd}||| || |	| |j
|dd	 W d    d S 1 sDw   Y  d S )
Nr:  rT   r   r  r-   r,   )r[   r\   r  rP   r   )joblibZparallel_backendr   r  r   r   r   rj   r   rl   r   )	r  r\   rs   r   r   r   rM  rN  r  r2   r2   r3   test_knn_forcing_backend3  s   


"r  c                  C   sP   t jdd} d}t|}dd dd | D }| |||}t|| d S )Nr+   r   r$  c                 S   s   g | ]}|qS r2   r2   )rf  chr2   r2   r3   ri  K      z&test_dtype_convert.<locals>.<listcomp>ZABCDEFGHIJKLMNOPQRSTU)r   r   r=   rD   rj   r   r   )Z
classifierZCLASSESrs   r   resultr2   r2   r3   test_dtype_convertG  s   
r  c                 C   s~   dd }| g dg dg dg}| g dg dg}t jdd	|d
|}|j|dd}td	dgd	dgg}t|| d S )Nc                 S   s(   t | rt |s
J | |j  S r   )r   dotrC   r   item)xr   r2   r2   r3   sparse_metricS  s   z2test_sparse_metric_callable.<locals>.sparse_metric)r+   r+   r+   r+   r+   )r+   r   r+   r   r+   )r   r   r+   r   r   )r+   r+   r   r+   r+   )r+   r   r   r+   r+   r(   r,   )r\   r[   r/   Fr]   r+   )r   ri   rj   rl   r=   r   r   )r   r  rs   r   r   NZgold_standard_nnr2   r2   r3   test_sparse_metric_callableQ  s   r  z0ignore::sklearn.exceptions.DataConversionWarningc                  C   sd   t jd} | jdd}tj}|ddd|}|ddd|}t||d ||d  d S )Nr   )r  rT   r   Zjaccardr(   r  r'   )	r=   r>   r?   rO   r   ri   rj   r   rl   )rE   rs   ZNNZnn1Znn2r2   r2   r3   test_pairwise_boolean_distancei  s   "r  c               	   C   s   t dD ]O} tjddddd| d\}}t||dd\}}}}td|  }tjd|d}||| ||}	|	|}
|
j
d	d
}t|
jd	d
dk||}t|	| qd S )NrT   r|   r-   r   )rp   r5   Zn_informativer  Z	n_classesr   rI  r,   r  r+   r   )rm   r   r  r   r   r   r   rj   r   r  Zargmaxr=   wherer   r   )r  rs   r   ZX_trZX_teZy_trZy_ter  r  r+  r*  Zproba_labelr2   r2   r3   #test_radius_neighbors_predict_probaw  s&   


r  c                  C   s2  t jd} d| dd d }d| dd d }| dd}d}d}d}tj|dd	}tjt|| dd	}tj|dd
}	tjt|| dd
}
tj|d}tj	|d}||f||f|	|f|
|fg}|D ]0\}}t
|}t
|}|jdd tt
||}||||}||||}t|| qfd S )Nr   r,   r   rT   r+   r  r7   rP   )r[   r   rB  r   r   r   r   )r=   r>   r?   rB   r   KNeighborsTransformerr   RadiusNeighborsTransformerr   r   r   r|  r   rj   r   r   )rE   rs   ry  r   r[   r   factorZk_transZk_trans_factorZr_transZr_trans_factorZk_regZr_regZ	test_listZtransregZreg_compactZreg_precompZ	reg_chainZy_pred_chainZy_pred_compactr2   r2   r3   0test_pipeline_with_nearest_neighbors_transformer  s>   r  z'X, metric, metric_params, expected_algor   r   r  r:   r;   Zcorrelationc                 C   s.   t jdd||d}||  |j|ksJ d S )Nr.   r*   r  )r   ri   rj   r  )rs   r/   r  Zexpected_algorE  r2   r2   r3   test_auto_algorithm  s
   
r  rJ   c              	   C   sD  t j|}|||j|dd}|||j|dd}	| dkr;td d}
t |d d |
f }t |	d d |
f }	t| |}|D ]]}|dd}t	j
|d| ||d}|| tdd |j|	d	d
\}}W d    n1 srw   Y  td	d |j|	d	d
\}}W d    n1 sw   Y  t|||||dd qBd S )NFrV   r  r,   r8   r(   )r   r\   r/   r8   r  r  Tr]   )r   Zcheck_sorted)r=   r>   r?   rB   rc   r  r  rG   r  r   ri   rj   r   r   r   )r/   r  ro   rp   r5   rq   r   rE   r   r   r  r  r  r8   rv   r  r  r  r  r2   r2   r3   #test_radius_neighbors_brute_backend  sJ   


r  c                  C   s,   t j D ]} t| tt| ksJ qd S r   )r   r  valuesrn   set)valr2   r2   r3   #test_valid_metrics_has_no_duplicate	  s   r  c                  C   sb   ddgddgddgddgg} g d}dd }t dd	|d
}|| | t|ddggdg dS )ztEnsures that `predict` works for array-likes when `weights` is a callable.

    Non-regression test for #22687.
    rT   r+   r-   r.   r   )r,   r-   rT   r  c                 S   s
   t | S r   )r=   Z	ones_likerL   r2   r2   r3   _weights	  s   
z6test_regressor_predict_on_arraylikes.<locals>._weightsr(   )r[   r\   r   r0  r  N)r   rj   r   r   )rs   r   r  r   r2   r2   r3   $test_regressor_predict_on_arraylikes	  s   r  zEstimator, paramsr   r7   c                 C   s   ddgdt jgddgddgg}g d}|ddi |  jdi |||}d	D ]'}t||rPt|||}t|d
rGt |j	 rFJ q)t |	 rPJ q)dS )zyCheck that the different neighbor estimators are lenient towards `nan`
    values if using `metric="nan_euclidean"`.
    r   r+   r,   r-   rT   r   r   r+   r+   r/   Znan_euclidean)rl   r   	transformZfit_predictr   Nr2   )
r=   nanupdater|  rj   hasattrr   rr  r   any)r  paramsrs   r   Z	estimatorZresponse_methodoutputr2   r2   r3   test_nan_euclidean_support"	  s   

r  c                  C   sj   t d} | jtddgddgddgdd	ggd
dgd}tg d}tjdd||}|| dS )z[Check that KNN predict works with dataframes

    non-regression test for issue #26768
    Zpandasr+   r,   r-   r.   rT   r  r  r  r"  b)columns)r+   r,   r-   r.   r   N)	rg   ZimportorskipZ	DataFramer=   r   r   r   rj   r   )pdrs   r   r   r2   r2   r3   test_predict_dataframeB	  s
   
0r  c                  C   s   t ddgddgddgg} tjddddid}||  |j| d d	d
ddd}t|d g d |j| d d	d
dd}t|d g d dS )zCheck that NearestNeighbors works with :math:`p \in (0,1)` when `algorithm`
    is `"auto"` or `"brute"` regardless of the dtype of X.

    Non-regression test for issue #26548
    rJ   r   r-   r(   r8   r   )r[   r\   r  r   r+   r  r.   F)r   r^   r   r]   N)	r=   r   r   ri   rj   r   r   r   rl   )rs   rv   r   r2   r2   r3   0test_nearest_neighbours_works_with_p_less_than_1P	  s   

r  c                  C   s   ddgddgddgddgg} g d}dd }t jd|d	}|| | d
}tjt|d |ddgg W d   n1 s?w   Y  tjt|d |ddgg W d   dS 1 s_w   Y  dS )zrCheck that `predict` and `predict_proba` raises on sample of all zeros weights.

    Related to Issue #25854.
    r   r+   r,   r-   r.   r  c                 S   s   t dd | S )Nc                 S   s   | dkrdS dS )Nr   r   r+   r2   )r  r2   r2   r3   <lambda>l	  r  zWtest_KNeighborsClassifier_raise_on_all_zero_weights.<locals>._weights.<locals>.<lambda>)r=   Z	vectorizer  r2   r2   r3   r  k	  s   zEtest_KNeighborsClassifier_raise_on_all_zero_weights.<locals>._weights)r[   r   zAll neighbors of some sample is getting zero weights. Please modify 'weights' to avoid this case if you are using a user-defined function.r   r2  N)r   r   rj   rg   r   r   r   r  )rs   r   r  r   r   r2   r2   r3   3test_KNeighborsClassifier_raise_on_all_zero_weightsc	  s   "r  nn_modelr   c                 C   s   t jddddd\}}t| j|d} d|  v r/t| }||dk }| jt|dd	 t	| ||t
 d
}| || t|| d|k t|t| d|ksXJ | d|| ||k sfJ dS )a  Check that `predict` and related functions work fine with X=None

    Calling predict with X=None computes a prediction for each training point
    from the labels of its neighbors (without the label of the data point being
    predicted upon). This is therefore mathematically equivalent to
    leave-one-out cross-validation without having do any retraining (rebuilding
    a KD-tree or Ball-tree index) or any data reshuffling.
    r$  rT   r,   r   )rp   Zcentersr5   r   r>  r   P   r   ZcvN)r   Z
make_blobsr   r|  
get_paramsr   ravelr=   
percentiler   r   rj   r   r   rd  rg   Zapproxr  r  r\   rs   r   distsZloocvr2   r2   r3   test_neighbor_classifiers_loocv~	  s     r  c                 C   s   t jdddd\}}t| j|d} d|  v r.t| }||dk }| jt|dd t	| ||t
 d	}| || t|| d
 d
S )z@Check that `predict` and related functions work fine with X=Noner$  r,   r   )rp   r5   r   r>  r   r  r   r  N)r   Zmake_regressionr   r|  r  r   r	  r=   r
  r   r   rj   r   r   r  r2   r2   r3   test_neighbor_regressors_loocv	  s   

r  r   )r   rT   r,   r   r   )r   rT   rR   rT   r   )r   rT   rR   r   r   )r   rT   rR   r-   r   )r   r-   rR   r   r   )r   rT   rR   r   )r  )r   r-   r,   rT   )r  r:  rT   rT   )r   r  )r  r:  rT   rJ   )rp  r   	itertoolsr   r  numpyr=   rg   Zscipy.sparser   Zsklearnr   r   r   r   Zsklearn.baser   Zsklearn.exceptionsr	   r
   Zsklearn.metrics._dist_metricsr   Zsklearn.metrics.pairwiser   r   Z'sklearn.metrics.tests.test_dist_metricsr   Z7sklearn.metrics.tests.test_pairwise_distances_reductionr   r   Zsklearn.model_selectionr   r   r   r   Zsklearn.neighborsr   r   Zsklearn.neighbors._baser   r   r   r   Zsklearn.pipeliner   Zsklearn.utils._testingr   r   r   Zsklearn.utils.fixesr   r    r!   r"   r#   r$   r%   Zsklearn.utils.validationr&   r>   r?   rE   Z	load_irisr{  Zpermutationr   r   permr   Zload_digitsr~  tuplerT  rU  rw  rd   sortedr  intersectionmapr  r  ZCOMMON_VALID_METRICSrA   r   r   r   ZDISTANCE_METRIC_OBJSr   r4   r   rG   rN   ZWEIGHTSmarkZparametrizer{   r   r   r   r   ri   r   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r,  r/  r6  r9  r=  rA  r   rH  rR  rX  rY  r`  rm  rn  rs  rt  ru  rz  r}  r  r  r  r  r  r  r  r  r  r  DeprecationWarningr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  ZLocalOutlierFactorr  r  r  r  r  r  r2   r2   r2   r3   <module>   s   $	
M	C

	
7







	*#}!



%'-'
 	%		Q7,
$

1





.
9

!
