o
    i(                     @   s   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_model)pad_specc                       s  e Zd Zedd Z			d@ fd
d	Zdd Z fddZdd Zdd Z	dA fdd	Z
dAddZdd Zdd Zdd Zdd  Zd!d" Z fd#d$ZdBd%d&Zd'd( Zd)d* Zd+d, ZdCd-d.ZdCd/d0Zd1d2 Zd3d4 Zd5d6 ZdCd7d8Z	:	dDd>d?Z  ZS )E
ScoreModelc                 C   sp   | 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 | S )Nz--lr-C6?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 term)add_argumentfloatintstr)parser r   >/home/ubuntu/.local/lib/python3.10/site-packages/geco/model.pyadd_argparse_args   s   zScoreModel.add_argparse_argsr
   r   r   r   r   r   Nc
                    s   t    t|}|di |
| _|dkr$d}|
d |
d< |
d= |
d= 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'
        bbvebbed	sigma_maxk	sigma_min)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save_hyperparametersgetdata_module)selfbackboner)   r*   r+   r/   r2   r1   r0   data_module_cls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*   )r6   	optimizerr   r   r   configure_optimizersJ   s   zScoreModel.configure_optimizersc                    s&   t  j|i | | j|   d S N)r%   optimizer_stepr-   updater,   r6   argsr9   r<   r   r   rD   N   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)r6   
checkpointr-   r   r   r   on_load_checkpointT   s
   zScoreModel.on_load_checkpointc                 C   s   | j  |d< d S )Nr-   )r-   
state_dict)r6   rK   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)r6   modeno_emaresr<   r   r   rP   _   s   zScoreModel.trainc                 C   s   | j d|dS )NF)rV   )rP   )r6   rV   r   r   r   evall      zScoreModel.evalc                 C   sb   | j dkr|| | }t| }n	| j dkr| }tdtj||jd ddd }|S )Nr   maer   r   dim)r0   r>   squareabsmeansumreshapeshape)r6   scoresigmaszerrlosseslossr   r   r   _lossp   s   

&zScoreModel._lossc                 C   s   |\}}}t j|jd |jd| jj| j  | j }t |t | jj}| j	|||\}}	t 
|}
|	d d d d d f }|||
  }| ||||}| |||
}|S )Nr   )device)r>   randrc   rk   r)   Tr/   mintensormarginal_prob
randn_likerj   )r6   batch	batch_idxxymrdmtr`   stdrf   re   perturbed_datard   ri   r   r   r   _step{   s   
*
zScoreModel._stepc                 C   s"   |  ||}| jd|ddd |S )N
train_lossTon_stepon_epoch)r{   log)r6   rr   rs   ri   r   r   r   training_step   s   zScoreModel.training_stepc                 C   s|   |  ||}| jd|ddd |dkr<| jdkr<t| | j\}}}| jd|ddd | jd|ddd | jd|ddd |S )	N
valid_lossFTr}   r   pesqsi_sdrestoi)r{   r   r1   r   )r6   rr   rs   ri   r   r   r   r   r   r   validation_step   s   zScoreModel.validation_stepc                 C   s&   t j|||gdd}| || }|S )N   r\   )r>   catr(   )r6   rt   rx   ru   rv   	dnn_inputrd   r   r   r   forward   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%   rF   r<   r   r   r      s   zScoreModel.toc	              
      s   |d u rj jn|}j  |_djid u r.tjf	|dS 	jd   	f
dd}
|
S )Neps)r)   score_fnYMY_priortimestep_typer   c               	      s   g g } }t tt  D ]9}	| |d   }| |d   }tjf||d}| \}}| | || qtj| dd} | |fS )Nr   )r)   r   r   r   y_priorr   r\   )ranger   r   r   get_pc_samplerappendr>   r   )samplesnsiy_miniy_prior_minisamplersamplen
r   r   corrector_namer9   rv   	minibatchpredictor_namer)   r6   ru   r   r   batched_sampling_fn   s   
 

z6ScoreModel.get_pc_sampler.<locals>.batched_sampling_fn)r)   Ncopyr/   r   r   rc   )r6   r   r   ru   rv   r   r   r   r   r9   r   r   r   r   r      s   
"
zScoreModel.get_pc_samplerc                 C   
   | j  S rC   )r5   train_dataloaderr6   r   r   r   r         
zScoreModel.train_dataloaderc                 C   r   rC   )r5   val_dataloaderr   r   r   r   r      r   zScoreModel.val_dataloaderc                 C   r   rC   )r5   test_dataloaderr   r   r   r   r      r   zScoreModel.test_dataloaderc                 C   s   | j j|dS )N)stage)r5   setup)r6   r   r   r   r   r      rY   zScoreModel.setupc                 C   s   |  | ||S rC   )_istft_backward_transformr6   speclengthr   r   r   to_audio   rO   zScoreModel.to_audioc                 C      | j |S rC   )r5   spec_fwdr6   r   r   r   r   _forward_transform      zScoreModel._forward_transformc                 C   r   rC   )r5   	spec_backr   r   r   r   r      r   zScoreModel._backward_transformc                 C   r   rC   )r5   stft)r6   sigr   r   r   _stft   r   zScoreModel._stftc                 C   s   | j ||S rC   )r5   istftr   r   r   r   r      rY   zScoreModel._istftpcreverse_diffusionald   r   c
                 K   s"  d}t   }|d}|   }|| }|| }t| | |	 d}t
|}t| | |	 d}t
|}|dkrY| j|||	 |	 f|||dd|
}ntd| | \}}| }| |}|| }|   }t   }|	r|| t||  }|||fS |S )zS
        One-call speech enhancement of noisy speech `y`, for convenience.
        i>  r   r   r   F)r   corrector_stepssnrintermediatez{} is not a valid sampler type!)timesizer_   maxitemr>   	unsqueezer   r   cudar   r   printformatsqueezer   cpunumpylen)r6   ru   rv   sampler_type	predictor	correctorr   r   r   timeitr9   srstartT_orignorm_factorr   r   r   r   nfex_hatendrtfr   r   r   enhance   s6   



zScoreModel.enhance)r
   r   r   r   r   r   N)F)NNNNrC   )r   r   r   r   r   r   F)__name__
__module____qualname__staticmethodr   r&   rB   rD   rL   rN   rP   rX   rj   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r<   r   r	      s>    

,




r	   )r   mathr   rI   r   npr>   pytorch_lightningpl	torch_emar   torch.nn.functionalnn
functionalFgecor   	geco.sdesr   geco.backbonesr   geco.util.inferencer   geco.util.otherr   matplotlib.pyplotpyplotpltLightningModuler	   r   r   r   r   <module>   s     