
    Q3j7                        d dl Z d dlZd dlZd dlmZmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZ ej&                  j)                  ed      Z G d	 d
      Z G d de      Z G d d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de	e      Z G d de	e      Z G d de	      Z G d de      Z  G d d e      Z! G d! d"e	e      Z"d# Z# G d$ d%e	      Z$ G d& d'e	e      Z%y)(    N)BaseEstimator_fit_contextclone)CallbackSupportMixinwith_callbacks)open_listenersend)_IS_WASM)Paralleldelayedz*callback tests are skipped on WASM/Pyodide)reasonc                   L    e Zd ZdZd Zd ZddddddZddddddZd Zd	 Z	y)
RecordingCallbacka   A minimal callback used for smoke testing purposes.

    This callback keeps a record of the hooks called for introspection.

    This callback doesn't define `max_propagation_depth` and is therefore not an
    `AutoPropagatedCallback`: it should not be propagated to sub-estimators.
    c                 ^    g | _         t        | j                   j                  |       | _        y )N)owner)recordr   append_listener_handle)selfs    J/DATA/.local/lib/python3.12/site-packages/sklearn/callback/tests/_utils.py__init__zRecordingCallback.__init__   s"     -dkk.@.@ M    c                 8    t        | j                  d||d       y )Nsetupname	estimatorcontextr	   r   r   r   r   s      r   r   zRecordingCallback.setup"   s    !!9I	
r   NXymetadatafitted_estimatorc                D    t        | j                  d||||||dd       y )Non_fit_task_beginr!   r   r   r   kwargsr   r   r   r   r"   r#   r$   r%   s          r   r'   z#RecordingCallback.on_fit_task_begin(   s4     	!!+&" ((8		
	
r   c                D    t        | j                  d||||||dd       y )Non_fit_task_endr!   r(   r   r*   s          r   r,   z!RecordingCallback.on_fit_task_endA   s4     	!!)&" ((8		
	
r   c                 8    t        | j                  d||d       y )Nteardownr   r   r    s      r   r.   zRecordingCallback.teardownZ   s    !!iGL	
r   c                 d    t        | j                  D cg c]  }|d   |k(  s| c}      S c c}w )Nr   )lenr   )r   	hook_namerecs      r   count_hookszRecordingCallback.count_hooks`   s.    4;;K;C#f+2JC;KLLKs   --)
__name__
__module____qualname____doc__r   r   r'   r,   r.   r3    r   r   r   r      sC    N
 

< 

2
Mr   r   c                       e Zd ZdZdZy)RecordingAutoPropagatedCallbackaF  A minimal auto-propagated callback used for smoke testing purposes.

    This callback keeps a record of the hooks called for introspection.

    This callback defines `max_propagation_depth` and is therefore an
    `AutoPropagatedCallback`: it should be set on a top-level estimator and propagated
    to sub-estimators.
    N)r4   r5   r6   r7   max_propagation_depthr8   r   r   r:   r:   d   s     !r   r:   c                       e Zd ZdZd Zd Zy)NotValidCallbackz>Invalid callback since it's missing methods from the protocol.c                      y Nr8   r    s      r   r   zNotValidCallback.setupt       r   c                      y r?   r8   r    s      r   r,   z NotValidCallback.on_fit_task_endw   r@   r   N)r4   r5   r6   r7   r   r,   r8   r   r   r=   r=   q   s    Hr   r=   c                       e Zd ZdZdddZy)NotValidHookCallbackzIInvalid callback since it has invalid parameters in the hooks signatures.N)not_valid_kwargc                     y r?   r8   )r   r   r   rD   s       r   r'   z&NotValidHookCallback.on_fit_task_begin~   r@   r   )r4   r5   r6   r7   r'   r8   r   r   rC   rC   {   s    SGK r   rC   c                   L     e Zd ZdZd fd	Z fdZ fdZ fdZ fdZ xZ	S )FailingCallbackz.A callback that raises an error at some point.c                 0    t         |           || _        y r?   )superr   fail_at)r   rJ   	__class__s     r   r   zFailingCallback.__init__   s    r   c                 Z    t         |   ||       | j                  dk(  rt        d      y )Nr   z Failing callback failed at setup)rI   r   rJ   
ValueErrorr   r   r   rK   s      r   r   zFailingCallback.setup   s.    i)<<7"?@@ #r   c                 Z    t         |   ||       | j                  dk(  rt        d      y )Nr'   z,Failing callback failed at on_fit_task_begin)rI   r'   rJ   rM   rN   s      r   r'   z!FailingCallback.on_fit_task_begin   s0    !)W5<<..KLL /r   c                 Z    t         |   ||       | j                  dk(  rt        d      y )Nr,   z*Failing callback failed at on_fit_task_end)rI   r,   rJ   rM   rN   s      r   r,   zFailingCallback.on_fit_task_end   s0    	73<<,,IJJ -r   c                 Z    t         |   ||       | j                  dk(  rt        d      y )Nr.   z#Failing callback failed at teardown)rI   r.   rJ   rM   rN   s      r   r.   zFailingCallback.teardown   s/    G,<<:%BCC &r   r?   )
r4   r5   r6   r7   r   r   r'   r,   r.   __classcell__rK   s   @r   rG   rG      s)    8A
M
K
D Dr   rG   c                   "     e Zd ZdZ fdZ xZS )StopFitCallbackz8A callback with a `on_fit_task_end` hook returning True.c                 &    t         |   ||       y)NTrI   r,   rN   s      r   r,   zStopFitCallback.on_fit_task_end   s    	73r   r4   r5   r6   r7   r,   rR   rS   s   @r   rU   rU      s    B r   rU   c                   *     e Zd ZdZddd fd
Z xZS )NotRequiredKwargsCallbackzFA callback with a `on_fit_task_end` not requiring all possible kwargs.Nr"   r#   c                ,    t         |   ||||       y )Nr[   rW   )r   r   r   r"   r#   rK   s        r   r,   z)NotRequiredKwargsCallback.on_fit_task_end   s    	7a1=r   rX   rS   s   @r   rZ   rZ      s    P7;t > >r   rZ   c                   X    e Zd ZU dZi Zeed<   d
dZ ed      	 	 dddd       Z	d	 Z
y)MaxIterEstimatora+  A class that mimics the behavior of an estimator.

    The iterative part uses a loop with a max number of iterations known in advance.

    This estimator computes arbitrary predictions by averaging the feature
    values and multiplying the result by the number of iterations done
    in fit.
    _parameter_constraintsc                      || _         || _        y r?   max_itercomputation_intensityr   rb   rc   s      r   r   zMaxIterEstimator.__init__        %:"r   Fprefer_skip_nested_validationN)sample_weightc          	         | j                  | j                        }|d|ini }|j                  | |||       t        | j                        D ]f  |j	                  d       }|j                  | |||       t        j                  | j                         |j                  | |||fd      sf n dz   | _	        |j                  | |||i        | S )	Nmax_subtasksrh   r   r"   r#   r$   z
iteration 	task_namec                      d dz   iS )Nn_iter_   r8   )is   r   <lambda>z&MaxIterEstimator.fit.<locals>.<lambda>   s    9a!e2Dr   )r   r"   r#   r$   reconstruction_attributesrq   
_init_callback_contextrb   call_on_fit_task_beginrange
subcontexttimesleeprc   call_on_fit_task_endrp   )r   r"   r#   rh   callback_ctxr$   ry   rr   s          @r   fitzMaxIterEstimator.fit   s     222N7D7PO]3VX++da1x+Xt}}%A%00Zs;K0LJ--!q8 .  JJt112..!*D /   &" 1u))&( 	* 	
 r   c                 J    t        j                  |d      | j                  z  S )Nrq   )axis)npmeanrp   r   r"   s     r   predictzMaxIterEstimator.predict   s    wwqq!DLL00r      MbP?NN)r4   r5   r6   r7   r_   dict__annotations__r   r   r~   r   r8   r   r   r^   r^      sJ     $&D%; 6 
&
 & 7&P1r   r^   c                   H    e Zd ZU dZi Zeed<   ddZ ed      d	d       Z	y)
WhileEstimatorzA class that mimics the behavior of an estimator.

    The iterative part uses a while loop with a number of iterations unknown in
    advance.
    r_   c                     || _         y r?   )rc   )r   rc   s     r   r   zWhileEstimator.__init__   s
    %:"r   Frf   Nc                 H   | j                  d       }|j                  | ||       d}	 |j                         }|j                  | ||       t        j                  | j
                         |j                  | ||      rn|dk(  rn|dz  }d|j                  | ||       | S )Nrj   r   r"   r#   r   r   rq   )rv   rw   ry   rz   r{   rc   r|   r   r"   r#   r}   rr   ry   s         r   r~   zWhileEstimator.fit   s    222E++da1+E%002J--Q-GJJt112..a.HBwFA  	))DA)Cr   )r   r   
r4   r5   r6   r7   r_   r   r   r   r   r~   r8   r   r   r   r      s2     $&D%; 6 7r   r   c                   *    e Zd ZdZddZedd       Zy)ThirdPartyEstimatorzaA class that mimics a third-party estimator with callback support only using
    public API.
    c                      || _         || _        y r?   ra   rd   s      r   r   zThirdPartyEstimator.__init__  re   r   Nc                    | j                  | j                        }|j                  | ||       t        | j                        D ][  }|j	                         }|j                  | ||       t        j                  | j                         |j                  | ||      s[ n |j                  | ||       dz   | _	        | S )Nrj   r   rq   ru   r   s         r   r~   zThirdPartyEstimator.fit  s    222N++da1+Et}}%A%002J--Q-GJJt112..a.H & 	))DA)C1ur   r   r   r4   r5   r6   r7   r   r   r~   r8   r   r   r   r     s     ;  r   r   c                   X     e Zd ZU dZi Zeed<   d fd	Z ed      d fd	       Z	 xZ
S )	ParentFitEstimatorz=A class that mimics an estimator using its parent fit method.r_   c                 &    t         |   ||       y r?   )rI   r   )r   rb   rc   rK   s      r   r   zParentFitEstimator.__init__2  s    #89r   Frf   c                 $    t         |   ||      S r?   )rI   r~   )r   r"   r#   rK   s      r   r~   zParentFitEstimator.fit5  s    w{1a  r   r   r   )r4   r5   r6   r7   r_   r   r   r   r   r~   rR   rS   s   @r   r   r   -  s/    G#%D%: 6! 7!r   r   c                   &    e Zd ZdZddZddZd Zy)NoCallbackEstimatorz:A class that mimics an estimator without callback support.c                      || _         || _        y r?   ra   rd   s      r   r   zNoCallbackEstimator.__init__=  re   r   Nc                 x    t        | j                        D ]!  }t        j                  | j                         # | S r?   )rx   rb   rz   r{   rc   )r   r"   r#   rr   s       r   r~   zNoCallbackEstimator.fitA  s.    t}}%AJJt112 & r   c                 F    t        j                  |j                  d         S )Nr   )r   zerosshaper   s     r   r   zNoCallbackEstimator.predictG  s    xx
##r   r   r   )r4   r5   r6   r7   r   r~   r   r8   r   r   r   r   :  s    D;$r   r   c                   J    e Zd ZU dZi Zeed<   	 ddZ ed      d	d       Z	y)
MetaEstimatora0  A class that mimics the behavior of a meta-estimator.

    It has two levels of iterations. The outer level uses parallelism and the inner
    level is done in a function that is not a method of the class. That function must
    therefore receive the estimator and the callback context as arguments.
    r_   Nc                 J    || _         || _        || _        || _        || _        y r?   )r   n_outern_innern_jobsprefer)r   r   r   r   r   r   s         r   r   zMetaEstimator.__init__U  s'     #r   Frf   c                      j                   j                  d      }|d|ini |j                          t         j                        D cg c]   }|j	                  d| j
                        " c} t         j                   j                         fdt         j                        D               |j                           S c c}w )	NF)rk   sequential_subtasksrh   rl   outer)rn   task_idrk   )r   r   c           
   3   n   K   | ],  } t        t              j                  |           . yw))r"   r#   r$   outer_callback_ctxN)r   _fit_subestimatorr   ).0rr   r"   r$   outer_callback_contextsr   r#   s     r   	<genexpr>z$MetaEstimator.fit.<locals>.<genexpr>m  sJ      
9
 ) 'G%&!#:1#=  )s   25)
rv   r   rw   rx   ry   r   r   r   r   r|   )r   r"   r#   rh   r}   rr   r$   r   s   ```   @@r   r~   zMetaEstimator.fit^  s    225 3 
 8E7PO]3VX++da1x+X 4<<(	#
 ) ##!14<< $  )	#
 	9DKK8 
9
 4<<(
9
 
	
 	))DAX)V+#
s   %C)      N	processes)NNNr   r8   r   r   r   r   K  s9     $&D% DO 6 7r   r   c                   |j                  | |||       t        | j                        D ]x  }t        |      }|j	                  d      }|j                  |      5  |j                  | |||        |j                  d||d| |j                  | |||       d d d        z |j                  | |||       y # 1 sw Y   xY w)Nrl   innerrm   r[   r8   )rw   rx   r   r   ry   propagate_callback_contextr~   r|   )	meta_estimatorinner_estimatorr"   r#   r$   r   rr   est	inner_ctxs	            r   r   r   ~  s     -- AX .  >))*O$&11G1D	11#6,,(AX -  CGG)a1))**(AX +  76	 + ++ AX ,  76s   A B<<C	c                   (    e Zd ZdZd Zedd       Zy)HeterogeneousMetaEstimatorz9A meta-estimator that fits a list of estimators in order.c                     || _         y r?   )
estimators)r   r   s     r   r   z#HeterogeneousMetaEstimator.__init__  s	    $r   Nc                 j   | j                  t        | j                              }|j                  | ||       t	        | j                        D ]  \  }}|rd|j
                  j                   nd| }|j                  |      }|`t        |      }|j                  |      5  |j                  | ||       |j                  ||       |j                  | ||       d d d        |j                  | ||       |j                  | ||        |j                  | ||       | S # 1 sw Y   xY w)Nrj   r   zfit zskip rm   )rv   r0   r   rw   	enumeraterK   r4   ry   r   r   r~   r|   )r   r"   r#   r}   rr   r   rn   ry   s           r   r~   zHeterogeneousMetaEstimator.fit  s,   22DOO@T2U++da1+E0FAs;>$s}}5567eA3KI%0090EJCj::3?55Q5OGGAqM33da13M @?
 11DA1K//$!q/I 1 	))DA)C @?s   %;D))D2	r   r   r8   r   r   r   r     s    C%  r   r   c                   "    e Zd ZdZedd       Zy)NoSubtaskEstimatorz7A class mimicking an estimator without subtasks in fit.Nc                 r    | j                         j                  | ||      }|j                  | ||       | S )Nr   )rv   rw   r|   )r   r"   r#   r}   s       r   r~   zNoSubtaskEstimator.fit  sD    224KKa1 L 
 	))DA)Cr   r   )r4   r5   r6   r7   r   r~   r8   r   r   r   r     s    A	 	r   r   )&rz   numpyr   pytestsklearn.baser   r   r   sklearn.callbackr   r   sklearn.callback._transportr   r	   sklearn.utils.fixesr
   sklearn.utils.parallelr   r   markskipifskip_callback_test_if_wasmr   r:   r=   rC   rG   rU   rZ   r^   r   r   r   r   r   r   r   r   r8   r   r   <module>r      s      ; ; A ; ( 4#[[//7 0  LM LM^
!&7 
! , D' D8' > 1 >:1+] :1z")= "J. <
!) 
!$- $"0(- 0f6!5 :-} r   