
    _nd$                        d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dl
mZ d dl
mZ d dl
mZ d	 Zd
 Z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d Zd Zd Z G d ded          Zd Zd Z G d d           Zd! Z d" Z!d# Z" G d$ d%e          Z#d& Z$dS )'    N)
csr_matrix)assert_array_equal)config_context
get_config)_wrap_in_pandas_container)_safe_set_output)_SetOutputMixin)_get_output_configc                  v   t          j        d          } t          j        g dg dg          }t          j        g dt                    t          j        ddg          }t          |fd|	          }t          || j                  sJ t          |j	                   t          |j
        |           d
S )z/Check _wrap_in_pandas_container for dense data.pandas   r      r   r   r   f0f1f2dtyper   r   c                       S N columnss   Clib/python3.11/site-packages/sklearn/utils/tests/test_set_output.py<lambda>z6test__wrap_in_pandas_container_dense.<locals>.<lambda>   s    w     r   indexN)pytestimportorskipnpasarrayobjectr   
isinstance	DataFramer   r   r    )pdXr    dense_namedr   s       @r   $test__wrap_in_pandas_container_denser+      s    		X	&	&B

IIIyyy)**Aj+++6:::GJ1vE+AeTTTKk2<00000{*G444{(%00000r   c                  0   t          j        d          } |                     g dg dgg d          }t          j        g dt
                    }dd	g}t          |||
          }t          |j        |           t          |j	        |j	                   dS )zACheck that _wrap_in_pandas_container overrides columns and index.r   r   r   abcr   r   r   
      r   N)
r!   r"   r'   r#   r$   r%   r   r   r   r    )r(   X_dfnew_columns	new_indexnew_dfs        r   =test__wrap_in_pandas_container_dense_update_columns_and_indexr7      s    		X	&	&B<<III.<HHD*///v>>>KRI&t[	RRRFv~{333 v|TZ00000r   c                      t          j        g dg dg          } t          |           }d}t          j        t
          |          5  t          |g d           ddd           dS # 1 swxY w Y   dS )z*Check errors in _wrap_in_pandas_container.r   r   z*Pandas output does not support sparse datamatchr-   r   N)r#   r$   r   r!   raises
ValueErrorr   )r)   X_csrr:   s      r   /test__wrap_in_pandas_container_error_validationr>   )   s    

IIIyyy)**AqMME8E	z	/	/	/ B B!%AAAAB B B B B B B B B B B B B B B B B Bs   A((A,/A,c                       e Zd ZdS ),EstimatorWithoutSetOutputAndWithoutTransformN__name__
__module____qualname__r   r   r   r@   r@   2   s        Dr   r@   c                       e Zd ZddZdS )!EstimatorNoSetOutputWithTransformNc                     |S r   r   selfr)   ys      r   	transformz+EstimatorNoSetOutputWithTransform.transform7       r   r   rB   rC   rD   rK   r   r   r   rF   rF   6   (             r   rF   c                   &    e Zd ZddZddZddZdS )EstimatorWithSetOutputNc                 *    |j         d         | _        | S Nr   shapen_features_in_rH   s      r   fitzEstimatorWithSetOutput.fit<       gajr   c                     |S r   r   rH   s      r   rK   z EstimatorWithSetOutput.transform@   rL   r   c                 p    t          j        d t          | j                  D             t                    S )Nc                     g | ]}d | S r)   r   .0is     r   
<listcomp>z@EstimatorWithSetOutput.get_feature_names_out.<locals>.<listcomp>D       GGGq7q77GGGr   r   r#   r$   rangerU   r%   rI   input_featuress     r   get_feature_names_outz,EstimatorWithSetOutput.get_feature_names_outC   1    zGGE$2E,F,FGGGvVVVVr   r   rB   rC   rD   rV   rK   re   r   r   r   rP   rP   ;   sV              W W W W W Wr   rP   c                  n   t                      } t          | d           t                      } t          j        t
          d          5  t          | d           ddd           n# 1 swxY w Y   t                                          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 dS )
z)Check _safe_set_output works as expected.r   rK   zUnable to configure outputr9   Nr      r   rK   densedefault)r@   r   rF   r!   r;   r<   rP   rV   r#   r$   r
   )estconfigs     r   test__safe_set_outputrp   G   s    7
8
8CSH---- ,
-
-C	z)E	F	F	F 2 211112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 !
"
"
&
&rz999+'>'>
?
?CSH----S11F'?h&&&&SI....S11F'?i'''' SD))))S11F'?i''''''s   	A''A+.A+c                       e Zd ZddZdS )2EstimatorNoSetOutputWithTransformNoFeatureNamesOutNc                     |S r   r   rH   s      r   rK   z<EstimatorNoSetOutputWithTransformNoFeatureNamesOut.transformc   rL   r   r   rM   r   r   r   rr   rr   b   rN   r   rr   c                  F    t                      } t          | d          rJ dS )zEEstimator without get_feature_names_out does not define `set_output`.
set_outputN)rr   hasattr)rn   s    r   test_set_output_mixinrw   g   s)    
<
>
>CsL)))))))r   c                     t          j        g dg dg          } t                      }t          |d           d}t	          j        t          |          5  |                    |            ddd           dS # 1 swxY w Y   dS )z$Check transform with invalid config.r   r   badri   output config must be 'default'r9   N)r#   r$   rP   r   r!   r;   r<   rK   r)   rn   msgs      r   test__safe_set_output_errorr}   m   s    

IIIyyy)**A
 
"
"CSE****
+C	z	-	-	-  a                 s   A::A>A>c                     t          j        d          } t          j        g dg dg          }t	                                          |          }|                    d          }||u sJ |                    |          }t          |t          j	                  sJ |                    d           |                    |          }t          || j
                  sJ dS )z Check that the output is pandas.r   r   r   Nri   )r!   r"   r#   r$   rP   rV   ru   rK   r&   ndarrayr'   )r(   r)   rn   est2
X_trans_np
X_trans_pds         r   test_set_output_methodr   y   s    		X	&	&B

IIIyyy)**A
 
"
"
&
&q
)
)C >>D>))D3;;;;""Jj"*-----NNXN&&&q!!Jj",///////r   c                  >   t          j        g dg dg          } t                                          |           }|                    d           d}t          j        t          |          5  |                    |            ddd           dS # 1 swxY w Y   dS )z-Check transform fails with invalid transform.r   r   ry   ri   rz   r9   N)	r#   r$   rP   rV   ru   r!   r;   r<   rK   r{   s      r   test_set_output_method_errorr      s     	
IIIyyy)**A
 
"
"
&
&q
)
)CNNUN###
+C	z	-	-	-  a                 s   /BBBc                  t   t                      d         } t          d          }|d         | k    sJ t          d          5  t          d          }|d         dk    sJ t                      }t          d|          }|d         dk    sJ t	                      }t          d|          }|d         dk    sJ |                    d           t          d|          }|d         dk    sJ 	 ddd           n# 1 swxY w Y   |                    d           t          d|          }|d         dk    sJ dS )	z+Check _get_output_config works as expected.transform_outputrK   rl   r   )r   rm   ri   N)r   r
   r   rF   rP   ru   )global_configro   rn   s      r   test__get_output_configr      s    LL!34M,,F'?m++++		2	2	2 , ,#K00g(****/11#K55g(****$&&#K55g(**** 	+++#K55g)+++++#, , , , , , , , , , , , , , ,& NNXN&&&S11F'?h&&&&&&s   B*C99C= C=c                       e Zd ZddZdS ) EstimatorWithSetOutputNoAutoWrapNc                     |S r   r   rH   s      r   rK   z*EstimatorWithSetOutputNoAutoWrap.transform   rL   r   r   rM   r   r   r   r   r      rN   r   r   auto_wrap_output_keysc                      t                      } t          | d          rJ t          j        g dg dg          }||                     |          u sJ dS )z4Check that auto_wrap_output_keys=None does not wrap.ru   r   r   N)r   rv   r#   r$   rK   )rn   r)   s     r   test_get_output_auto_wrap_falser      sb    
*
,
,CsL)))))

IIIyyy)**Aa        r   c                      d} t          j        t          |           5   G d dt          d          }d d d            d S # 1 swxY w Y   d S )Nz6auto_wrap_output_keys must be None or a tuple of keys.r9   c                       e Zd ZdS )Ltest_auto_wrap_output_keys_errors_with_incorrect_input.<locals>.BadEstimatorNrA   r   r   r   BadEstimatorr      s        Dr   r   bad_parameterr   )r!   r;   r<   r	   )r|   r   s     r   6test_auto_wrap_output_keys_errors_with_incorrect_inputr      s    
BC	z	-	-	-  	 	 	 	 	?/ 	 	 	 	                 s   AAAc                        e Zd Z fdZ xZS )AnotherMixinc                 H     t                      j        di | || _        d S )Nr   )super__init_subclass__custom_parameter)clsr   kwargs	__class__s      r   r   zAnotherMixin.__init_subclass__   s.    !!++F+++/r   )rB   rC   rD   r   __classcell__)r   s   @r   r   r      s8        0 0 0 0 0 0 0 0 0r   r   c                       G d dt           t          d          }  |             }|j        dk    sJ t          |d          sJ dS )z9Check that multiple init_subclasses passes parameters up.c                       e Zd ZddZddZdS )>test_set_output_mixin_custom_mixin.<locals>.BothMixinEstimatorNc                     |S r   r   rH   s      r   rK   zHtest_set_output_mixin_custom_mixin.<locals>.BothMixinEstimator.transform   s    Hr   c                     |S r   r   rc   s     r   re   zTtest_set_output_mixin_custom_mixin.<locals>.BothMixinEstimator.get_feature_names_out   s    !!r   r   )rB   rC   rD   rK   re   r   r   r   BothMixinEstimatorr      s<        	 	 	 		" 	" 	" 	" 	" 	"r   r   {   )r   ru   N)r	   r   r   rv   )r   rn   s     r   "test_set_output_mixin_custom_mixinr      su    " " " " "_lS " " " " 


C3&&&&3%%%%%%%r   c                  x   t          j        d          } d }|                     g dg dd          }t          ||          }t	          |j        |j                   t          j        ddgd	d
gddgg          }t          ||          }t	          |j        t          |j	        d                              dS )zJIf a callable `columns` errors, it has the same semantics as columns=None.r   c                       t          d          )NzNo feature names defined)r<   r   r   r   get_columnszAtest__wrap_in_pandas_container_column_errors.<locals>.get_columns   s    3444r   rj   )r         )feat1feat2r   r   r   rk   r   r   N)
r!   r"   r'   r   r   r   r#   r$   rb   rT   )r(   r   r3   	X_wrappedX_nps        r   ,test__wrap_in_pandas_container_column_errorsr      s    		X	&	&B5 5 5 <<)))iii@@AAD)$DDDIy($,777:1v1v1v.//D)$DDDIy(%
1*>*>?????r   c                       G d dt                     }  G d d|           } G d d|           } G d d||          } |                                d	          dk    sJ d	S )
zjCheck that multi-inheritance resolves to the correct class method.

    Non-regression test gh-25293.
    c                       e Zd Zd ZdS )!test_set_output_mro.<locals>.Basec                     dS )NBaser   rI   r)   s     r   rK   z+test_set_output_mro.<locals>.Base.transform   s    6r   NrM   r   r   r   r   r      s#        	 	 	 	 	r   r   c                       e Zd ZdS )test_set_output_mro.<locals>.ANrA   r   r   r   Ar              r   r   c                       e Zd Zd ZdS )test_set_output_mro.<locals>.Bc                     dS )NBr   r   s     r   rK   z(test_set_output_mro.<locals>.B.transform  s    3r   NrM   r   r   r   r   r     s#        	 	 	 	 	r   r   c                       e Zd ZdS )test_set_output_mro.<locals>.CNrA   r   r   r   Cr     r   r   r   N)r	   rK   )r   r   r   r   s       r   test_set_output_mror      s               D       D       Aq    133==#%%%%%%r   c                   &    e Zd ZddZddZddZdS )EstimatorWithSetOutputIndexNc                 *    |j         d         | _        | S rR   rS   rH   s      r   rV   zEstimatorWithSetOutputIndex.fit  rW   r   c                     dd l }|                    |                                d t          |j        d                   D                       S )Nr   c                     g | ]}d | S )sr   r\   s     r   r_   z9EstimatorWithSetOutputIndex.transform.<locals>.<listcomp>  s    0T0T0TQQ0T0T0Tr   r    )r   r'   to_numpyrb   rT   )rI   r)   rJ   r(   s       r   rK   z%EstimatorWithSetOutputIndex.transform  sL     ||AJJLL0T0T%PQ
BSBS0T0T0T|UUUr   c                 p    t          j        d t          | j                  D             t                    S )Nc                     g | ]}d | S r[   r   r\   s     r   r_   zEEstimatorWithSetOutputIndex.get_feature_names_out.<locals>.<listcomp>  r`   r   r   ra   rc   s     r   re   z1EstimatorWithSetOutputIndex.get_feature_names_out  rf   r   r   rg   r   r   r   r   r     sZ           V V V VW W W W W Wr   r   c                  2   t          j        d          } |                     g dg dgddg          }t                                          d          }|                    |           |                    |          }t          |j        dd	g           d
S )zZCheck that set_output does not override index.

    Non-regression test for gh-25730.
    r   rj   )r   r      r   r   r   ri   s0s1N)	r!   r"   r'   r   ru   rV   rK   r   r    )r(   r)   rn   X_transs       r   !test_set_output_pandas_keep_indexr     s    
 
	X	&	&B
iii+Aq6::A
%
'
'
2
2X
2
F
FCGGAJJJmmAGw}tTl33333r   )%r!   numpyr#   scipy.sparser   numpy.testingr   sklearn._configr   r   sklearn.utils._set_outputr   r   r	   r
   r+   r7   r>   r@   rF   rP   rp   rr   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s        # # # # # # , , , , , , 6 6 6 6 6 6 6 6 ? ? ? ? ? ? 6 6 6 6 6 6 5 5 5 5 5 5 8 8 8 8 8 8
1 
1 
11 1 1B B B	 	 	 	 	 	 	 	       
	W 	W 	W 	W 	W_ 	W 	W 	W( ( (6       
* * *	 	 	0 0 0&	 	 	' ' '@    d    
! ! !  0 0 0 0 0 0 0 0& & &@ @ @"& & &.W W W W W/ W W W4 4 4 4 4r   