o
    9wi                     @   s2   d dl mZ d dlZddlmZ G dd dZdS )    )contextmanagerN   )
swap_statec                   @   sF   e Zd ZdZdddZdd Zd	d
 Zedd Zdd Z	dd Z
dS )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.
    H.?Tcpuc                 C   s0   || _ || _i | _d| _|| _|| _|   d S )Nr   )decaymodelstatecountdeviceunbias_init)selfr	   r   r   r    r   G/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/demucs/ema.py__init__   s   zModelEMA.__init__c                 C   sX   | j   D ]"\}}|jtjkrq| jp|j}|| jvr)| j	|dd| j|< qd S )NT)copy)
r	   
state_dictitemsdtypetorchfloat32r   r
   detachto)r   keyvalr   r   r   r   r   "   s   
zModelEMA._initc                 C   s   | j r| j| j d | _d| j }nd| j }| j  D ]*\}}|jtjkr)q| j	p.|j	}| j
| d|  | j
| j| ||d qd S )Nr   )alpha)r   r   r   r	   r   r   r   r   r   r   r
   mul_add_r   r   )r   wr   r   r   r   r   r   update*   s   
 zModelEMA.updatec                 c   s<    t | j| j d V  W d    d S 1 sw   Y  d S )N)r   r	   r
   r   r   r   r   swap7   s   "zModelEMA.swapc                 C   s   | j | jdS )Nr
   r   r$   r"   r   r   r   r   <   s   zModelEMA.state_dictc                 C   s4   |d | _ |d  D ]\}}| j| | qd S )Nr   r
   )r   r   r
   copy_)r   r
   kvr   r   r   load_state_dict?   s   
zModelEMA.load_state_dictN)r   Tr   )__name__
__module____qualname____doc__r   r   r!   r   r#   r   r(   r   r   r   r   r      s    


r   )
contextlibr   r   statesr   r   r   r   r   r   <module>   s   