o
    9i	                     @   sr   d dl mZmZ d dlZd dlmZ ddlmZmZ ddl	m
Z
 ddlmZ G dd	 d	ejZG d
d deZdS )    )DictUnionN   )append_dimsinstantiate_from_config   )DenoiserScaling)Discretizationc                
       st   e Zd Zdef fddZdejdejfddZdejdejfd	d
Zde	j
dejdejdedejf
ddZ  ZS )Denoiserscaling_configc                    s   t    t|| _d S N)super__init__r   scaling)selfr   	__class__ O/data/cameron/vidgen/generative-models/sgm/modules/diffusionmodules/denoiser.pyr      s   
zDenoiser.__init__sigmareturnc                 C      |S r   r   r   r   r   r   r   possibly_quantize_sigma      z Denoiser.possibly_quantize_sigmac_noisec                 C   r   r   r   r   r   r   r   r   possibly_quantize_c_noise   r   z"Denoiser.possibly_quantize_c_noisenetworkinputcondc                 K   sb   |  |}|j}t||j}| |\}}}	}
| |
|}
|||	 |
|fi || ||  S r   )r   shaper   ndimr   r   reshape)r   r   r   r   r    additional_model_inputssigma_shapec_skipc_outc_inr   r   r   r   forward   s   
zDenoiser.forward)__name__
__module____qualname__r   r   torchTensorr   r   nnModuler)   __classcell__r   r   r   r   r
      s    r
   c                       s   e Zd Z			ddedededededef fd	d
ZdejdejfddZ	de
ejef dejfddZdejdejfddZdejdejfddZ  ZS )DiscreteDenoiserFTr   num_idxdiscretization_configdo_append_zeroquantize_c_noiseflipc                    sB   t  | t|| _| j|||d}| d| || _|| _d S )N)r5   r7   sigmas)r   r   r   discretizationregister_bufferr6   r3   )r   r   r3   r4   r5   r6   r7   r8   r   r   r   r   +   s   	
zDiscreteDenoiser.__init__r   r   c                 C   s.   || j d d d f  }| jdd|jS )Nr   )dim)r8   absargminviewr!   )r   r   distsr   r   r   sigma_to_idx=   s   zDiscreteDenoiser.sigma_to_idxidxc                 C   s
   | j | S r   )r8   )r   rA   r   r   r   idx_to_sigmaA   s   
zDiscreteDenoiser.idx_to_sigmac                 C   s   |  | |S r   )rB   r@   r   r   r   r   r   D   s   z(DiscreteDenoiser.possibly_quantize_sigmar   c                 C   s   | j r| |S |S r   )r6   r@   r   r   r   r   r   G   s   
z*DiscreteDenoiser.possibly_quantize_c_noise)FTT)r*   r+   r,   r   intboolr   r-   r.   r@   r   rB   r   r   r1   r   r   r   r   r2   *   s*    r2   )typingr   r   r-   torch.nnr/   utilr   r   denoiser_scalingr   discretizerr	   r0   r
   r2   r   r   r   r   <module>   s    