o
    i*8                     @   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Zd dlZd dl	Z	d dl
mZ G dd dZG dd dZG dd dZG d	d
 d
ZG dd dZG dd dZG dd dZdddZG dd dZG dd dZG dd dZG dd dZeeeeeeeeeeedZddiZdS )    N)argsc                   @   ,   e Zd Zedd ZdZdZdZdd ZdS )	ModelMergeSimplec              	   C      dddddddddfdiS )	NrequiredMODELFLOAT      ?        {Gz?defaultminmaxstep)model1model2ratio sr   r   >/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_model_merging.pyINPUT_TYPES      zModelMergeSimple.INPUT_TYPESr   mergeadvanced/model_mergingc                 C   s<   |  }|d}|D ]}|||| id| | q|fS Ndiffusion_model.r
   cloneget_key_patchesadd_patches)selfr   r   r   mkpkr   r   r   r      s
   
zModelMergeSimple.mergeN	__name__
__module____qualname__classmethodr   RETURN_TYPESFUNCTIONCATEGORYr   r   r   r   r   r          
r   c                   @   r   )	ModelSubtractc              	   C      dddddddddfd	iS )
Nr   r   r	   r
         $      $@r   r   )r   r   
multiplierr   r   r   r   r   r   "   r   zModelSubtract.INPUT_TYPESr   r   r   c                 C   s:   |  }|d}|D ]}|||| i| | q|fS )Nr   r   )r#   r   r   r4   r$   r%   r&   r   r   r   r   -   s
   
zModelSubtract.mergeNr'   r   r   r   r   r0   !   r/   r0   c                   @   r   )	ModelAddc                 C      ddddiS )Nr   r   )r   r   r   r   r   r   r   r   5      zModelAdd.INPUT_TYPESr   r   r   c                 C   s8   |  }|d}|D ]}|||| idd q|fS r   r   )r#   r   r   r$   r%   r&   r   r   r   r   ?   s
   
zModelAdd.mergeNr'   r   r   r   r   r5   4   s    
r5   c                   @   r   )	CLIPMergeSimplec              	   C   r   )	Nr   CLIPr	   r
   r   r   r   )clip1clip2r   r   r   r   r   r   r   H   r   zCLIPMergeSimple.INPUT_TYPESr9   r   r   c                 C   sP   |  }| }|D ]}|ds|drq
|||| id| | q
|fS N.position_ids.logit_scaler
   r    r!   endswithr"   )r#   r;   r<   r   r$   r%   r&   r   r   r   r   S   s   zCLIPMergeSimple.mergeNr'   r   r   r   r   r8   G   r/   r8   c                   @   s4   e Zd ZddgZedd ZdZdZdZdd	 Z	d
S )CLIPSubtractzclip differenceztext encoder subtractc              	   C   r1   )
Nr   r9   r	   r
   r2   r3   r   r   )r;   r<   r4   r   r   r   r   r   r   _   r   zCLIPSubtract.INPUT_TYPESr9   r   r   c                 C   sN   |  }| }|D ]}|ds|drq
|||| i| | q
|fS )Nr>   r?   r@   )r#   r;   r<   r4   r$   r%   r&   r   r   r   r   j   s   zCLIPSubtract.mergeN
r(   r)   r*   SEARCH_ALIASESr+   r   r,   r-   r.   r   r   r   r   r   rB   ]   s    
rB   c                   @   s2   e Zd ZdgZedd ZdZdZdZdd Z	d	S )
CLIPAddzcombine clipc                 C   r6   )Nr   r9   )r;   r<   r   r   r   r   r   r   v   r7   zCLIPAdd.INPUT_TYPESr9   r   r   c                 C   sL   |  }| }|D ]}|ds|drq
|||| idd q
|fS r=   r@   )r#   r;   r<   r$   r%   r&   r   r   r   r      s   zCLIPAdd.mergeNrC   r   r   r   r   rE   t   s    
rE   c                   @   r   )	ModelMergeBlocksc                 C   s>   dddddddddfddddddfddddddfdiS )	Nr   r   r	   r
   r   r   r   )r   r   inputmiddleoutr   r   r   r   r   r      s   zModelMergeBlocks.INPUT_TYPESr   r   r   c                 K   s   |  }|d}tt| }|D ]3}|}|tdd  }	d}
|D ]}|	|r8|
t|k r8|| }t|}
q#|||| id| | q|fS )Nr   r   r
   )r    r!   nextitervalueslen
startswithr"   )r#   r   r   kwargsr$   r%   default_ratior&   r   k_unetlast_arg_sizeargr   r   r   r      s   
zModelMergeBlocks.mergeNr'   r   r   r   r   rF      s    
rF   c              	   C   s  t ||\}}	}
}}d}|d urt|}i }d}t| jtjjr4t| jtjj	r/d|d< n.d|d< n)t| jtjj
rAd|d< nt| jtjjrNd|d< nt| jtjjr[d|d< nd	}|rod
|d< d|d< d|	|
|d< i }| d}t|tjjrt|tjjrt|j |d< t|j |d< | jjtjjjkrd|d< n!| jjtjjjkrd|d< tg |d< t|dd	rtg |d< tjs||d< |d ur|D ]}t|| ||< q|	 d|
dd}tj||}tj j!|| |||||d d S )N Tzstable-diffusion-xl-v1-editzmodelspec.architecturezstable-diffusion-xl-v1-basezstable-diffusion-xl-v1-refinerz!stable-video-diffusion-img2vid-v1zstable-diffusion-v3-mediumFz1.0.0zmodelspec.sai_model_specsgmzmodelspec.implementationz{} {}zmodelspec.titlemodel_samplingzedm_vpred.sigma_maxzedm_vpred.sigma_minepsilonzmodelspec.predict_keyvv_predzsnrztsnrprompt_05_.safetensors)metadata
extra_keys)"folder_pathsget_save_image_pathjsondumps
isinstancemodelcomfy
model_baseSDXLSDXL_instructpix2pixSDXLRefinerSVD_img2vidSD3formatget_model_objectrV   ModelSamplingContinuousEDMV_PREDICTIONtorchtensor	sigma_maxfloat	sigma_min
model_type	ModelTypeEPSgetattrr   disable_metadataospathjoinsdsave_checkpoint)rg   clipvaeclip_visionfilename_prefix
output_dirr\   extra_pnginfofull_output_folderfilenamecounter	subfolderprompt_infor`   enable_modelspecra   rV   xoutput_checkpointr   r   r   r      sT   







r   c                   @   sB   e Zd Zg dZdd Zedd ZdZdZdZ	d	Z
dddZd
S )CheckpointSave)z
save modelzexport checkpointz
merge savec                 C      t  | _d S Nrb   get_output_directoryr   r#   r   r   r   __init__      zCheckpointSave.__init__c                 C   s"   ddddddifddd	d
dS )Nr   r9   VAESTRINGr   zcheckpoints/ComfyUI)rg   r   r   r   PROMPTEXTRA_PNGINFOr\   r   r   hiddenr   r   r   r   r   r      s   
zCheckpointSave.INPUT_TYPESr   saveTr   Nc              	   C   s   t ||||| j||d i S )N)r   r   r   r   r\   r   r   r   )r#   rg   r   r   r   r\   r   r   r   r   r      s   zCheckpointSave.saveNNr(   r)   r*   rD   r   r+   r   r,   r-   OUTPUT_NODEr.   r   r   r   r   r   r      s    
r   c                   @   :   e Zd Zdd Zedd ZdZdZdZdZ	dd
dZ
d	S )CLIPSavec                 C   r   r   r   r   r   r   r   r      r   zCLIPSave.__init__c                 C      ddddifddddd	S )
Nr9   r   r   zclip/ComfyUI)r   r   r   r   r   r   r   r   r   r   r   r      
   
zCLIPSave.INPUT_TYPESr   r   Tr   Nc                    sX  d}|d urt |}i }tjs*d|d< ||d< |d ur*|D ]}t || ||< qtjj| gdd | }dD ]n t	t
 fdd	| }	i }
|	D ]	}|||
|< qNt|
d
kr_q; d d }i }|}t|d
kryd||}d| < d|d< t|| j\}}}}}| d|dd}tj||}tj|
|}
tjj|
||d q;i S )NrT   ptro   r\   T)force_patch_weights)zclip_l.zclip_g.zclip_h.zt5xxl.z
pile_t5xl.zmt5xl.zumt5xxl.zt5base.z
gemma2_2b.zllama.zhydit_clip.rT   c                    s
   |   S r   )rN   )aprefixr   r   <lambda>  s   
 zCLIPSave.save.<locals>.<lambda>r   z{}_{}ztransformer.r]   r^   r_   r`   )rd   re   r   r|   rh   model_managementload_models_gpu
load_modelget_sdlistfilterkeyspoprM   ro   rb   rc   r   r}   r~   r   utilsstate_dict_prefix_replacesave_torch_file)r#   r   r   r\   r   r   r`   r   clip_sdr&   current_clip_sdpreplace_prefixfilename_prefix_r   r   r   r   r   r   r   r   r   
  s@   
zCLIPSave.saver   r(   r)   r*   r   r+   r   r,   r-   r   r.   r   r   r   r   r   r          
r   c                   @   r   )VAESavec                 C   r   r   r   r   r   r   r   r   5  r   zVAESave.__init__c                 C   r   )
Nr   r   r   zvae/ComfyUI_vae)r   r   r   r   r   r   r   r   r   r   r   r   8  r   zVAESave.INPUT_TYPESr   r   Tr   Nc                 C   s   t || j\}}}}}d}	|d urt|}	i }
tjs2|	|
d< |d ur2|D ]}t|| |
|< q&| d|dd}tj	||}t
jj| ||
d i S )NrT   r\   r]   r^   r_   r   )rb   rc   r   rd   re   r   r|   r}   r~   r   rh   r   r   r   )r#   r   r   r\   r   r   r   r   r   r   r`   r   r   r   r   r   r   C  s   
zVAESave.saver   r   r   r   r   r   r   4  r   r   c                   @   sB   e Zd ZddgZdd Zedd ZdZdZd	Z	d
Z
dddZdS )	ModelSavezexport modelzcheckpoint savec                 C   r   r   r   r   r   r   r   r   X  r   zModelSave.__init__c                 C   r   )
Nr   r   r   zdiffusion_models/ComfyUI)rg   r   r   r   r   r   r   r   r   r   r   r   [  r   zModelSave.INPUT_TYPESr   r   Tr   Nc                 C   s   t ||| j||d i S )N)r   r   r\   r   r   )r#   rg   r   r\   r   r   r   r   r   f  s   zModelSave.saver   r   r   r   r   r   r   V  s    
r   )r   rF   ModelMergeSubtractModelMergeAddr   r8   CLIPMergeSubtractCLIPMergeAddr   r   r   zSave Checkpoint)NNNNNNN)comfy.sdrh   comfy.utilscomfy.model_basecomfy.model_managementcomfy.model_samplingrs   rb   rd   r}   comfy.cli_argsr   r   r0   r5   r8   rB   rE   rF   r   r   r   r   r   NODE_CLASS_MAPPINGSNODE_DISPLAY_NAME_MAPPINGSr   r   r   r   <module>   sH    
 ;9"