a
    Ã
þd“  ã                   @   s|   d dl mZ d dlmZmZ d dlZd dlmZ d dlm  m	Z
 ddlmZ G dd„ dejƒZG dd	„ d	eƒZd
d„ ZdS )é    )Úabstractmethod)ÚAnyÚTupleNé   )ÚDiagonalGaussianDistributionc                       sJ   e Zd Z‡ fdd„Zejeejef dœdd„Ze	e
dœdd„ƒZ‡  ZS )	ÚAbstractRegularizerc                    s   t ƒ  ¡  d S ©N)ÚsuperÚ__init__©Úself©Ú	__class__© úu/var/www/html/stable-diffusion-webui/repositories/generative-models/sgm/modules/autoencoding/regularizers/__init__.pyr
      s    zAbstractRegularizer.__init__©ÚzÚreturnc                 C   s
   t ƒ ‚d S r   ©ÚNotImplementedError)r   r   r   r   r   Úforward   s    zAbstractRegularizer.forward©r   c                 C   s
   t ƒ ‚d S r   r   r   r   r   r   Úget_trainable_parameters   s    z,AbstractRegularizer.get_trainable_parameters)Ú__name__Ú
__module__Ú__qualname__r
   ÚtorchÚTensorr   Údictr   r   r   r   Ú__classcell__r   r   r   r   r      s   r   c                       sN   e Zd Zdedœ‡ fdd„Zedœdd„Zeje	eje
f dœd	d
„Z‡  ZS )ÚDiagonalGaussianRegularizerT)Úsamplec                    s   t ƒ  ¡  || _d S r   )r	   r
   r!   )r   r!   r   r   r   r
      s    
z$DiagonalGaussianRegularizer.__init__r   c                 c   s   dE d H  d S )Nr   r   r   r   r   r   r      s    z4DiagonalGaussianRegularizer.get_trainable_parametersr   c                 C   sR   t ƒ }t|ƒ}| jr| ¡ }n| ¡ }| ¡ }t |¡|jd  }||d< ||fS )Nr   Úkl_loss)r   r   r!   ÚmodeÚklr   ÚsumÚshape)r   r   ÚlogÚ	posteriorr"   r   r   r   r      s    
z#DiagonalGaussianRegularizer.forward)T)r   r   r   Úboolr
   r   r   r   r   r   r   r   r   r   r   r   r   r       s   r    c                 C   sT   t  | |¡ ¡  d|¡}| d¡}|t |d ¡  ¡   ¡ }t |dk¡}||fS )Néÿÿÿÿr   g»½×Ùß|Û=)	ÚFÚone_hotÚfloatÚreshapeÚmeanr   r'   r%   Úexp)Zpredicted_indicesZnum_centroidsÚ	encodingsZ	avg_probsÚ
perplexityZcluster_user   r   r   Úmeasure_perplexity,   s    ÿ
r3   )Úabcr   Útypingr   r   r   Útorch.nnÚnnZtorch.nn.functionalÚ
functionalr+   Ú#modules.distributions.distributionsr   ÚModuler   r    r3   r   r   r   r   Ú<module>   s   