
    {Kg=                        d dl Z d dlmZ d dlZd dl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mZmZmZmZmZmZ d dlmZ d Zd	 Zej4                  j7                  d
e      d        Z G d d      Z G d d      Z G d de      Zd Z  G d de      Z!d Z"d Z#ej4                  j7                  dddg      d        Z$d Z%ej4                  j7                  dddg      d        Z& G d ded       Z'd! Z(d" Z) G d# d$      Z*d% Z+d& Z, G d' d(e      Z-d) Z. G d* d+e      Z/d, Z0 G d- d.e      Z1ej4                  j7                  dddg      d/        Z2ej4                  j7                  d0 e3ejh                              d1        Z5d2 Z6d3 Z7y)4    N)
namedtuple)assert_array_equal)config_context
get_config)StandardScaler)ADAPTERS_MANAGERContainerAdapterProtocol_get_adapter_from_container_get_output_config_safe_set_output_SetOutputMixin_wrap_data_with_containercheck_library_installed)CSR_CONTAINERSc                  (   t        j                  d      } t        j                  g dg dg      }t        j                  g dt              t        j                  ddg      }| j                  ddgdd	gg|
      }t        j                  d   }|j                  ||fd      }t        || j
                        sJ t        |j                         t        |j                  |       t        j                  ddgt              }| j                  ddgdd	ggddg
      }|j                  |||      }t        |j                  |       t        |j                  |j                         |j                  |      sJ |j                  |      rJ t        j                  ddgt              }|j                  ||      }t        |j                  |       | j                  g dg dgg d      }	| j                  dgdggdg      }
|j!                  |	|
g      }| j                  g dg dgg d      }| j"                  j%                  ||       | j                  ddgdd	ggddg      }t        j                  ddgt              }|j                  ||      }t        |j                  |       | j                  ddgdd	gg|
      }|j                  ||ddgd      }||usJ t'        |j                        ddgk(  sJ t'        |j                        ddgk(  sJ | j                  ddgdd	gg|
      }|j                  ||ddgd       }||u sJ t'        |j                        ddgk(  sJ t'        |j                        ddgk(  sJ y!)"z+Check pandas adapter has expected behavior.pandas   r      r   r   r   )f0f1f2dtyper   r      r   indexc                       S N columnss   g/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/utils/tests/test_set_output.py<lambda>z%test_pandas_adapter.<locals>.<lambda>        G    r"   r   r   
      acr   r      r         r*   ber/   r-   r   r   r-   r/   r   r/   r0   r-   r*   r2   r3   r+   x__ay__ar2   Fr#   inplaceTN)pytestimportorskipnpasarrayobject	DataFramer   adapterscreate_container
isinstancer   r#   r   is_supported_containerarrayrename_columnshstacktestingassert_frame_equallist)pdX_npr   	X_df_origadapterX_containernew_columnsX_dfnew_dfX_df_1X_df_2	X_stackedexpected_dfX_outputr#   s                 @r$   test_pandas_adapterrX      sq   			X	&B::y),-Djj+6:GJJ1vEq!fq!f-U;I''1G**4O*TKk2<<000{**G4{((%0 **dD\8K<<!Q!Q(R<9D%%dI{%KFv~~{3v||TZZ0))$///--d333 ((C:V4K##D+6Fv~~{3 \\9i0/\JF\\A3*se\4F/0I,,	|$.B  K JJ!!)[9
 <<!Q!Q(3*<=D((FF+6:K##D+6Fv~~{3 <<!Q!Q(<6D''dS#JPU'VH4!Q'''  !c3Z/// <<!Q!Q(<6D''dS#JPT'UHt#s+++  !c3Z///r'   c                  T   t        j                  d      } t        j                  g dg dg      }g d| j	                  |d      }t
        j                  d   }|j                  ||fd      }t        || j                        sJ t        |j                         t        j                  g d	t        
      }|j                  |||      }t        |j                  |       |j                  |      sJ |j                  |      rJ t        j                  g dt        
      }|j                  ||      }t        |j                  |       | j	                  g dg dgg dd      }| j	                  dgdggdgd      }|j                  ||g      }	| j	                  g dg dgg dd      }
ddlm}  ||	|
       | j	                  ddgddggddgd      }|j                  ||ddgd      }||usJ t%        |j                        ddgk(  sJ t%        |j                        ddgk(  sJ | j	                  ddgddggddgd      }|j                  ||ddgd      }||u sJ t%        |j                        ddgk(  sJ t%        |j                        ddgk(  sJ y )!z+Check Polars adapter has expected behavior.polarsr   r   )r   r   f3row)schemaorientc                       S r    r!   r"   s   r$   r%   z%test_polars_adapter.<locals>.<lambda>^   r&   r'   r"   )r*   r2   r+   r   )r*   r+   gr,   r.   r1   r/   r-   r+   r4   r5   r6   r   )rI   r   r   r   r*   r2   dFr9   TN)r;   r<   r=   rE   r@   r   rA   rB   rC   r   r#   r>   r?   rD   rF   rG   polars.testingrI   rJ   )plrL   rM   rN   rO   rP   rR   rS   rT   rU   rV   rI   rQ   rW   r#   s                 @r$   test_polars_adapterrd   V   s   			X	&B88Y	*+D GT'%@I''1G**4O*TKk2<<000{**G4 **_F;K%%iK%PFv~~{3)))444--d333 ((?&9K##I{;Fv~~{3 \\9i0QV\WF\\A3*cU5\AF/0I,,	|$-A%  K 2y+. <<!Q!Q(#sE<JD''dS#JPU'VH4#s+++  !c3Z/// <<!Q!Q(#sE<JD''dS#JPT'UHt#s+++  !c3Z///r'   csr_containerc           	         t        j                  g dg dg      } | |      }d}t        d      5  t        j                  t
        |      5  t        d||t                      ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z*Check errors in _wrap_data_with_container.r   r   z.The transformer outputs a scipy sparse matrix.r   transform_outputmatch	transformN)r=   r>   r   r;   raises
ValueErrorr   r   )re   XX_csrrj   s       r$    test__container_error_validationrp      sj     	

Iy)*A!E<E		2]]:U3%k5!^=MN 4 
3	233 
3	2s#   BA6%B6A?	;BBc                       e Zd Zy),EstimatorWithoutSetOutputAndWithoutTransformN__name__
__module____qualname__r!   r'   r$   rr   rr      s    r'   rr   c                       e Zd ZddZy)!EstimatorNoSetOutputWithTransformNc                     |S r    r!   selfrn   ys      r$   rk   z+EstimatorNoSetOutputWithTransform.transform       r'   r    rt   ru   rv   rk   r!   r'   r$   rx   rx          r'   rx   c                   $    e Zd ZddZddZddZy)EstimatorWithSetOutputNc                 .    |j                   d   | _        | S Nr   shapen_features_in_rz   s      r$   fitzEstimatorWithSetOutput.fit       ggajr'   c                     |S r    r!   rz   s      r$   rk   z EstimatorWithSetOutput.transform   r}   r'   c                     t        j                  t        | j                        D cg c]  }d| 	 c}t              S c c}w Nrn   r   r=   r>   ranger   r?   r{   input_featuresis      r$   get_feature_names_outz,EstimatorWithSetOutput.get_feature_names_out   8    zzE$2E2E,FG,FqQqc7,FGvVVG   A r    rt   ru   rv   r   rk   r   r!   r'   r$   r   r      s    Wr'   r   c                     t               } t        | d       t               } t        j                  t
        d      5  t        | d       ddd       t               j                  t        j                  g dg            } t        | d       t        d|       }|d   dk(  sJ t        | d	       t        d|       }|d   d	k(  sJ t        | d       t        d|       }|d   d	k(  sJ y# 1 sw Y   xY w)
z)Check _safe_set_output works as expected.r   rk   zUnable to configure outputri   Nr   r   r   rk   densedefault)rr   r   rx   r;   rl   rm   r   r   r=   r>   r   )estconfigs     r$   test__safe_set_outputr      s     7
8CSH- ,
-C	z)E	F1 
G !
"
&
&rzz9+'>
?CSH-S1F'?h&&&SI.S1F'?i''' SD)S1F'?i''' 
G	Fs   C,,C5c                       e Zd ZddZy)2EstimatorNoSetOutputWithTransformNoFeatureNamesOutNc                     |S r    r!   rz   s      r$   rk   z<EstimatorNoSetOutputWithTransformNoFeatureNamesOut.transform   r}   r'   r    r~   r!   r'   r$   r   r      r   r'   r   c                  4    t               } t        | d      rJ y)zEEstimator without get_feature_names_out does not define `set_output`.
set_outputN)r   hasattr)r   s    r$   test_set_output_mixinr      s    
<
>CsL))))r'   c                      t        j                  g dg dg      } t               }t        |d       d}t	        j
                  t        |      5  |j                  |        ddd       y# 1 sw Y   yxY w)z$Check transform with invalid config.r   r   badr   output config must be inri   N)r=   r>   r   r   r;   rl   rm   rk   rn   r   msgs      r$   test__safe_set_output_errorr      sR    


Iy)*A
 
"CSE*
$C	z	-a 
.	-	-s   A++A4dataframe_libr   rZ   c                    t        j                  |       }t        j                  g dg dg      }t	               j                  |      }|j                  d      }||u sJ |j                  |      }t        |t        j                        sJ |j                  |        |j                  |      }t        ||j                        sJ y)z%Check that the output is a dataframe.r   r   Nr   )r;   r<   r=   r>   r   r   r   rk   rC   ndarrayr@   )r   librn   r   est2
X_trans_np
X_trans_pds          r$   test_set_output_methodr      s     

m
,C


Iy)*A
 
"
&
&q
)C >>D>)D3;;"Jj"**---NN]N+q!Jj#--000r'   c                     t        j                  g dg dg      } t               j                  |       }|j	                  d       d}t        j                  t        |      5  |j                  |        ddd       y# 1 sw Y   yxY w)z-Check transform fails with invalid transform.r   r   r   r   r   ri   N)	r=   r>   r   r   r   r;   rl   rm   rk   r   s      r$   test_set_output_method_errorr      sc     	

Iy)*A
 
"
&
&q
)CNNUN#
$C	z	-a 
.	-	-s   $A??Brh   c                    t               d   }t        d      }|d   |k(  sJ t        |       5  t        d      }|d   | k(  sJ t               }t        d|      }|d   | k(  sJ t	               }t        d|      }|d   | k(  sJ |j                  d       t        d|      }|d   dk(  sJ 	 ddd       j                  |        t        d|      }|d   | k(  sJ y# 1 sw Y   2xY w)z+Check _get_output_config works as expected.rh   rk   r   rg   r   r   N)r   r   r   rx   r   r   )rh   global_configr   r   s       r$   test__get_output_configr      s   
 L!34M,F'?m+++	)9	:#K0g"2222/1#K5g"2222$&#K5g"2222 	+#K5g)+++# 
;& NN-N.S1F'?....+ 
;	:s   A>CC(c                       e Zd ZddZy) EstimatorWithSetOutputNoAutoWrapNc                     |S r    r!   rz   s      r$   rk   z*EstimatorWithSetOutputNoAutoWrap.transform!  r}   r'   r    r~   r!   r'   r$   r   r      r   r'   r   auto_wrap_output_keysc                      t               } t        | d      rJ t        j                  g dg dg      }|| j	                  |      u sJ y)z4Check that auto_wrap_output_keys=None does not wrap.r   r   r   N)r   r   r=   r>   rk   )r   rn   s     r$   test_get_output_auto_wrap_falser   %  sD    
*
,CsL)))


Iy)*Aa    r'   c                      d} t        j                  t        |       5   G d dt        d      }d d d        y # 1 sw Y   y xY w)Nz6auto_wrap_output_keys must be None or a tuple of keys.ri   c                       e Zd Zy)Ltest_auto_wrap_output_keys_errors_with_incorrect_input.<locals>.BadEstimatorNrs   r!   r'   r$   BadEstimatorr   2  s    r'   r   bad_parameterr   )r;   rl   rm   r   )r   r   s     r$   6test_auto_wrap_output_keys_errors_with_incorrect_inputr   .  s/    
BC	z	-	?/ 	 
.	-	-s	   9Ac                        e Zd Z fdZ xZS )AnotherMixinc                 2    t        |   di | || _        y )Nr!   )super__init_subclass__custom_parameter)clsr   kwargs	__class__s      r$   r   zAnotherMixin.__init_subclass__7  s    !+F+/r'   )rt   ru   rv   r   __classcell__)r   s   @r$   r   r   6  s    0 0r'   r   c                  |     G d dt         t        d      }  |        }|j                  dk(  sJ t        |d      sJ y)z9Check that multiple init_subclasses passes parameters up.c                       e Zd ZddZddZy)>test_set_output_mixin_custom_mixin.<locals>.BothMixinEstimatorNc                     |S r    r!   rz   s      r$   rk   zHtest_set_output_mixin_custom_mixin.<locals>.BothMixinEstimator.transform@  s    Hr'   c                     |S r    r!   )r{   r   s     r$   r   zTtest_set_output_mixin_custom_mixin.<locals>.BothMixinEstimator.get_feature_names_outC  s    !!r'   r    )rt   ru   rv   rk   r   r!   r'   r$   BothMixinEstimatorr   ?  s    		"r'   r   {   )r   r   N)r   r   r   r   )r   r   s     r$   "test_set_output_mixin_custom_mixinr   <  s@    "_lS " 
C3&&&3%%%r'   c                       G d dt               }  G d d|       } G d d|       } G d d||      } |       j                  d	      dk(  sJ y	)
zjCheck that multi-inheritance resolves to the correct class method.

    Non-regression test gh-25293.
    c                       e Zd Zd Zy)!test_set_output_mro.<locals>.Basec                      y)NBaser!   r{   rn   s     r$   rk   z+test_set_output_mro.<locals>.Base.transformR  s    r'   Nr~   r!   r'   r$   r   r   Q  s    	r'   r   c                       e Zd Zy)test_set_output_mro.<locals>.ANrs   r!   r'   r$   Ar   U      r'   r   c                       e Zd Zd Zy)test_set_output_mro.<locals>.Bc                      y)NBr!   r   s     r$   rk   z(test_set_output_mro.<locals>.B.transformY  s    r'   Nr~   r!   r'   r$   r   r   X  s    	r'   r   c                       e Zd Zy)test_set_output_mro.<locals>.CNrs   r!   r'   r$   Cr   \  r   r'   r   N)r   rk   )r   r   r   r   s       r$   test_set_output_mror   K  sO     D D Aq  3==#%%%r'   c                   $    e Zd ZddZddZddZy)EstimatorWithSetOutputIndexNc                 .    |j                   d   | _        | S r   r   rz   s      r$   r   zEstimatorWithSetOutputIndex.fitc  r   r'   c                     dd l }|j                  |j                         t        |j                  d         D cg c]  }d| 	 c}      S c c}w )Nr   sr   )r   r@   to_numpyr   r   )r{   rn   r|   rK   r   s        r$   rk   z%EstimatorWithSetOutputIndex.transformg  sH     ||AJJL%PQ
BS0TBSQ1QCBS0T|UU0Ts   A
c                     t        j                  t        | j                        D cg c]  }d| 	 c}t              S c c}w r   r   r   s      r$   r   z1EstimatorWithSetOutputIndex.get_feature_names_outm  r   r   r    r   r!   r'   r$   r   r   b  s    VWr'   r   c                     t        j                  d      } | j                  g dg dgddg      }t               j	                  d      }|j                  |       |j                  |      }t        |j                  dd	g       y
)zZCheck that set_output does not override index.

    Non-regression test for gh-25730.
    r   r   )r/   r-   r0   r   r   r   r   s0s1N)	r;   r<   r@   r   r   r   rk   r   r   )rK   rn   r   X_transs       r$   !test_set_output_pandas_keep_indexr   q  sp    
 
		X	&B
i+Aq6:A
%
'
2
2X
2
FCGGAJmmAGw}}tTl3r'   c                       e Zd Zd ZddZy)EstimatorReturnTuplec                     || _         y r    OutputTuple)r{   r   s     r$   __init__zEstimatorReturnTuple.__init__  s
    &r'   Nc                 ,    | j                  |d|z        S )Nr   r   rz   s      r$   rk   zEstimatorReturnTuple.transform  s    1q5))r'   r    )rt   ru   rv   r   rk   r!   r'   r$   r   r     s    '*r'   r   c                      t        dd      } t        j                  g dg      }t        |       }|j	                  |      }t        ||       sJ t        |j                  |       t        |j                  d|z         y)z+Check that namedtuples are kept by default.OutputzX, Yr   r   r   N)	r   r=   r>   r   rk   rC   r   rn   Y)r   rn   r   r   s       r$   test_set_output_named_tuple_outr     sf    &)F


I;A
6
2CmmAGgv&&&wyy!$wyy!a%(r'   c                   $    e Zd ZddZddZddZy)EstimatorWithListInputNc                 P    t        |t              sJ t        |d         | _        | S )Nr   )rC   rJ   lenr   rz   s      r$   r   zEstimatorWithListInput.fit  s'    !T"""!!A$ir'   c                     |S r    r!   rz   s      r$   rk   z EstimatorWithListInput.transform  r}   r'   c                     t        j                  t        | j                        D cg c]  }d| 	 c}t              S c c}w r   r   r   s      r$   r   z,EstimatorWithListInput.get_feature_names_out  r   r   r    r   r!   r'   r$   r   r     s    
Wr'   r   c                    t        j                  |       }g dg dg}t               }|j                  |        |j	                  |      j                  |      }t        ||j                        sJ t        |j                  g d       y)zJCheck set_output for list input.

    Non-regression test for #27037.
    )r   r   r   r   )r/   r-   r0      r   )X0X1X2X3N)
r;   r<   r   r   r   rk   rC   r@   r   r#   )r   r   rn   r   X_outs        r$   test_set_output_list_inputr    so     

m
,C	|$A
 
"CNN]N+GGAJ  #EeS]]+++u}}&>?r'   namec                 J    t        t        j                  |    t              sJ y)z*Check adapters have the correct interface.N)rC   r   rA   r	   )r  s    r$    test_adapter_class_has_interfacer    s!     &//57OPPPr'   c                     t         j                  fd}| j                  t         d|       d}t        j                  t
        |      5  t        d       ddd       y# 1 sw Y   yxY w)zCheck import error changed.c                 8    | dk(  r
t                | d        y )Nr   )package)ImportError)r  orig_import_modules    r$   patched_import_modulez;test_check_library_installed.<locals>.patched_import_module  s    8-4.r'   import_modulez-Setting output container to 'pandas' requiresri   r   N)	importlibr  setattrr;   rl   r  r   )monkeypatchr  r   r  s      @r$   test_check_library_installedr    sP    "00/
 	?4IJ
9C	{#	.) 
/	.	.s   A  A)c                  ,   t        j                  d      } | j                  g dg dd      }t        |      }|j                  dk(  sJ d}t        j
                  t        |      5  t        |j                                ddd       y# 1 sw Y   yxY w)z4Check the behavior fo `_get_adapter_from_container`.r   r   )r(      d   )r*   r2   zAThe container does not have a registered adapter in scikit-learn.ri   N)r;   r<   r@   r
   container_librl   rm   r   )rK   rn   rN   err_msgs       r$   test_get_adapter_from_containerr     sp    			X	&B
9=9:A)!,G  H,,,QG	z	1#AJJL1 
2	1	1s   'B

B)8r  collectionsr   numpyr=   r;   numpy.testingr   sklearn._configr   r   sklearn.preprocessingr   sklearn.utils._set_outputr   r	   r
   r   r   r   r   r   sklearn.utils.fixesr   rX   rd   markparametrizerp   rr   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  sortedrA   r  r  r   r!   r'   r$   <module>r+     s    "   , 6 0	 	 	 /<0~30l .9O :O	 	 
	W_ 	W(6 
*	 8X*>?1 @1(	 +h-AB/ C/@d 
!0 0&&.W/ W4*? *	)
W_ 
W 8X*>?@ @@  (8(A(A!BCQ DQ
* 2r'   