o
    in+                     @   s   d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZ	d dl
mZ d dlm  mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ G d	d
 d
e	jZdS )    N)ceil)ExponentialMovingAverage)sampling)SDERegistry)BackboneRegistry)evaluate_model2)pad_specc                       s  e Zd Zedd Z			dB fdd	Zdd Z fddZdd Zdd Z	dC fdd	Z
dCddZdDddZdd Zd d! Zd"d# Zd$d% Zd&d' Z fd(d)Zd*d+ Zd,d- Zd.d/ ZdEd0d1ZdEd2d3Zd4d5 Zd6d7 Zd8d9 ZdEd:d;ZdFd@dAZ  ZS )G
ScoreModelc                 C   s   | j dtddd | j dtddd | j dtd	d
d | j dtddd | j dtddd | j dtddd | j dtdddd | S )Nz--lrgh㈵>z#The learning rate (1e-4 by default))typedefaulthelpz--ema_decay+?z3The parameter EMA decay constant (0.999 by default)z--t_epsQ?z"The minimum time (3e-2 by default)z--num_eval_files   zNumber of files for speech enhancement performance evaluation during training. Pass 0 to turn off (no checkpoints based on evaluation metrics will be generated).z--loss_typemsez!The type of loss function to use.z--loss_abs_exponent      ?z)magnitude transformation in the loss termz--output_scale)sigmatimer   z-backbone model scale before last output layer)r
   choicesr   r   )add_argumentfloatintstr)parser r   B/home/ubuntu/.local/lib/python3.10/site-packages/fastgeco/model.pyadd_argparse_args   s   zScoreModel.add_argparse_args-C6?r   r   r   r   r   Nr      c                    s   t    t|}|d	i || _t|}|d	i || _|| _|| _t	| 
 | jd| _d| _|| _|| _|| _|| _|
| _| jdgd |	d	i |d|dddki| _|| _|| _dS )
a.  
        Create a new ScoreModel.

        Args:
            backbone: Backbone DNN that serves as a score-based model.
            sde: The SDE that defines the diffusion process.
            lr: The learning rate of the optimizer. (1e-4 by default).
            ema_decay: The decay constant of the parameter EMA (0.999 by default).
            t_eps: The minimum time to practically run for to avoid issues very close to zero (1e-5 by default).
            loss_type: The type of loss to use (wrt. noise z/std). Options are 'mse' (default), 'mae'
        )decayFno_wandb)ignoregpugpusr   Nr   )super__init__r   get_by_namednnr   sdelr	ema_decayr   
parametersema_error_loading_emat_eps	loss_typenum_eval_filesloss_abs_exponentoutput_scalesave_hyperparametersgetdata_moduleinference_Ninference_start)selfbackboner(   r)   r*   r.   r1   r0   r/   data_module_clsr2   r6   r7   kwargsdnn_clssde_cls	__class__r   r   r%   !   s$   


$
zScoreModel.__init__c                 C   s   t jj|  | jd}|S )N)r)   )torchoptimAdamr+   r)   )r8   	optimizerr   r   r   configure_optimizersI   s   zScoreModel.configure_optimizersc                    s&   t  j|i | | j|   d S N)r$   optimizer_stepr,   updater+   r8   argsr;   r>   r   r   rF   M   s   zScoreModel.optimizer_stepc                 C   s<   | dd }|d ur| j|d  d S d| _td d S )Nr,   Tz'EMA state_dict not found in checkpoint!)r4   r,   load_state_dictr-   warningswarn)r8   
checkpointr,   r   r   r   on_load_checkpointS   s
   zScoreModel.on_load_checkpointc                 C   s   | j  |d< d S )Nr,   )r,   
state_dict)r8   rM   r   r   r   on_save_checkpoint[      zScoreModel.on_save_checkpointFc                    sb   t  |}| js/|dkr!|s!| j|   | j|   |S | jjd ur/| j|   |S )NF)	r$   trainr-   r,   storer+   copy_tocollected_paramsrestore)r8   modeno_emaresr>   r   r   rR   ^   s   zScoreModel.trainc                 C   s   | j d|dS )NF)rX   )rR   )r8   rX   r   r   r   evalk      zScoreModel.eval:0yE>c              	   C   s   |t j|ddd }|t j|ddd }t j|| ddd| t j|| ddd }|| }dt t j|| ddd| t j|| ddd|   }| S )NT)dimkeepdim
   )r@   meansumlog10)r8   estrefepsest_pest_v	est_sisnrr   r   r   sisnro   s   ,:zScoreModel.sisnrc                 C   sz   | j dkr5t|jd |jd }|dd d d |f }|dd d d |f }t| ||}|S t| j  d)Nr   r]   r   z loss not defined)r/   minshapesqueezer@   ra   rj   RuntimeError)r8   	wav_x_tm1wav_gtmin_lenglossr   r   r   _lossx   s   
zScoreModel._lossc                 C   s   | j  |||\}}tj|jd |jd| }	|||d | ||	|||	d d d d d f   |  }
t|}|
|| t|  }|S )Nr   device   )r(   r@   onesrl   ru   forward
randn_likesqrt)r8   XX_tMYtdtfgvec_t
mean_x_tm1zr   r   r   
euler_step   s   6
zScoreModel.euler_stepc                 C   s(  |\}}}t | j| j}t | j| j}| jdkr#t d|d }n| jdkr-|d }nt| j dt	j
|| j||jd}	| j|t	j|jd f|jd }
t	|}|||
d d d d d f   }tt|	D ]}|	| }|t|	d kr||	|d   }n|	d }||krt	  | ||||||}W d    n1 sw   Y  qk| j|||\}}t	j|jd |jd| }| |||||d d d d d f }|||d |  |  }| j|t	j|jd |jd||  |\}}| | }| | }| ||} | jd	|d
d
d |S )Nrandomr   r   lastz not definedrt   r]   rv   
train_lossTon_stepon_epoch)r   uniform	t_rsp_min	t_rsp_maxrandintN_minN_maxstop_iteration_randomrn   r@   linspacer.   ru   r(   _stdrw   rl   ry   rangelenno_gradr   rx   marginal_probto_audiorm   rs   log)r8   batch	batch_idxr{   r~   r}   reverse_start_time	N_reversestop_iteration	timestepsstdr   r|   ir   r   r   r   r   scorer   mean_gt_rp   ro   rr   r   r   r   training_step   sB   



$

".zScoreModel.training_stepc                 C   s   |dkr>| j dkr@t| | j | j| jd\}}}}| jd|ddd | jd|ddd | jd|ddd | jd	|ddd |S d S d S )
Nr   )r7   pesqFTr   si_sdrestoi
valid_loss)r0   r   r6   r7   r   )r8   r   r   r   r   r   rr   r   r   r   validation_step   s   zScoreModel.validation_stepc                 C   s(   t j|||gdd}| ||| }|S )Nr   )r^   )r@   catr'   )r8   xr   mydivide_scale	dnn_inputr   r   r   r   rx      s   zScoreModel.forwardc                    s$   | j j|i | t j|i |S )zDOverride PyTorch .to() to also transfer the EMA of the model weights)r,   tor$   rH   r>   r   r   r      s   zScoreModel.toc                 C   
   | j  S rE   )r5   train_dataloaderr8   r   r   r   r         
zScoreModel.train_dataloaderc                 C   r   rE   )r5   val_dataloaderr   r   r   r   r      r   zScoreModel.val_dataloaderc                 C   r   rE   )r5   test_dataloaderr   r   r   r   r      r   zScoreModel.test_dataloaderc                 C   s   | j j|dS )N)stage)r5   setup)r8   r   r   r   r   r      r[   zScoreModel.setupc                 C   s   |  | ||S rE   )_istft_backward_transformr8   speclengthr   r   r   r      rQ   zScoreModel.to_audioc                 C      | j |S rE   )r5   spec_fwdr8   r   r   r   r   _forward_transform      zScoreModel._forward_transformc                 C   r   rE   )r5   	spec_backr   r   r   r   r      r   zScoreModel._backward_transformc                 C   r   rE   )r5   stft)r8   sigr   r   r   _stft   r   zScoreModel._stftc                 C   s   | j ||S rE   )r5   istftr   r   r   r   r      r[   zScoreModel._istft@   r   -C6
?r   c                 C   sR   || _ || _|| _|| _|| j_d| j_d| j_|| _|| _	|| _
|	| _|
| _d S )N   T)r   r   r   r   r5   
batch_sizenum_workersr"   r/   r)   r   r6   r7   )r8   r   r   r   r   r   r/   r)   r   r6   r7   r   r   r   add_para   s   
zScoreModel.add_para)
r   r   r   r   r   r   Nr   r   r   )F)r\   rE   )
r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__staticmethodr   r%   rD   rF   rN   rP   rR   rZ   rj   rs   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r>   r   r	      s<    
(

	
2


r	   )r   r   mathr   rK   numpynpr@   pytorch_lightningpl	torch_emar   torch.nn.functionalnn
functionalFsolospeech.corrector.gecor   solospeech.corrector.geco.sdesr   'solospeech.corrector.fastgeco.backbonesr   (solospeech.corrector.geco.util.inferencer   $solospeech.corrector.geco.util.otherr   matplotlib.pyplotpyplotpltLightningModuler	   r   r   r   r   <module>   s"    