
    ]i                     8    S SK Jr  S SKrSSKJr   " S S5      rg)    )contextmanagerN   )
swap_statec                   J    \ rS rSrSrSS jrS rS r\S 5       r	S r
S rS	rg
)ModelEMA   z
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                 p    X l         Xl        0 U l        SU l        X@l        X0l        U R                  5         g )Nr   )decaymodelstatecountdeviceunbias_init)selfr   r
   r   r   s        G/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/demucs/ema.py__init__ModelEMA.__init__   s-    





    c                 \   U R                   R                  5       R                  5        H  u  pUR                  [        R
                  :w  a  M%  U R                  =(       d    UR                  nXR                  ;  d  MU  UR                  5       R                  USS9U R                  U'   M     g )NT)copy)
r   
state_dictitemsdtypetorchfloat32r   r   detachto)r   keyvalr   s       r   r   ModelEMA._init"   ss    

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

3 8r   c                 <   U R                   (       a1  U R                  U R                  -  S-   U l        SU R                  -  nOSU R                  -
  nU R                  R	                  5       R                  5        H  u  p#UR                  [        R                  :w  a  M%  U R                  =(       d    UR                  nU R                  U   R                  SU-
  5        U R                  U   R                  UR                  5       R                  U5      US9  M     g )Nr   )alpha)r   r   r
   r   r   r   r   r   r   r   r   mul_add_r   r   )r   wr   r    r   s        r   updateModelEMA.update*   s    ;;djj014DJDJJADJJA

--/557HCyyEMM)[[.CJJFJJsO  Q'JJsO  !8 B 8r   c              #      #    [        U R                  U R                  5         S v   S S S 5        g ! , (       d  f       g = f7f)N)r   r   r   r   s    r   swapModelEMA.swap7   s%     

DJJ/ 0//s   !A1	A
?Ac                 4    U R                   U R                  S.$ )Nr   r   r.   r*   s    r   r   ModelEMA.state_dict<   s    djj99r   c                     US   U l         US   R                  5        H#  u  p#U R                  U   R                  U5        M%     g )Nr   r   )r   r   r   copy_)r   r   kvs       r   load_state_dictModelEMA.load_state_dict?   s<    7^
'N((*DAJJqM" +r   )r   r
   r   r   r   r   N)gH.?Tcpu)__name__
__module____qualname____firstlineno____doc__r   r   r'   r   r+   r   r4   __static_attributes__ r   r   r   r      s6    EC  :#r   r   )
contextlibr   r   statesr   r   r=   r   r   <module>r@      s    &  3# 3#r   