a
    Ad                     @   s^   d dl Zd dlmZmZmZmZmZ d dlm	Z	 d dl
mZ dd Zdd ZG d	d
 d
ZdS )    N)	sd_modelssd_vaeerrorsextras
call_queue)FormRow)create_refresh_buttonc                 C   s*   d}| d| d| dd}||  S )Nz&<p style='margin-bottom: 2.5em'>{}</p>zbNo interpolation will be used. Requires one model; A. Allows for format conversion and VAE baking.z|A weighted sum will be used for interpolation. Requires two models; A and B. The result is calculated as A * (1 - M) + B * MzThe difference between the last two models will be added to the first. Requires three models; A, B and C. The result is calculated as A + (B - C) * MzNo interpolationWeighted sumzAdd difference)format)valueZinterp_description_cssZinterp_descriptions r   D/var/www/html/stable-diffusion-webui/modules/ui_checkpoint_merger.pyupdate_interp_description	   s    r   c               
   G   sn   zt j|  }W nZ tyh } zBtjddd t  g dd tdD d| W  Y d }~S d }~0 0 |S )NzError loading/saving model fileT)exc_infoc                 S   s   g | ]}t jjt d qS ))choices)grDropdownupdater   checkpoint_tiles.0_r   r   r   
<listcomp>       zmodelmerger.<locals>.<listcomp>   zError merging checkpoints: )r   Zrun_modelmerger	Exceptionr   reportr   list_modelsrange)argsresultser   r   r   modelmerger   s    6r#   c                   @   s   e Zd Zdd Zdd ZdS )UiCheckpointMergerc                 C   s  t jdd^}t jdd. t jdd t jtddd| _td	d
 t jt	
 ddd| _t| jt	jdd d t jt	
 ddd| _t| jt	jdd d t jt	
 ddd| _t| jt	jdd d W d    n1 s0    Y  t jddd| _t jddddd d!d"| _t jg d#dd$d%d&| _| jjt| jg| jgd' t : t jd(d)gd)d*d+d&| _t jdd,d-d.| _W d    n1 s0    Y  t  t  * t jg d/d0d1d2d3d4| _W d    n1 s0    Y  t  n t F t jd5gttj d5d6d7d&| _t| jtjd8d d9 W d    n1 sH0    Y  W d    n1 sh0    Y  W d    n1 s0    Y  t " t jd:d;d<d.| _ W d    n1 s0    Y  t j!d=dd>}t F t jd?d@dAd.| _"t jd?dBdCd.| _#t jd?dDdEd.| _$W d    n1 s00    Y  t j%dFdGdH| _&t 'dI| _(W d    n1 sl0    Y  t " t j'dJdKdLdM| _)W d    n1 s0    Y  W d    n1 s0    Y  t jddNdON t j*dPd
  t jdQddR| _+W d    n1 s0    Y  W d    n1 s40    Y  W d    n1 sT0    Y  W d    n1 st0    Y  || _,|| _-d S )SNF)analytics_enabled)equal_heightcompact)variantr
   Zmodelmerger_interp_description)r   elem_idZmodelmerger_models)r)   Zmodelmerger_primary_model_namezPrimary model (A))r)   labelc                   S   s   dt  iS Nr   r   r   r   r   r   r   <lambda>&   r   z-UiCheckpointMerger.__init__.<locals>.<lambda>Zrefresh_checkpoint_AZ modelmerger_secondary_model_namezSecondary model (B)c                   S   s   dt  iS r+   r,   r   r   r   r   r-   )   r   Zrefresh_checkpoint_BZmodelmerger_tertiary_model_namezTertiary model (C)c                   S   s   dt  iS r+   r,   r   r   r   r   r-   ,   r   Zrefresh_checkpoint_CzCustom Name (Optional)Zmodelmerger_custom_name)r*   r)   g        g      ?g?z(Multiplier (M) - set to 0 to get model Ag333333?Zmodelmerger_interp_amount)minimummaximumstepr*   r   r)   r	   zInterpolation MethodZmodelmerger_interp_method)r   r   r*   r)   fninputsoutputsckptsafetensorszCheckpoint formatZmodelmerger_checkpoint_formatzSave as float16Zmodelmerger_save_as_half)r   r*   r)   )	A, B or CBCzDon'tr7   zCopy config fromindexZmodelmerger_config_method)r   r   r*   typer)   NonezBake in VAEZmodelmerger_bake_in_vaec                   S   s   ddgt tj iS )Nr   r<   )listr   vae_dictr   r   r   r   r-   >   r   Zmodelmerger_refresh_bake_in_vae z"Discard weights with matching nameZmodelmerger_discard_weightsMetadata)openTzSave metadataZmodelmerger_save_metadatazAdd merge recipe metadataZmodelmerger_add_recipez Copy metadata from merged modelsZmodelmerger_copy_metadataz{}zMetadata in JSON format)r*   z'Read metadata from selected checkpointsmodelmerger_mergeMergeprimary)r)   r   r(   Zmodelmerger_results_container)r(   r)   Zmodelmerger_results_panelmodelmerger_result)r)   
show_label).r   BlocksRowColumnHTMLr   interp_descriptionr   r   r   r   primary_model_namer   r   secondary_model_nametertiary_model_nameTextboxcustom_nameSliderinterp_amountRadiointerp_methodchangecheckpoint_formatCheckboxsave_as_halfconfig_sourcer=   r   r>   bake_in_vaerefresh_vae_listdiscard_weights	Accordionsave_metadataadd_merge_recipecopy_metadata_fieldsTextAreametadata_jsonButtonread_metadatarB   GrouprE   metadata_editorblocks)selfZmodelmerger_interfacerf   r   r   r   __init__   sR    42
:
 v22,RzUiCheckpointMerger.__init__c                 C   s   | j jdd | j g| jgdd | jjtj| j| j| jg| j	gd | j
jdd g | jgd | j
jtjtdd d	d
|| j| j| j| j| j| j| j| j | j| j| j| j| j| j| j	g| j| j| j|| jgd t| jj| j_d S )Nc                 S   s   t j| dkdS )Nr6   )visibler   r   )fmtr   r   r   r-   W   r   z-UiCheckpointMerger.setup_ui.<locals>.<lambda>F)r3   r4   show_progress)r3   r4   c                   S   s   dS )Nr?   r   r   r   r   r   r-   [   r   r1   c                   S   s   dd t dD S )Nc                 S   s   g | ]}t  qS r   rk   r   r   r   r   r   ]   r   zAUiCheckpointMerger.setup_ui.<locals>.<lambda>.<locals>.<listcomp>r   )r   r   r   r   r   r-   ]   r   )extra_outputsr#   )r2   _jsr3   r4   )rV   rU   rf   rd   clickr   rL   rM   rN   rb   rB   rE   r   wrap_gradio_gpu_callr#   rT   rR   rX   rP   rY   rZ   r\   r^   r_   r`   r   r   rK   )rh   dummy_componentsd_model_checkpoint_componentr   r   r   setup_uiV   s>     $zUiCheckpointMerger.setup_uiN)__name__
__module____qualname__ri   rt   r   r   r   r   r$      s   8r$   )gradior   modulesr   r   r   r   r   modules.ui_componentsr   modules.ui_commonr   r   r#   r$   r   r   r   r   <module>   s   

