o
    iP                     @   s   d Z ddlZddlZddlmZ dZdZdZ	dddeee	fddZ
dd	deee	fd
dZdddddeee	fddZdddZdS )z_Flow-related transformation.

This code is derived from https://github.com/bayesiains/nflows.

    N)
functionalgMbP?F      ?c
                 C   sL   |d u r	t }
i }nt}
||d}|
d| |||||||	d|\}}||fS )N)tails
tail_bound)inputsunnormalized_widthsunnormalized_heightsunnormalized_derivativesinversemin_bin_widthmin_bin_heightmin_derivative )rational_quadratic_spline'unconstrained_rational_quadratic_spline)r   r   r   r	   r
   r   r   r   r   r   	spline_fnspline_kwargsoutputs	logabsdetr   r   R/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/gan_tts/vits/transform.py&piecewise_rational_quadratic_transform   s$   
	
r   linearc
                 C   s   | | k| |k@ }
|
 }t | }t | }|dkr@tj|dd}ttd|	 d }||d< ||d< | | ||< d||< ntd|t	| |
 ||
d d f ||
d d f ||
d d f || || ||||	d	\||
< ||
< ||fS )
Nr   )   r   )padr   .r   .r   z{} tails are not implemented.)r   r   r   r	   r
   leftrightbottomtopr   r   r   )
torch
zeros_likeFr   nplogexpRuntimeErrorformatr   )r   r   r   r	   r
   r   r   r   r   r   inside_interval_maskoutside_interval_maskr   r   constantr   r   r   r   3   s<   


r           c           '      C   s  t | |k st | |krtd|jd }|	| dkr!td|
| dkr+tdtj|dd}|	d|	|  |  }t j|dd}tj|dd	d
d}|| | | }||d< ||d< |ddd f |dd df  }|t	| }tj|dd}|
d|
|  |  }t j|dd}tj|dd	d
d}|| | | }||d< ||d< |ddd f |dd df  }|rt
|| d }nt
|| d }|d|d }|d|d }|d|d }|| }|d|d }|d|d }|ddd f d|d }|d|d }|r| | || d|   |||   }|| | | || d|    }| | |  }|dd| |  }|dk sGJ d| | t |  }|| | } |d|  }!||| d|  |!  }"|d||d d| |!  |d| d   }#t |#dt |"  }$| |$ fS | | | }%|%d|%  }!|||%d ||!   }&||| d|  |!  }"||&|"  } |d||%d d| |!  |d|% d   }#t |#dt |"  }$| |$fS )Nz-Input to a transform is not within its domainr   r   z2Minimal bin width too large for the number of binsz3Minimal bin height too large for the number of binsdimr   )r   r   r+   r,   )r   modevaluer   r   ..N      r   )r!   minmax
ValueErrorshaper#   softmaxcumsumr   softplus_searchsortedgatherpowallsqrtr%   )'r   r   r   r	   r
   r   r   r   r    r   r   r   num_binswidths	cumwidthsderivativesheights
cumheightsbin_idxinput_cumwidthsinput_bin_widthsinput_cumheightsdeltainput_deltainput_derivativesinput_derivatives_plus_oneinput_heightsabcdiscriminantrootr   theta_one_minus_thetadenominatorderivative_numeratorr   theta	numeratorr   r   r   r   f   s   
  



r   ư>c                 C   s*   | d  |7  < t j|d | kddd S )Nr   r1   r   r-   r   )r!   sum)bin_locationsr   epsr   r   r   r;      s   r;   )rY   )__doc__numpyr$   r!   torch.nnr   r#   DEFAULT_MIN_BIN_WIDTHDEFAULT_MIN_BIN_HEIGHTDEFAULT_MIN_DERIVATIVEr   r   r   r;   r   r   r   r   <module>   s>    	
'
8
p