Ë
    ÜÍ:jÐ  ã                   óB  — d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
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mZ ej.                  j1                  d	d
dg«      ej.                  j1                  dddg«      ej.                  j1                  deeeg«      ej.                  j1                  dg d¢«      d„ «       «       «       «       Zd„ Zd„ Zej.                  j8                  ej.                  j1                  dddg«      d„ «       «       Zej.                  j1                  dddg«      d„ «       Zd„ Zej.                  j1                  d e ed¬«      d¬«       e
 ed¬«      dddg«       e
dd ed¬«      dg«       e
ddd ed¬«      g«      g«      d „ «       Z d!„ Z!y)"é    N)Úmock)Úclone)ÚProgressBar)ÚHeterogeneousMetaEstimatorÚMaxIterEstimatorÚMetaEstimatorÚNoSubtaskEstimatorÚWhileEstimator)Úcheck_rich_support)Úassert_allcloseÚ'assert_run_python_script_without_output)ÚParallelÚdelayedÚn_jobsé   é   ÚpreferÚthreadsÚ	processesÚInnerEstimatorÚmax_propagation_depth)r   r   Nc                 ó¶  — t        j                  d«       d}d} |«       }t        |||| |¬«      }|j                  t	        |¬«      «       |j                  «        |j                  «       }	t        j                  d|	j                  «      sJ ‚t        |«      D ]'  }
t        j                  d|
› �|	j                  «      rŒ'J ‚ |�|d	kD  rLt        |«      D ]>  }
t        j                  d
|j                  j                  › d|
› �|	j                  «      rŒ>J ‚ t        j                  d|	j                  «      sJ ‚t        j                  d|	j                  «      rJ ‚y)z;Check the output of the progress bars and their completion.Úrichr   é   )Ún_outerÚn_innerr   r   )r   zMetaEstimator - fitzMetaEstimator - outer #Nr   zMetaEstimator - inner \| z - fit #ú100%z\b[0-9]{1,2}%)ÚpytestÚimportorskipr   Úset_callbacksr   ÚfitÚ
readouterrÚreÚsearchÚoutÚrangeÚ	__class__Ú__name__)r   r   r   r   Úcapsysr   r   ÚestÚmeta_estÚcapturedÚis              ú|/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/sklearn/callback/tests/test_progressbar.pyÚtest_progressbarr/      sE  € ô ×Ñ˜Ôà€GØ€Gá
Ó
€CÜØ�W g°fÀVô€Hð ×Ñœ;Ð=RÔSÔTØ‡L�L„Nà× Ñ Ó"€Hä�9‰9Ð+¨X¯\©\Ô:Ð:Ð:Ü�7‹^ò GˆÜ�y‰yÐ3°A°3Ð7¸¿¹ÕFÐFÐFðGð
 Ð$Ð(=ÀÒ(AÜ�w“ò 	ˆAÜ—9‘9Ø,¨S¯]©]×-CÑ-CÐ,DÀHÈQÈCÐPØ—‘õð ð ð	ô �9‰9�W˜hŸl™lÔ+Ð+Ð+Ü�y‰yÐ)¨8¯<©<Ô8Ð8Ð8Ð8ó    c                  óÞ   — 	 t        d«       t        j                  d«       y# t        $ r@ d} t        j                  t        | ¬«      5  t        «        ddd«       Y y# 1 sw Y   Y yxY ww xY w)zDCheck that we raise an informative error when rich is not installed.Ú$test_progressbar_requires_rich_errorz,This test requires rich to not be installed.zProgressbar requires rich)ÚmatchN)r   r   ÚskipÚImportErrorÚraisesr   )Úerr_msgs    r.   r2   r2   C   sY   € ðÜÐAÔBÜ�‰ÐBÕCøÜò Ø-ˆÜ�]‰]œ;¨gÔ6ñ 	ÜŒM÷	÷ 	ó 	úðús'   ‚ # £&A,Á	AÁA,ÁA(	Á#A,Á(A,c                  óÌ   — t        j                  d«       t        «       } t        «       j	                  | «      j                  «       }t        |«      }|j                  d   | u sJ ‚y)zºCloning an estimator with a ProgressBar preserves the callback reference.

    clone copies _skl_callbacks by reference so that a single callback instance can
    track every clone.
    r   r   N)r   r   r   r   r    r!   r   Ú_skl_callbacks)Úpbr*   Úcloneds      r.   Útest_clone_after_fitr<   N   sW   € ô ×Ñ˜ÔÜ	‹€BÜ
Ó
×
*Ñ
*¨2Ó
.×
2Ñ
2Ó
4€CÜ�3‹Z€FØ× Ñ  Ñ# rÑ)Ð)Ñ)r0   ÚbackendÚ	threadingÚlokyc                 óì   ‡ ‡— t        j                  d«       d„ Šˆ ˆfd„}t        «       }d} |t        «       j	                  |«      |¬«       ddlm}m} |j                  i k(  sJ ‚|i k(  sJ ‚|i k(  sJ ‚y)	zäSanity check for ProgressBar within function not supporting callbacks.

    It's hard to check the output from sub-processes so this test only checks that it
    doesn't crash and that there are no threads leftover running.
    r   c                 ó6   — t        | «      j                  «        y ©N)r   r!   )Ú	estimators    r.   Úclone_and_fitz;test_progressbar_no_callback_support.<locals>.clone_and_fitf   s   € ÜˆiÓ×ÑÕr0   c                 óT   •‡ —  t        d‰¬«      ˆˆ fd„t        |«      D «       «       y )Nr   )r   r=   c              3   ó@   •K  — | ]  } t        ‰«      ‰«      –— Œ y ­wrB   )r   )Ú.0Ú_rD   rC   s     €€r.   ú	<genexpr>zEtest_progressbar_no_callback_support.<locals>.func.<locals>.<genexpr>j   s#   øè ø€ ò ,
Ø23Ð"ŒG�MÓ" 9×-ñ,
ùs   ƒ)r   r&   )rC   Ún_fitsr=   rD   s   ` €€r.   Úfuncz2test_progressbar_no_callback_support.<locals>.funci   s%   ù€ Ø+Œ˜ 7Ô+ô ,
Ü7<¸V³}ô,
õ 	
r0   é   )rJ   r   )Ú_run_monitorsÚ_run_queuesN)	r   r   r   r   r    Úsklearn.callback._progressbarrM   rN   Ú_listener_handles)r=   rK   ÚprogressbarrJ   rM   rN   rD   s   `     @r.   Ú$test_progressbar_no_callback_supportrR   \   sy   ù€ ô ×Ñ˜Ôòõ
ô
 “-€KØ€FÙÔ	Ó	×	)Ñ	)¨+Ó	6¸vÕFçHð ×(Ñ(¨BÒ.Ð.Ð.Ø˜"ÒÐÐØ˜BÒÐÑr0   c                 ó€   — t        j                  d«       d| › d�}d}t        t        j                  |«      |d¬«       y)zHCheck that ProgressBar does not trigger spawn errors outside `__main__`.r   zí
    from sklearn.callback import ProgressBar
    from sklearn.callback.tests._utils import MaxIterEstimator, MetaEstimator

    est = MaxIterEstimator()
    meta_est = MetaEstimator(
        est, n_outer=2, n_inner=1, n_jobs=2, prefer='zI'
    )
    meta_est.set_callbacks(ProgressBar())
    meta_est.fit()
    z/An attempt has been made to start a new processéx   )ÚpatternÚtimeoutN)r   r   r   ÚtextwrapÚdedent)r   ÚcoderU   s      r.   Ú$test_progressbar_outside_main_modulerZ   {   sJ   € ô ×Ñ˜Ôð6ð 7=°Xð >ð
€Dð @€GÜ+Ü�‰˜Ó w¸ör0   c                  ó¢  ‡‡— t        j                  d«       ddlm}  g Š| j                  Šˆˆfd„}d}t
        j                  j                  | d|«      5  t        |¬«      j                  t        «       «      j                  «        ddd«       t        d	|d	z   «      D �cg c]  }||z  ‘Œ	 c}d
gz   }t        ‰|«       y# 1 sw Y   Œ:xY wc c}w )zLCheck that the completion of a bottom-level progressbar increments linearly.r   r   ©ÚRichProgressMonitorc                 ób   •—  ‰| |«       ‰j                  | j                  j                  «       y rB   ©ÚappendÚroot_rich_taskÚprogress)ÚselfÚ	task_infoÚorig_on_task_endÚrecordss     €€r.   Úrecording_on_task_endz7test_progress_during_fit.<locals>.recording_on_task_end™   s%   ø€ Ù˜˜yÔ)Ø�‰�t×*Ñ*×3Ñ3Õ4r0   é   Ú_on_task_end©Úmax_iterNr   ç      ð?)r   r   rO   r]   ri   r   ÚpatchÚobjectr   r    r   r!   r&   r   )r]   rg   rk   r-   Úexpectedre   rf   s        @@r.   Útest_progress_during_fitrp   ‘   s¶   ù€ ä
×Ñ˜ÔÝAà€GØ*×7Ñ7Ðõ5ð €HÜ	�‰×	Ñ	Ð.°Ð@UÓ	Vñ OÜ (Ô+×9Ñ9¼+»-ÓH×LÑLÔN÷Oô ',¨A¨x¸!©|Ó&<Ö= ��H“Ò=ÀÀÑE€HÜ�G˜XÕ&÷Oð Oüò >s   Á2C Â CÃ C	Úmeta_estimatoré   rj   rL   )r   c                 ó¤  ‡‡	‡
— t        j                  d«       ddlm} g Š
|j                  Š	ˆfd„Šˆˆ	ˆ
fd„}t
        j                  j                  |d|«      5  | j                  t        «       «      }|j                  «        ddd«       ‰
D ��cg c]  \  }}t        |«      dk(  sŒ|‘Œ }}}g d	¢}t        ||«       y# 1 sw Y   Œ=xY wc c}}w )
zECheck the recursive computation of the progress of nested estimators.r   r   r\   c                 ó  •— | j                   sd}n^t        d„ | j                   j                  «       D «       «      | j                  z  }| j                   j                  «       D ]
  } ‰|«       Œ t	        | j
                  |«       y )Nrl   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrB   )rb   )rG   Úcs     r.   rI   zOtest_progress_during_fit_composition.<locals>.check_progress.<locals>.<genexpr>½   s   è ø€ ÒF¨!˜1Ÿ:�:ÑFùs   ‚)ÚchildrenÚsumÚvaluesÚtotalr   rb   )Útaskro   ÚchildÚcheck_progresss      €r.   r}   z<test_progress_during_fit_composition.<locals>.check_progress·   si   ø€ ð �}Š}Ø‰HäÑF¨t¯}©}×/CÑ/CÓ/EÔFÓFÈÏÉÑSˆHØŸ™×-Ñ-Ó/ò &�Ù˜uÕ%ð&ä˜Ÿ™ xÕ0r0   c                 ó”   •— |d   } ‰| |«       ‰j                  || j                  j                  g«        ‰| j                  «       y )NÚpathr_   )rc   rd   r   r}   re   rf   s      €€€r.   rg   zCtest_progress_during_fit_composition.<locals>.recording_on_task_endÂ   sB   ø€ Ø˜Ñ ˆÙ˜˜yÔ)Ø�‰˜˜d×1Ñ1×:Ñ:Ð;Ô<Ù�t×*Ñ*Õ+r0   ri   Nr   )g      Ð?g      à?g      è?rl   )r   r   rO   r]   ri   r   rm   rn   r    r   r!   Úlenr   )rq   r]   rg   Úmetar   rb   Úend_of_outer_subtasksÚexpected_progressr}   re   rf   s           @@@r.   Ú$test_progress_during_fit_compositionr„   ¦   s¸   ú€ ô ×Ñ˜ÔÝAà€GØ*×7Ñ7Ðô	1ö,ô 
�‰×	Ñ	Ð.°Ð@UÓ	Vñ Ø×+Ñ+¬K«MÓ:ˆØ�‰Œ
÷ð =D×V©.¨$°ÄsÈ4ÃyÐTUÃ~šXÐVÐÑVÚ.ÐÜÐ)Ð+<Õ=÷ð üó Ws   Á*C ÂCÂ(CÃ C	c                 ó4  — t        j                  d«       t        «       j                  t	        «       «      j                  «        | j                  «       }t        j                  d|j                  «      sJ ‚t        j                  d|j                  «      sJ ‚y)zICheck that a progress bar is displayed for an estimator without subtasks.r   zNoSubtaskEstimator - fitr   N)
r   r   r	   r    r   r!   r"   r#   r$   r%   )r)   r,   s     r.   Útest_estimator_without_subtasksr†   Ó   sk   € ä
×Ñ˜ÔäÓ×&Ñ&¤{£}Ó5×9Ñ9Ô;Ø× Ñ Ó"€HÜ�9‰9Ð0°(·,±,Ô?Ð?Ð?Ü�9‰9�W˜hŸl™lÔ+Ð+Ñ+r0   )"r#   rW   Úunittestr   r   Úsklearn.baser   Úsklearn.callbackr   Úsklearn.callback.tests._utilsr   r   r   r	   r
   Ú$sklearn.utils._optional_dependenciesr   Úsklearn.utils._testingr   r   Úsklearn.utils.parallelr   r   ÚmarkÚparametrizer/   r2   r<   Úthread_unsaferR   rZ   rp   r„   r†   © r0   r.   ú<module>r’      s¹  ðó 
Û Ý ã å Ý (÷õ õ D÷÷ 5ð ‡�×Ñ˜ A q 6Ó*Ø‡�×Ñ˜ I¨{Ð#;Ó<Ø‡�×ÑØÐ'¨Ð9KÐLóð ‡�×ÑÐ0²,Ó?ñ9ó @óó =ó +ð9òDò
*ð ‡�×ÑØ‡�×Ñ˜ [°&Ð$9Ó:ñó ;ó ðð: ‡�×Ñ˜ I¨{Ð#;Ó<ñó =ðò*'ð* ‡�×ÑØáÑ&°Ô2¸AÔ>Ù"Ñ$4¸aÔ$@À$ÈÈdÐ#SÓTÙ" D¨$Ñ0@È!Ô0LÈdÐ#SÓTÙ" D¨$°Ñ6FÐPQÔ6RÐ#SÓTð	óñ!>óð!>óH,r0   