
    mi                     8    d dl mZ d dlZddlmZ  G d d      Zy)    )contextmanagerN   )
swap_statec                   @    e Zd ZdZd	dZd Zd Zed        Zd Z	d Z
y)
ModelEMAz
    Perform EMA on a model. You can switch to the EMA weights temporarily
    with the `swap` method.

        ema = ModelEMA(model)
        with ema.swap():
            # compute valid metrics with averaged model.
    c                 x    || _         || _        i | _        d| _        || _        || _        | j                          y )Nr   )decaymodelstatecountdeviceunbias_init)selfr
   r	   r   r   s        D/var/www/stems/demucs_env/lib/python3.12/site-packages/demucs/ema.py__init__zModelEMA.__init__   s5    





    c                 N   | j                   j                         j                         D ]z  \  }}|j                  t        j
                  k7  r$| j                  xs |j                  }|| j                  vsM|j                         j                  |d      | j                  |<   | y )NT)copy)
r
   
state_dictitemsdtypetorchfloat32r   r   detachto)r   keyvalr   s       r   r   zModelEMA._init"   s~    

--/557 	EHCyyEMM)[[.CJJF$**$"%**,//&t/"D

3	Er   c                 (   | j                   r1| j                  | j                  z  dz   | _        d| j                  z  }nd| j                  z
  }| j                  j	                         j                         D ]  \  }}|j                  t        j                  k7  r$| j                  xs |j                  }| j                  |   j                  d|z
         | j                  |   j                  |j                         j                  |      |        y )Nr   )alpha)r   r   r	   r
   r   r   r   r   r   r   r   mul_add_r   r   )r   wr   r   r   s        r   updatezModelEMA.update*   s    ;;djj014DJDJJADJJA

--/557 	CHCyyEMM)[[.CJJFJJsO  Q'JJsO  !8 B	Cr   c              #   ~   K   t        | j                  | j                        5  d  d d d        y # 1 sw Y   y xY ww)N)r   r
   r   r   s    r   swapzModelEMA.swap7   s/     

DJJ/ 		 	 	s   !=1	=:=c                 4    | j                   | j                  dS )Nr   r   r)   r&   s    r   r   zModelEMA.state_dict<   s    djj99r   c                     |d   | _         |d   j                         D ]#  \  }}| j                  |   j                  |       % y )Nr   r   )r   r   r   copy_)r   r   kvs       r   load_state_dictzModelEMA.load_state_dict?   sC    7^
'N((* 	#DAqJJqM"	#r   N)gH.?Tcpu)__name__
__module____qualname____doc__r   r   r$   r   r'   r   r.    r   r   r   r      s6    EC  :#r   r   )
contextlibr   r   statesr   r   r4   r   r   <module>r7      s    &  3# 3#r   