a
    
d	                     @   sf   d dl mZmZm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 G dd dejZdS )	    )ListOptionalUnionN)
ListConfig   )append_dimsinstantiate_from_config)LPIPSc                       sF   e Zd Zdeeeee ef  d fddZdd Z	d	d
 Z
  ZS )StandardDiffusionLossl2        N)batch2model_keysc                    sf   t    |dv sJ t|| _|| _|| _|dkr@t  | _|sHg }t	|t
rX|g}t|| _d S )N)r   l1lpipsr   )super__init__r   sigma_samplertypeoffset_noise_levelr	   evalr   
isinstancestrsetr   )selfZsigma_sampler_configr   r   r   	__class__ h/var/www/html/stable-diffusion-webui/repositories/generative-models/sgm/modules/diffusionmodules/loss.pyr      s    


zStandardDiffusionLoss.__init__c                    s   | } fdd| j  D }| |jd |j}t|}	| jdkrv|	| jt	tj
|jd |jd|j  }	||	t	||j  }
|||
||fi |}t	|||j}| |||S )Nc                    s   i | ]}| | qS r   r   ).0keybatchr   r   
<dictcomp>)   s   z2StandardDiffusionLoss.__call__.<locals>.<dictcomp>r   r   )device)r   intersectionr   shapetor#   torch
randn_liker   r   randnndimwget_loss)r   networkdenoiserZconditionerinputr!   condZadditional_model_inputssigmasnoiseZnoised_inputmodel_outputr+   r   r    r   __call__'   s$    



zStandardDiffusionLoss.__call__c                 C   s   | j dkr0t||| d  |jd ddS | j dkr`t|||   |jd ddS | j dkr| ||d}|S d S )Nr      r      r   r   )r   r'   meanreshaper%   absr   )r   r3   targetr+   lossr   r   r   r,   :   s    


zStandardDiffusionLoss.get_loss)r   r   N)__name__
__module____qualname__r   r   r   r   r   r   r4   r,   __classcell__r   r   r   r   r
      s      r
   )typingr   r   r   r'   torch.nnnn	omegaconfr   utilr   r   Z%modules.autoencoding.lpips.loss.lpipsr	   Moduler
   r   r   r   r   <module>   s   