o
    GiU                     @   sx   d dl Z d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ dddZG d	d
 d
ejZG dd deZdS )    N)linen)
FrozenDict)
CLIPConfigFlaxPreTrainedModel)FlaxCLIPVisionModule-q=c                 C   sZ   t | jt jt jj| dd|dj}t |jt jt jj|dd|dj}t ||jS )N   axis)a_min)jnpdivideTcliplinalgnormmatmul)emb_1emb_2eps
norm_emb_1
norm_emb_2 r   l/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/pipelines/stable_diffusion/safety_checker_flax.pyjax_cosine_distance   s   &&r   c                   @   s6   e Zd ZU eed< ejZejed< dd Zdd Z	dS )&FlaxStableDiffusionSafetyCheckerModuleconfigdtypec                 C   s   t | jj| _tj| jjd| jd| _| 	dt
jjjd| jjf| _| 	dt
jjjd| jjf| _| 	dt
jjjd| _| 	d	t
jjjd
| _d S )NF)use_biasr   concept_embeds   special_care_embeds   concept_embeds_weights)r    special_care_embeds_weights)r"   )r   r   vision_configvision_modelnnDenseprojection_dimr   visual_projectionparamjaxinitializersonesr   r!   r#   r$   )selfr   r   r   setup!   s   z,FlaxStableDiffusionSafetyCheckerModule.setupc                 C   s   |  |d }| |}t|| j}t|| j}d}|| jd d d f  | }t|d}tj|dkddd}|d }	|| j	d d d f  |	 }
t|
d}
tj|
dkdd}|S )	Nr   g        r"   r   T)r
   keepdimsg{Gz?r	   )
r&   r*   r   r!   r   r$   r   roundanyr#   )r/   
clip_inputpooled_outputimage_embedsspecial_cos_distcos_dist
adjustmentspecial_scoresis_special_carespecial_adjustmentconcept_scoreshas_nsfw_conceptsr   r   r   __call__-   s   
z/FlaxStableDiffusionSafetyCheckerModule.__call__N)
__name__
__module____qualname__r   __annotations__r   float32r   r0   r?   r   r   r   r   r      s
   
 r   c                       s   e Zd ZeZdZeZddej	dfdede
dB dedejd	ef
 fd
dZddejde
dedefddZ	ddefddZ  ZS ) FlaxStableDiffusionSafetyCheckerr4   Nr   Tr   input_shapeseedr   _do_initc                    s>   |d u rd}| j d||d|}t j||||||d d S )N)r      rI   r"   )r   r   )rF   rG   r   rH   r   )module_classsuper__init__)r/   r   rF   rG   r   rH   kwargsmodule	__class__r   r   rL   J   s   	z)FlaxStableDiffusionSafetyChecker.__init__rngparamsreturnc           	      C   s>   t j||}t j|\}}||d}| j||d }|S )N)rR   dropoutrR   )r,   randomnormalsplitrN   init)	r/   rQ   rF   rR   r4   
params_rngdropout_rngrngsrandom_paramsr   r   r   init_weightsX   s
   
z-FlaxStableDiffusionSafetyChecker.init_weightsc                 C   s4   t |d}| jjd|p| jit j|t jdi dS )N)r      r"   r   rR   )r   )r[   )r   	transposerN   applyrR   arrayrD   )r/   r4   rR   r   r   r   r?   c   s   z)FlaxStableDiffusionSafetyChecker.__call__)N)r@   rA   rB   r   config_classmain_input_namer   rJ   r   rD   tupleintr   boolrL   r,   Arrayr   r]   dictr?   __classcell__r   r   rO   r   rE   E   s0    rE   )r   )r,   	jax.numpynumpyr   flaxr   r'   flax.core.frozen_dictr   transformersr   r   +transformers.models.clip.modeling_flax_clipr   r   Moduler   rE   r   r   r   r   <module>   s   
(