o
    9i
	                     @   s   d dl mZ d dlmZ d dlZd dlZddlmZ ddl	m
Z
 deded	ejfd
dZG dd dZG dd deZG dd deZdS )    )abstractmethod)partialN   )make_beta_schedule)append_zeronum_substepsmax_stepreturnc                 C   s&   t j|d d| ddtd d d S )N   r   F)endpoint)nplinspaceastypeint)r   r    r   R/data/cameron/vidgen/generative-models/sgm/modules/diffusionmodules/discretizer.py%generate_roughly_equally_spaced_steps   s   &r   c                   @   s"   e Zd Zd	ddZedd ZdS )
DiscretizationTcpuFc                 C   s2   | j ||d}|rt|n|}|s|S t|dS )Ndevicer   )
get_sigmasr   torchflip)selfndo_append_zeror   r   sigmasr   r   r   __call__   s   zDiscretization.__call__c                 C   s   d S Nr   )r   r   r   r   r   r   r      s   zDiscretization.get_sigmasN)Tr   F)__name__
__module____qualname__r    r   r   r   r   r   r   r      s    
r   c                   @   s    e Zd Zd
ddZdddZd	S )EDMDiscretizationMb`?      T@      @c                 C   s   || _ || _|| _d S r!   )	sigma_min	sigma_maxrho)r   r)   r*   r+   r   r   r   __init__   s   
zEDMDiscretization.__init__r   c                 C   sL   t jdd||d}| jd| j  }| jd| j  }||||   | j }|S )Nr   r
   r   )r   r   r)   r+   r*   )r   r   r   rampmin_inv_rhomax_inv_rhor   r   r   r   r   "   s
   zEDMDiscretization.get_sigmasN)r&   r'   r(   r   )r"   r#   r$   r,   r   r   r   r   r   r%      s    
r%   c                       s.   e Zd Z			d	 fdd	Zd
ddZ  ZS )LegacyDDPMDiscretization_QK?~jt?  c                    sN   t    || _td|||d}d| }tj|dd| _ttj	tj
d| _d S )Nlinear)linear_start
linear_endg      ?r   )axis)dtype)superr,   num_timestepsr   r   cumprodalphas_cumprodr   r   tensorfloat32to_torch)r   r6   r7   r;   betasalphas	__class__r   r   r,   +   s   
z!LegacyDDPMDiscretization.__init__r   c                 C   sj   || j k rt|| j }| j| }n|| j kr| j}ntttjtj|d}|d| | d }t|dS )N)r9   r   r
   g      ?r   )	r;   r   r=   
ValueErrorr   r   r>   r?   r   )r   r   r   	timestepsr=   r@   r   r   r   r   r   :   s   

z#LegacyDDPMDiscretization.get_sigmas)r2   r3   r4   r0   )r"   r#   r$   r,   r   __classcell__r   r   rC   r   r1   *   s    r1   )abcr   	functoolsr   numpyr   r   modules.diffusionmodules.utilr   utilr   r   ndarrayr   r   r%   r1   r   r   r   r   <module>   s     
