
    -i4              	          S r SSKrSSKJrJr  SSKrSSKrSSKJ	r	  SSK
JrJrJr  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJrJrJrJr  SSKJrJ r   \" 5       r!\" 5       r"S r#\RH                  RK                  S\\ -   5      S 5       r&S r'S r(S r)S r*S r+\RH                  RK                  SSS/5      S 5       r,S r-S r.S r/S r0S r1\" S\" S10 SS 0D6S!9\RH                  RK                  S"S#S$/5      S% 5       5       r2\" S\" S10 SS&0D6S!9\RH                  RK                  S"S#S$/5      S' 5       5       r3S( r4\RH                  RK                  S)\5      S* 5       r5S+ r6\RH                  RK                  S\\ -   5      S, 5       r7\RH                  RK                  S-S.S//5      \RH                  RK                  SSS/5      S0 5       5       r8g)2zD
Testing for Isolation Forest algorithm (sklearn.ensemble.iforest).
    N)Mockpatch)parallel_backend)load_diabetes	load_irismake_classification)IsolationForest)_average_path_length)roc_auc_score)ParameterGridtrain_test_split)check_random_state)assert_allcloseassert_array_almost_equalassert_array_equalignore_warnings)CSC_CONTAINERSCSR_CONTAINERSc                 L   [         R                  " SS/SS//5      n[         R                  " SS/SS//5      n[        S// SQSS/S.5      n[        5          U H.  n[	        SS	U 0UD6R                  U5      R                  U5        M0     S
S
S
5        g
! , (       d  f       g
= f)z6Check Isolation Forest for various parameter settings.r            )      ?      ?r   TF)n_estimatorsmax_samples	bootstraprandom_stateN )nparrayr   r   r	   fitpredict)global_random_seedX_trainX_testgridparamss        V/var/www/html/venv/lib/python3.13/site-packages/sklearn/ensemble/tests/test_iforest.pytest_iforestr*   "   s    hhAA'(GXX1v1v&'F]$PUWD 
	FF);FvFJJgfo  
		s   5B
B#sparse_containerc                 x   [        U 5      n[        [        R                  SS US9u  p4[	        SS/SS/S.5      nU" U5      nU" U5      nU Hj  n[        SS	U S
.UD6R                  U5      n	U	R                  U5      n
[        SS	U S
.UD6R                  U5      nUR                  U5      n[        X5        Ml     g)z=Check IForest for various parameter settings on sparse input.N2   r   r   r   TF)r   r   
   )r   r   r   )	r   r   diabetesdatar   r	   r"   r#   r   )r$   r+   rngr%   r&   r'   X_train_sparseX_test_sparser(   sparse_classifiersparse_resultsdense_classifierdense_resultss                r)   test_iforest_sparser9   2   s     /
0C&x}}Sb'9LOG#s4-PQD%g.N$V,M+ 
*<
@F

#n
 	 +22=A + 
*<
@F

#g, 	 )008>9     c                  :   [         R                  n Sn[        R                  " [        US9   [        SS9R                  U 5        SSS5        [        R                  " 5          [        R                  " S[        5        [        SS9R                  U 5        SSS5        [        R                  " 5          [        R                  " S[        5        [        [        R                  " S5      S9R                  U 5        SSS5        [        R                  " [        5         [        5       R                  U 5      R                  U SS2S	S24   5        SSS5        g! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g= f)
z7Test that it gives proper exception on deficient input.3max_samples will be set to n_samples for estimationmatch  r   Nerrorautor   r   )irisr1   pytestwarnsUserWarningr	   r"   warningscatch_warningssimplefilterr    int64raises
ValueErrorr#   )Xwarn_msgs     r)   test_iforest_errorrO   L   s	   		A
 EH	k	2D)--a0 
3		 	 	"g{3F+//2 
# 
	 	 	"g{3BHHQK044Q7 
#
 
z	"a ((1ab52 
#	" 
3	2	"	" 
#	"
 
#	"s0   E"4E*3AE;2F
E'*
E8;
F	
Fc            
         [         R                  n [        5       R                  U 5      nUR                   HS  nUR
                  [        [        R                  " [        R                  " U R                  S   5      5      5      :X  a  MS   e   g)zDCheck max_depth recalculation when max_samples is reset to n_samplesr   N)rC   r1   r	   r"   estimators_	max_depthintr    ceillog2shape)rM   clfests      r)   test_recalculate_max_depthrY   b   s]    		A




"C}}BGGBGGAGGAJ,?$@ AAAA r:   c                     [         R                  n [        5       R                  U 5      nUR                  U R
                  S   :X  d   e[        SS9nSn[        R                  " [        US9   UR                  U 5        S S S 5        UR                  U R
                  S   :X  d   e[        SS9R                  U 5      nUR                  SU R
                  S   -  :X  d   eg ! , (       d  f       Nh= f)Nr   i  r@   r<   r=   g?)	rC   r1   r	   r"   max_samples_rV   rD   rE   rF   )rM   rW   rN   s      r)   test_max_samples_attributer\   j   s    		A




"Cqwwqz)))
c
*CDH	k	2
 
3qwwqz)))
c
*
.
.q
1CsQWWQZ//// 
3	2s   -C!!
C/c                    [        U 5      n[        [        R                  US9u  p#[	        SU S9R                  U5      nUR                  SS9  UR                  U5      nUR                  SS9  UR                  U5      n[        XV5        [	        SU S9R                  U5      nUR                  U5      n[        XW5        g)zCheck parallel regression.r.   r   )n_jobsr   r   r^   r   N)	r   r   r0   r1   r	   r"   
set_paramsr#   r   )r$   r2   r%   r&   ensembley1y2y3s           r)    test_iforest_parallel_regressionre   y   s    
/
0C&x}}3GOGa6HIMMgVHq!			&	!Bq!			&	!Bb%a6HIMMgVH			&	!Bb%r:   c                    [        U 5      nSUR                  SS5      -  nUR                  [        R                  " US-   US-
  45      5      nUSS nUR                  SSSS	9n[        R                  " USS U45      n[        R                  " S
/S-  S/S-  -   5      n[        SUS9R                  U5      nUR                  U5      * n[        Xh5      S:  d   eg)z#Test Isolation Forest performs wellg333333?iX  r   Nr?   r   )   r   )lowhighsizer   rh   d   )r   r   g\(\?)r   randnpermutationr    vstackuniformr!   r	   r"   decision_functionr   )	r$   r2   rM   r%   
X_outliersr&   y_testrW   y_preds	            r)   test_iforest_performanceru      s     /
0CciiQA		1q5!a%.12AhG !(;JYY$%*-.FXXqcCi1#)+,F c
<
@
@
IC ##F++F (4///r:   contamination      ?rB   c           	      L   SS/SS/SS/SS/SS/SS/SS/SS//n[        XS	9nUR                  U5        UR                  U5      * nUR                  U5      n[        R
                  " USS  5      [        R                  " US S 5      :  d   e[        US
S/-  SS/-  -   5        g )Nrg   r   r         	   r   rv      )r	   r"   rq   r#   r    minmaxr   )rv   r$   rM   rW   decision_funcpreds         r)   test_iforest_worksr      s     bB8b"X1v1v1v1vAwOA '9
WCGGAJ**1--M;;q>D66-$%}Sb/A(BBBBtQ!WqB4x/0r:   c                      [         R                  n [        5       R                  U 5      nUR                  UR
                  :X  d   eg N)rC   r1   r	   r"   r[   _max_samples)rM   rW   s     r)   test_max_samples_consistencyr      s8    		A




"Cs/////r:   c                      [        S5      n [        [        R                  S S [        R                  S S U S9u  pp4[        SS9nUR                  X5        UR                  U5        g )Nr   r-   r.   g?)max_features)r   r   r0   r1   targetr	   r"   r#   )r2   r%   r&   y_trainrs   rW   s         r)    test_iforest_subsampled_featuresr      s\    
Q
C'7crHOOCR0s($GW s
+CGGGKKr:   c                  x   S[         R                  " S5      [         R                  -   -  S-
  n S[         R                  " S5      [         R                  -   -  S-
  n[        [	        S/5      S/5        [        [	        S/5      S/5        [        [	        S	/5      S
/5        [        [	        S/5      U /5        [        [	        S/5      U/5        [        [	        [         R
                  " / SQ5      5      SS
X/5        [	        [         R                  " S5      5      n[        U[         R                  " U5      5        g )N       @g      @g?g     0@g}?r   g        r   r   r        )r   r   r   r   )	r    logeuler_gammar   r
   r!   aranger   sort)
result_one
result_twoavg_path_lengths      r)    test_iforest_average_path_lengthr      s     sbnn45GJu67:MMJ(!-u5(!-u5(!-u5(!-
|<(#/*>RXXn56	c:*
 +299Q<8O(@Ar:   c                     SS/SS/SS//n [        SS9R                  U 5      n[        5       R                  U 5      n[        UR                  SS//5      UR	                  SS//5      UR
                  -   5        [        UR                  SS//5      UR	                  SS//5      UR
                  -   5        [        UR                  SS//5      UR                  SS//5      5        g )Nr   r   皙?)rv   r   )r	   r"   r   score_samplesrq   offset_)r%   clf1clf2s      r)   test_score_samplesr      s    1v1v1v&G-11':D  )DS#J<(c
|,t||; S#J<(c
|,t||; S#J<($*<*<sCj\*Jr:   c                  4   [        S5      n U R                  SS5      n[        SSU SS9nUR                  U5        UR                  S   nUR                  SS9  UR                  U5        [        UR                  5      S:X  d   eUR                  S   UL d   eg)	z/Test iterative addition of iTrees to an iForestr      r   r/   T)r   r   r   
warm_start)r   N)r   rm   r	   r"   rQ   r`   len)r2   rM   rW   tree_1s       r)   test_iforest_warm_startr      s     Q
C		"aA RcdC GGAJ__QFNNN#GGAJs2%%%??1'''r:   z*sklearn.ensemble._iforest.get_chunk_n_rowsreturn_valuer   )side_effectzcontamination, n_predict_calls)rw   r   )rB   r   c                 >    [        X5        U R                  U:X  d   eg r   r   
call_countmocked_get_chunkrv   n_predict_callsr$   s       r)   test_iforest_chunks_works1r           }9&&/999r:   r/   c                 >    [        X5        U R                  U:X  d   eg r   r   r   s       r)   test_iforest_chunks_works2r     r   r:   c                     [         R                  " S5      n [        5       nUR                  U 5        [         R                  R                  S5      n[        UR                  U 5      S:H  5      (       d   e[        UR                  UR                  SS5      5      S:H  5      (       d   e[        UR                  U S-   5      S:H  5      (       d   e[        UR                  U S-
  5      S:H  5      (       d   e[         R                  " UR                  SS5      SS5      n [        5       nUR                  U 5        [        UR                  U 5      S:H  5      (       d   e[        UR                  UR                  SS5      5      S:H  5      (       d   e[        UR                  [         R                  " S5      5      S:H  5      (       d   eUR                  SS5      n [        5       nUR                  U 5        [        UR                  U 5      S:H  5      (       d   e[        UR                  UR                  SS5      5      S:H  5      (       d   e[        UR                  [         R                  " S5      5      S:H  5      (       d   eg)z=Test whether iforest predicts inliers when using uniform data)rl   r/   r   r   rl   r/   N)
r    onesr	   r"   randomRandomStateallr#   rm   repeat)rM   iforestr2   s      r)   test_iforest_with_uniform_datar     s    		AGKKN
))


"Cwq!Q&''''wsyyb12a78888wq1u%*++++wq1u%*++++ 			#))Ar"C+AGKKNwq!Q&''''wsyyb12a78888wrwwy12a78888 			!RAGKKNwq!Q&''''wsyyb12a78888wrwwy12a78888r:   csc_containerc                 b    [        SSSS9u  pU " U5      n[        SSSS9R                  U5        g	)
z\Check that Isolation Forest does not segfault with n_jobs=2

Non-regression test for #23252
iL rl   r   	n_samples
n_featuresr   r/      r   )r   r   r^   N)r   r	   r"   )r   rM   _s      r)   *test_iforest_with_n_jobs_does_not_segfaultr   =  s5     CaPDAaAQ?CCAFr:   c                  x   [         R                  " S5      n [        R                  R	                  S5      nU R                  UR                  S5      S/S9n[        SSS9n[        R                  " 5          [        R                  " S[        5        UR                  U5        S	S	S	5        g	! , (       d  f       g	= f)
zCheck that feature names are preserved when contamination is not "auto".

Feature names are required for consistency checks during scoring.

Non-regression test for Issue #25844
pandasr   r{   a)r1   columnsg?r~   rA   N)rD   importorskipr    r   r   	DataFramerm   r	   rG   rH   rI   rF   r"   )pdr2   rM   models       r)   #test_iforest_preserve_feature_namesr   H  s     
		X	&B
))


"C
#))A,6A$?E		 	 	"g{3		! 
#	"	"s   5-B++
B9c                 "   [        SSSS9u  pU " U5      nUR                  5         Sn[        SUSS9R                  U5      nUR	                  U5      nUS:  R                  5       UR                  S   -  [        R                  " U5      :X  d   eg)	zCheck that `IsolationForest` accepts sparse matrix input and float value for
contamination.

Non-regression test for:
https://github.com/scikit-learn/scikit-learn/issues/27626
r-   r{   r   r   r   r   )r   rv   r   N)	r   sort_indicesr	   r"   rq   sumrV   rD   approx)r+   rM   r   rv   r   
X_decisions         r)   -test_iforest_sparse_input_float_contaminationr   Z  s     JDAANNMm!	c!f  **1-JN!AGGAJ.&--2NNNNr:   r^   r   r   c           	         SS/SS/SS/SS/SS/SS/SS/SS//n[        XS	S
9nUR                  U5        UR                  U5      * nUR                  U5      n[        R
                  " USS	 5      [        R                  " US	S 5      :  d   e[        USS/-  SS/-  -   5        [        XSS
9nUR                  U5        [        SUS9   UR                  U5      nS	S	S	5        [        UW5        g	! , (       d  f       N= f)z5Check that `IsolationForest.predict` is parallelized.ry   rg   r   r   rz   r{   r|   r}   N)r   rv   r^   r   	threadingr_   )	r	   r"   rq   r#   r    r   r   r   r   )	r$   rv   r^   rM   rW   r   r   clf_parallelpred_paralells	            r)   test_iforest_predict_parallelr   n  s   
 bB8b"X1v1v1v1vAwOA 'TC GGAJ**1--M;;q>D 66-$%}Sb/A(BBBBtQ!WqB4x/0"'RL Q	+f	5$,,Q/ 
6 t]+	 
6	5s   C22
D r   )9__doc__rG   unittest.mockr   r   numpyr    rD   joblibr   sklearn.datasetsr   r   r   sklearn.ensembler	   sklearn.ensemble._iforestr
   sklearn.metricsr   sklearn.model_selectionr   r   sklearn.utilsr   sklearn.utils._testingr   r   r   r   sklearn.utils.fixesr   r   rC   r0   r*   markparametrizer9   rO   rY   r\   re   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r)   <module>r      s    %   # J J , : ) C ,  ? {?  +^n-LM: N:23,B0&(00 4.91 :10B("(. 0+*+ 9I{;ST: U	
: 0,+, 9I{;ST: U	
:9D .9G :G$ +^n-LMO NO& Aq6*4.9, : +,r:   