a
    AdB1                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlZd dlZdd Zdd ZdgZd	d
 Zdd Zdd ZdS )    N)sharedimages	sd_modelssd_vaesd_models_configerrors)plaintext_to_htmlc                 C   s   | d u rdS t | \}}i d|i|}d}| D ]6\}}|dtt| dtt| d d 7 }q6t|dkrd	}d
| d}d||fS )N) r	   r	   
parametersr	   z
<div>
<p><b>z</b></p>
<p>z</p>
</div>

r   zNothing found in the image.z<div><p>z	<p></div>)r   read_info_from_imageitemsr   strstriplen)imagegeninfor   infokeytextmessage r   6/var/www/html/stable-diffusion-webui/modules/extras.pyrun_pnginfo   s"    


r   c           
      C   s   dd }|dkr*||p&||p&||}n(|dkr<||}n|dkrN||}nd }|d u r^d S t j| \}}|d }	td td| td	|	 t||	 d S )
Nc                 S   s$   | rt | nd }|tjkr |S d S N)r   $find_checkpoint_config_near_filenamer   sd_default_config)xresr   r   r   config(   s    zcreate_config.<locals>.configr         z.yamlzCopying config:z   from:z     to:)ospathsplitextprintshutilcopyfile)
Zckpt_resultconfig_sourceabcr   cfgfilename_Zcheckpoint_filenamer   r   r   create_config'   s     



r/   z?cond_stage_model.transformer.text_model.embeddings.position_idsc                 C   s   |r| j tjkr|  S | S r   )dtypetorchfloathalf)tensorenabler   r   r   to_halfD   s    r6   c                 C   sH   i }| ||fD ](}t j|d }|d u r*q||j qtj|dddS )N   F)indentensure_ascii)r   checkpoints_listgetupdatemetadatajsondumps)primary_model_namesecondary_model_nametertiary_model_namer=   checkpoint_namecheckpoint_infor   r   r   read_metadataK   s    rE   c           1         s  t jjdd dd }dd }dd }d	d
 }fdd}fdd}fdd}|d |f|||f|d d fd}|| \}}}|rdnd|rdnd t j_|s|dS tj| |r|s|dS |rtj| nd |r|s|d| dS |rtj| nd d}d}|rBdt j_tdj d tj	jdd}nd }|rdt j_tdj d tj	jdd}dt j_t
| t j_t| D ]t}|tv rqd |v r||v r||t|| } ||| | ||< nt|| ||< t j jd7  _q~t j  dj dt j_tdj d tj	jdd}!td! d"t j_t
|! t j_t|! D ]}|rrd |v rr||v rr|tv rq|!| }"|| }#|"j|#jkrP|"jdd |"jd#d   |#jdd |#jd#d   krP|"jd d$kr.|#jd d%kr.td&|"jd d$krV|#jd d'krVtd(|"jd d'kr|#jd d$kr||"d d dd$d d d d f |#|!| d d dd$d d d d f< d)}n|"jd d%kr|#jd d$ksJ d*| d+|"j d,|#j ||"d d dd$d d d d f |#|!| d d dd$d d d d f< d)}n||"|#|!|< t|!| ||!|< t j jd7  _q~tj|
d }$|$d urtd-|$  d.t j_tj|$dd}%|% D ]*}d/| }&|&|!v rt|%| ||!|&< q~%|r(|s(|! D ]}t|!| ||!|< q|rbt|}'t|!D ] }t|'|r@|!|d  q@t jj pptj!}(|d0kr| n|  |rd1nd07   |rd2nd07   d3| 7  t"j#$|( })t j  d4t j_td5|) d i }*|r,|r,r|*%j& r|*%j& r,|*%j& |rz|*%t'(| W n2 t)yx }+ zt*+|+d6 W Y d }+~+n
d }+~+0 0 d7|*d8< |r|rd9j,rj,nd rj,nd ||||	|
|||d:},i fd;d<}-|- r|- r|- t'-|,|*d=< t'-|*d>< t"j#.|)\}.}/|// d?kr\t0jj1|!|)t
|*dkrR|*nd d@ nt2|!|) t3  t4 fdAdBtj5 D d }0|0r|06  t7|)|	 tdC|) d3 dDt j_t j8  g dEdF t9d$D dC|) S )GNzmodel-merge)jobc                 S   s,   | t j_t j  g dd tdD | S )Nc                 S   s   g | ]}t  qS r   )grr<   .0r.   r   r   r   
<listcomp>^       z1run_modelmerger.<locals>.fail.<locals>.<listcomp>r7   )r   statetextinfoendrange)r   r   r   r   fail[   s    
zrun_modelmerger.<locals>.failc                 S   s   d| |  ||  S )Nr    r   )theta0theta1alphar   r   r   weighted_sum`   s    z%run_modelmerger.<locals>.weighted_sumc                 S   s   | | S r   r   )rR   theta2r   r   r   get_differencec   s    z'run_modelmerger.<locals>.get_differencec                 S   s   | ||  S r   r   )rQ   Ztheta1_2_diffrS   r   r   r   add_differencef   s    z'run_modelmerger.<locals>.add_differencec                     s@   j } j }td  d}t d}| d|  d| d| dS )Nr    r!   (z) + )
model_nameround)r)   r*   ZMaMb)
multiplierprimary_model_infosecondary_model_infor   r   filename_weighted_sumi   s
    
z.run_modelmerger.<locals>.filename_weighted_sumc                     s8   j } j }j }t d}|  d| d| d| dS )Nr!   z + rX   z - rY   rZ   )r)   r*   r+   M)r^   r_   r`   tertiary_model_infor   r   filename_add_differenceq   s
    
z0run_modelmerger.<locals>.filename_add_differencec                      s    j S r   )r[   r   )r_   r   r   filename_nothingy   s    z)run_modelmerger.<locals>.filename_nothing)zWeighted sumzAdd differencezNo interpolationr    r   z)Failed: Merging requires a primary model.z+Failed: Merging requires a secondary model.zFailed: Interpolation method (z) requires a tertiary model.Fz	Loading BzLoading z...cpu)map_locationz	Loading CzMerging B and Cmodelz
Merging...zMerging A and Br!   r7   	   zPWhen merging inpainting model with a normal one, A must be the inpainting model.   z\When merging instruct-pix2pix model with a normal one, A must be the instruct-pix2pix model.Tz Bad dimensions for merged layer z: A=z, B=zBaking in VAE from zBaking in VAEzfirst_stage_model.r	   z.inpaintingz.instruct-pix2pix.ZSavingz
Saving to zreadin metadata from jsonptformatwebui)typeZprimary_model_hashZsecondary_model_hashZtertiary_model_hashinterp_methodr^   save_as_halfcustom_namer(   bake_in_vaediscard_weightsZis_inpaintingZis_instruct_pix2pixc                    s@   |    | j| j| jdd d | j<  | jdi  d S )Nsd_merge_recipe)nameZlegacy_hashru   sd_merge_models)calculate_shorthashrv   hashr=   r;   sha256r<   )rD   )rw   r   r   add_model_metadata&  s    z+run_modelmerger.<locals>.add_model_metadataru   rw   z.safetensors)r=   c                 3   s   | ]}|j  kr|V  qd S r   )rv   )rI   ckpt)r-   r   r   	<genexpr>@  rK   z"run_modelmerger.<locals>.<genexpr>zCheckpoint saved to zCheckpoint savedc                 S   s   g | ]}t jjt d qS ))choices)rG   Dropdownr<   r   checkpoint_tilesrH   r   r   r   rJ   J  rK   z#run_modelmerger.<locals>.<listcomp>):r   rL   begin	job_countr   r:   rM   r%   r-   read_state_dictr   keyssampling_stepstqdmcheckpoint_dict_skip_on_merger;   r1   
zeros_likesampling_stepnextjobshapeRuntimeErrorr6   r   vae_dictload_vae_dictrecompilelistsearchpopcmd_optsckpt_dir
model_pathr"   r#   joinr<   r=   r>   loads	Exceptionr   displayrz   r?   r$   lowersafetensors	save_filesavelist_modelsnextvaluesrx   r/   rN   rO   )1id_taskr@   rA   rB   rp   r^   rq   rr   checkpoint_formatr(   rs   rt   save_metadataadd_merge_recipecopy_metadata_fieldsmetadata_jsonrP   rT   rV   rW   ra   rd   re   Ztheta_funcsZfilename_generatorZtheta_func1Ztheta_func2Zresult_is_inpainting_modelZ result_is_instruct_pix2pix_modelZtheta_1Ztheta_2r   t2Ztheta_0r)   r*   Zbake_in_vae_filenamer   Ztheta_0_keyregexr   Zoutput_modelnamer=   eZmerge_reciper{   r.   	extensionZcreated_modelr   )r-   r^   r_   rw   r`   rc   r   run_modelmergerX   s0   





H   H>H



"
&
r   )r"   r   r&   r>   r1   r   modulesr   r   r   r   r   r   modules.ui_commonr   gradiorG   safetensors.torchr   r   r/   r   r6   rE   r   r   r   r   r   <module>   s    