
    +j                        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 Z G d d	e          Zej        ej        d
ZddZ G d dej                  Z G d de          ZdefdZdS )    N)Enum)override)ComfyExtensionio)trangegGz?c                    t          | j                  dk    }|sd n|                                 dd         }|o|dk    }|                                 dd         \  }}t          |||          }|r-|r|                     d          } n|                                 } t          j                            | 	                                          \  }}}	|d d d |f         }|d |         }|t          j
        |          z  }|	d |d d f         }	t          j        |                                |	                                g          }
t          j        |
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_vals                ?/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_lora_extract.pyextract_lorar+      s   $*oo"F$:$$$))++ac*:K1K61Jiikk!A#&OGVtVW%%D " 	"<<!<,,DD<<>>D |

--HAq"	!!!UdU(A	%4%A	EJqMMA	ETE111HB9aiikk2::<<011D^D.11FgG	  A	'6	"	"B FIIgtQ**ZZfk!nk!nEEr7N    c                       e Zd ZdZdZdS )LORATyper   r   N)__name__
__module____qualname__STANDARD	FULL_DIFF r,   r*   r.   r.   -   s        HIIIr,   r.   )standard	full_diffFc           
         t           j                            | g           |                     |          }t	          |                                          }t          t          |          d          D ]T}	||	         }
||	                             dd          }t          |          dk     s|d         dvs|d         dk    r|sSt           j	        
                    | j        |d	                   }t          |d
          r/t          |dd          s|                     |
| j        d          }n||
         }|d         dk    r|t           j        k    r|j        dk     rh|rd|                                                                                                |d                    ||
t          |          d                   <   V	 t/          ||          }|d	                                                                                                         |d                    ||
t          |          d                   <   |d                                                                                                         |d                    ||
t          |          d                   <   =#  t1          j        d                    |
                     Y ixY w|t           j        k    rd|                                                                                                |d                    ||
t          |          d                   <   |rp|d         dk    rd|                                                                                                |d                    ||
t          |          d                   <   V|S )N)filter_prefixweight)unit.r   r
   )r9   biasr<   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.   r2   ndim
contiguoushalfcpuformatr+   loggingwarningr3   )
model_diffr   prefix_modelprefix_lora	output_sd	lora_type	bias_diffsdsd_keysindexkop_keysopweight_diffouts                  r*   calc_lora_modelrd   4   s   	**J<888		$	$<	$	@	@B27799ooGG8444 z zEN%.''Q//w<<!wqz1CCCPQ
V\H\H\enH\[!!*"2GAJ??2+,, 	 WRAXZ_5`5` 	 $;;Az?Uei;jjKKQ%K1:!!H---#a''  D^i^t^t^v^v^{^{^}^}  _B  _B  _D  _D	+"4"4[!CDUDUVXDXBY"Z"Z[~&{D99Cdghidjdududwdwd|d|d~d~  eC  eC  eE  eEI3::;#lJ[J[\^J^H_``afijkflfwfwfyfyf~f~  gA  gA  gE  gE  gG  gGI5<<[!CP\L]L]^`L`Jabbcc~O$r$y$yz{$|$|}}}}}h000VaVlVlVnVnVsVsVuVuVyVyV{V{	+,,[!C<M<Mb<P:QRRS 	z71://T_TjTjTlTlTqTqTsTsTwTwTyTyIm**;#l:K:KB:N8OPPQs   C$J33)Kc                   L    e Zd Zed             Zeddej        fd            ZdS )LoraSavec                    t          j        ddgddt           j                            dd          t           j                            dd	d
dd
d          t           j                            dt          t                                                    d          t           j	                            ddd          t           j
                            ddd          t           j                            ddd          gdd          S )Nrf   zexport lorazExtract and Save Loraexperimentalfilename_prefixzloras/ComfyUI_extracted_lora)defaultr      r   i   T)rj   r   maxstepadvancedrZ   )optionsrn   r[   )rj   rn   rV   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_TYPESrF   BooleanModelClip)clss    r*   define_schemazLoraSave.define_schemaX   s    y)?0#	 1;YZZVQA4aRVWW{E*//:K:K4L4LW[\\
  dT JJ Q!   
 %P!     !-
 
 
 	
r,   Nreturnc           	         ||t          j                    S t                              |          }t	          j        |t	          j                              \  }}}	}
}i }|t          ||dd|||          }|t          |j        |dd|||          }| d|	dd}t          j
                            ||          }t          j                            ||d            t          j                    S )	Nzdiffusion_model.)r[    ztext_encoders._05z_.safetensors)metadata)r   
NodeOutputr   getfolder_pathsget_save_image_pathget_output_directoryrd   patcherospathjoinrA   rH   save_torch_file)r   ri   r   rZ   r[   rV   rr   full_output_folderfilenamecounter	subfolderrY   output_checkpoints                r*   executezLoraSave.executes   s8   "3";=??"NN9--	LXLlm|  K  `  b  b  Mc  McIHgy/	!'
D:LN`bkmv  CL  M  M  MI('(9(A4M]_hjs  @I  J  J  JI'CC'CCCCGLL);=NOO##I/@4#PPP}r,   )NN)r/   r0   r1   classmethodr   r   r   r   r4   r,   r*   rf   rf   W   s]        
 
 [
4  npn{    [  r,   rf   c                   L    e Zd Zedeeej                          fd            ZdS )LoraSaveExtensionr   c                    K   t           gS N)rf   )selfs    r*   get_node_listzLoraSaveExtension.get_node_list   s       
 	
r,   N)	r/   r0   r1   r   rE   typer   	ComfyNoder   r4   r,   r*   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r,   r   r   c                  "   K   t                      S r   )r   r4   r,   r*   comfy_entrypointr      s      r,   )F)r   comfy.model_managementrA   comfy.utilsr   r   rT   enumr   typing_extensionsr   comfy_api.latestr   r   	tqdm.autor   r   r+   r.   r2   r3   r   rd   r   rf   r   r   r4   r,   r*   <module>r      s|                				        & & & & & & / / / / / / / /        >    t    #+#-/ /
! ! ! !F. . . . .r| . . .b
 
 
 
 
 
 
 
 1      r,   