o
    ¶Ïiã±  ã                   @   sæ  d Z ddlZddlm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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ZddlmZ erbddlmZ dd„ ZG dd	„ d	eƒZG d
d„ dƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZ G dd„ deƒZ!i fdd„Z"dd„ Z#i fdd„Z$G dd„ deƒZ%i fdd„Z&i fdd„Z'd i fd!d"„Z(i fd#d$„Z)i fd%d&„Z*i fd'd(„Z+d)d*„ Z,di fd+d,„Z-di fd-d.„Z.G d/d0„ d0eƒZ/i fd1d2„Z0dS )3aÎ  
    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)ÚEnum)ÚTYPE_CHECKING)Ú	HookGroupc                 C   s˜   | j d }|dkr| S || }| d |… } || j d kr7tj| g|| j d   | d || j d  … g dd} | j d }||krB| S tj| g| ddS )Nr   é   ©Údim)ÚshapeÚtorchÚcat)ÚtensorÚtarget_batch_sizeÚbatched_numberÚcurrent_batch_sizeÚ	per_batch© r   ú./mnt/c/Users/fbmor/ComfyUI/comfy/controlnet.pyÚbroadcast_image_to.   s   
6
r   c                   @   s   e Zd ZdZdZdS )ÚStrengthTyper   é   N)Ú__name__Ú
__module__Ú__qualname__ÚCONSTANTÚ	LINEAR_UPr   r   r   r   r   ?   s    r   c                   @   sp   e Zd Zdd„ Zdddg fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„ZdS )ÚControlBasec                 C   s|   d | _ d | _d| _d| _d | _d | _d| _d | _d| _d| _	i | _
d | _g | _tj| _d| _g | _d | _d | _dd„ | _d S )Nç      ð?©ç        r   Fé   únearest-exactc                 S   ó   | S ©Nr   ©Úar   r   r   Ú<lambda>W   ó    z&ControlBase.__init__.<locals>.<lambda>)Úcond_hint_originalÚ	cond_hintÚstrengthÚtimestep_percent_rangeÚlatent_formatÚvaeÚglobal_average_poolingÚtimestep_rangeÚcompression_ratioÚupscale_algorithmÚ
extra_argsÚprevious_controlnetÚextra_condsr   r   Ústrength_typeÚconcat_maskÚextra_concat_origÚextra_concatÚextra_hooksÚpreprocess_image©Úselfr   r   r   Ú__init__D   s&   zControlBase.__init__r   r   Nc                 C   sp   || _ || _|| _| jd ur|d u rt d¡ || _| ¡ | _| j	r6t
| jƒdkr6| j t dgggg¡¡ | S )NzXWARNING: no VAE provided to the controlnet apply node when this controlnet requires one.r   r   )r&   r(   r)   r*   ÚloggingÚwarningr+   Úcopyr5   r4   ÚlenÚappendr	   r   )r:   r'   r(   r)   r+   r6   r   r   r   Úset_cond_hintY   s   


zControlBase.set_cond_hintc                 C   s>   || j d ƒ|| j d ƒf| _| jd ur| j ||¡ d S d S )Nr   r   )r)   r-   r1   Úpre_run©r:   ÚmodelÚpercent_to_timestep_functionr   r   r   rB   f   s   
ÿzControlBase.pre_runc                 C   s
   || _ | S r!   )r1   )r:   Ú
controlnetr   r   r   Úset_previous_controlnetk   s   z#ControlBase.set_previous_controlnetc                 C   s*   | j d ur
| j  ¡  d | _d | _d | _d S r!   )r1   Úcleanupr'   r6   r-   r9   r   r   r   rH   o   s
   


zControlBase.cleanupc                 C   s    g }| j d ur|| j  ¡ 7 }|S r!   )r1   Ú
get_models©r:   Úoutr   r   r   rI   w   s   
zControlBase.get_modelsc                 C   s6   g }| j d ur| | j ¡ | jd ur|| j ¡ 7 }|S r!   )r7   r@   r1   Úget_extra_hooksrJ   r   r   r   rL   }   s   

zControlBase.get_extra_hooksc                 C   s–   | j |_ | j|_| j|_| j|_| j|_| j|_| j|_| j ¡ |_| j	|_	| j
 ¡ |_
| j|_| j|_| j ¡ |_| jrB| j ¡ nd |_| j|_d S r!   )r&   r(   r)   r,   r.   r/   r*   r0   r>   r+   r2   r3   r4   r5   r7   Úcloner8   ©r:   Úcr   r   r   Úcopy_to…   s   zControlBase.copy_toc                 C   s   | j d ur| j  |¡S dS )Nr   )r1   Úinference_memory_requirements©r:   Údtyper   r   r   rQ   –   ó   
z)ControlBase.inference_memory_requirementsc              	   C   sž  g g g dœ}|D ]n}|| }t ƒ }tt|ƒƒD ]^}|| }	|	d urn| jr8tj|	ddd dd|	jd |	jd ¡}	|	|vr`| |	¡ | j	t
jkrM|	| j9 }	n| j	t
jkr`|	| jtt|ƒ| ƒ 9 }	|d urn|	j|krn|	 |¡}	||  |	¡ qq|d urÍdD ]O}	||	 }
tt||	 ƒƒD ]@}||	 | }|t|
ƒkrŸ|
 |¡ q‹|d urË|
| d u r®||
|< q‹|
| jd |jd k rÃ||
|  |
|< q‹||
|  |
|< q‹q}|S )	N)ÚinputÚmiddleÚoutput)r   é   T)r   Úkeepdimr   r   rX   r   )ÚsetÚranger?   r,   r	   ÚmeanÚrepeatr   Úaddr3   r   r   r(   r   ÚfloatrS   Útor@   )r:   ÚcontrolÚcontrol_prevÚoutput_dtyperK   ÚkeyÚcontrol_outputÚ
applied_toÚiÚxÚoÚprev_valr   r   r   Úcontrol_merge›   sF   (

ð
€õzControlBase.control_mergec                 C   s   || j |< d S r!   )r0   )r:   ÚargumentÚvaluer   r   r   Úset_extra_argÄ   s   zControlBase.set_extra_argr!   )r   r   r   r;   rA   rB   rG   rH   rI   rL   rP   rQ   rk   rn   r   r   r   r   r   C   s    )r   c                       sn   e Zd Zdddddddgejddd„ f
‡ fdd„	Zd	d
„ Zdd„ Z‡ fdd„Z‡ fdd„Z	‡ fdd„Z
‡  ZS )Ú
ControlNetNFr   Úyc                 C   r    r!   r   r"   r   r   r   r$   É   r%   zControlNet.<lambda>c                    s|   t ƒ  ¡  || _|| _|d urtjj| j|tj ¡ d| _	|| _
|| _d | _|| _|| _|  j|7  _|| _|	| _|
| _d S )N)Úload_deviceÚoffload_device)Úsuperr;   Úcontrol_modelrq   ÚcomfyÚmodel_patcherÚCoreModelPatcherÚmodel_managementÚunet_offload_deviceÚcontrol_model_wrappedr.   r,   Úmodel_sampling_currentÚmanual_cast_dtyper*   r2   r3   r4   r8   )r:   rt   r,   r.   r*   rq   r|   r2   r3   r4   r8   ©Ú	__class__r   r   r;   É   s   

zControlNet.__init__c              
   C   sF  d }| j d ur| j  |||||¡}| jd ur0|d | jd ks(|d | jd k r0|d ur.|S d S | jj}| jd ur<| j}| jd u s^|jd | j | jjd ks^|jd | j | jjd kr2| jd ure| `d | _| j}| j	d urx|| j	 
¡ 9 }n	| jd urtdƒ‚tj | j|jd | |jd | | jd¡| _|  | j¡| _| j	d ur½tjjd	d
}	| j	 | j dd¡¡| _tj |	¡ | jd urÊ| j | j¡| _t| jƒdkr(g }
| jD ]D}| | jj¡}tj || jjd | jjd | jd¡}|j| jjk r| d¡}tjj|| jjd dd}|
  tj || jjd ¡¡ q×t!j"| jg|
 dd| _| jj|j|d| _|jd | jjd krIt#| j|jd |ƒ| _| $d|d ¡}| j% &¡ }| j'D ]}| $|d ¡}|d urqtj( )|||j¡||< qY| j* +|¡}| j* ,||¡}| jd| |¡| j| |¡tj -||j|¡dœ|¤Ž}| j.||d dS )Nr   r   r   rX   zuThis Controlnet needs a VAE but none was provided, please use a ControlNetApply node with a VAE input and connect it.éÿÿÿÿéþÿÿÿÚcenterT)Úonly_currently_usedr   )ÚdevicerS   Úcrossattn_controlnetÚc_crossattn)rh   ÚhintÚ	timestepsÚcontext)rc   r   )/r1   Úget_controlr-   rt   rS   r|   r'   r   r.   r+   Úspacial_compression_encoder*   Ú
ValueErrorru   ÚutilsÚcommon_upscaler&   r/   r8   rx   Úloaded_modelsÚencodeÚmovedimÚload_models_gpuÚ
process_inr?   r5   r`   rƒ   ÚndimÚ	unsqueezeÚrepeat_to_batch_sizer@   r	   r
   r   Úgetr0   r>   r2   Ú
model_baseÚconvert_tensorr{   ÚtimestepÚcalculate_inputÚcast_to_devicerk   )r:   Úx_noisyÚtÚcondr   Útransformer_optionsrb   rS   r.   rŽ   Ú	to_concatrO   rˆ   ÚextraÚtempr™   ra   r   r   r   r‰   Ú   sh   

$
D


.


&



€6zControlNet.get_controlc                 C   ó4   t d | j| j| jd}| j|_| j|_|  |¡ |S ©N©r,   rq   r|   )ro   r,   rq   r|   rt   rz   rP   rN   r   r   r   r>     ó
   
zControlNet.copyc                    s   t ƒ  ¡ }| | j¡ |S r!   )rs   rI   r@   rz   rJ   r}   r   r   rI     rT   zControlNet.get_modelsc                    s   t ƒ  ||¡ |j| _d S r!   )rs   rB   Úmodel_samplingr{   rC   r}   r   r   rB   $  s   zControlNet.pre_runc                    s   d | _ tƒ  ¡  d S r!   )r{   rs   rH   r9   r}   r   r   rH   (  s   zControlNet.cleanup)r   r   r   r   r   r;   r‰   r>   rI   rB   rH   Ú__classcell__r   r   r}   r   ro   È   s    *>ro   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚQwenFunControlNetc                    s@   | j }t t| j dƒ¡| _ ztƒ  |||||¡W || _ S || _ w )Nr   )r(   ÚmathÚsqrtÚmaxrs   r‰   )r:   rœ   r   rž   r   rŸ   Úoriginal_strengthr}   r   r   r‰   .  s
   zQwenFunControlNet.get_controlc                    s    t ƒ  ||¡ |  d|j¡ d S )NÚ
base_model)rs   rB   rn   Údiffusion_modelrC   r}   r   r   rB   9  s   zQwenFunControlNet.pre_runc                 C   r£   r¤   )r©   r,   rq   r|   rt   rz   rP   rN   r   r   r   r>   =  r¦   zQwenFunControlNet.copy)r   r   r   r‰   rB   r>   r¨   r   r   r}   r   r©   -  s    r©   c                   @   s@   e Zd ZG dd„ dejjejjƒZ	G dd„ dejjejjƒZ
dS )ÚControlLoraOpsc                	       s<   e Zd Z		ddedededdf‡ fdd„Zd	d
„ Z‡  ZS )zControlLoraOps.LinearTNÚin_featuresÚout_featuresÚbiasÚreturnc                    s2   t ƒ  ¡  || _|| _d | _d | _d | _d | _d S r!   )rs   r;   r±   r²   ÚweightÚupÚdownr³   )r:   r±   r²   r³   rƒ   rS   r}   r   r   r;   F  s   

zControlLoraOps.Linear.__init__c              
   C   s   t jj| |dd\}}}| jd ur4tjj ||t | jj	dd| j
j	dd¡ | jj¡ |j¡ |¡}n	tjj |||¡}t j | |||¡ |S ©NT)Úoffloadabler   )Ú	start_dim)ru   ÚopsÚcast_bias_weightr¶   r	   ÚnnÚ
functionalÚlinearÚmmÚflattenr·   Úreshaperµ   r   ÚtyperS   Úuncast_bias_weight©r:   rU   rµ   r³   Úoffload_streamrh   r   r   r   ÚforwardP  s   
FzControlLoraOps.Linear.forward)TNN)r   r   r   ÚintÚboolr;   rÇ   r¨   r   r   r}   r   ÚLinearE  s    ÿÿ
rÊ   c                       s6   e Zd Z								d
‡ fdd„	Zdd	„ Z‡  ZS )zControlLoraOps.Conv2dr   r   TÚzerosNc                    sb   t ƒ  ¡  || _|| _|| _|| _|| _|| _d| _d| _	|| _
|	| _d | _d | _d | _d | _d S )NFr   )rs   r;   Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingÚdilationÚ
transposedÚoutput_paddingÚgroupsÚpadding_moderµ   r³   r¶   r·   )r:   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÔ   r³   rÕ   rƒ   rS   r}   r   r   r;   Z  s   

zControlLoraOps.Conv2d.__init__c              
   C   s°   t jj| |dd\}}}| jd ur<tjj ||t | jj	dd| j
j	dd¡ | jj¡ |j¡ || j| j| j| j¡}ntjj |||| j| j| j| j¡}t j | |||¡ |S r¸   )ru   r»   r¼   r¶   r	   r½   r¾   Úconv2drÀ   rÁ   r·   rÂ   rµ   r   rÃ   rS   rÏ   rÐ   rÑ   rÔ   rÄ   rÅ   r   r   r   rÇ   z  s   
V"zControlLoraOps.Conv2d.forward)r   r   r   r   TrË   NN)r   r   r   r;   rÇ   r¨   r   r   r}   r   ÚConv2dY  s    ô r×   N)r   r   r   r	   r½   ÚModuleru   r»   ÚCastWeightBiasOprÊ   r×   r   r   r   r   r°   D  s    r°   c                       sN   e Zd Zdi fdd„Z‡ fdd„Zdd„ Z‡ fdd	„Zd
d„ Zdd„ Z‡  Z	S )ÚControlLoraFc                 C   s*   t  | ¡ || _|| _|  jdg7  _d S )Nrp   )r   r;   Úcontrol_weightsr,   r2   )r:   rÛ   r,   Úmodel_optionsr   r   r   r;   „  s   
zControlLora.__init__c           
   	      sp  t ƒ  ||¡ |jj ¡ }| d¡ | jd jd |d< |j| _| 	¡ }| jd u r5G dd„ dt
tjjƒ}nG dd„ dt
tjjƒ}| j}||d< ||d	< tjjjdi |¤Ž| _| j tj ¡ ¡ |j}| ¡ }|D ]}|| }	ztj | j||	¡ W qh   Y qh| jD ]3}|d
vrµ| d¡sœ| d¡sœ| d¡sœ| d¡rµd|vrµtj | j|| j|  |¡ tj ¡ ¡¡ q‚d S )NrÍ   zinput_hint_block.0.weightr   Úhint_channelsc                   @   ó   e Zd ZdS ©z-ControlLora.pre_run.<locals>.control_lora_opsN©r   r   r   r   r   r   r   Úcontrol_lora_ops’  ó    rá   c                   @   rÞ   rß   rà   r   r   r   r   rá   •  râ   Ú
operationsrS   >   Úlora_controlnetz.upz.downú.weightú.biasÚ__r   )rs   rB   Úmodel_configÚunet_configr>   ÚpoprÛ   r   r|   Ú	get_dtyper°   ru   r»   Údisable_weight_initÚmanual_castÚcldmro   rt   r`   rx   Úget_torch_devicer¯   Ú
state_dictrŒ   Úset_attr_paramÚendswith)
r:   rD   rE   Úcontrolnet_configrS   rá   r¯   ÚsdÚkrµ   r}   r   r   rB   Š  s8   


0*€ýzControlLora.pre_runc                 C   s   t | j| jd}|  |¡ |S )N)r,   )rÚ   rÛ   r,   rP   rN   r   r   r   r>   ¬  s   
zControlLora.copyc                    s   | ` d | _ tƒ  ¡  d S r!   )rt   rs   rH   r9   r}   r   r   rH   ±  s   zControlLora.cleanupc                 C   s   t  | ¡}|S r!   )r   rI   rJ   r   r   r   rI   ¶  s   
zControlLora.get_modelsc                 C   s&   t j | j¡t j |¡ t | |¡ S r!   )ru   rŒ   Úcalculate_parametersrÛ   rx   Ú
dtype_sizer   rQ   rR   r   r   r   rQ   º  s   &z)ControlLora.inference_memory_requirements)
r   r   r   r;   rB   r>   rH   rI   rQ   r¨   r   r   r}   r   rÚ   ƒ  s    "rÚ   c           
      C   s¤   t j | dd¡}| dd ¡}|d u r&t j | ¡}t|jƒ}t jj	d||d}t j 
¡ }t j ||¡}| dd ¡}|d u rEt jj||dd}t j ¡ }	||||||	fS )NÚ TrS   r   ©Úmodel_paramsÚsupported_dtypesÚweight_dtypeÚcustom_operations©Údisable_fast_fp8)ru   Úmodel_detectionÚmodel_config_from_unetr–   rŒ   rü   ÚlistÚsupported_inference_dtypesrx   Ú
unet_dtyperï   Úunet_manual_castr»   Úpick_operationsry   )
rô   rÜ   rè   r  rü   r  rq   r|   rã   rr   r   r   r   ró   ½  s   


ró   c                 C   sN   | j |dd\}}t|ƒdkrt d |¡¡ t|ƒdkr%t d |¡¡ | S )NF©Ústrictr   úmissing controlnet keys: {}úunexpected controlnet keys: {})Úload_state_dictr?   r<   r=   ÚformatÚdebug)rt   rô   ÚmissingÚ
unexpectedr   r   r   Úcontrolnet_load_state_dictÑ  s   r  c                 C   s¾   t j | d¡}t||d\}}}}}}t j |d¡}	| D ]}
| |
 ||
< qd}| d¡jd }|dkr5d}t jjj	d|	||||d	œ|j
¤Ž}t||ƒ}t j ¡ }d
|_t	|d||||d}|S )Nrø   ©rÜ   zjoint_blocks.{}.Fúpos_embed_input.proj.weightr   é   T)Ú
num_blocksÚcontrol_latent_channelsrã   rƒ   rS   r   )r.   r*   r4   rq   r|   r   )ru   r   Úconvert_diffusers_mmditró   Úcount_blocksr–   r   rî   Úmmditro   ré   r  Úlatent_formatsÚSD3Úshift_factor)rô   rÜ   Únew_sdrè   rã   rq   r  r|   rr   r  rõ   r4   r  rt   r*   ra   r   r   r   Úload_controlnet_mmditÜ  s   "

r  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚControlNetSD35c                    sX   | j jr| j jj|jj ¡ dd\}}n| j jj|jj ¡ dd\}}tƒ  	||¡ d S )NFr  )
rt   Údouble_y_embÚorig_y_embedderr  r¯   Ú
y_embedderrð   Ú
x_embedderrs   rB   )r:   rD   rE   r  r  r}   r   r   rB   ò  s    zControlNetSD35.pre_runc                 C   r£   r¤   )r  r,   rq   r|   rt   rz   rP   rN   r   r   r   r>   ù  r¦   zControlNetSD35.copy)r   r   r   rB   r>   r¨   r   r   r}   r   r  ñ  s    r  c                 C   sŠ  d}d| v rt |  d¡ ¡ ƒ}|dk}|dk}i }tjjD ]}|d | v r0|  |d ¡||d < q| D ]}| | ||< q3|} | d j}|d d }d| }	|}
|	|
 }tj |d¡}tj	 
¡ }tj	 ¡ }tj	jdd	}tj	 ||¡}| d
d ¡}|d u r…tjj||dd}tjjjd dd|||d |d k||
d|||d}t|| ƒ}tj ¡ }dd„ }|r³dd„ }n|r¹dd„ }t|d||||d}|S )Nr   Úcontrol_typer   r   r   zy_embedder.mlp.0.weighté@   ztransformer_blocks.{}.)rú   rý   Trþ   é   i   )Úimg_sizeÚ
patch_sizeÚin_chansÚ
num_layersÚmain_model_doubler  Úattention_head_dimÚnum_attention_headsÚadm_in_channelsrƒ   rS   rã   c                 S   r    r!   r   r"   r   r   r   r$   2  r%   z&load_controlnet_sd35.<locals>.<lambda>c                 S   s   | d d d S )Néÿ   g      à?r   r"   r   r   r   r$   4  s    c                 S   s   d|  S )Nr   r   r"   r   r   r   r$   6  s    )r.   r*   rq   r|   r8   )Úroundrê   Úitemru   rŒ   ÚMMDIT_MAP_BASICr   r   r  rx   rï   ry   r  r  r–   r»   r  rî   Údit_embedderÚControlNetEmbedderr  r  r  r  )rô   rÜ   r#  Ú
canny_cnetÚ
depth_cnetr  rõ   Úy_emb_shapeÚdepthÚhidden_sizeÚ	num_headsÚhead_dimr  rq   rr   r  r|   rã   rt   r*   r8   ra   r   r   r   Úload_controlnet_sd35   s`   €



õ


r;  c              	   C   sf   t | |d\}}}}}}tjjjj|||d}t|| ƒ}tj ¡ }	g d¢}
t	|d|	|||
t
jd}|S )Nr  )rã   rƒ   rS   )Útext_embedding_maskÚencoder_hidden_states_t5Útext_embedding_mask_t5Úimage_meta_sizeÚstyleÚcos_cis_imgÚsin_cis_imgr   )r.   r*   rq   r|   r2   r3   )ró   ru   ÚldmÚhyditrF   ÚHunYuanControlNetr  r  ÚSDXLro   r   r   )Úcontrolnet_datarÜ   rè   rã   rq   r  r|   rr   rt   r*   r2   ra   r   r   r   Úload_controlnet_hunyuandit=  s   

rH  Fc                 C   sj   t | |d\}}}}}}tjjjjd||||dœ|j¤Ž}	| | ¡} t|	| ƒ}	ddg}
t	|	|||
d}|S )Nr  )Ú	mistolinerã   rƒ   rS   rp   Úguidance)rq   r|   r2   r   )
ró   ru   rC  ÚfluxrF   ÚControlNetFluxré   Úprocess_unet_state_dictr  ro   )rô   rI  rÜ   rè   rã   rq   r  r|   rr   rt   r2   ra   r   r   r   Ú$load_controlnet_flux_xlabs_mistolineH  s   "

rN  c              	   C   sÚ   t j | d¡}t||d\}}}}}}| D ]}	| |	 ||	< qd}
d}||v r-|| jd }
| d¡jd d }d}|d	kr?d
}t jjjj	dd
|
||||dœ|j
¤Ž}t||ƒ}t j ¡ }ddg}t|d|||||d}|S )Nrø   r  r   zcontrolnet_mode_embedder.weightzpos_embed_input.weightr   é   Fr  T)Úlatent_inputÚnum_union_modesr  rã   rƒ   rS   rp   rJ  ©r.   r*   r4   rq   r|   r2   r   )ru   r   r  ró   r   r–   rC  rK  rF   rL  ré   r  r  ÚFluxro   )rô   rÜ   r  rè   rã   rq   r  r|   rr   rõ   rQ  Ú
union_cnetr  r4   rt   r*   r2   ra   r   r   r   Úload_controlnet_flux_instantxQ  s$   &

rU  c              	   C   s˜   t | |d\}}}}}}|  d¡jd }d}	d}
|dkr"|d }	d}
tjjjjd|	|||d	œ|j¤Ž}t	|| ƒ}tj
 ¡ }g }t|d||
|||d
}|S )Nr  úcontrolnet_x_embedder.weightr   r   FéD   r$  T)Úextra_condition_channelsrã   rƒ   rS   rR  r   )ró   r–   r   ru   rC  Ú
qwen_imagerF   ÚQwenImageControlNetModelré   r  r  ÚWan21ro   )rô   rÜ   rè   rã   rq   r  r|   rr   r  rX  r4   rt   r*   r2   ra   r   r   r   Úload_controlnet_qwen_instantxi  s   "

r\  c                 C   sú   t j ¡ }t j | ¡}| d|¡}t j ||¡}| dd ¡}|d u r+t jj||dd}| d j	d }| d j	d }| d }	| d	 j	d }
t
d|	j	d t
d|
ƒ ƒ}t jjjj||||
d
dd|t j ¡ |d
}t|| ƒ}t j ¡ }t|d|d||g d}|S )NrS   rý   Trþ   úcontrol_img_in.weightr   r   z!control_blocks.0.attn.to_q.weightz#control_blocks.0.attn.norm_q.weighté   é<   )r   é   é   é$   é0   )
Úcontrol_in_featuresÚ	inner_dimr,  r+  Únum_control_blocksr*  Úinjection_layersrã   rƒ   rS   FrR  )ru   rx   rï   rŒ   rü   r–   r  r»   r  r   r¬   rC  rY  rF   ÚQwenImageFunControlNetModelry   r  r  r[  r©   )rô   rÜ   rq   rü   r  r|   rã   r±   re  Úblock_weightr+  r,  rD   r*   ra   r   r   r   Úload_controlnet_qwen_funz  sH   

ö

örj  c                 C   s   t j | ddi¡S )Nzsingle_controlnet_blocks.zcontrolnet_single_blocks.)ru   rŒ   Ústate_dict_prefix_replace)rô   r   r   r   Úconvert_mistoline¨  s   rl  c           (      C   s$  | }d|  ¡ v rt||dS d|v rt||dS d }d }d|v rëtj |¡}tj |¡}d|d< d|d< d	}d
}|raddg}	|	D ]}
d ||
¡}d ||
¡}||vrVd} n|||< q@|d7 }|s:d	}d
}|rŸddg}	|	D ]+}
|d	kryd |
¡}nd |d |
¡}d |d |
¡}||vr”d |
¡}d}|||< qm|d7 }|sgi }|D ]}||v r²| 	|¡||| < q£d|v rÖ|d j
d	 |d< t|  ¡ ƒD ]}| dd¡}| 	|¡||< qÆ|  ¡ }t|ƒd	krèt d |¡¡ |}nZd|v r'd|v rút||dS d|v rd|v r
t||dS t||dS d |v rt||dS d!|v r&t||dS nd"|v r7d#|v r7t||dS d$|v rEtt|ƒd
|d%S d&}d}d'}||v rWd
}|}d(}n||v r_d)}nt||d}|d u rot d*¡ |S |d u r†tj ||d
¡}t|jƒ}|j}| d+d ¡}|d u r«tj |¡}|d u r¢tj ¡ g}tjjd,||d-}tj  ¡ }tj !||¡}| d.d ¡}|d u rÉtj" #||¡}||d/< ||d+< tj $¡ |d0< | 	d1¡ |d2 |¡ j
d |d3< tj%j%j&d>i |¤Ž}|r[d4|v rA|d ur<tj '|g¡ | (¡ }|D ]-}d(}| )|¡r9d5 |t|ƒd … ¡} | |v r9|| }!|!||   *|!j+¡ ,|!j-¡7 }!qnt d6¡ G d7d8„ d8t.j/j0ƒ}"|"ƒ }#||#_1|#j2|dd9\}$}%n	|j2|dd9\}$}%t|$ƒd	krst d: |$¡¡ t|%ƒd	kr‚t 3d; |%¡¡ | d<d¡}&t&||&||d=}'|'S )?Nzafter_proj_list.18.biasr  rä   z(controlnet_cond_embedding.conv_in.weightzmiddle_block_out.0.weightzcontrolnet_mid_block.weightzmiddle_block_out.0.biaszcontrolnet_mid_block.biasr   Trå   ræ   zcontrolnet_down_blocks.{}{}zzero_convs.{}.0{}Fr   z#controlnet_cond_embedding.conv_in{}z%controlnet_cond_embedding.blocks.{}{}zinput_hint_block.{}{}r   z$controlnet_cond_embedding.conv_out{}z#control_add_embedding.linear_1.biasÚtask_embeddingÚ!union_controlnet_num_control_typez.attn.in_proj_z.attn.in_proj.zleftover keys: {}zcontrolnet_blocks.0.weightz,double_blocks.0.img_attn.norm.key_norm.scaler  z,transformer_blocks.0.adaLN_modulation.1.biasz.transformer_blocks.0.img_mlp.net.0.proj.weightrV  z"control_blocks.0.after_proj.weightr]  z!controlnet_blocks.0.linear.weight)rI  rÜ   z#control_model.zero_convs.0.0.weightzzero_convs.0.0.weightzcontrol_model.rø   z*error could not detect control model type.rS   r   rù   rý   rã   rƒ   rÍ   z{}input_hint_block.0.weightrÝ   Ú
differencezdiffusion_model.{}zPWARNING: Loaded a diff controlnet without a model. It will very likely not work.c                   @   rÞ   )z1load_controlnet_state_dict.<locals>.WeightsLoaderNrà   r   r   r   r   ÚWeightsLoader5  râ   rp  r  r	  r
  r,   r¥   r   )4ÚkeysrH  rÚ   ru   r   Úunet_config_from_diffusers_unetrŒ   Úunet_to_diffusersr  rê   r   r  Úreplacer?   r<   r=   rN  r;  r  r\  rU  rj  rl  Úload_t2i_adapterÚerrorr  r  ré   r–   rü   rx   r  rï   r  r»   r  ry   rî   ro   r‘   Úmodel_state_dictÚ
startswithrÃ   rS   r`   rƒ   r	   r½   rØ   rt   r  r  )(rð   rD   rÜ   rG  ró   r  Údiffusers_keysÚcountÚloopÚsuffixÚsÚk_inÚk_outr  rõ   Únew_kÚleftover_keysÚpth_keyÚpthrd   ÚprefixÚnetrè   r  rü   rq   r|   rã   rt   Úmodel_sdrh   Úc_mÚsd_keyÚcdrp  Úwr  r  r,   ra   r   r   r   Úload_controlnet_state_dict¬  s  
÷

ô€




ÿ














€ú
r‹  c                 C   sr   |  ¡ }d|vrtj | ¡d }| d¡s| d¡rd|d< ttjj| dd||d}|d u r7t	 
d | ¡¡ |S )	Nr,   r   Ú_shuffleÚ_shuffle_fp16T)Ú	safe_load)rD   rÜ   zCerror checkpoint does not contain controlnet or t2i adapter data {})r>   ÚosÚpathÚsplitextrò   r‹  ru   rŒ   Úload_torch_filer<   rv  r  )Ú	ckpt_pathrD   rÜ   ÚfilenameÚcnetr   r   r   Úload_controlnetG  s   r–  c                       s6   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡  ZS )Ú
T2IAdapterNc                    sD   t ƒ  ¡  || _|| _d | _|| _|| _|d u rtj 	¡ }|| _
d S r!   )rs   r;   Ú	t2i_modelÚchannels_inÚcontrol_inputr.   r/   ru   rx   rï   rƒ   )r:   r˜  r™  r.   r/   rƒ   r}   r   r   r;   T  s   


zT2IAdapter.__init__c                 C   s4   | j j}t || ¡| }t || ¡| }||fS r!   )r˜  Úunshuffle_amountrª   Úceil)r:   ÚwidthÚheightr›  r   r   r   Úscale_image_to_  s   zT2IAdapter.scale_image_toc                 C   sæ  d }| j d ur| j  |||||¡}| jd ur0|d | jd ks(|d | jd k r0|d ur.|S d S | jd u sQ|jd | j | jjd ksQ|jd | j | jjd krœ| jd urX| `d | _d | _|  |jd | j |jd | j ¡\}}tj	 
| j||| jd¡ ¡  | j¡| _| jdkrœ| jjd dkrœtj| jddd| _|jd | jjd kr²t| j|jd |ƒ| _| jd u rÕ| j |j¡ | j | j¡ |  | j |j¡¡| _| j ¡  i }	| jD ]}
ttdd	„ | j|
 ƒƒ|	|
< qÚ|  |	||j¡S )
Nr   r   r   rX   r   T)rY   c                 S   s   | d u rd S |   ¡ S r!   )rM   r"   r   r   r   r$   „  s    z(T2IAdapter.get_control.<locals>.<lambda>)r1   r‰   r-   r'   r   r.   rš  rŸ  ru   rŒ   r   r&   r/   r_   r`   rƒ   r™  r	   r\   r   r˜  rS   Úcpur  Úmaprk   )r:   rœ   r   rž   r   rŸ   rb   r  rž  rš  rõ   r   r   r   r‰   e  s8   

$B
(&


zT2IAdapter.get_controlc                 C   s$   t | j| j| j| jƒ}|  |¡ |S r!   )r—  r˜  r™  r.   r/   rP   rN   r   r   r   r>   ˆ  s   
zT2IAdapter.copyr!   )r   r   r   r;   rŸ  r‰   r>   r¨   r   r   r}   r   r—  S  s
    #r—  c              	   C   s6  d}d}d| v r| d } d| v rFi }t dƒD ]$}t dƒD ]}d |d | ¡|d ||¡< qd |d ¡|d	 |¡< qd
|d< tj | |¡} |  ¡ }d|v rb| d jd }tjjj	|g d¢dd}	nŒd|v r·| d jd }| d jd }
| d jd }d}t
tdd„ |ƒƒ}t|ƒdkrŽd}d}|dks˜|dkršd}tjjj||
|
d |
d |
d gd d… d|d||d}	n7d|v rÑtjjjj| d jd g d¢d}	d}d}nd|v rìtjjjj| d  jd d!g d¢d"}	d}d}nd S |	 | ¡\}}t|ƒdkrt d# |¡¡ t|ƒdkrt d$ |¡¡ t|	|	j||ƒS )%Nr   r   Úadapterz&adapter.body.0.resnets.0.block1.weightrO  r   zbody.{}.zadapter.body.{}.resnets.{}.zadapter.body.{}.rø   zadapter.zbody.0.in_conv.weightr   )i@  i€  é   r£  )ÚcinÚchannelsÚnums_rbzconv_in.weightr   zbody.0.block2.weightFc                 S   s
   |   d¡S )Nzdown_opt.op.weight)rò   r"   r   r   r   r$   ¥  s   
 z"load_t2i_adapter.<locals>.<lambda>Té   i   )r¤  r¥  r¦  ÚksizeÚskÚuse_convÚxlzbackbone.0.0.weight)r   rO  r   r`  é3   é7   é;   é?   )Úc_inÚproj_blocksé    Úbilinearzbackbone.10.blocks.0.weightzbackbone.0.weightÚlarge)r°  Úbottleneck_moder±  zt2i missing {}zt2i unexpected {})r[   r  ru   rŒ   rk  rq  r   Út2i_adapterr¢  ÚAdapter_lightr  Úfilterr?   ÚAdapterrC  ÚcascaderF   ro   r  r<   r=   r  r—  Úinput_channels)Út2i_datarÜ   r.   r/   Úprefix_replacerg   Újrq  r¤  Úmodel_adÚchannelr¨  rª  Ú	down_optsr«  r  r  r   r   r   ru    sV    :"$ru  )1Ú__doc__r	   Úenumr   rª   r  r<   Úcomfy.utilsru   Úcomfy.model_managementÚcomfy.model_detectionÚcomfy.model_patcherÚ	comfy.opsÚcomfy.latent_formatsÚcomfy.model_baseÚcomfy.cldm.cldmÚcomfy.t2i_adapter.adapterÚcomfy.ldm.cascade.controlnetÚcomfy.cldm.mmditÚcomfy.ldm.hydit.controlnetÚcomfy.ldm.flux.controlnetÚcomfy.ldm.qwen_image.controlnetÚcomfy.cldm.dit_embedderÚtypingr   Úcomfy.hooksr   r   r   r   ro   r©   r°   rÚ   ró   r  r  r  r;  rH  rN  rU  r\  rj  rl  r‹  r–  r—  ru  r   r   r   r   Ú<module>   s`     e?:=	. :