
    9i.                         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	5      r\R                  " \R                  S
9 " S S\	5      5       rg)    N)Hooks)
get_logger   )HOOKS)Hook)Priorityc                        \ rS rSrSrSrSrSrg)EarlyStopStrategy   by_epochby_stepno N)__name__
__module____qualname____firstlineno__r   r   r   __static_attributes__r       i/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/trainers/hooks/early_stop_hook.pyr
   r
      s    HG	Br   r
   )module_namec                       \ rS rSrSr\R                  rS S S.rSSSS	\	R                  S
4S\S\S\S\S\S\S\4S jjrS rS rS rS rS rSrg)EarlyStopHook   a8  Early stop when a specific metric stops improving.

Args:
    metric_key (str):  Metric key to be monitored.
    rule (str): Comparison rule for best score. Support "max" and "min".
        If rule is "max", the training will stop when `metric_key` has stopped increasing.
        If rule is "min", the training will stop when `metric_key` has stopped decreasing.
    patience (int): Trainer will stop if the monitored metric did not improve for the last `patience` times.
    min_delta (float): Minimum change in the monitored metric to qualify as an improvement.
    check_finite (bool): If true, stops training when the metric becomes NaN or infinite.
    early_stop_strategy (str): The strategy to early stop, can be by_epoch/by_step/none
    interval (int): The frequency to trigger early stop check, by epoch or step.
c                 
    X:  $ Nr   xys     r   <lambda>EarlyStopHook.<lambda>#   s    AEr   c                 
    X:  $ r   r   r   s     r   r    r!   #   s    qur   )maxminr#      g        Tr   
metric_keyrulepatience	min_deltacheck_finiteearly_stop_strategyintervalc                 "   Xl         X l        X0l        X@l        XPl        SU;   a0  US   (       a  [
        R                  O[
        R                  U l        OX`l        Xpl	        SU l
        US:X  a  [        S5      U l        g [        S5      * U l        g )Nr   r   r$   inf)r&   r'   r(   r)   r*   r
   r   r   r+   r,   
wait_countfloat
best_score)	selfr&   r'   r(   r)   r*   r+   r,   kwargss	            r   __init__EarlyStopHook.__init__%   s}     %	 "(EKF'8'A'A!2!:!: $ (;$ *.%-%,eEl]r   c                 h    [        US5      (       d  [        5       U l        g UR                  U l        g )Nlogger)hasattrr   r7   r2   trainers     r   
before_runEarlyStopHook.before_run=   s#    w))$,DK!..DKr   c           	         UR                   nUc  gU R                  U;  a  [        SU R                   SU 35      eSnX R                     nU R                  (       aY  [        R
                  " U5      (       d>  SnU R                  R                  SU R                   SU SU R                  S S	35        U$ U R                  U R                     " X@R                  -
  U R                  5      (       a  X@l        S
U l        U$ U =R                  S-  sl        U R                  U R                  :  aF  SnU R                  R                  SU R                   SU R                   SU R                  S S	35        U$ )NFzMetric not found: z not in TzMetric z = z& is not finite. Previous best metric: z.4f.r   r   z did not improve in the last z# epochs or iterations. Best score: )metric_valuesr&   
ValueErrorr*   npisfiniter7   warningr1   rule_mapr'   r)   r/   r(   info)r2   r:   r?   should_stopcurrent_scores        r   _should_stopEarlyStopHook._should_stopC   sk   -- ??-/$T__$5Xm_MO O %oo6R[[%?%?KKK$//*#m_ =))-(=Q@A  ]]499%mnn&D&*oo7 7+ODO  OOq O$--/"  doo..KDOOK\ ]##'??3"7q:; r   c                 H    U R                   R                  S5        SUl        g )NzEarly Stopping!T)r7   rE   _stop_trainingr9   s     r   rK   EarlyStopHook._stop_traininga   s    *+!%r   c                     U R                   [        R                  :w  a  g U R                  XR                  5      (       d  g U R                  U5      (       a  U R                  U5        g g r   )r+   r
   r   every_n_epochsr,   rH   rK   r9   s     r   after_train_epochEarlyStopHook.after_train_epoche   sV    ##'8'A'AA""7MM::W%%( &r   c                     U R                   [        R                  :w  a  g U R                  XR                  5      (       d  g U R                  U5      (       a  U R                  U5        g g r   )r+   r
   r   every_n_itersr,   rH   rK   r9   s     r   after_train_iterEarlyStopHook.after_train_itero   sV    ##'8'@'@@!!'==99W%%( &r   )
r1   r*   r+   r,   r7   r&   r)   r(   r'   r/   N)r   r   r   r   __doc__r   VERY_LOWPRIORITYrD   r
   r   strintr0   boolr4   r;   rH   rK   rO   rS   r   r   r   r   r   r      s       H)2DEH #!"$'&*,=,F,F!"K KK K "	K
  $K '*K K0)<&))r   r   )numpyrA   modelscope.metainfor   modelscope.utils.loggerr   builderr   hookr   priorityr   r
   register_moduler   r   r   r   <module>rb      sR     % .     5#6#67d)D d) 8d)r   