o
    }oi~$                     @   s   d dl Zd dlZd dlmZ d dlmZ d dlmZmZ d dl	m
Z
 dd Zdd
dZdddZG dd dejjZG dd deZG dd deZdS )    N)	rearrange)tqdm)	batch_div	batch_mul) GaussianDiffusionContinuousTimesc                 C   s2   | j |j  }|dkr|S |jg |jd| R  S )Nr      )ndimviewshape)xtpadding_dims r   n/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/multimodal/modules/imagen/sampler/sampler.pyright_pad_dims_to   s   r   dynamicףp=
?c                 C   s   |d u r| S |dkr|  ddS |dkrI| j}|tjtjfvr#|  } tjt| d |dd}|jdd t	| |}|  | || } | 
|S td	| d
)Nstaticg            ?r   zb ... -> b (...))dim)minzThresholding method: z not supported.)clampdtypetorchfloatdoublequantiler   absclamp_r   typeRuntimeError)x0methodthoriginal_dtypesr   r   r   thresholding_x0   s   

r(   c                 C   s*   | t || }t||}t| | |}|S N)r   r(   r   )r   r   dthresholding_methodr#   corrected_x0corrected_dr   r   r   thresholding_derivative2   s   
r.   c                       s&   e Zd Z fddZdddZ  ZS )Samplerc                    s   t    d S r)   )super__init__)self	__class__r   r   r1   :   s   zSampler.__init__Nc                 C   s   d S r)   r   )r2   modelmodel_kwargsr   zr   r   r   forward=   s   zSampler.forwardr)   )__name__
__module____qualname__r1   r8   __classcell__r   r   r3   r   r/   9   s    r/   c                       sN   e Zd Z fddZ	dddZe 	ddd	Z				dd
dZ  Z	S )DDPMSamplerc                    s    t    || _|| _d| _d S )Nnoise)r0   r1   	unet_typenoise_schedulerpred_objective)r2   r?   denoiserr3   r   r   r1   B   s   

zDDPMSampler.__init__Nr   r   c
                 C   s   | j dkr|j|||||d}
n| j dkr |j||||||d}
| jdkr/| jj|||
d}n| jdkr7|
}n| jdkrF| jj|||
d	}ntd
| j t||	d}| jj||||d}||fS )Nbaser   time
text_embed	text_mask
cond_scalesr)r   	x_low_resrE   rF   rG   rH   r>   )r   r>   x_startv)r   rL   zunknown objective )r$   )rK   x_tr   t_next)	r?   forward_with_cond_scalerA   r@   predict_start_from_noisepredict_start_from_v
ValueErrorr(   q_posterior)r2   unetr   r   rN   text_embedsrG   rJ   rH   r+   predrK   mean_and_variancer   r   r   p_mean_varianceH   s$   





zDDPMSampler.p_mean_variancec
                 C   s   | j |||||||||	d	\\}
}}}t|}|jd }t| jtr'|dkn|dk}d|| j|gdt	|jd  R  }|
|d| 
  |  }||fS )N	rT   r   r   rN   rU   rG   rH   rJ   r+   r   r   r         ?)rX   r   
randn_liker   
isinstancer@   r   type_asreshapelenexp)r2   rT   r   r   rN   rU   rG   rJ   rH   r+   
model_mean_model_log_variancerK   r>   bis_last_sampling_timestepnonzero_maskrV   r   r   r   p_sampleb   s$   

*zDDPMSampler.p_samplec	                 C   s   |j d }	|j}
|j}| jj}|r|| j_| jj|	|
d}|}t|t|dD ]&\}}| j||	||	||	|||||d urF|	|nd |d	\}}q'|| j_|S )Nr   devicetotalrY   )
r   ri   r   r@   num_timestepsget_sampling_timestepsr   r_   rg   r!   )r2   r5   	noise_maptext_encodingrG   rJ   rH   sampling_stepsr+   batchri   r   original_steps	timestepsimgtimes
times_nextrK   r   r   r   r8   {   s,   
zDDPMSampler.forward)Nr   r   Nr   Nr   )
r9   r:   r;   r1   rX   r   no_gradrg   r8   r<   r   r   r3   r   r=   A   s    
r=   c                       sD   e Zd Zddddddeddf fdd		Z	
		
	dddZ  ZS )
EDMSampler2   gMb`?P      r   infr   c
           
         sD   t    || _|| _|| _|| _|| _|| _|| _|	| _	|| _
d S r)   )r0   r1   r?   	sigma_min	sigma_maxrhoS_churnS_minS_maxS_noise	num_steps)
r2   r?   r   r~   r   r   r   r   r   r   r3   r   r   r1      s   

zEDMSampler.__init__Nr   r   c	              	   C   sv  | j dkr|d u sJ n| j dkr|d usJ |d urd|ini }	d}| j}
| j}td|
 d| d|  |r:|n| j}tj||jd}|d	| j  ||d	  |
d	| j  |d	| j     | j }t	|t
|d d	 g}||d
  }ttt|d d |d	d  t|d d dD ]\}\}}|}| j|  kr| jkrn nt| j| tdd	 nd
}|||  |j}||d |d   | j t|  }|jd|tj|tj|||d|	}|| | }t||||d}||| |  }||d	 k r8|jd|tj|tj|||d|	}|| | }t||||d}||| d| d|    }q|S )NrC   rI   rJ   r   zSampling with sigma in [z, z], cfg=rh   r   r   r   rj      rD   )r+   rZ   r   )r?   r~   r   printr   r   arangeri   r   cat
zeros_liker   	enumeratezipr_   r   r   r   r   npsqrttor   r[   rO   float32r.   )r2   rT   rn   ro   rG   rJ   rH   rp   r+   low_res_condr~   r   r   step_indicest_stepsx_nextit_currN   x_curgammat_hatx_hatdenoisedd_curd_primer   r   r   r8      sh   

&*:(



zEDMSampler.forwardrw   )r9   r:   r;   r   r1   r8   r<   r   r   r3   r   ry      s    ry   )r   r   )r   )numpyr   r   einopsr   r   <nemo.collections.multimodal.modules.imagen.sampler.batch_opsr   r   Bnemo.collections.multimodal.modules.imagen.sampler.continuous_ddpmr   r   r(   r.   nnModuler/   r=   ry   r   r   r   r   <module>   s   

]