B
    s
b                 @   sv   d dl Z d dlmZ d dlZd dlZd dlZG dd dejZe	dkrre Z
ejddZe e Ze
e dS )    Nc                   s@   e Zd Zd fdd	Zdd Zdd	 ZdddZdd Z  ZS )VAEvae     c                sx   t t|   || _|| _|| _t| j| j| _t	| j| j| _
tjjt|dd| _tjjt|dd| _d S )NF)requires_grad)superr   __init__namez_dim	input_dimnetsZ	EncoderV1encoderZ	DecoderV1decodertorchnn	Parameterzerosz_prior_meanonesz_prior_var)selfr	   r   r
   )	__class__ 7/Users/wangjiarui/Desktop/Learn/CS236/HW/HW2_VAE/VAE.pyr   	   s    zVAE.__init__c       	      C   s   | j |\}}t||| j| j}tj||dd}| j|}t	
|dd}| ||}t	j|dd}t	|}t	|}|| ||fS )zD
		:param x: torch.Tensor, of shape [batch, input_dim]
		:return:
		   )
num_sampler      )dim)r   encodeprobsZKL_gaussiansr   r   sample_from_gaussian_repramr   decoder   	transposecompute_log_likelihoodmean)	r   xr$   varKL	z_samplesP_x_given_zZlog_likelihoodexpected_log_likelihoodr   r   r   negative_evidence_lower_bound   s    

z!VAE.negative_evidence_lower_boundc             C   s   | j |\}}tj||dd}t|dd}t| j| j|}t|||}| j	
|}| ||}|| | }	tj|	ddd d d d f }
|
d ttjt|	|
 dd }t| S )Nr   )r   r   r   )r   )r   r   r   r    r   r"   Zlog_gaussian_pdfr   r   r   r!   r#   maxlogr$   exp)r   r%   r$   r&   r(   Zlog_P_zZlog_q_z_given_xZP_X_given_zZlog_P_x_given_z	log_probsZlog_probs_maxZiwlbr   r   r   )negative_importance_weighting_lower_bound(   s    
z-VAE.negative_importance_weighting_lower_bound:0yE>c             C   s6   t j|t ||  d| t d| |   ddS )z
		:param P_x_given_z: torch.Tensor, of shape [num_sample, batch, input_dim]
		:param x: torch.Tensor, of shape [batch, input_dim]
		:param eps: float
		:return:
		r   )r   )r   sumr-   )r   r)   r%   epsr   r   r   r#   @   s    *zVAE.compute_log_likelihoodc             C   s>   t | jdddf | jdddf |}| j|}|d S )zI
		:param num_sample: int
		:return: of shape [num_sample, input_dim]

		Nr   )r   r    r   r   r   r!   )r   r   zsr)   r   r   r   sample_from_priorL   s    *zVAE.sample_from_prior)r   r   r   )r1   )	__name__
__module____qualname__r   r+   r0   r#   r6   __classcell__r   r   )r   r   r      s
   
r   __main__
   i  )r   torch.nnr   r   r   numpynpModuler   r7   r   randomrandnr%   
from_numpyfloatr0   r   r   r   r   <module>   s   P