
    +j                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
  S SKJrJr  S SKJr  SrS r " S S	\5      r\R&                  \R(                  S
.rSS jr " S S\R.                  5      r " S S\5      rS\4S jrg)    N)Enum)override)ComfyExtensionio)trangegGz?c                 @   [        U R                  5      S:H  nU(       d  S OU R                  5       SS nU=(       a    US:g  nU R                  5       SS u  pV[        XU5      nU(       a'  U(       a  U R	                  SS9n OU R                  5       n [        R                  R                  U R                  5       5      u  pxn	US S 2S U24   nUS U nU[        R                  " U5      -  nU	S U2S S 24   n	[        R                  " UR	                  5       U	R	                  5       /5      n
[        R                  " U
[        5      nU* nUR                  X5      nU	R                  X5      n	U(       a,  UR                  XQSS5      nU	R                  XUS   US   5      n	Xy4$ )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+      sa   $**o"F$$$))+a*:K1K61Jiik!A&OGtW%D<<!<,D<<>D ||

-HA"	!UdU(A	%4A	EJJqMA	ETE1HB99aiik2::<01D^^D.1FgG	 A	'	"BIIgQ*ZZk!nk!nE7N    c                       \ rS rSrSrSrSrg)LORAType-   r   r    N)__name__
__module____qualname____firstlineno__STANDARD	FULL_DIFF__static_attributes__r0   r,   r*   r.   r.   -   s    HIr,   r.   )standard	full_diffc           
      l   [         R                  R                  U /5        U R                  US9n[	        UR                  5       5      n[        [        U5      SS9 GH  n	X   n
X   R                  SS5      n[        U5      S:  d  US   S;  d  US   S:X  a	  U(       d  MF  [         R                  R                  U R                  US	   5      n[        US
5      (       a-  [        USS5      (       d  U R                  XR                  SS9nOXz   nUS   S:X  Ga  U[         R"                  :X  Ga  UR$                  S:  aT  U(       aJ  UR'                  5       R)                  5       R+                  5       USR-                  X:[        U5      S 5      '   GM8   [/        X5      nUS	   R'                  5       R)                  5       R+                  5       USR-                  X:[        U5      S 5      '   US   R'                  5       R)                  5       R+                  5       USR-                  X:[        U5      S 5      '   GM  U[         R4                  :X  aM  UR'                  5       R)                  5       R+                  5       USR-                  X:[        U5      S 5      '   GMB  GME  U(       d  GMO  US   S:X  d  GM[  UR'                  5       R)                  5       R+                  5       USR-                  X:[        U5      S 5      '   GM     U$ !   [0        R2                  " SR-                  U
5      5         GM  = f)N)filter_prefixweight)unit.r   r
   )r<   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.   r5   ndim
contiguoushalfcpuformatr+   loggingwarningr6   )
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_modelrg   4   s   	**J<8		$	$<	$	@B2779oGG84N.''Q/w<!wqz1CCPQ
V\H\en[[!!*"2"2GAJ?2+,,WRAXZ_5`5`$;;A?U?Uei;jK%K1:!H---##a' ^i^t^t^v^{^{^}  _B  _B  _D	+"4"4[CDUVXBY"Z[~&{9Cdghidjdududwd|d|d~  eC  eC  eEI3::;#lJ[\^H_`afijkflfwfwfyf~f~  gA  gE  gE  gGI5<<[CP\L]^`Jabc h000VaVlVlVnVsVsVuVyVyV{	+,,[C<Mb:QRS 1 Y71:/T_TjTjTlTqTqTsTwTwTyIm**;#l:KB8OPQ7 58 ~OO$r$y$yz{$|}}s   B%L'L3c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)LoraSaveW   c                    [         R                  " SS/SS[         R                  R                  SSS9[         R                  R                  SS	S
SS
SS9[         R
                  R                  S[        [        R                  5       5      SS9[         R                  R                  SSSS9[         R                  R                  SSSS9[         R                  R                  SSSS9/SSS9$ )Nri   zexport lorazExtract and Save Loraexperimentalfilename_prefixzloras/ComfyUI_extracted_lora)defaultr      r   i   T)rn   r   maxstepadvancedr]   )optionsrr   r^   )rn   rr   rY   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_TYPESrI   BooleanModelClip)clss    r*   define_schemaLoraSave.define_schemaX   s    yy)?0#		 1;YZVQA4aRVW{E*//:K4LW[\

  dT J Q!  
 %P!    !-
 	
r,   Nreturnc           
         Uc  Uc  [         R                  " 5       $ [        R                  U5      n[        R
                  " U[        R                  " 5       5      u  pxpn0 nUb  [        XRSSXUS9nUb  [        UR                  USSXUS9nU SU	S S3n[        R                  R                  X|5      n[        R                  R                  XS S9  [         R                  " 5       $ )	Nzdiffusion_model.)r^    ztext_encoders._05z_.safetensors)metadata)r   
NodeOutputr   getfolder_pathsget_save_image_pathget_output_directoryrg   patcherospathjoinrD   rK   save_torch_file)r   rm   r   r]   r^   rY   rv   full_output_folderfilenamecounter	subfolderr\   output_checkpoints                r*   executeLoraSave.executes   s    "3";==?"NN9-	LXLlLlm|  K  `  `  b  McIg/	!'
:LN`bk  CL  MI('(9(A(A4M]_h  @I  JI'j'"]CGGLL);O##I4#P}}r,   r0   )NN)
r1   r2   r3   r4   classmethodr   r   r   r   r7   r0   r,   r*   ri   ri   W   s6    
 
4 npn{n{  r,   ri   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)LoraSaveExtension   r   c                    #    [         /$ 7fN)ri   )selfs    r*   get_node_listLoraSaveExtension.get_node_list   s      
 	
s   
r0   N)r1   r2   r3   r4   r   rH   typer   	ComfyNoder   r7   r0   r,   r*   r   r      s)    
T$r||*<%= 
 
r,   r   r   c                     #    [        5       $ 7fr   )r   r0   r,   r*   comfy_entrypointr      s     s   )F)r   comfy.model_managementrD   comfy.utilsr   r   rW   enumr   typing_extensionsr   comfy_api.latestr   r   	tqdm.autor   r   r+   r.   r5   r6   r   rg   r   ri   r   r   r0   r,   r*   <module>r      s        	   & / >t  #++#--/
!F.r|| .b
 
 1 r,   