o
    i                     @   s  d 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 ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlZejZejZ	 G d	d
 d
Z de _!dd Z"de"_!ddl
m#Z# ddl$m%Z% dd Z&de&_!ej'(e e"e#e%e&g e)d i dej*dej+dej,dej-dej.dej/dej0dej1dej2dej3dej4d ej5d!ej6d"ej7d#ej8d$ej9Z:d%d& Z;dd(d)Z<dd*d+Z=dd-d.Z>dd/d0Z?d1d2 Z@dd3d4ZAd5d6 ZBd7d8 ZCh d9ZDh d:ZEd;d<d=d>d?d@dAdBdCdDdEdFdGZFh dHZGdIdJ ZHdKdL ZIdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[eIfd\d]eIfd^d_hZJh d`ZKddadbZLh dcZMh ddZNddedfZOddgdhZPddidjZQddkdlZRddmdnZSdodp ZTdqdr ZUdsdt ZVddvdwZWi ZXdxdy ZYdzd{ ZZd|d} Z[d~d Z\dd Z]de^fddZ_dd Z`dd Zadd Zbdd Zced dddZedddZfdd Zgdahdd Zidajdd ZkdZldZmG dd dZndd ZodejpfddZqdd Zrdd Zsdd Ztd,i fddZudd ZvdddZwdd ZxdS )a  
    This file is part of ComfyUI.
    Copyright (C) 2024 Comfy

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
    N)Image)interpolate)trange)	rearrange)argsTc                   @   s   e Zd ZdS )ModelCheckpointN)__name__
__module____qualname__ r   r   )/mnt/c/Users/fbmor/ComfyUI/comfy/utils.pyr   -   s    r   z,pytorch_lightning.callbacks.model_checkpointc                  O      d S Nr   r   kwargsr   r   r   scalar1      r   znumpy.core.multiarraydtype)Float64DTypec                  O   r   r   r   r   r   r   r   encode8   r   r   _codecsz.Checkpoint files will always be loaded safely.F64F32F16BF16I64I32I16I8U8BOOLF8_E4M3F8_E5M2C64U64U32U16c                 C   s  dd l }t| ddd}|j| }tj| }ttj	| 
| }td|d d d }t|dd|   d}|d|  }d  }i }	| D ]{\}
}|
dkrXqO|d \}}||krrtj|d	 t|d
  d|	|
< qOt L tjddd tj||| t|d
  d|d	 }| }t|dtj|t ! || ||  t|d||f t|dd ||	|
< W d    n1 sw   Y  qO|	|di fS )Nr   rb)	buffering<Q   utf-8__metadata__data_offsetsshaper   r   ignorez The given buffer is not writable)message_comfy_tensor_file_slice_comfy_tensor_mmap_refs_comfy_tensor_mmap_touchedF)"comfy_aimdo.model_mmapopen
model_mmap	ModelMMAPospathgetsize
memoryviewctypesc_uint8from_addressgetstructunpackjsonloadstobytesdecodeitemstorchempty_TYPESwarningscatch_warningsfilterwarnings
frombufferviewuntyped_storagesetattrcomfymemory_managementTensorFileSlice	threading	get_ident)ckptcomfy_aimdofr7   	file_sizemvheader_sizeheaderdata_base_offsetsdnameinfostartendtensorstorager   r   r   load_safetensorsU   s:     
(
rf   Fc              
   C   s  |d u r	t d}d }|  ds|  drzKtjjr)t| \}}|s(d }n:tj	| d|j
d)}i }| D ]}||}trI|j|dd}|||< q9|rT| }W d    n1 s^w   Y  W nk ty }	 z&t|	jdkr|	jd }
d	|
v rtd
|
| d|
v rtd|
| |	d }	~	ww i }trd|d< t j| f|dd|}d|v r|d }nt|dkrt| d }|| }t|ts|}n|}|r||fS |S )Ncpuz.safetensorsz.sftpt)	frameworkdeviceT)rj   copyr   HeaderTooLargez{}

File path: {}

The safetensors file is corrupt or invalid. Make sure this is actually a safetensors file and not a ckpt or pt or other filetype.MetadataIncompleteBufferz{}

File path: {}

The safetensors file is corrupt/incomplete. Check the file size and make sure you have copied/downloaded it correctly.mmap)map_locationweights_only
state_dict   )rH   rj   lowerendswithrR   rS   aimdo_enabledrf   safetensors	safe_opentypekeys
get_tensorDISABLE_MMAPtometadata	Exceptionlenr   
ValueErrorformatMMAP_TORCH_FILESloadlist
isinstancedict)rW   	safe_loadrj   return_metadatar}   r_   rY   krd   er1   
torch_argspl_sdkeyr   r   r   load_torch_filez   s\   


	
	

r   c                 C   s0   |d urt jj| ||d d S t j| | d S )N)r}   )rv   rH   	save_file)r_   rW   r}   r   r   r   save_torch_file   s   r    c                 C   s4   d}|   D ]}||r| | }|| 7 }q|S )Nr   )ry   
startswithnelement)r_   prefixparamsr   wr   r   r   calculate_parameters   s   
r   c                 C   s^   i }|   D ]}||r| | }||jd|  ||j< qt|dkr(d S t||jdS )Nr   )r   )ry   r   r@   r   numelr   max)r_   r   dtypesr   r   r   r   r   weight_dtype   s   
r   c                 C   s(   |D ]}|| v r|  || || < q| S r   )pop)rq   keys_to_replacexr   r   r   state_dict_key_replace   s
   r   c                    sj   |ri }n| } D ])t t fddtfdd|  }|D ]}| |d }|||d < q"q	|S )Nc                    s    | d   | td  fS )N{}{})r   r   areplace_prefixrpr   r   <lambda>   s     z+state_dict_prefix_replace.<locals>.<lambda>c                    s
   |   S r   )r   r   )r   r   r   r      s   
 r   rr   )r   mapfilterry   r   )rq   r   filter_keysoutreplacer   r   r   r   r   state_dict_prefix_replace   s   *r   c              	   C   s0  ddddd}|D ]}| |}|| v r | || ||  |< q	dddd	d
d}t|D ]h}|D ]$}dD ]}	d ||||	}d |||| |	}
|| v rT| || |
< q5q1dD ]<}	d |||	}|| v r| |}|jd d }tdD ]}g d}d |||| |	}
||| ||d   | |
< quqXq-| S )Nz&{}embeddings.position_embedding.weightz#{}embeddings.token_embedding.weightz{}final_layer_norm.weightz{}final_layer_norm.bias)z{}positional_embeddingz{}token_embedding.weightz{}ln_final.weightz{}ln_final.biaslayer_norm1layer_norm2zmlp.fc1zmlp.fc2zself_attn.out_proj)ln_1ln_2zmlp.c_fcz
mlp.c_projzattn.out_projweightbiasz {}transformer.resblocks.{}.{}.{}z{}encoder.layers.{}.{}.{}z*{}transformer.resblocks.{}.attn.in_proj_{}r      )zself_attn.q_projzself_attn.k_projzself_attn.v_projrr   )r   r   ranger/   )r_   prefix_from	prefix_tonumberr   r   r   resblock_to_replaceresblockyk_tok_fromweights
shape_frompr   r   r   transformers_convert   sJ   


r   c                 C   sp   t | |d|d} d|}|| v r| || d|< d|}|| v r6| |dd | d|< | S )Nz{}text_model.    z{}text_projection.weightz{}text_projectionr   rr   )r   r   r   	transpose
contiguous)r_   r   r   tpr   r   r   clip_text_transformers_convert   s   

 r   >   	norm.biasnorm.weightproj_in.biasproj_in.weightproj_out.biasproj_out.weight>   
norm3.biasnorm3.weightattn1.to_k.weightattn1.to_q.weightattn1.to_v.weightattn2.to_k.weightattn2.to_q.weightattn2.to_v.weight
norm1.bias
norm2.biasnorm1.weightnorm2.weightff.net.2.biasff.net.2.weightff.net.0.proj.biasattn1.to_out.0.biasattn2.to_out.0.biasff.net.0.proj.weightattn1.to_out.0.weightattn2.to_out.0.weightzconv1.weightz
conv1.biasztime_emb_proj.weightztime_emb_proj.biaszconv2.weightz
conv2.biaszconv_shortcut.weightzconv_shortcut.biasr   r   r   r   )zin_layers.2.weightzin_layers.2.biaszemb_layers.1.weightzemb_layers.1.biaszout_layers.3.weightzout_layers.3.biaszskip_connection.weightzskip_connection.biaszin_layers.0.weightzin_layers.0.biaszout_layers.0.weightzout_layers.0.bias>   z
out.0.biaszconv_norm_out.biasz
out.2.biaszconv_out.biaszout.0.weightzconv_norm_out.weightzout.2.weightzconv_out.weightztime_embed.0.biasztime_embedding.linear_1.biasztime_embed.2.biasztime_embedding.linear_2.biasztime_embed.0.weightztime_embedding.linear_1.weightztime_embed.2.weightztime_embedding.linear_2.weightzinput_blocks.0.0.biaszconv_in.biaszinput_blocks.0.0.weightzconv_in.weightlabel_emb.0.0.biaszadd_embedding.linear_1.biasr   zclass_embedding.linear_1.biaslabel_emb.0.2.biaszadd_embedding.linear_2.biasr   zclass_embedding.linear_2.biaslabel_emb.0.0.weightzadd_embedding.linear_1.weightr   zclass_embedding.linear_1.weightlabel_emb.0.2.weightzadd_embedding.linear_2.weightr   zclass_embedding.linear_2.weightc                 C   s*  d| vri S | d }| d }| d d d  }| d d d  }t |}| dd }i }t|D ]t}d|| d |  }	t|| D ]P}
tD ]}d|	||d||
t| < qD|d	}|d	krtD ]}d
|	||d||
|< qat|D ]}tD ]}d|	|||d||
||< qyqu|	d7 }	q@dD ]}d|	||d||< qq.d	}
tD ]}d||d|
|< qt|D ]}tD ]}d|||d|
||< qqtd	dgD ]\}
}	tD ]}d|	||d|
t| < qqt	t
|}t|D ]}|| d | }	|| d }t|D ]y}
d	}tD ]}d|	||d||
t| < q|d7 }| }|d	krd|d7 }tD ]}d|	||d||
|< q6t|D ]}tD ]}d|	|||d||
||< qOqK|
|d kr~dD ]}d|	|||d||< qm|	d7 }	q
qtD ]}|d	 ||d < q|S ) Nnum_res_blockschannel_multtransformer_depthtransformer_depth_outputtransformer_depth_middlerr   zinput_blocks.{}.0.{}zdown_blocks.{}.resnets.{}.{}r   zinput_blocks.{}.1.{}zdown_blocks.{}.attentions.{}.{}z*input_blocks.{}.1.transformer_blocks.{}.{}z5down_blocks.{}.attentions.{}.transformer_blocks.{}.{}r   zinput_blocks.{}.0.op.{}z%down_blocks.{}.downsamplers.0.conv.{}zmiddle_block.1.{}zmid_block.attentions.{}.{}z'middle_block.1.transformer_blocks.{}.{}z0mid_block.attentions.{}.transformer_blocks.{}.{}   zmiddle_block.{}.{}zmid_block.resnets.{}.{}zoutput_blocks.{}.0.{}zup_blocks.{}.resnets.{}.{}zoutput_blocks.{}.1.{}zup_blocks.{}.attentions.{}.{}z+output_blocks.{}.1.transformer_blocks.{}.{}z3up_blocks.{}.attentions.{}.transformer_blocks.{}.{}zoutput_blocks.{}.{}.conv.{}z!up_blocks.{}.upsamplers.0.conv.{})r   r@   r   UNET_MAP_RESNETr   r   UNET_MAP_ATTENTIONSTRANSFORMER_BLOCKS	enumerater   reversedUNET_MAP_BASIC)unet_configr   r   r   r   
num_blockstransformers_middiffusers_unet_mapr   nibnum_transformerstr   lcr   r   r   unet_to_diffusersP  s~    
 
"
"r  c                 C   s(   | j ddd\}}tj||gdd}|S )Nr   r   dim)chunkrH   cat)r   shiftscale
new_weightr   r   r   swap_scale_shift  s   r  )context_embedder.biasr  )context_embedder.weightr  )t_embedder.mlp.0.bias/time_text_embed.timestep_embedder.linear_1.bias)t_embedder.mlp.0.weight1time_text_embed.timestep_embedder.linear_1.weight)t_embedder.mlp.2.bias/time_text_embed.timestep_embedder.linear_2.bias)t_embedder.mlp.2.weight1time_text_embed.timestep_embedder.linear_2.weightzx_embedder.proj.biaspos_embed.proj.biaszx_embedder.proj.weightpos_embed.proj.weight)zy_embedder.mlp.0.bias+time_text_embed.text_embedder.linear_1.bias)zy_embedder.mlp.0.weight-time_text_embed.text_embedder.linear_1.weight)zy_embedder.mlp.2.bias+time_text_embed.text_embedder.linear_2.bias)zy_embedder.mlp.2.weight-time_text_embed.text_embedder.linear_2.weight)	pos_embedpos_embed.pos_embed#final_layer.adaLN_modulation.1.biasnorm_out.linear.bias%final_layer.adaLN_modulation.1.weightnorm_out.linear.weightfinal_layer.linear.biasr   final_layer.linear.weightr   >   zx_block.mlp.fc1.biasr   zx_block.mlp.fc2.biasr   zx_block.attn.proj.biasattn.to_out.0.biaszx_block.mlp.fc1.weightr   zx_block.mlp.fc2.weightr   zx_block.attn2.proj.biasr   zx_block.attn.ln_k.weightattn.norm_k.weightzx_block.attn.ln_q.weightattn.norm_q.weightzx_block.attn.proj.weightattn.to_out.0.weightzx_block.attn2.ln_k.weightzattn2.norm_k.weightzx_block.attn2.ln_q.weightzattn2.norm_q.weightzx_block.attn2.proj.weightr   zcontext_block.mlp.fc1.biasff_context.net.0.proj.biaszcontext_block.mlp.fc2.biasff_context.net.2.biaszcontext_block.attn.proj.biasattn.to_add_out.biaszcontext_block.mlp.fc1.weightff_context.net.0.proj.weightzcontext_block.mlp.fc2.weightff_context.net.2.weightzcontext_block.attn.ln_k.weightattn.norm_added_k.weightzcontext_block.attn.ln_q.weightattn.norm_added_q.weightzcontext_block.attn.proj.weightattn.to_add_out.weightzx_block.adaLN_modulation.1.biasnorm1.linear.biasz!x_block.adaLN_modulation.1.weightnorm1.linear.weightz%context_block.adaLN_modulation.1.biasnorm1_context.linear.biasz'context_block.adaLN_modulation.1.weightnorm1_context.linear.weightc              	   C   sR  i }|  dd}|  d|}t|D ]}d|}d||}|d }dD ]}	d|}
d	||	}|dd|ff|d
|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< d||	}|dd|ff|d|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< d|}
d||	}|dd|ff|d
|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< q%tD ]}
d||
d |d||
d < qqt }|d|d d|d tf |d|d d|d tf |D ]'}
t|
dkrd||
d d |
d f||
d < qd||
d ||
d < q|S )Ndepthr   r  transformer_blocks.{}z{}joint_blocks.{}@   r   {}.attn.z{}.x_block.attn.qkv.{}	{}to_q.{}	{}to_k.{}r   	{}to_v.{}z{}.context_block.attn.qkv.{}{}add_q_proj.{}{}add_k_proj.{}{}add_v_proj.{}	{}.attn2.z{}.x_block.attn2.qkv.{}{}.{}rr   z5joint_blocks.{}.context_block.adaLN_modulation.1.biasz/transformer_blocks.{}.norm1_context.linear.biasz7joint_blocks.{}.context_block.adaLN_modulation.1.weightz1transformer_blocks.{}.norm1_context.linear.weightr   )	r@   r   r   MMDIT_MAP_BLOCKMMDIT_MAP_BASICrk   addr  r   )mmdit_configoutput_prefixkey_mapr[  r  r  
block_fromblock_tooffsetrc   r   qkv	map_basicr   r   r   mmdit_to_diffusers  sB   


 "$$$rr  >   zt_block.1.biaszadaln_single.linear.biaszt_block.1.weightzadaln_single.linear.weightzar_embedder.mlp.0.biasz4adaln_single.emb.aspect_ratio_embedder.linear_1.biaszar_embedder.mlp.2.biasz4adaln_single.emb.aspect_ratio_embedder.linear_2.biaszy_embedder.y_embeddingzcaption_projection.y_embeddingzar_embedder.mlp.0.weightz6adaln_single.emb.aspect_ratio_embedder.linear_1.weightzar_embedder.mlp.2.weightz6adaln_single.emb.aspect_ratio_embedder.linear_2.weightzcsize_embedder.mlp.0.biasz2adaln_single.emb.resolution_embedder.linear_1.biaszcsize_embedder.mlp.2.biasz2adaln_single.emb.resolution_embedder.linear_2.biaszy_embedder.y_proj.fc1.biasz caption_projection.linear_1.biaszy_embedder.y_proj.fc2.biasz caption_projection.linear_2.biaszcsize_embedder.mlp.0.weightz4adaln_single.emb.resolution_embedder.linear_1.weightzcsize_embedder.mlp.2.weightz4adaln_single.emb.resolution_embedder.linear_2.weightzy_embedder.y_proj.fc1.weightz"caption_projection.linear_1.weightzy_embedder.y_proj.fc2.weightz"caption_projection.linear_2.weightzfinal_layer.scale_shift_tablescale_shift_tabler  z0adaln_single.emb.timestep_embedder.linear_1.biasr  z0adaln_single.emb.timestep_embedder.linear_2.biasr  z2adaln_single.emb.timestep_embedder.linear_1.weightr  z2adaln_single.emb.timestep_embedder.linear_2.weightr!  r#  r/  r1  >	   zmlp.fc1.biasr   zmlp.fc2.biasr   zattn.proj.biasr   zmlp.fc1.weightr   zmlp.fc2.weightr   zattn.proj.weightr   zcross_attn.proj.biasr   zcross_attn.proj.weightr   r  r  c              	   C   sh  i }|  dd}|  dd}t|D ]}d|}d||}dD ]i}d|}	d	||}
|
dd|ff|d
|	|< |
d||ff|d|	|< |
d|d |ff|d|	|< d|}	d||}d||}||d
|	|< |dd|ff|d|	|< |d||ff|d|	|< q!tD ]}d||d |d||d < qqtD ]}d||d ||d < q|S )Nr[  r   hidden_sizei  r\  z{}blocks.{}r   z	{}.attn1.z{}.attn.qkv.{}r_  r`  r   ra  re  z{}.cross_attn.q_linear.{}z{}.cross_attn.kv_linear.{}rf  rr   r   )r@   r   r   PIXART_MAP_BLOCKPIXART_MAP_BASIC)rj  rk  rl  r[  ro  r  rm  rn  rc   srp  qkvr   r   r   r   pixart_to_diffusers  s0   


"r  c                 C   sv  |  dd}|  dd}i }t|D ]m}||k rT|}d}d|}i dddd	d
dddddddddddddddddddddd d!d"d#d$d%}	n|| }d&}d'|}ddddd(d)d*d+d,}	|	D ]}
d-|||	|
 |d-|||
< qlqd.d/d0d1d2d3d4d5d6d7d8d9tfh}|D ]&}
t|
d:krd;||
d d |
d: f||
d< < qd;||
d ||
d< < q|S )=Nn_double_layersr   n_layersjoint_transformer_blocksz{}double_layersattn.to_q.weightzattn.w2q.weightattn.to_k.weightzattn.w2k.weightattn.to_v.weightzattn.w2v.weightr?  zattn.w2o.weightzattn.add_q_proj.weightzattn.w1q.weightzattn.add_k_proj.weightzattn.w1k.weightzattn.add_v_proj.weightzattn.w1v.weightrR  zattn.w1o.weightff.linear_1.weightzmlpX.c_fc1.weightff.linear_2.weightzmlpX.c_fc2.weightff.out_projection.weightzmlpX.c_proj.weightzff_context.linear_1.weightzmlpC.c_fc1.weightzff_context.linear_2.weightzmlpC.c_fc2.weightz ff_context.out_projection.weightzmlpC.c_proj.weightrV  zmodX.1.weightrZ  zmodC.1.weightsingle_transformer_blocksz{}single_layerszmodCX.1.weightzmlp.c_fc1.weightzmlp.c_fc2.weightzmlp.c_proj.weight)r  r  r  r?  rV  r  r  r  z{}.{}.{})positional_encodingr*  )register_tokensr  )r  ztime_step_proj.linear_1.weight)r  ztime_step_proj.linear_1.bias)r  ztime_step_proj.linear_2.weight)r  ztime_step_proj.linear_2.bias)zcond_seq_linear.weightr  )zinit_x_linear.weightr$  )zinit_x_linear.biasr"  )zfinal_linear.weightr   zmodF.1.weightr.  r   r   rr   r@   r   r   r  r   )rj  rk  r  r  rl  r  indexr   r   	block_mapr   	MAP_BASICr   r   r   auraflow_to_diffusers:  s   
	

"$r  c                 C   s`  |  dd}|  dd}|  dd}i }t|D ]}d|}d||}dD ]j}	d|}
d	||	}|dd|ff|d
|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< d|}
d||	}|dd|ff|d|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< q'i ddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d#d%d'd)d+d-d/d1d3d4d5d6d7}|D ]}
d8|||
 |d8||
< qqt|D ]v}d9|}d:||}dD ]G}	d|}
d;||	}|dd|ff|d
|
|	< |d||ff|d|
|	< |d|d |ff|d|
|	< |d|d< |d= ff|d>||	< qd?d@dAdBdCdDdEdAdF}|D ]}
d8|||
 |d8||
< qQqdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZtfd[d\tfd]d^h}|D ])}
t|
dkrd_||
d d |
d f||
d` < qd_||
d ||
d` < q|S )aNr[  r   depth_single_blocksr  r\  z{}double_blocks.{}r   r^  z{}.img_attn.qkv.{}r_  r`  r   ra  z{}.txt_attn.qkv.{}rb  rc  rd  r?  zimg_attn.proj.weightr6  zimg_attn.proj.biasrV  zimg_mod.lin.weightrT  zimg_mod.lin.biasrZ  ztxt_mod.lin.weightrX  ztxt_mod.lin.biasrR  ztxt_attn.proj.weightrH  ztxt_attn.proj.biasr   zimg_mlp.0.weightr   zimg_mlp.0.biasr   zimg_mlp.2.weightr   zimg_mlp.2.biasrJ  ztxt_mlp.0.weightrD  ztxt_mlp.0.biasrL  ztxt_mlp.2.weightrF  ztxt_mlp.2.biaszff.linear_in.weightzimg_attn.norm.query_norm.weightzimg_attn.norm.key_norm.weightztxt_attn.norm.query_norm.weightztxt_attn.norm.key_norm.weight)zff.linear_in.biaszff.linear_out.weightzff.linear_out.biaszff_context.linear_in.weightzff_context.linear_in.biaszff_context.linear_out.weightzff_context.linear_out.biasr=  r;  rP  rN  rf  zsingle_transformer_blocks.{}z{}single_blocks.{}z{}.linear1.{}r      z{}.proj_mlp.{}zmodulation.lin.weightzmodulation.lin.biaszlinear2.weightzlinear2.biasznorm.query_norm.weightznorm.key_norm.weightzlinear1.weight)znorm.linear.weightznorm.linear.biasr   r   r=  r;  zattn.to_qkv_mlp_proj.weightzattn.to_out.weightr/  r1  )zimg_in.biasx_embedder.bias)zimg_in.weightx_embedder.weight)ztime_in.in_layer.biasr  )ztime_in.in_layer.weightr  )ztime_in.out_layer.biasr  )ztime_in.out_layer.weightr   )ztxt_in.biasr  )ztxt_in.weightr  )zvector_in.in_layer.biasr%  )zvector_in.in_layer.weightr&  )zvector_in.out_layer.biasr'  )zvector_in.out_layer.weightr(  )zguidance_in.in_layer.biasz/time_text_embed.guidance_embedder.linear_1.bias)zguidance_in.in_layer.weightz1time_text_embed.guidance_embedder.linear_1.weight)zguidance_in.out_layer.biasz/time_text_embed.guidance_embedder.linear_2.bias)zguidance_in.out_layer.weightz1time_text_embed.guidance_embedder.linear_2.weightr+  r,  r-  r.  )zpos_embed_input.biaszcontrolnet_x_embedder.bias)zpos_embed_input.weightzcontrolnet_x_embedder.weightr   rr   r  )rj  rk  r  n_single_layersr  rl  r  r   r   rc   r   rp  r  r  r   r   r   flux_to_diffusers  s   


 	


$ &r  c           
         s   |  dd}|  dd |  dd}|  dd}i d fdd	}t|D ]}|d	|d
|| q&t|D ]}|d|d|| q9t|D ]}|d|d|| qLg d}|D ]\}}	d|||	< qaS )Nr  r   r  n_refiner_layersr   Tc                    s   dD ]6}d | }d ||}|dd ffd ||< |d  ffd ||< |d d  ffd ||< qd	d
dddddddddd}|rQd|d< d|d< | D ]\}}d ||d | |< qUd S )Nr   z{}.attention.z{}.attention.qkv.{}r   r_  r`  r   ra  zattention.q_norm.weightzattention.k_norm.weightzattention.out.weightzattention.out.biasattention_norm1.weightattention_norm2.weightfeed_forward.w1.weightfeed_forward.w2.weightfeed_forward.w3.weightffn_norm1.weightffn_norm2.weight)zattention.norm_q.weightzattention.norm_k.weightzattention.to_out.0.weightzattention.to_out.0.biasr  r  r  r  r  r  r  zadaLN_modulation.0.weightzadaLN_modulation.0.biasrf  )r   rG   )r   r   	has_adalnrc   r   rp  r  vr  rl  r   r   add_block_keys  s0   
 z,z_image_to_diffusers.<locals>.add_block_keysz	layers.{}z{}layers.{}zcontext_refiner.{}z{}context_refiner.{}znoise_refiner.{}z{}noise_refiner.{}))r2  z!all_final_layer.2-1.linear.weight)r0  zall_final_layer.2-1.linear.bias)r-  z-all_final_layer.2-1.adaLN_modulation.1.weight)r+  z+all_final_layer.2-1.adaLN_modulation.1.bias)r  zall_x_embedder.2-1.weight)r  zall_x_embedder.2-1.bias)x_pad_tokenr  )cap_embedder.0.weightr  )cap_embedder.1.weightr  )cap_embedder.1.biasr  )cap_pad_tokenr  )r  r  )r  r  )r  r  )r  r  r   )T)r@   r   r   )
rj  rk  r  n_context_refinern_noise_refinerr  r  r  r  	diffusersr   r  r   z_image_to_diffusers  s    r  c                 C   sv   | j | |kr| |d|S | j | |k r9| |dg t|| j |  g dgt| j d |   |d|S | S )Nr   rr   )r/   narrowrepeatmathceilr   )rd   
batch_sizer  r   r   r   repeat_to_batch_size5  s
   Hr  c                 C   s   | j d }||kr| S |dkr| d | S tj|gt| j dd   | j| jd}||k rM|d |d  }t|D ]}| tt|| |d  ||< q9|S || }t|D ]}| tt	
|d | |d  ||< qU|S )Nr   rr   r   rj         ?)r/   rH   rI   r   r   rj   r   minroundr  floor)rd   r  in_batch_sizeoutputr  r  r   r   r   resize_to_batch_size<  s   
( &r  c              	   C   s   t | }||ks|dkr| S |dkr| d | S g }||k r?|d |d  }t|D ]}|| tt|| |d   q*|S || }t|D ]}|| tt|d | |d   qG|S )Nr   rr   r  )r   r   appendr  r  r  r  )r  r  r  r  r  r  r   r   r   resize_list_to_batch_sizeP  s   "(r  c                 C   s,   t |  }|D ]}| | || |< q| S r   )r   ry   r|   )rq   r   ry   r   r   r   r   convert_sd_tod  s   r    @c                 C   sl   t | d'}|d}td|d }||kr 	 W d    d S ||W  d    S 1 s/w   Y  d S )Nr(   r+   r*   r   )r6   readrA   rB   )safetensors_pathmax_sizerY   r]   length_of_headerr   r   r   safetensors_headerj  s   
$r  c                 C   s2   | d}|d d D ]}t| |} q| |d fS N.splitgetattrobjattrattrsr`   r   r   r   resolve_attrt  s   
r  c                 C   s@   t | |\} }t| |t}|tu rt| | |S t| || |S r   )r  r  
ATTR_UNSETdelattrrQ   )r  r  valuer`   prevr   r   r   set_attrz  s   
r  c                 C   s0   t  s| r| }t| |t jj|ddS )NF)requires_grad)rH   is_inference_mode_enabledis_inferencecloner  nn	Parameter)r  r  r  r   r   r   set_attr_param  s   r  c                 C   s@   t | |\} }t| |t}|t| dt v}| j|||d |S )N_non_persistent_buffers_set)
persistent)r  r  r  setregister_buffer)r  r  r  r`   r  r  r   r   r   set_attr_buffer  s
   r  c                 C   sD   | d}|d d D ]}t| |} qt| |d }|j| d S r  )r  r  datacopy_)r  r  r  r  r`   r  r   r   r   copy_to_param  s
   
r  r  c                 C   s"   | d}|D ]}t| |} q| S )aE  Retrieves a nested attribute from an object using dot notation.

    Args:
        obj: The object to get the attribute from
        attr (str): The attribute path using dot notation (e.g. "model.layer.weight")

    Returns:
        The value of the requested attribute

    Example:
        model = MyModel()
        weight = get_attr(model, "layer1.conv.weight")
        # Equivalent to: model.layer1.conv.weight

    Important:
        Always prefer `comfy.model_patcher.ModelPatcher.get_model_object` when
        accessing nested model objects under `ModelPatcher.model`.
    r  r  r  r   r   r   get_attr  s   
r  c                 C   s  dd }dd }| j }|  } | j\}}}}	||}
}||	|| j\}}}||||df}||||df}||d|df}| d|ddd|f}| d|ddd|f}|ddd}||||}|||||dd}|||
| j\}}}|d||d|f}|d||d|f}|d|dd|f}|d	|ddd|f}|d	|ddd|f}|ddd}||||}|||
||dd}||S )
Nc                 S   s(  | j d }tj| ddd}tj|ddd}| | }|| }d||d|dk< d||d|dk< || d}t|}	t|	}
td|d |	 |
 d| t|d|	 |
 d|  }||d|  ||  d|9 }| |dk ||dk< | d|  ||  |dk  ||dk < |S )	zKslerps batches b1, b2 according to ratio r, batches should be flat e.g. NxCr  T)r  keepdim        rr         ?gwJ?gwJ)	r/   rH   normexpandsumacossinsqueeze	unsqueeze)b1b2rr  b1_normsb2_normsb1_normalizedb2_normalizeddotomegasoresr   r   r   slerp  s   


H $zbislerp.<locals>.slerpc                 S   s   t j| t j|dd}t jjj|d|fdd}||  }|t j	}t j| t j|ddd }|d d d d d d df  d8  < t jjj|d|fdd}|t j	}|||fS )Nr  )rr   rr   rr   r  rr   bilinearsizemoder  )
rH   arangefloat32reshaper  
functionalr   r  r|   int64)
length_old
length_newrj   coords_1ratioscoords_2r   r   r   generate_bilinear_data  s   $
z'bislerp.<locals>.generate_bilinear_datar  rr   )r  rr   )rr   rr   r  rr   )	r   floatr/   rj   r  gathermovedimr  r|   )sampleswidthheightr  r  
orig_dtyper  r  hr   h_neww_newr  r  r  pass_1pass_2resultr   r   r   bislerp  s2   

r.  c                    sn   | j d dkr| dn| dd} dd | D } fdd|D }dd |D }t|}|| j| jS )Nrr   r  c              	   S   s4   g | ]}t td |   ddtjqS )     o@r      )r   	fromarraynpcliprg   numpyastypeuint8.0imager   r   r   
<listcomp>   s   4 zlanczos.<locals>.<listcomp>c                    s"   g | ]}|j  ftjjd qS ))resample)resizer   
ResamplingLANCZOSr7  r&  r%  r   r   r:       " c                 S   s0   g | ]}t t|tjd  ddqS )r/  r  r   )rH   
from_numpyr2  arrayr5  r  r#  r7  r   r   r   r:    s   0 )r/   r  r#  rH   stackr|   rj   r   )r$  r%  r&  imagesr-  r   r?  r   lanczos  s   $
rE  c                 C   s  t | j}t|dkr4| | jd | jd d| jd | jd } | dd} | d|d |d |d } |dkr| jd }| jd }|| }|| }	d}
d}||	kr_t|||	|   d }
n||	k rot||||	   d }| d|||d  d|
||
d  }n| }|dkrt|||}n|d	krt|||}nt	j
jj|||f|d
}t|dkr|S ||d d|d f||f }|dd|d d ||f S )Nr  r   rr   r  r   r   centerr.  rE  r  )tupler/   r   r  r#  r  r  r.  rE  rH   r  r  r   )r$  r%  r&  upscale_methodcrop
orig_shape	old_width
old_height
old_aspect
new_aspectr   r   r  r   r   r   r   common_upscale  s6   
*

* "rO  c                 C   sL   ||krdn
t || ||  }| |krdn
t | | ||  }|| S )Nrr   )r  r  )r%  r&  tile_xtile_yoverlaprowscolsr   r   r   get_tiled_scale_steps(  s   ""rU  r]  r]  r+   r  r   rg   c
           #   
      s  t }
tttfsg|
 tttfsg|
 d u r"tttfs.g|
 fdd}fdd}fdd}fdd}|rM| |}n| |} fd	d
}tj| jd |g|| jdd   |d}t| jd D ]M}| ||d  tfddt|
D r|	||||d < |	d ur|	
d qs|||d   }tjjd dg|jdd   |d}fddt|
D }tj| D ]}}g }t|
D ]6}tdtj|d  |  || }t| j|d  | }||d ||}|t||| q||	|}tjddgt|jdd   |d}td|
d D ]C}t |d |d  }||j| krNq5t|D ]$}|d | } |||d|  |||j| d | d|  qRq5|}!|}"t|
D ]#}|!|d || |j|d  }!|"|d || |j|d  }"q|!||  |"| |	d ur|	
d q|| qs|S )Nc                         |  }t |r||S || S r   callabler  valupupscale_amountr   r   get_upscale=     z)tiled_scale_multidim.<locals>.get_upscalec                         |  }t |r||S || S r   rX  rZ  r]  r   r   get_downscaleD  r`  z+tiled_scale_multidim.<locals>.get_downscalec                    rW  r   rX  rZ  index_formulasr   r   get_upscale_posK  r`  z-tiled_scale_multidim.<locals>.get_upscale_posc                    ra  r   rX  rZ  rc  r   r   get_downscale_posR  r`  z/tiled_scale_multidim.<locals>.get_downscale_posc                    s2   g }t t| D ]}|t || |  q|S r   )r   r   r  r  )r   r   r  )	get_scaler   r   mult_list_upscale`  s   z/tiled_scale_multidim.<locals>.mult_list_upscaler   r   )rj   rr   c                 3   s&    | ]} j |d   | kV  qdS )r   N)r/   r8  d)r  tiler   r   	<genexpr>l  s   $ z'tiled_scale_multidim.<locals>.<genexpr>c                    sR   g | ]%}j |d   | kr$tdj |d    |  |  |  ndgqS )r   r   )r/   r   ri  )rR  r  rk  r   r   r:  u  s   R z(tiled_scale_multidim.<locals>.<listcomp>)r   r   rG  r   rH   rI   r/   r   allr|   updatezero_zeros	itertoolsproductr   r  r  r  r  onesmul_add_div_)#r$  functionrk  rR  r^  out_channelsoutput_device	downscalerd  pbardimsr_  rb  re  rf  get_posrh  r  r	  r   out_div	positionsits_inupscaledrj  posr  psmaskfeatherr  r   oo_dr   )rg  rd  rR  r  rk  r^  r   tiled_scale_multidim-  sz   


*
*&$& $


r  r]  c	           	   
   C   s   t | |||f|||||dS )N)rR  r^  rx  ry  r{  )r  )	r$  rw  rP  rQ  rR  r^  rx  ry  r{  r   r   r   tiled_scale  s   r  c                     s\   t jjst| i |S t| i |ddid_d j d fdd	}|_S )	N	smoothingr  r   z  Model Initializing ...  rr   c                    sd    j d7  _ j dkrt _d nj dkr,jt j  _d  |  d S )Nrr   z! Model Initialization complete!  r   r   )_itimei1_timeset_postfix_strstart_t)r  _updater{  r   r   warmup_update  s   



z#model_trange.<locals>.warmup_updaterr   )rR   rS   ru   r   r  r  rn  )r   r   r  r   r  r   model_trange  s   
r  c                 C      | a d S r   )PROGRESS_BAR_ENABLED)enabledr   r   r   set_progress_bar_enabled     r  c                 C   r  r   )PROGRESS_BAR_HOOK)rw  r   r   r   set_progress_bar_global_hook  r  r  g?r  c                   @   s(   e Zd ZdddZd	ddZdd ZdS )
ProgressBarNc                 C   s(   || _ d| _t| _|| _d| _d| _d S )Nr   r  r  )totalcurrentr  hooknode_id_last_update_time_last_sent_value)selfr  r  r   r   r   __init__  s   
zProgressBar.__init__c           
      C   s   |d ur|| _ || j kr| j }|| _| jd uryt }| jdk }|| j k}|d u}|s/|s/|rC| j| j| j || jd || _|| _d S | j dkrV|td| j | j  d }nd}|| j }	|	t	kr{|t
kr}| j| j| j || jd || _|| _d S d S d S d S )Nr   )r  d   )r  r  r  r  perf_counterr  r  r  r   PROGRESS_THROTTLE_MIN_INTERVALPROGRESS_THROTTLE_MIN_PERCENT)
r  r  r  previewcurrent_timeis_firstis_finalhas_previewpercent_changedtime_elapsedr   r   r   update_absolute  s2   






zProgressBar.update_absolutec                 C   s   |  | j|  d S r   )r  r  )r  r  r   r   r   rn    s   zProgressBar.updater   )NN)r   r	   r
   r  r  rn  r   r   r   r   r    s    

	r  c                 C   s   t |d }|dkrd}|dkr!| dd| jd | jd f} d}|dkr>t | jdk r<| ddd| jd | jd f} d	}tjjj| |dd  |d
}|jd |d k rl|d|d fd|  d d d |d f }t||d }|S )Nr   rr   linearr  r   r  r      	trilinearr  r  r   )	r   r  r/   rH   r  r  r   r  r  )
input_maskoutput_shaper|  
scale_moder  r   r   r   reshape_mask  s    .r  r  c                 C   s  |\}}|\}}||f||fkr| S | j dkr| d} | j dkr,tdt| j d| jd ||  }| d d d |d |f }| d d d ||d f }	| d d |d |d f }
| d d |d d |f }t|	d||d}	t|	|d	d
}	t|	d}	t|
d||d}
t|
|d	d
}
t|
d||d}
t|
|d	d
}
t|
d||d}
t|d||d}t||d	d
}t|d}tjtj||	gddtj||
gddgdd}|S )Nr   r   r   zGot a mask of shape z, expected [b, q, k] or [q, k]rr   zb t (h w) -> b t h w)r(  r   r  r  zb t h w -> b t (h w)zb hw (h w) -> b hw h wz"b (hk wk) hq wq -> b (hq wq) hk wk)hkwkz$b (hq wq) hk wk -> b (hk wk) (hq wq))hqwqzb (h w) t -> b t h wzb t h w -> b (h w) tr  )	ndimr  r   r   r/   r   r   rH   r  )r  img_size_inimg_size_outhiwihowo
txt_tokens
txt_to_txt
txt_to_img
img_to_img
img_to_txtr   r   r   r   upscale_dit_mask  s>   




r  c                 C   sN   g }g }| D ]}| |j | ||jd dd qtj|dd}||fS )Nr   rr   r  r  )r  r/   r  rH   r  )latentslatent_shapestensorsrd   latentr   r   r   pack_latents1  s   r  c              	   C   s   t |dkrFg }|D ]9}t|dd  }| d d d d d |f }| d d d d |d f } |||jd gt|dd    q
|S | g}|S )Nrr   r   )r   r  prodr  r  r/   r   )combined_latentr  output_tensorsr/   cuttensr   r   r   unpack_latents;  s   *r  c                 C   s8   | D ]}| |r|drtd ddi  S qd S )Nz.comfy_quantz%Found quantization metadata version 1	mixed_opsT)r   rt   loggingra   )rq   r   r   r   r   r   detect_layer_quantizationG  s   
r  c                 C   s  |d u ri }d }d|vrd |}|| v r| | }|j}|tjkr$tj}| dkr-d}nd}i }i }	t|  D ]_}
|
|kr@q9|
|sL| |
 ||
< q9|
}| 	|
}d }|
drh|d td  }d |}|d urzdd	i}|rv||d
< ||	|< |
dr|d td  }d |}| dkrq9|||< q9|} d|	i}nt|d }|d ur|d }	|	 D ]\}
}tjtt|dtjd| d |
< q| |fS )N_quantization_metadataz{}scaled_fp8r   TFz.scale_weightz{}.weight_scaler   float8_e4m3fnfull_precision_matrix_multz.scale_inputz{}.input_scaler  layersr,   r   z{}.comfy_quant)r   r   rH   r  r  r   r   ry   r   r   rt   r   itemrC   rD   rG   rd   dumpsr   r6  )rq   model_prefixr}   quant_metadatascaled_fp8_keyscaled_fp8_weightscaled_fp8_dtyper  out_sdr  r   k_outr   layer
layer_confr  r   r   r   convert_old_quantsN  s^   








,r  c                 C   s\   d}| D ]%}t |trt|}||N }tdD ]}|d@ r$|d? dA }q|dL }qq|dA S )Nl    r+   rr   l    q[ )r   strordr   )r  crcbyte_r   r   r   string_to_seed  s   

r  c                    st    d u ri  t | }| v r | S t| tr# fdd|  D }nt| tr2 fdd| D }n| }| |< |S )Nc                    s"   i | ]\}}t | t | qS r   deepcopy_list_dict)r8  r   r  memor   r   
<dictcomp>  r@  z&deepcopy_list_dict.<locals>.<dictcomp>c                    s   g | ]}t | qS r   r  )r8  r  r  r   r   r:    s    z&deepcopy_list_dict.<locals>.<listcomp>)idr   r   rG   r   )r  r  obj_idr  r   r  r   r    s   

r  c                 C   sR   |D ]$}| ddkr&|d }||d  }| dd||ddf  |  < qdS )z8Normalize image embeddings to match text embedding scalerx   r9  r  r  N)r@   )embedsembeds_infoscale_factorra   	start_idxend_idxr   r   r   normalize_image_embeddings  s   "r  )FNFr   )r   )F)r   )r  )rV  r+   r  r   rg   FNN)r]  r]  r+   r  r   rg   N)y__doc__rH   r  rA   r=   r9   comfy.memory_managementrR   safetensors.torchrv   r4  r2  PILr   r  rq  torch.nn.functionalr   	tqdm.autor   einopsr   comfy.cli_argsr   rC   r  rU   rK   mmap_torch_filesr   disable_mmapr{   r   r	   r   r   numpy.dtypesr   r   serializationadd_safe_globalsra   float64r  float16bfloat16r  int32int16int8r6  boolr  float8_e5m2	complex64uint64uint32uint16rJ   rf   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rh  rg  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  rE  rO  rU  inference_moder  r  r  r  r  r  r  r  r  r  r  Tensorr  r  r  r  r  r  r  r  r   r   r   r   <module>   s6   
	

%
/


)	B
,

!
E
t
B
	L	"
n,)
<
