o
    9i.                     @   s  d Z ddlmZmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZmZmZ d	d
iZG dd dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )zh
    Partially ported from https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/sampling.py
    )DictUnionN)
ListConfig	OmegaConf)tqdm   )get_ancestral_steplinear_multistep_coeffto_dto_neg_log_sigmato_sigma)append_dimsdefaultinstantiate_from_configtargetz3sgm.modules.diffusionmodules.guiders.IdentityGuiderc                   @   sl   e Zd Z				ddeeeef deedf deeeedf dede	f
d	d
Z
dddZdd Zdd ZdS )BaseDiffusionSamplerNFcudadiscretization_config	num_stepsguider_configverbosedevicec                 C   s0   || _ t|| _tt|t| _|| _|| _d S N)r   r   discretizationr   DEFAULT_GUIDERguiderr   r   )selfr   r   r   r   r    r   O/data/cameron/vidgen/generative-models/sgm/modules/diffusionmodules/sampling.py__init__   s   

zBaseDiffusionSampler.__init__c                 C   sl   | j |d u r	| jn|| jd}t||}|td|d d  9 }t|}||jd g}||||||fS )N)r         ?r          @)	r   r   r   r   torchsqrtlennew_onesshape)r   xconducr   sigmas
num_sigmass_inr   r   r   prepare_sampling_loop)   s   
z*BaseDiffusionSampler.prepare_sampling_loopc                 C   s&   || j |||| }|  ||}|S r   )r   prepare_inputs)r   r'   denoisersigmar(   r)   denoisedr   r   r   denoise6   s   zBaseDiffusionSampler.denoisec                 C   s|   t |d }| jr<tddd td| jj  td| jjj  td| jjj  t||d| jj d| d	d
}|S )N   z##############################z Sampling setting z	Sampler: zDiscretization: zGuider: zSampling with z for z steps)totaldesc)ranger   print	__class____name__r   r   r   )r   r+   sigma_generatorr   r   r   get_sigma_gen;   s   z"BaseDiffusionSampler.get_sigma_gen)NNFr   NN)r9   
__module____qualname__r   r   r   r   intboolstrr   r-   r2   r;   r   r   r   r   r      s&    


r   c                   @   s   e Zd Zdd Zdd ZdS )SingleStepDiffusionSamplerc           	      O   s   t r   )NotImplementedError)	r   r0   
next_sigmar/   r'   r(   r)   argskwargsr   r   r   sampler_stepK   s   z'SingleStepDiffusionSampler.sampler_stepc                 C   s   |||  S r   r   )r   r'   ddtr   r   r   
euler_stepN   s   z%SingleStepDiffusionSampler.euler_stepN)r9   r=   r>   rG   rJ   r   r   r   r   rB   J   s    rB   c                       s>   e Zd Zddeddf fdd	ZdddZdd	d
Z  ZS )
EDMSampler        infr    c                    s.   t  j|i | || _|| _|| _|| _d S r   )superr   s_churns_tmins_tmaxs_noise)r   rO   rP   rQ   rR   rE   rF   r8   r   r   r   S   s
   
zEDMSampler.__init__Nc              
   C   s   ||d  }|dkr$t || j }	||	t|d |d  |jd   }| |||||}
t|||
}t|| |j}| |||}| ||||||||}|S )Nr    r            ?)	r"   
randn_likerR   r   ndimr2   r
   rJ   possible_correction_step)r   r0   rD   r/   r'   r(   r)   gamma	sigma_hatepsr1   rH   rI   rJ   r   r   r   rG   ]   s   $zEDMSampler.sampler_stepc              
   C   s   |  ||||\}}}}}}| |D ]3}	| j||	   kr#| jkr/n n
t| j|d  dnd}
| |||	  |||	d   |||||
}q|S )Nr3   g4y?rL   )r-   r;   rP   rQ   minrO   rG   )r   r/   r'   r(   r)   r   r,   r*   r+   irY   r   r   r   __call__m   s$    

zEDMSampler.__call__NrL   r<   )r9   r=   r>   floatr   rG   r^   __classcell__r   r   rS   r   rK   R   s
    

rK   c                       s8   e Zd Zd fdd	Zdd Zdd Zdd	d
Z  ZS )AncestralSamplerr    c                    s,   t  j|i | || _|| _dd | _d S )Nc                 S   s
   t | S r   )r"   rV   r'   r   r   r   <lambda>   s   
 z+AncestralSampler.__init__.<locals>.<lambda>)rN   r   etarR   noise_sampler)r   re   rR   rE   rF   rS   r   r   r      s   zAncestralSampler.__init__c                 C   s*   t |||}t|| |j}| |||S r   )r
   r   rW   rJ   )r   r'   r1   r0   
sigma_downrH   rI   r   r   r   ancestral_euler_step   s   z%AncestralSampler.ancestral_euler_stepc                 C   s:   t t||jdk|| || j t||j  |}|S r_   )r"   wherer   rW   rf   rR   )r   r'   r0   rD   sigma_upr   r   r   ancestral_step   s   zAncestralSampler.ancestral_stepNc           
   	   C   sX   |  ||||\}}}}}}| |D ]}	| |||	  |||	d   ||||}q|S )Nr3   r-   r;   rG   )
r   r/   r'   r(   r)   r   r,   r*   r+   r]   r   r   r   r^      s   
	zAncestralSampler.__call__)r    r    r<   )r9   r=   r>   r   rh   rk   r^   ra   r   r   rS   r   rb      s
    rb   c                       s*   e Zd Z	d fdd	ZdddZ  ZS )	LinearMultistepSampler   c                    s   t  j|i | || _d S r   )rN   r   order)r   ro   rE   rF   rS   r   r   r      s   
zLinearMultistepSampler.__init__Nc                    s   |  ||||\}}}}	}}g }
|   | |	D ]X||  }|| j||||i |}| ||}t|||}|
| t	|
| j
krP|
d td | j
  fddt D }|tdd t|t|
D  }q|S )Nr   r3   c                    s   g | ]	}t  |qS r   )r	   ).0j	cur_orderr]   
sigmas_cpur   r   
<listcomp>   s    z3LinearMultistepSampler.__call__.<locals>.<listcomp>c                 s   s    | ]	\}}|| V  qd S r   r   )rp   coeffrH   r   r   r   	<genexpr>   s    z2LinearMultistepSampler.__call__.<locals>.<genexpr>)r-   detachcpunumpyr;   r   r.   r
   appendr$   ro   popr\   r6   sumzipreversed)r   r/   r'   r(   r)   r   rF   r,   r*   r+   dsr0   r1   rH   coeffsr   rr   r   r^      s.   

"zLinearMultistepSampler.__call__)rn   r<   )r9   r=   r>   r   r^   ra   r   r   rS   r   rm      s    
rm   c                   @      e Zd Zdd ZdS )EulerEDMSamplerc	           	      C   s   |S r   r   )	r   rJ   r'   rH   rI   rD   r/   r(   r)   r   r   r   rX      s   z(EulerEDMSampler.possible_correction_stepNr9   r=   r>   rX   r   r   r   r   r          r   c                   @   r   )HeunEDMSamplerc	                 C   sb   t |dk r	|S | |||||}	t|||	}
||
 d }t t||jdk|||  |}|S )N+=r!   rL   )r"   r}   r2   r
   ri   r   rW   )r   rJ   r'   rH   rI   rD   r/   r(   r)   r1   d_newd_primer   r   r   rX      s   z'HeunEDMSampler.possible_correction_stepNr   r   r   r   r   r      r   r   c                   @   r   )EulerAncestralSamplerc           
      C   sJ   t ||| jd\}}| |||||}	| ||	||}| ||||}|S )Nre   )r   re   r2   rh   rk   )
r   r0   rD   r/   r'   r(   r)   rg   rj   r1   r   r   r   rG      s
   z"EulerAncestralSampler.sampler_stepN)r9   r=   r>   rG   r   r   r   r   r      r   r   c                   @   s&   e Zd Zdd Zdd ZdddZdS )	DPMPP2SAncestralSamplerc                 C   s6   dd ||fD \}}|| }|d|  }||||fS )Nc                 S      g | ]}t |qS r   r   rp   sr   r   r   ru          z9DPMPP2SAncestralSampler.get_variables.<locals>.<listcomp>rU   r   )r   r0   rg   tt_nexthr   r   r   r   get_variables   s   z%DPMPP2SAncestralSampler.get_variablesc           	      C   sB   t |t | }d|  }t |t | }|  }||||fS )Ng      ࿩r   expm1)	r   r   r   r   r   mult1mult2mult3mult4r   r   r   get_mult   s
   
z DPMPP2SAncestralSampler.get_multNc                    s   t ||| jd\}}	|  ||||}
|  |
||}t|dk r%| nI| ||\}}}} fdd| ||||D }|d   |d |
  }| ||t|||}|d   |d |  }t	t
| jd	k|| |  |||	  S )
Nr   r   c                       g | ]}t | jqS r   r   rW   rp   multrc   r   r   ru     s    z8DPMPP2SAncestralSampler.sampler_step.<locals>.<listcomp>r   r3   rT   r   rL   )r   re   r2   rh   r"   r}   r   r   r   ri   r   rW   rk   )r   r0   rD   r/   r'   r(   r)   rF   rg   rj   r1   x_eulerr   r   r   r   r   x2	denoised2	x_dpmpp2sr   rc   r   rG     s   
z$DPMPP2SAncestralSampler.sampler_stepr   )r9   r=   r>   r   r   rG   r   r   r   r   r      s    r   c                   @   s4   e Zd Zd
ddZdd Z	d
ddZddd	ZdS )DPMPP2MSamplerNc           	      C   sR   dd ||fD \}}|| }|d ur#|t | }|| }||||fS |d ||fS )Nc                 S   r   r   r   r   r   r   r   ru   !  r   z0DPMPP2MSampler.get_variables.<locals>.<listcomp>r   )	r   r0   rD   previous_sigmar   r   r   h_lastrr   r   r   r      s   zDPMPP2MSampler.get_variablesc           
      C   sR   t |t | }|  }|d ur%ddd|   }dd|  }	||||	fS ||fS )Nr3   rT   r   )
r   r   r   r   r   r   r   r   r   r   r   r   r   r   +  s   
zDPMPP2MSampler.get_multc	                    s   |   ||||}	| |||\}
}}} fdd| |
||||D }|d   |d |	  }|d u s;t|dk r?||	fS |d |	 |d |  }|d   |d |  }tt| jdk||  |	fS )	Nc                    r   r   r   r   rc   r   r   ru   D  s    
z/DPMPP2MSampler.sampler_step.<locals>.<listcomp>r   r3   r   rT   r   rL   )r2   r   r   r"   r}   ri   r   rW   )r   old_denoisedr   r0   rD   r/   r'   r(   r)   r1   r   r   r   r   r   
x_standard
denoised_d
x_advancedr   rc   r   rG   6  s   
zDPMPP2MSampler.sampler_stepc                 K   s~   |  ||||\}}}}	}}d }
| |	D ]'}| j|
|dkr d n|||d   |||  |||d   ||||d\}}
q|S )Nr   r3   )r)   rl   )r   r/   r'   r(   r)   r   rF   r,   r*   r+   r   r]   r   r   r   r^   X  s    
zDPMPP2MSampler.__call__r   r<   )r9   r=   r>   r   r   rG   r^   r   r   r   r   r     s    

"r   )__doc__typingr   r   r"   	omegaconfr   r   r   'modules.diffusionmodules.sampling_utilsr   r	   r
   r   r   utilr   r   r   r   r   rB   rK   rb   rm   r   r   r   r   r   r   r   r   r   <module>   s$    53(&
(