
    ^jt                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
Z
 G d de
j                  j                        Z G d d      Z G d	 d
      Zg dZy)zLEMA model and best-metric tracking utilities (moved from rfdetr.util.utils).    N)deepcopy)CallableDictOptionalUnionc                       e Zd ZdZ	 	 	 ddej
                  j                  dededeej                     ddf
 fdZ
defd	Zdej
                  j                  d
eej                  ej                  gej                  f   ddfdZdej
                  j                  ddfdZdej
                  j                  ddfdZ xZS )ModelEmaz
EMA Model.Nmodeldecaytaudevicereturnc                    t         t        |           t        |      | _        | j                  j                          || _        || _        d| _        || _	        | j                  | j                  j                  |       y y )N   r   )superr	   __init__r   moduleevalr   r   updatesr   to)selfr
   r   r   r   	__class__s        d/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/training/model_ema.pyr   zModelEma.__init__   sj     	h&(uo
;;"KKNN&N) #    c                     | j                   dk(  r| j                  }|S | j                  dt        j                  | j                   | j                   z        z
  z  }|S )Nr   r   )r   r   mathexpr   )r   r   s     r   
_get_decayzModelEma._get_decay&   sO    88q=JJE  JJ!dhh}txx/G&H"HIEr   	update_fnc                    t        j                         5  t        | j                  j	                         j                         |j	                         j                               D ]E  \  }}| j                  |j                  | j                        }|j                   |||             G 	 d d d        y # 1 sw Y   y xY w)Nr   )	torchno_gradzipr   
state_dictvaluesr   r   copy_)r   r
   r    ema_vmodel_vs        r   _updatezModelEma._update-   s    
 ]]_ 	7"%dkk&<&<&>&E&E&GIYIYI[IbIbId"e 7w;;*%jjj<GIeW567	7 	7 	7s   BB66B?c                 |    | j                         | j                  |fd       | xj                  dz  c_        y )Nc                      | z  dz
  |z  z   S )Ng      ? )emr   s     r   <lambda>z!ModelEma.update.<locals>.<lambda>:   s    519eq?P3P r   r    r   )r   r*   r   )r   r
   r   s     @r   updatezModelEma.update8   s.    !U&PQr   c                 ,    | j                  |d        y )Nc                     |S Nr-   )r.   r/   s     r   r0   zModelEma.set.<locals>.<lambda>>   s    1 r   r1   )r*   )r   r
   s     r   setzModelEma.set=   s    Un5r   )gZڊ?r   N)__name__
__module____qualname____doc__r"   nnModulefloatr   r   r   r   r   Tensorr*   r2   r6   __classcell__)r   s   @r   r	   r	      s    
 )-*xx* * 	*
 &* 
*&E 	7xx	7 U\\5<<8%,,FG	7 
		7EHHOO  
6 6T 6r   r	   c                       e Zd ZddededdfdZdededefdZded	edefd
Z	defdZ
defdZdeeeeef   f   fdZy)BestMetricSingleinit_resbetterr   Nc                 H    || _         || _        d| _        || _        |dv sJ y )N)largesmall)rB   best_resbest_eprC   )r   rB   rC   s      r   r   zBestMetricSingle.__init__B   s-      ++++r   new_resold_resc                     | j                   dk(  r||kD  S | j                   dk(  r||k  S t        d| j                         )NrF   rG   zUnexpected value for 'better': )rC   
ValueError)r   rJ   rK   s      r   isbetterzBestMetricSingle.isbetterJ   sG    ;;'!W$$[[G#W$$>t{{oNOOr   epc                 Z    | j                  || j                        r|| _        || _        yy)NTF)rN   rH   rI   )r   rJ   rO   s      r   r2   zBestMetricSingle.updateR   s(    ==$--0#DMDLr   c                 N    dj                  | j                  | j                        S )Nzbest_res: {}	 best_ep: {})formatrH   rI   r   s    r   __str__zBestMetricSingle.__str__Y   s    +224==$,,OOr   c                 "    | j                         S r5   )rT   rS   s    r   __repr__zBestMetricSingle.__repr__\   s    ||~r   c                 4    | j                   | j                  dS )NrH   rI   rX   rS   s    r   summaryzBestMetricSingle.summary_   s    ||
 	
r   )        rF   )r7   r8   r9   r=   strr   boolrN   intr2   rT   rV   r   r   rY   r-   r   r   rA   rA   A   s    , ,c , ,P P P$ Pe   P P# 
c5#445 
r   rA   c            	       x    e Zd ZddedededdfdZddeded	edefd
Zde	ee
eef   f   fdZdefdZdefdZy)BestMetricHolderrB   rC   use_emar   Nc                 ~    t        ||      | _        || _        |r#t        ||      | _        t        ||      | _        y y r5   )rA   best_allr`   best_emabest_regular)r   rB   rC   r`   s       r   r   zBestMetricHolder.__init__g   s<    (6:,Xv>DM 06 BD r   rJ   epochis_emac                 6   | j                   s| j                  j                  ||      S |r8| j                  j                  ||       | j                  j                  ||      S | j                  j                  ||       | j                  j                  ||      S )z"Return if the results is the best.)r`   rb   r2   rc   rd   )r   rJ   re   rf   s       r   r2   zBestMetricHolder.updaten   s{    ||==''77$$We4}}++GU;;!!((%8}}++GU;;r   c                 N   | j                   s| j                  j                         S i }|j                  | j                  j                         j	                         D ci c]  \  }}d| | c}}       |j                  | j
                  j                         j	                         D ci c]  \  }}d| | c}}       |j                  | j                  j                         j	                         D ci c]  \  }}d| | c}}       |S c c}}w c c}}w c c}}w )Nall_regular_ema_)r`   rb   rY   r2   itemsrd   rc   )r   reskvs       r   rY   zBestMetricHolder.summaryz   s    ||==((**

dmm.C.C.E.K.K.MNdad1#JMNO

$2C2C2K2K2M2S2S2UV$!QhqcNA%VW

dmm.C.C.E.K.K.MNdad1#JMNO
 OVNs   D
-D
;D!
c                 L    t        j                  | j                         d      S )N   )indent)jsondumpsrY   rS   s    r   rV   zBestMetricHolder.__repr__   s    zz$,,.33r   c                 "    | j                         S r5   )rV   rS   s    r   rT   zBestMetricHolder.__str__   s    }}r   )rZ   rF   F)F)r7   r8   r9   r=   r[   r\   r   r]   r2   r   r   rY   rV   rT   r-   r   r   r_   r_   f   s    C Cc Cd C_c C
<e 
<C 
< 
<$ 
<c5#445 4# 4 r   r_   )r	   rA   r_   )r:   rs   r   copyr   typingr   r   r   r   r"   r;   r<   r	   rA   r_   __all__r-   r   r   <module>ry      sO    S    2 2 .6uxx .6b"
 "
J" "Jr   