o
    ´‹
j»  ã                   @   st   d dl Z d dlZd dlZd dlm  mZ d dlm	Z	 ddd„Z
ddd„Zd	d
„ Zddd„Zddd„Zddd„ZdS )é    N)ÚNormalç      Àc                 C   s¨   |   ¡ dksJ ‚|  d¡dksJ ‚| d d …d d …d d…f }tj| d d …d d …dd …f |d}dt dtj ¡ d|  t || d¡t d| ¡   }| 	¡  
¡ S )Né   é   é   ©Úming      à¿ç       @g       À)ÚdimÚsizeÚtorchÚclampÚmathÚlogÚpiÚpowÚexpÚsqueezeÚmean)Úy_hatÚyÚlog_std_minr   Úlog_stdÚ	log_probs© r   úQ/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/utils/distribution.pyÚgaussian_loss	   s   $<r   ç      ð?c                 C   sˆ   |   d¡dks	J ‚| d d …d d …d d…f }tj| d d …d d …dd …f |d}t|t |¡ƒ}| ¡ }tjtj|| d|d}~|S )Nr   r   r   ©Úmax)r   r   r   r   r   Úsample)r   r   Úscale_factorr   r   Údistr    r   r   r   Úsample_from_gaussian   s   $þr#   c                 C   sX   t |  ¡ ƒd }tj| |d\}}tj| |dd\}}|t tjt | | ¡|d¡ S )zDnumerically stable log_sum_exp implementation that prevents overflowr   ©r
   T)r
   Úkeepdim)Úlenr   r   r   r   Úsumr   )ÚxÚaxisÚmÚ_Úm2r   r   r   Úlog_sum_exp!   s   "r-   é   Tc                 C   s  |d u rt t d¡ƒ}|  ddd¡} |  ¡ dksJ ‚|  d¡d dks%J ‚|  d¡d }|  dd¡} | d d …d d …d |…f }| d d …d d …|d| …f }tj| d d …d d …d| d| …f |d}| 	|¡}|| }	t 
| ¡}
|
|	d|d    }t |¡}|
|	d|d    }t |¡}|t |¡ }t |¡ }|| }|
|	 }|| dt |¡  }|d	k  ¡ }|t tj|d
d¡ d| |t |d d ¡   }|dk  ¡ }|| d| |  }|dk   ¡ }|| d| |  }|t |d¡ }|rt t|ƒ¡ S t|ƒ d¡ S )Nç›+¡†›„=r   r   r   r   r   r   r	   çñhãˆµøä>gê-™—q=g+‡ÙÎ÷ï?g+‡ÙÎ÷ï¿éÿÿÿÿ)ÚfloatÚnpr   Úpermuter
   r   Ú	transposer   r   Ú	expand_asr   ÚsigmoidÚFÚsoftplusÚlog_softmaxr   r-   Ú	unsqueeze)r   r   Únum_classesÚlog_scale_minÚreduceÚnr_mixÚlogit_probsÚmeansÚ
log_scalesÚ
centered_yÚinv_stdvÚplus_inÚcdf_plusÚmin_inÚcdf_minÚlog_cdf_plusÚlog_one_minus_cdf_minÚ	cdf_deltaÚmid_inÚlog_pdf_midÚinner_inner_condÚinner_inner_outÚ
inner_condÚ	inner_outÚcondr   r   r   r   Údiscretized_mix_logistic_loss+   sD   ,


ÿrS   c                 C   sj  |du rt t d¡ƒ}|  d¡d dksJ ‚|  d¡d }|  dd¡} | dd…dd…d|…f }|j | ¡ ¡ dd¡}|jt t |¡ ¡ }|j	d	d
\}}t
||ƒ}tj| dd…dd…|d| …f | d	d
}tjtj| dd…dd…d| d| …f | d	d
|d}	|j | ¡ ¡ dd¡}
|t |	¡t |
¡t d|
 ¡   }tjtj|dddd}|S )zã
    Sample from discretized mixture of logistic distributions
    Args:
        y (Tensor): :math:`[B, C, T]`
        log_scale_min (float): Log scale minimum value
    Returns:
        Tensor: sample in range of [-1, 1].
    Nr/   r   r   r   r   r0   gwJëÿï?r1   r$   r   r   g      ð¿r   )r2   r3   r   r   r5   ÚdataÚnewÚuniform_r   r   Ú
to_one_hotr'   r   r   )r   r=   r?   r@   Útempr+   ÚargmaxÚone_hotrA   rB   Úur(   r   r   r   Ú$sample_from_discretized_mix_logisticp   s    	
,:&r\   c                 C   s>   t  |  ¡ |f ¡ ¡  | ¡}| t|  ¡ ƒ|  d¡|¡ |S )Nr1   )r   ÚFloatTensorr   Úzero_Útype_asÚscatter_r&   r;   )ÚtensorÚnÚ	fill_withrZ   r   r   r   rW   –   s   rW   )r   )r   r   )r.   NT)N)r   )r   Únumpyr3   r   Útorch.nn.functionalÚnnÚ
functionalr8   Útorch.distributions.normalr   r   r#   r-   rS   r\   rW   r   r   r   r   Ú<module>   s    





E&