a
    dD                  
   @   s.  d dl mZ d dlZd dlmZ d dlmZ d dlZd dl	m
Z
 ddlmZmZmZmZ ddlmZmZmZmZ z<d d	lmZmZmZmZmZmZmZmZ eed
dZdZW n4 e y Z! zddd
dZdZW Y dZ![!n
dZ![!0 0 e
G dd deZ"de#eej$ dddZ%G dd dej&Z'dddZ(dS )    )OptionalN)nn)
functional)	dataclass   )LayerNormFp32	LayerNorm	QuickGELUMultimodalTransformer)CLIPTextCfgCLIPVisionCfg_build_vision_tower_build_text_tower)BeamSearchScorerLogitsProcessorListTopPLogitsWarperTopKLogitsWarper RepetitionPenaltyLogitsProcessorMinLengthLogitsProcessorMaxLengthCriteriaStoppingCriteriaListbeam_search)top_ktop_pr   TFc                   @   sJ   e Zd ZU dZeed< dZeed< dZeed< dZeed< dZ	eed	< d
S )MultimodalCfg   	mlp_ratio@   dim_head   heads   	n_queriesattn_pooler_headsN)
__name__
__module____qualname__r   int__annotations__r   r    r"   r#    r)   r)   ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/open_clip/coca_model.pyr   ,   s
   
r   )
quick_gelu
cast_dtypec              
   C   sh   t |trtf i |n|}|r$tntj}|tjtjfv r>t	nt
}t|j|j|j|j|j| ||d}|S )N)context_lengthwidthr    layersls_init_valueZ
output_dim	act_layer
norm_layer)
isinstancedictr   r	   r   ZGELUtorchfloat16Zbfloat16r   r   r
   r-   r.   r    r/   r0   )	embed_dimmultimodal_cfgr+   r,   r1   r2   decoderr)   r)   r*   _build_text_decoder_tower5   s    r:   c                       s   e Zd Zd!eeeeeej	 e
d fddZejjd"dd	Zd#d
dZd$ddZd%ddZd&ddZd'ddZd(ddZd)dd Z  ZS )*CoCaFNr   )r8   text_cfg
vision_cfgr+   r,   pad_idc           	         s   t    t|tr"tf i |n|}t|tr>tf i |n|}t|trZtf i |n|}t||||d| _t	|dr|j
d ur|jn|j}t||||d| _t||||d| _ttg td | _|| _d S )N)r7   r<   r+   r,   hf_model_name)r7   r=   r+   r,   )r8   r+   r,   g$I$I,@)super__init__r3   r4   r   r   r   r   texthasattrr?   
vocab_sizer   visualr:   text_decoderr   	Parameterr5   onesnploglogit_scaler>   )	selfr7   r8   r<   r=   r+   r,   r>   rD   	__class__r)   r*   rA   P   s<    

	zCoCa.__init__Tc                 C   s(   | j | | j| | j| d S )N)rE   set_grad_checkpointingrB   rF   )rL   enabler)   r)   r*   rO   }   s    zCoCa.set_grad_checkpointingc                 C   s,   |  |\}}|r tj|ddn|}||fS Ndim)rE   F	normalize)rL   imagesrV   image_latentZtokens_embsr)   r)   r*   _encode_image   s    zCoCa._encode_imagec                 C   sH   |r|d d d df n|}|  |\}}|r<tj|ddn|}||fS rQ   )rB   rU   rV   )rL   rB   rV   	embed_clstext_latentZ	token_embr)   r)   r*   _encode_text   s    zCoCa._encode_textc                 C   s   | j ||d\}}|S )N)rV   )rY   )rL   rW   rV   rX   _r)   r)   r*   encode_image   s    zCoCa.encode_imagec                 C   s   | j |||d\}}|S )N)rV   rZ   )r\   )rL   rB   rV   rZ   r[   r]   r)   r)   r*   encode_text   s    zCoCa.encode_textc           
      C   sn   | j ||d\}}|d u s"|d u r0| |\}}|d d |jd  d f }| ||}	|||	|| j dS )N)rZ   r   )Zimage_featuresZtext_featureslogitslabelsrK   )r\   rY   shaperF   rK   exp)
rL   imagerB   rZ   rX   
image_embsr[   Z
token_embsra   r`   r)   r)   r*   forward   s    zCoCa.forward   M         ?r   皙?r            c           "      C   s  t sJ d||ksJ dt x |d u r4dn|}|
d u rDdn|
}
|	d u rV| jn|	}	tt||
t|g}|d u rt|dg}t|}|j	}|dkr&| j
||	|
||||||d	}|r|jd |k rtj|tj|jd	 ||jd  ||jd
| j fddW  d    S |W  d    S |dkr>t| |}n>|dkrVt| |}n&tdddtt  d  d| |\}}|d u rtj|jd	 df|tjd
| }| j}t|j}|dkr|d d d f }|jd }|   |}|d d | d f }|jd }| ||||ddd d d df }|d d df |
k|d d df |	kB }tj|jd	 df|tjd
|	 }| r|s@qnn|| d d f }||| d d f |} ||| d d f | } tj| | dd}!|d |kr&tjt| df|tjd
|
 || d d f< nt|!d|| d d f< tj||fdd}|d7 }||d rqnq|dkr|d	}| | |W  d    S 1 s0    Y  d S )NzSPlease install transformers for generate functionality. `pip install transformers`.z'seq_len must be larger than min_seq_leni  i  )
max_lengthr   )	image_inputspad_token_ideos_token_idsot_token_id	num_beamsnum_beam_groupsmin_seq_lenstopping_criterialogit_processorr   r   devicedtyperS   r   r   z!generation_type has to be one of z| z | z |.F)rX   re   rZ   r`   rR   ) _has_transformersr5   Zno_gradr>   r   r   r   r   r   ry   _generate_beamsearchrb   catrH   rz   GENERATION_TYPES
ValueErrorjoinlistkeysrY   longZtraininglenevalallrU   ZsoftmaxsumZmultinomialZsqueezeZtrain)"rL   rd   rB   Zseq_lenZmax_seq_lenZtemperatureZgeneration_typer   r   rp   rq   rr   rs   rt   ru   rv   Zrepetition_penaltyZfixed_output_lengthrw   ry   outputlogit_warperrX   re   Zwas_trainingZnum_dimscur_lenoutxr`   masksampleZfiltered_logitsZprobsr)   r)   r*   generate   s    
,


 



"( 
0


zCoCa.generatec           -   
      s  |j }|jd }tj|dd}| |\}}tj| df|tjd}|| }t|||d}|	d u rztt	||dgn|	}t
|j}|j|j}| }|j\}}d }| |krtd|  d| d	tj|fd
tj|d}d|d d d d |f< || f}tj| |j|d}tj| tj|d}t||d}| |d |d d||d}t|D ]}|| }t|| }|| }g }t|D ]& | fddt||D  q|| } |d |dd d f }!|!jd }"|| |!||d}#|#|| d }$|$|#}$|$|||" }$tj|$d| dddd\}$}%tj|%|"dd}&|%|" }%|d urlt|dnd }'|j| |$|%|&|||'d}(|(d ||< |(d })|(d }*| |* ||< tj| |*d d f |)dgdd} | d d df ||< tj|*|dd | |*|  ||< qhtj||dgdd}|d }|jsL||d rqLq|d ur`t|dnd }+|j |||%|&|||j!|+d },|,d! S )"Nr   rS   r   rx   )
batch_sizers   ry   rt   )rq   z)Batch dimension of `input_ids` should be z	, but is r{   g    e)rz   ry   )	input_idsro   rW   rB   F)rZ   rX   re   c                    s   g | ]}  | qS r)   r)   ).0idxZ	batch_idxrs   r)   r*   
<listcomp>q      z-CoCa._generate_beamsearch.<locals>.<listcomp>r`   rR   )current_tokensbeam_group_idx   T)rT   Zlargestsortedfloor)Zrounding_moder)   )rp   rq   beam_indicesZnext_beam_scoresZnext_beam_tokensZnext_beam_indices)rp   rq   rn   r   	sequences)"ry   rb   r5   Zrepeat_interleaverY   rH   r   r   r   r   r   Z
_beam_hypsrs   rt   r   fullfloatviewzerosrz   prepare_inputs_for_generationrangeminextend	unsqueezeZ	expand_asZtopkdivr   processr~   Zis_donefinalizern   )-rL   ro   rp   rq   rr   rs   rt   ru   rv   rw   r   ry   r   rX   re   r   Zbeam_scorerZlogits_processorZnum_sub_beamsZbatch_beam_sizer   r   Zbeam_scoresr   Zreordering_indicesZmodel_inputsoutputsr   Zgroup_start_idxZgroup_end_idxZ
group_sizeZbatch_group_indicesZgroup_input_idsZnext_token_logitsrD   Znext_token_scores_processedZnext_token_scoresZnext_tokensZnext_indicesZprocess_beam_indicesZbeam_outputsZbeam_next_tokensZbeam_idxZfinal_beam_indicesZsequence_outputsr)   r   r*   r}   "  s    
	




	$

zCoCa._generate_beamsearch)FNr   )T)T)TT)T)TT)TNN)Nrg   rh   ri   r   rj   r   NNNrk   rl   rm   Nri   F)	NNNrk   rl   rm   NNN)r$   r%   r&   r   r   r   boolr   r5   rz   r'   rA   ZjitignorerO   rY   r\   r^   r_   rf   r   r}   __classcell__r)   r)   rM   r*   r;   O   sZ      -




                
~         r;   c                 K   sz   |r| d d df  d} |dd }|dd }|d urf|d u rf| dd }||dkd nd }| ||||dS )NrR   attention_maskposition_idsr   r   )rB   rW   Zpast_key_valuesr   r   )r   getr   ZcumsumZmasked_fill_)r   ro   Zpastkwargsr   r   r)   r)   r*   r     s    r   )FN)N))typingr   r5   r   Ztorch.nnr   rU   numpyrI   Zdataclassesr   Ztransformerr   r   r	   r
   modelr   r   r   r   Ztransformersr   r   r   r   r   r   r   r   r   r|   ImportErrorer   r   rz   r:   Moduler;   r   r)   r)   r)   r*   <module>   s@   (    j