o
    i#                     @   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 d dl	m
Z
 d dlmZmZ d dlmZ dZdd ZG d	d
 d
eZejejdZdddZG dd dejZG dd deZdefddZdS )    N)Enum)override)ComfyExtensionio)trangegGz?c                 C   s<  t | jdk}|sd n|  dd }|o|dk}|  dd \}}t|||}|r8|r4| jdd} n|  } tj| 	 \}}}	|d d d |f }|d | }|t
| }|	d |d d f }	t| |	 g}
t|
t}| }|||}|	||}	|r|||dd}|	|||d |d }	||	fS )N      )   r	   r   r	   )	start_dim)lenshapesizeminflattensqueezetorchlinalgsvdfloatdiagcatquantileCLAMP_QUANTILEclampreshape)diffrankconv2dkernel_size
conv2d_3x3out_dimin_dimUSVhdisthi_vallow_val r(   =/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_lora_extract.pyextract_lora   s.   r*   c                   @   s   e Zd ZdZdZdS )LORATyper   r	   N)__name__
__module____qualname__STANDARD	FULL_DIFFr(   r(   r(   r)   r+   -   s    r+   )standard	full_diffFc              	   C   s  t j| g | j|d}t| }tt|ddD ]}	||	 }
||	 dd}t|dk s=|d dvs=|d dkr>|s>qt j	
| j|d	 }t|d
r]t|dds]| j|
| jdd}n||
 }|d dkr|tjkr|jdk r|r|   |d||
t|d < qz3t||}|d	    |d||
t|d < |d    |d||
t|d < W q   td|
 Y q|tjkr|   |d||
t|d < q|r|d dkr|   |d||
t|d < q|S )N)filter_prefixweight)unit.r	   r   )r4   biasr7   r   comfy_cast_weightscomfy_patched_weightsFT)return_weightz	{}{}.diffiz{}{}.lora_up.weightz{}{}.lora_down.weightzLCould not generate lora weights for key {}, is the weight difference a zero?z{}{}.diff_b)comfymodel_managementload_models_gpumodel_state_dictlistkeysr   r   rsplitutilsget_attrmodelhasattrgetattrpatch_weight_to_deviceload_devicer+   r/   ndim
contiguoushalfcpuformatr*   loggingwarningr0   )
model_diffr   prefix_modelprefix_lora	output_sd	lora_type	bias_diffsdsd_keysindexkop_keysopweight_diffoutr(   r(   r)   calc_lora_model4   s>   (

(
,0
((r_   c                   @   s.   e Zd Zedd ZeddejfddZdS )LoraSavec                 C   s   t jddgddt jjdddt jjdd	d
dd
ddt jjdtt ddt j	jddddt j
jddddt jjddddgdddS )Nr`   zexport lorazExtract and Save Lora_for_testingfilename_prefixzloras/ComfyUI_extracted_lora)defaultr      r	   i   T)rc   r   maxstepadvancedrU   )optionsrg   rV   )rc   rg   rQ   z3The ModelSubtract output to be converted to a lora.)tooltipoptionaltext_encoder_diffz2The CLIPSubtract output to be converted to a lora.)node_idsearch_aliasesdisplay_namecategoryinputsis_experimentalis_output_node)r   SchemaStringInputIntCombotuple
LORA_TYPESrA   BooleanModelClip)clsr(   r(   r)   define_schemaX   s.   zLoraSave.define_schemaNreturnc              	   C   s   |d u r|d u rt  S t|}t|t \}}}	}
}i }|d ur/t||dd|||d}|d ur?t|j|dd|||d}| d|	dd}t	j
||}tjj||d d t  S )	Nzdiffusion_model.)rV    ztext_encoders._05z_.safetensors)metadata)r   
NodeOutputry   getfolder_pathsget_save_image_pathget_output_directoryr_   patcherospathjoinr<   rC   save_torch_file)r}   rb   r   rU   rV   rQ   rk   full_output_folderfilenamecounter	subfolderrT   output_checkpointr(   r(   r)   executes   s   
zLoraSave.execute)NN)r,   r-   r.   classmethodr~   r   r   r   r(   r(   r(   r)   r`   W   s
    
r`   c                   @   s(   e Zd Zedeeej  fddZdS )LoraSaveExtensionr   c                    s   t gS N)r`   )selfr(   r(   r)   get_node_list   s   zLoraSaveExtension.get_node_listN)	r,   r-   r.   r   r@   typer   	ComfyNoder   r(   r(   r(   r)   r      s    r   r   c                      s   t  S r   )r   r(   r(   r(   r)   comfy_entrypoint   s   r   )F)r   comfy.model_managementr<   comfy.utilsr   r   rO   enumr   typing_extensionsr   comfy_api.latestr   r   	tqdm.autor   r   r*   r+   r/   r0   ry   r_   r   r`   r   r   r(   r(   r(   r)   <module>   s(    
#1