
    ]ie1                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr  SSKJr  SSKrS	S
KJr  S	SKJrJr  S	SKJrJr  S S\R6                  \\R:                  4   S\4S jjr " S S\5      r  " S S\	5      r! " S S\	5      r" " S S5      r#SSSS.S jr$ " S S5      r%S r& " S S\5      r'g)!z
Support for PyTorch lightning. You should just replace the call
to `Trainer(...)` with `get_trainer(...)`.
For using `dora.log.LogProgress` as a progress bar with PL, see `PLLogProgress`.
    N)LightningModule)Callback)ProgressBarBase)ClusterEnvironment)Trainer)from_argparse_args   )distrib)get_xpis_xp)boldLogProgressTmetricsepochc                    0 nU R                  5        H  u  p4U(       a  UR                  S5      (       a  M$  U(       d  UR                  S5      (       a  MC  UR                  S5      (       d  UR                  S5      (       a  UR                  SS5      S   n[        U[        R
                  5      (       a$  UR                  5       S:X  a  UR                  5       nXBU'   M     U$ )a  Filters metrics before formatting, in particular to remove the `_step` or `_epoch`
suffix. This will also convert torch tensors to float.
Args:
    metrics: dict given by PL.
    epoch: if True, keep only epoch level metrics, otherwise, keep only step level metrics.
_step_epoch_r	   r   )itemsendswithrsplit
isinstancetorchTensornumelitem)r   r   outkeyvalues        K/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/dora/lightning.py_filter_metricsr!      s     Cmmo
S\\'**h//<<  CLL$:$:**S!$Q'CeU\\**u{{}/AJJLEC & J    c                      ^  \ rS rSrU 4S jrS\4S jr\S\4S j5       rS\	4S jr
S\	SS4S	 jrS\	4S
 jrS\	SS4S jrS\	4S jrS\	4S jr\S\4S j5       r\S\4S j5       r\S\	4S j5       rSrU =r$ )DoraEnvironment3   c                    > [         TU ]  5         [        R                  " 5       U l        [        R
                  " 5         g N)super__init__r
   get_distrib_specspecset_distrib_envself	__class__s    r    r)   DoraEnvironment.__init__4   s*    ,,.	!r"   returnc                     gNT r.   s    r    creates_children DoraEnvironment.creates_children9   s    r"   c                     gr3   r4   r5   s    r    creates_processes_externally,DoraEnvironment.creates_processes_externally<   s    r"   c                 .    U R                   R                  $ r'   )r+   
world_sizer5   s    r    r<   DoraEnvironment.world_size@       yy###r"   sizeNc                     g r'   r4   )r.   r?   s     r    set_world_sizeDoraEnvironment.set_world_sizeC       r"   c                 .    U R                   R                  $ r'   )r+   rankr5   s    r    global_rankDoraEnvironment.global_rankF   s    yy~~r"   rE   c                     g r'   r4   )r.   rE   s     r    set_global_rankDoraEnvironment.set_global_rankI   rC   r"   c                 .    U R                   R                  $ r'   )r+   
local_rankr5   s    r    rL   DoraEnvironment.local_rankL   r>   r"   c                 .    U R                   R                  $ r'   )r+   	node_rankr5   s    r    rO   DoraEnvironment.node_rankO   s    yy"""r"   c                      gNFr4   r4   r"   r    detectDoraEnvironment.detectR   s    r"   c                 (    [         R                  S   $ )N	MAIN_ADDR)osenvironr5   s    r    main_addressDoraEnvironment.main_addressV   s    zz+&&r"   c                 :    [        [        R                  S   5      $ )N	MAIN_PORT)intrW   rX   r5   s    r    	main_portDoraEnvironment.main_portZ   s    2::k*++r"   )r+   )__name__
__module____qualname____firstlineno__r)   boolr6   propertyr9   r]   r<   rA   rF   rI   rL   rO   staticmethodrS   strrY   r^   __static_attributes____classcell__r/   s   @r    r$   r$   3   s    "
$  d  $C $3 4 S C D $C $#3 # D   'c ' ' ,3 , ,r"   r$   c                   *    \ rS rSrSrS rS rS rSrg)DoraCheckpointSync_   z>Make sure Dora history, and checkpoint state are in sync.
    c                 "    [        5       U l        g r'   )r   xpr5   s    r    r)   DoraCheckpointSync.__init__b   s    (r"   c                 X    US   nU R                   R                  R                  U5        g )Ndora_link_history)ro   linkupdate_history)r.   trainer	pl_module
checkpointhistorys        r    on_load_checkpoint%DoraCheckpointSync.on_load_checkpointe   s#    01##G,r"   c                     U R                   R                  R                  US'   U R                   R                  US'   U R                   R                  US'   U$ )Nrr   dora_sigdora_cfg)ro   rs   rx   sigcfgr.   ru   rv   rw   s       r    on_save_checkpoint%DoraCheckpointSync.on_save_checkpointi   sE    *.'',,*>*>
&'!%
:!%
:r"   )ro   N)	r`   ra   rb   rc   __doc__r)   ry   r   rh   r4   r"   r    rl   rl   _   s    -r"   rl   c                   >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )DoraHistoryLoggerp   z,Save metrics to Dora using the XP link.
    c                 T   > [         TU ]  5         [        5       R                  U l        g r'   )r(   r)   r   rs   r-   s    r    r)   DoraHistoryLogger.__init__s   s    HMM	r"   c                     SU l         g r3   _first_validr.   ru   rv   s      r    on_fit_startDoraHistoryLogger.on_fit_startw   s
     r"   c                     SU l         g rR   r   r   s      r    on_train_epoch_start&DoraHistoryLogger.on_train_epoch_startz   s
    !r"   c                     U R                   (       a  g UR                  n[        USS9nU R                  R	                  U5        g )NTr   )r   logged_metricsr!   rs   push_metrics)r.   ru   rv   r   s       r    on_epoch_endDoraHistoryLogger.on_epoch_end}   s7    ((!'6		w'r"   )r   rs   )r`   ra   rb   rc   r   r)   r   r   r   rh   ri   rj   s   @r    r   r   p   s!    "!"( (r"   r   c                       \ rS rSrS rSrg)_DummySLURMConnector   c                     g r'   r4   r5   s    r    register_slurm_signal_handlers3_DummySLURMConnector.register_slurm_signal_handlers   rC   r"   r4   N)r`   ra   rb   rc   r   rh   r4   r"   r    r   r      s    r"   r   )auto_resumeadd_dora_loggerno_unfinished_epochsc                 V   [        5       (       d  [        S5      e[        R                  n[	        US5      (       a  UR
                  n[	        US5      (       a  M  [        R                  " US/[        U5      -   40 UD6nUS	 UR                  S5      =(       d    / n[        5       n[        [        R                  R                  5       UR                  5       5      nUR                  5       S:  a  XgS/-  nXdS'   UR                  SS5      =(       d    / n	U	R!                  [#        5       5        XS'   US	   b  [        S
5      eUS   S:w  a  [        S5      eXS	'   UR$                  R&                  US'   [)        5       R*                  US'   U(       a  US   R!                  [-        5       5        UR/                  S5      n
U (       aA  U
c>  [)        5       R*                  S-  nUR1                  5       (       a  [3        U5      nOSnXS'   [        S0 UD6nU(       a  [5        5       Ul        U$ )a  Return a PL trainer, adding the necessary glue code to make everything works.
The arguments are exactly the same as for `pytorch_lightning.trainer.Trainer`,
with a few extras documented after.

..note:: You should not pass `gpus=` or `num_nodes=` arguments as those will be filled by Dora.

Args:
    auto_resume (bool): if True, automatically resume previous checkpoints.
        You are still responsible for creating the `ModelCheckpoint` callback,
        this only handles the `resume_from_checkpoint` part.
    add_dora_logger (bool): if True, adds a Dora Logger to automatically
        forward the metrics (those logged with per_epoch=True), otherwise
        pushing metrics will be up to you.
    no_unfinished_epochs (bool): if True, deactivates SLURM signal handling
        by PL, which can result in half finished epoch with each interruption.
        It is recommended to instead dump a checkpoint every epoch and resume
        from that one so that training is reliable.

z.This can only be called from inside a Dora XP.__wrapped__Nr.   pluginsr	   ddp	callbacksgpuszCYou cannot specify the number of GPUs, as this is provided by Dora.	num_nodeszDYou cannot specify the number of nodes, as this is provided by Dora.default_root_dirresume_from_checkpointz	last.ckptr4   )r   RuntimeErrorr   r)   hasattrr   inspectgetcallargslistpopr$   minr   cudadevice_countr<   appendrl   r+   r   r   folderr   getis_filerg   r   slurm_connector)r   r   r   argskwargsinitr   envr   r   r   lastresumeru   s                 r    get_trainerr      s   * 77KLL D
$
&
& $
&
&  vT
':EfEFvjj#)rG

Cuzz&&(#..*:;D
~~!<9

;-3I')*#;f~!`aakaabb6N((,,F;!'F{""#4#67#ZZ(@A-5x,<<>>YFF+1'(G"6"8Nr"   c                   X    \ rS rSr\R
                  " \R                  5      S 5       rSrg)
_Intercept   c                     Xl         X l        g r'   r   r   )r.   r   r   s      r    r)   _Intercept.__init__   s    	r"   r   N)	r`   ra   rb   rc   	functoolswrapsr   r)   rh   r4   r"   r    r   r      s#    __W%%& 'r"   r   c                 b    [        [        U 40 UD6n[        UR                  0 UR                  D6$ r'   )r   r   r   r   r   )r   r   	intercepts      r    trainer_from_argparse_argsr      s-    ":t>v>I	;)*:*:;;r"   c                   H  ^  \ rS rSrSrSU 4S jjrS\SS4U 4S jjrU 4S jr\	S\
4S	 j5       r SS
\R                  \\R                  4   S\S\4S jjr\	S 5       rS rU 4S jrU 4S jrS rU 4S jrU 4S jrS rS rU 4S jrU 4S jrU 4S jrS rS rS rSr U =r!$ )PLLogProgress   z<`dora.log.LogProgress` support for Pytorch-Lightning.


    r1   Nc                 H   > [         TU ]  5         Xl        X l        S U l        g r'   )r(   r)   loggerr   
_pl_module)r.   r   r   r/   s      r    r)   PLLogProgress.__init__   s    8<r"   stagec                 @   > [         TU ]  XU5        X l        / U l        g r'   )r(   setupr   _replay_history)r.   ru   rv   r   r/   s       r    r   PLLogProgress.setup   s    g%0#02r"   c                 @   > [         TU ]  X5        SU l        SU l        g )NFT)r(   r   	_in_trainr   r.   ru   rv   r/   s      r    r   PLLogProgress.on_fit_start   s    W0 r"   c                 8    U R                   c   eU R                   $ r'   )r   r5   s    r    rv   PLLogProgress.pl_module   s    ***r"   r   r   c                     0 nUR                  5        H*  u  pV[        U[        5      (       d  M  [        US5      XE'   M,     U$ )a/  Default method to format metrics for displaying in the progress bar.
To customize, you can define a `format_metrics()` method on your
Lightning module.

Args:
    metrics: dict of metrics given by PL.
    stage: "train" or "valid".
    epoch: if True, provided metrics are for the end of epoch summary.
z.5f)r   r   floatformat)r.   r   r   r   r   r   r   s          r    format_metricsPLLogProgress.format_metrics   s=     !--/JC%''!%/ * 
r"   c                 D    [        U R                  SU R                  5      $ )Nr   )getattrrv   r   r5   s    r    _format_metricsPLLogProgress._format_metrics  s    t~~'79L9LMMr"   c                    U R                   R                  S5        U R                   R                  US:X  a  SOS5        UR                  5       SU R                  R                  S-    3-   nUS:X  a  [        U R                  5      nO*US:X  a  [        U R                  5      nO[        SU 35      e[        U5      n[        U R                   U4X2S	.U R                  D6U l        [        U R                  5        g )
NzF----------------------------------------------------------------------trainzTraining...zValidating...z	 | Epoch r	   validzInvalid stage )totalname)r   info
capitalizeru   current_epochr]   total_train_batchestotal_val_batchesr   ranger   r   logprogiter)r.   r   r   r   loaders        r    _on_epoch_startPLLogProgress._on_epoch_start  s    "%7*:P!i0J0JQ0N/O$PPG001Eg../Ew788u"4;;^e^RVR]R]^T\\r"   c                 `   > U R                  S5        SU l        SU l        [        TU ]  X5      $ )Nr   TF)r   r   r   r(   r   r   s      r    r   "PLLogProgress.on_train_epoch_start  s0    W%!w+G??r"   c                 D   > U R                  S5        [        TU ]	  X5      $ Nr   )r   r(   on_validation_epoch_startr   s      r    r   'PLLogProgress.on_validation_epoch_start$  s!    W%w0DDr"   c                     U R                  U R                  U R                  5      n[        USS9nU R	                  X!SS9nU R
                  R                  " S0 UD6  [        U R
                  5        g )NFr   r4   )get_metricsru   rv   r!   r   r   updatenext)r.   r   r   	formatteds       r    _on_batch_endPLLogProgress._on_batch_end(  s^    ""4<<@!'7((u(E	(i(T\\r"   c                 H   > [         TU ]  " U0 UD6  U R                  S5        g )Nr   )r(   on_train_batch_endr   r.   r   r   r/   s      r    r   PLLogProgress.on_train_batch_end/  s#    "D3F37#r"   c                 H   > [         TU ]  " U0 UD6  U R                  S5        g r   )r(   on_validation_batch_endr   r  s      r    r  %PLLogProgress.on_validation_batch_end3  s#    '887#r"   c                 v   US:X  a=  U R                   R                  R                  R                  R	                  S5      S   nOFU R                   R                  R                  R
                  R                  R	                  S5      S   n[        USS9nU R                  XR                   R                  U5        g )Nr   Flogr   )	ru   fit_loop
epoch_loop_resultsr   val_loopr!   _show_epoch_summaryr   )r.   r   r   s      r    _on_stage_endPLLogProgress._on_stage_end7  s    Gll++66??GGNuUGll++66??HHPPQVWX]^G!'7  (B(BGLr"   c           	      (   U R                   R                  XU45        U R                  X1SS9nUR                  5       nSR	                  S UR                  5        5       5      nU R                  R                  [        U SUS-    SU 35      5        g )NTr   z | c              3   P   #    U  H  u  pUR                  5        S U 3v   M     g7f)=N)r   ).0r   vals      r    	<genexpr>4PLLogProgress._show_epoch_summary.<locals>.<genexpr>D  s)      
8IHCs~~ #'8Is   $&z Summary | End of Epoch r	   )	r   r   r   r   joinr   r   r   r   )r.   r   r   r   r   r   summarys          r    r  !PLLogProgress._show_epoch_summary@  s    ##U7$;<((t(D	!** 
8A8I
 
 	&>uqykWIVWXr"   c                    > [         TU ]  X5        U R                  (       d  U R                  (       d   eU R                  (       d  U R	                  S5        SU l        g g Nr   F)r(   on_train_endr   r   r  r   s      r    on_validation_start!PLLogProgress.on_validation_startI  sH    W0~~!2!222  w'"DN !r"   c                 v   > [         TU ]  X5        U R                  (       a  U R                  S5        SU l        g r  )r(   r   r   r  r   s      r    r   PLLogProgress.on_epoch_endP  s,    W0>>w'r"   c                 F   > [         TU ]  X5        U R                  S5        g r   )r(   on_validation_endr  r   s      r    r$  PLLogProgress.on_validation_endV  s    !'57#r"   c                     g r'   r4   r5   s    r    disablePLLogProgress.disableZ  s     	r"   c                     UR                  S/ 5      nU(       a  U R                  R                  S5        U H  nU R                  " U6   M     g )Ndora_replay_historyzReplaying past metrics...)r   r   r   r  )r.   ru   rv   rw   replay_historysteps         r    ry    PLLogProgress.on_load_checkpoint_  sA    #(=rBKK89"D$$d+ #r"   c                 $    U R                   US'   U$ )Nr*  )r   r   s       r    r    PLLogProgress.on_save_checkpointf  s    ,0,@,@
()r"   )r   r   r   r   r   r   r   )r1   N)F)"r`   ra   rb   rc   r   r)   rg   r   r   re   r   rv   tpDictAnyrd   r   r   r   r   r   r   r  r  r  r  r  r   r$  r'  ry   r   rh   ri   rj   s   @r    r   r      s    
=3s 3t 3
!
 ?  
 27bggc266k&: !*." N N@E$$MY#$
, r"   r   )T)(r   r   r   rW   typingr0  pytorch_lightningr   pytorch_lightning.callbacksr   $pytorch_lightning.callbacks.progressr   &pytorch_lightning.plugins.environmentsr   pytorch_lightning.trainerr   $pytorch_lightning.utilities.argparser   r    r
   ro   r   r   r
  r   r   r1  rg   r2  rd   r!   r$   rl   r   r   r   r   r   r   r4   r"   r    <module>r;     s   
   	  - 0 @ E - C    "RWWS"&&[1 $ *),( ),X "( (,  $(TX CL <
IO Ir"   