
    ^(ju                     F   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mZmZ d dlmZ d dlmZ  G d de j                  j$                        Z G d d	e j                  j$                        Z G d
 de j                  j$                        Zd Z G d d      Z G d d      Z G d d      Z G d d      Z G d de      Z G d d      Z G d d      Z G d de j                  j$                        Z G d dej>                        Z eeeee dZ!y)     N)nn)WanMultiTalkAttentionBlockMultiTalkAudioProjModel)io)
SUPIRPatchc                   ,     e Zd Zddef fdZd Z xZS )BlockWiseControlBlockdimc                 $   t         |           |j                  |d      | _        |j                  |d      | _        |j                  ||      | _        t        j                  j                         | _
        |j                  ||      | _        y )Ngư>)eps)super__init__RMSNormx_rmsy_rmsLinear
input_projtorchr   GELUactoutput_proj)selfr
   devicedtype
operations	__class__s        H/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_extras/nodes_model_patch.pyr   zBlockWiseControlBlock.__init__   sv    '''6
'''6
$++C588==?%,,S#6    c                     | j                  |      | j                  |      }}| j                  ||z         }| j                  |      }| j	                  |      }|S N)r   r   r   r   r   )r   xys      r   forwardzBlockWiseControlBlock.forward   sO    zz!}djjm1OOAE"HHQKQr   )   NNN)__name__
__module____qualname__intr   r#   __classcell__r   s   @r   r	   r	      s    7C 7r   r	   c            	       H     e Zd Z	 	 	 	 	 ddedededef fdZd Zd Z xZS )	QwenImageBlockWiseControlNet
num_layersin_dimadditional_in_dimr
   c                    t         	|           || _        |j                  ||z   |||      | _        t
        j                  j                  t        |      D cg c]  }t        ||||       c}      | _
        y c c}w )Nr   r   r   r   r   )r   r   r/   r   img_inr   r   
ModuleListranger	   controlnet_blocks)
r   r-   r.   r/   r
   r   r   r   _r   s
            r   r   z%QwenImageBlockWiseControlNet.__init__#   s     	!2 ''1B(BCPV^c'd!&!4!4 z**A &c&R\]*"
s   A=c                    t         j                  j                         j                  |d d d df         |d d d df<   d}t         j                  j
                  j                  |d||f      }|j                  }|j                  |d   |d   |d   dz  d|d   dz  d      }|j                  dddddd	      }|j                  |d   |d   dz  |d   dz  z  |d   dz        }| j                  |      S )
N         r            )comfylatent_formatsWan21
process_inldm
common_ditpad_to_patch_sizeshapeviewpermutereshaper3   )r   latent_image
patch_sizehidden_states
orig_shapes        r   process_input_latent_imagez7QwenImageBlockWiseControlNet.process_input_latent_image5   s   $3399;FF|TUWZXZWZTZG[\QV
		,,>>|aQ[]gMhi"((
%**:a=*Q-TV[\I\^_aklnaostatvwx%--aAq!Q?%--jmjnPQ>QV`acVdhiVi=jlvwxly|}l}~{{=))r   c                 .     | j                   |   ||      S r    )r6   )r   imgcontrolnet_conditioningblock_ids       r   control_blockz*QwenImageBlockWiseControlNet.control_block?   s    /t%%h/5LMMr   )<   @   r   r$   NNN)r%   r&   r'   r(   r   rP   rU   r)   r*   s   @r   r,   r,   "   sJ     !",0

 
 	

 
$*Nr   r,   c                        e Zd ZdZ	 	 	 	 	 	 ddededededef
 fdZd Zd	ej                  d
e
j                  de
j                  de
j                  dej                  dej                  fdZ xZS )SigLIPMultiFeatProjModela  
    SigLIP Multi-Feature Projection Model for processing style features from different layers
    and projecting them into a unified hidden space.

    Args:
        siglip_token_nums (int): Number of SigLIP tokens, default 257
        style_token_nums (int): Number of style tokens, default 256
        siglip_token_dims (int): Dimension of SigLIP tokens, default 1536
        hidden_size (int): Hidden layer size, default 3072
        context_layer_norm (bool): Whether to use context layer normalization, default False
    siglip_token_numsstyle_token_numssiglip_token_dimshidden_sizecontext_layer_normc	                 .   t         	|           t        j                  |j	                  ||      t        j
                               | _        |r|j                  |      nt        j                         | _	        |j	                  ||d      | _
        t        j                  |j	                  ||      t        j
                               | _        |r|j                  |      nt        j                         | _        |j	                  ||d      | _        t        j                  |j	                  ||      t        j
                               | _        |r|j                  |      nt        j                         | _        |j	                  ||d      | _        y )NT)bias)r   r   r   
Sequentialr   SiLUhigh_embedding_linear	LayerNormIdentityhigh_layer_normhigh_projectionmid_embedding_linearmid_layer_normmid_projectionlow_embedding_linearlow_layer_normlow_projection)
r   rZ   r[   r\   r]   r^   r   r   r   r   s
            r   r   z!SigLIPMultiFeatProjModel.__init__P   s`    	 &(]]/1ABGGI&
"
 8JJ  !23r{{} 	  *001BKVZ0[ %'MM/1ABGGI%
!
 8JJ  !23r{{} 	 )//0A;UY/Z %'MM/1ABGGI%
!
 8JJ  !23r{{} 	 )//0A;UY/Zr   c                    t        | j                  j                               j                  }| j	                  |d   | j                  | j
                  | j                  |      }| j	                  |d   | j                  | j                  | j                  |      }| j	                  |d   | j                  | j                  | j                  |      }t        j                  |||fd      S )a  
        Forward pass function

        Args:
            siglip_outputs: Output from SigLIP model, containing hidden_states

        Returns:
            torch.Tensor: Concatenated multi-layer features with shape [bs, 3*style_token_nums, hidden_size]
        r:   r;   r   r
   )nextrc   
parametersr   _process_layer_featuresrf   rg   rh   ri   rj   rk   rl   rm   r   cat)r   siglip_outputsr   high_embeddingmid_embeddinglow_embeddings         r   r#   z SigLIPMultiFeatProjModel.forwardy   s     T//::<=CC 551&&    
 441%%
 441%%
 yy.-GQOOr   rN   embedding_linear
layer_norm
projectionr   returnc                      ||j                  |      j                  dd            j                  dd      } ||      } ||      }|S )a  
        Helper function to process features from a single layer

        Args:
            hidden_states: Input hidden states [bs, seq_len, dim]
            embedding_linear: Embedding linear layer
            layer_norm: Layer normalization
            projection: Projection layer
            dtype: Target data type

        Returns:
            torch.Tensor: Processed features [bs, style_token_nums, hidden_size]
        r;   r:   )to	transpose)r   rN   rx   ry   rz   r   	embeddings          r   rr   z0SigLIPMultiFeatProjModel._process_layer_features   sU    , %U#--a3

)Aq/ 	
 y)	 y)	r   )i  rW   i  r$   TNNN)r%   r&   r'   __doc__r(   boolr   r#   r   Tensorr   Moduler   rr   r)   r*   s   @r   rY   rY   C   s    
 "% "!%#',0'['[ '[ 	'[
 '[ !'[R(PT ||  ))  II	 
 II  {{  
 r   rY   c                    ddddd}i }t        | j                               D ]  }| |   }|}|j                  d      r|g}|j                  d      r|gz   }7|j                  d      r/|gz   }t        j                  |d	
      }|j                  dd      }|j                         D ]  \  }}|j                  ||      } |||<    |S )Nz.attention.out.biasz.attention.k_norm.weightz.attention.q_norm.weightz.attention.out.weight)z.attention.to_out.0.biasz.attention.norm_k.weightz.attention.norm_q.weightz.attention.to_out.0.weightz.attention.to_k.weightz.attention.to_q.weightz.attention.to_v.weightr   ro   z.attention.qkv.weight)sortedkeysendswithr   rs   replaceitems)	sdreplace_keysout_sdkwk_outccrrrs	            r   z_image_convertr      s    0E0J0J2IL FBGGIqE>>23B>>23rB>>23qcB		"!$AMM":<STE!'')EArMM!R(E *u# & Mr   c                   2    e Zd Zed        ZdZdZdZdZd Z	y)ModelPatchLoaderc                 6    ddt        j                  d      fiiS )Nrequirednamemodel_patches)folder_pathsget_filename_listss    r   INPUT_TYPESzModelPatchLoader.INPUT_TYPES   s&    f|'E'Eo'V&Y   ! 	!r   MODEL_PATCHload_model_patchTzadvanced/loadersc           
          t        j                  d|      }t        j                  j	                  |d      }t        j                  j                  |      }d|v rZ|d   j                  d   dz
  }t        |t        j                  j                         |t        j                  j                        }nd	|v rht        j                  j                  |d
did      }t        t        j                  j                         |t        j                  j                        }nqd|v rt        |      }i }d|vrd|d<   d|d<   d|d<   d|v r@d|d<   d|d<   d|d<   |j                  dd       }|t!        j"                  |      dk(  rd|d<   t        j$                  j&                  j(                  j*                  d+t        j                  j                         |t        j                  j                  d|}nd|v ryt-        ddd|d   j                  d   |d   j                  d   |d   j                  d   t        j                  j                         t        j                  j                         }nd!|v sd"|v ri }	d!|v rd#|	d$<   d%|	d&<   n
d#|	d#<   d%|	d%<   d'}
i }t/        |j1                               D ]4  }|j3                  |
      s|j5                  |      ||t7        |
      d  <   6 t        j                  j                  ||	d      }|j5                  d(d        t        j$                  j8                  j:                  j=                  t        j                  j                         |t        j                  j                        }|r||_        t        j@                  jC                  t        j                  jE                         t        j                  j                         )      }|jG                  ||jI                         *       |fS ),Nr   T)	safe_loadz controlnet_blocks.0.y_rms.weightzimg_in.weightr;   rW   )r/   r   r   r   z$feature_embedder.mid_layer_norm.biaszfeature_embedder. )filter_keysr2   z!control_all_x_embedder.2-1.weightz*control_layers.4.adaLN_modulation.0.weightr?   n_control_layers   r/   refiner_controlz+control_layers.14.adaLN_modulation.0.weight   z)control_noise_refiner.0.after_proj.weightr   brokenzaudio_proj.proj1.weightr@       r>   z%blocks.0.audio_cross_attn.proj.weightzaudio_proj.norm.weight)audio_windowcontext_tokens	vae_scaler.   intermediate_dimout_dimr   r   z-model.control_model.input_hint_block.0.weightz'control_model.input_hint_block.0.weightzcontrol_model.zmodel.control_model.zproject_modules.z&model.diffusion_model.project_modules.z"first_stage_model.denoise_encoder.zcontrol_model.mask_LQ)load_deviceoffload_device)assign )%r   get_full_path_or_raiserA   utilsload_torch_fileweight_dtyperH   r,   model_managementunet_offload_deviceopsmanual_caststate_dict_prefix_replacerY   r   getr   count_nonzerorE   lumina
controlnetZImage_ControlMultiTalkModelPatchlistr   
startswithpoplensupirsupir_modulesSUPIRdenoise_encoder_sdmodel_patcherCoreModelPatcherget_torch_deviceload_state_dict
is_dynamic)r   r   model_patch_pathr   r   r/   modelconfig
ref_weightprefix_replace	de_prefixr   r   r   s                 r   r   z!ModelPatchLoader.load_model_patch   sH   '>>PTU[[(()9T(J((,-3 "? 3 9 9! <r A0CT]b]s]s  ^H  ^H  ^J  RW  di  dm  dm  dy  dy  zE3r966r<OQS;Tbf6gB,E4J4J4^4^4`hmz  {D  {D  {P  {P  QE0B6 $BF;2E-.)*.0*+,0()<B-/)*.0*+,0()VV$OQUV
)**:6!;+/x(II$$//>>  meF\F\FpFpFrz  MR  MV  MV  Mb  Mb  m  fl  mE&",'!"2EFLLQO%'(A%B%H%H%K78>>qA 11EEG$yy446E =BFosuFuN>"D9I56K]GH3C/05G12 =I!#"'')_<<	*=?VVAY&qY'9: % 66r>W[6\BFF*D1IIOO1177u?U?U?i?i?ksx  FK  FO  FO  F[  F[7  \E!+=(++<<UPUPfPfPwPwPy  KP  Ka  Ka  Ku  Ku  Kw<  xb)A)A)CDr   N)
r%   r&   r'   classmethodr   RETURN_TYPESFUNCTIONEXPERIMENTALCATEGORYr   r   r   r   r   r      s/    ! ! $L!HL!H; r   r   c                   ,    e Zd ZddZd Zd Zd Zd Zy)DiffSynthCnetPatchNc                     || _         || _        || _        || _        || _        |j
                  j                  | j                  |            | _        |j                  d   |j                  d   f| _
        y )Nr;   r:   )model_patchvaeimagestrengthmaskr   rP   encode_latent_condencoded_imagerH   encoded_image_size)r   r   r   r   r   r   s         r   r   zDiffSynthCnetPatch.__init__,  sh    &
 	(..II$JaJabgJhi#(;;q>5;;q>"Br   c                    | j                   j                  |      }| j                  j                  j                  dkD  r| j
                  @t        j                  |      d d d | j                  j                  j                  dz  f   }nXt        j                  j                  | j
                  j                  dd      |j                  d   |j                  d   dd	      }t        j                  ||gd
      S |S )Nr   r>   r;   Tr
   keepdimr=   r<   bilinearnonero   )r   encoder   r   r/   r   r   	ones_likerA   r   common_upscalemeanrH   rs   )r   r   rL   mask_s       r   r   z%DiffSynthCnetPatch.encode_latent_cond5  s    xxu-!!33a7yy 5a9g$:J:J:P:P:b:bfg:g9g6gh22499>>aQU>3VXdXjXjkmXnp|  qC  qC  DF  qG  IS  U[  \99lE2::r   c           
      t   |j                  d      }|j                  d      }|j                  d      }| j                  j                         }| j                  2| j                  |j
                  d   |z  |j
                  d   |z  fk7  rt        j                  j                  | j                  j                  dd      |j
                  d   |z  |j
                  d   |z  dd      }t        j                  j                  d	
      }| j                  j                  j                  | j!                  |j                  dd                  | _        |j
                  d   |j
                  d   f| _        t        j                  j#                  |       |d d d | j                  j
                  d   fxx   | j                  j                  j%                  |d d d | j                  j
                  d   f   | j                  j'                  |j(                        |      | j*                  z  z  cc<   ||d<   |S )Nr!   rR   block_indexr<   r=   r;   areacenterTonly_currently_used)r   r   spacial_compression_encoder   r   rH   rA   r   r   r   movedimr   loaded_modelsr   r   rP   r   load_models_gpurU   r}   r   r   )r   kwargsr!   rR   r   spacial_compressionimage_scaledr   s           r   __call__zDiffSynthCnetPatch.__call__A  sq   JJsOjjjj/"hhAAC%)@)@QWWR[SfEfhihohoprhs  wJ  iJ  EK  *K ;;55djj6H6HQ6OQRQXQXY[Q\_rQrtut{t{|~t  CV  uV  X^  `h  iL!22@@UY@ZM!%!1!1!7!7!R!RSWSjSjkwkk  AB  DF  lG  TH  "ID'3'9'9"'=|?Q?QRT?U&VD#""22=AA+""((+++,1A1A1G1G1U1UVYZ[]y^b^p^p^v^vwx^y]yZyVz  }A  }O  }O  }R  }R  SV  S\  S\  }]  _j  2k  nr  n{  n{  2{  	|,ur   c                 z    t        |t        j                        r | j                  j	                  |      | _        | S r    
isinstancer   r   r   r}   r   device_or_dtypes     r   r}   zDiffSynthCnetPatch.toQ  .    ou||4!%!3!3!6!6!GDr   c                     | j                   gS r    r   r   s    r   modelszDiffSynthCnetPatch.modelsV        !!r   r    r%   r&   r'   r   r   r   r}   r  r   r   r   r   r   +  s    C
  
"r   r   c                   .    e Zd ZddZddZd Zd Zd Zy)ZImageControlPatchNc                    || _         || _        || _        || _        || _        || _        | j                   j                  j                  dkD  | _        d}| j                  ;| j                  /| j                  j                  | j                  j                  k7  rd}|rd | _
        d | _        y | j                  | j                  | j                        | _
        | j                  ?| j                  j                  d   | j                  j                  d   f| _        d | _        y | j                  j                  d   | j                  j                  d   f| _        d | _        y )Nr   FTr;   r:   )r   r   r   inpaint_imager   r   r   r/   
is_inpaintrH   r   r   r   	temp_data)r   r   r   r   r   r  r   skip_encodings           r   r   zZImageControlPatch.__init__Z  s6   &
*	 **00BBQF::!d&8&8&Dzz4#5#5#;#;; $!%D  "&!8!8TEWEW!XDzz!+/+=+=+C+CA+FHZHZH`H`abHc*d'  ,0::+;+;A+>

@P@PQR@S*T'r   c           	         d }|Ft         j                  j                         j                  | j                  j                  |            }| j                  r|t        j                  |      dz  }| j                  t         j                  j                  | j                  j                  | j                  j                  d   d| j                  j                  d   | j                  j                  d         j                  dd      |j                  d   |j                  d   d	d
      }|dz
  |j                  dd      j!                         z  dz   }t         j                  j                         j                  | j                  j                  |            }| j                  t        j"                  |      d d d df   }nt         j                  j                  | j                  j                  | j                  j                  d   d| j                  j                  d   | j                  j                  d         j                  dd      j%                  |j&                        |j                  d   |j                  d   dd
      }|\t         j                  j                         j                  | j                  j                  t        j                  |      dz              }t        j(                  |||gd      S |S )Ng      ?r   r=   r<   r;   Tr   r   r   )r   nearestro   )rA   rB   FluxrD   r   r   r  r   r   r   r   r   rI   rH   r   r   round
zeros_liker}   r   rs   )r   control_imager  rL   mask_inpaintinpaint_image_latentr   s          r   r   z%ZImageControlPatch.encode_latent_condr  sG   $ //446AA$((//R_B`aL??$ % > Dyy$${{99$))..YZI[]_aeajajapapqsatvzvv  wF  wF  GI  wJ  ;K  ;P  ;P  UV  `d  ;P  ;e  gt  gz  gz  {}  g~  @M  @S  @S  TV  @W  Yc  em   n"/#"59M9MaQS9T9Z9Z9\!\`c c#(#7#7#<#<#>#I#I$((//ZgJh#i yy (()=>q"1"uE22499>>$))//RSBTVXZ^ZcZcZiZijlZmosoxoxo~o~  @B  pC  4D  4I  4I  NO  Y]  4I  4^  4a  4a  i}  iD  iD  4a  4E  G[  Ga  Ga  bd  Ge  g{  gA  gA  BD  gE  GP  RZ  [#$3388:EEdhhooV[VeVefsVtwzVzF{|99lE3GHaPPr   c           
      v   |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  dd	      }	| j                  j                         }
| j                  2| j                  |j
                  d
   |
z  |j
                  d   |
z  fk7  rd }| j                  t        j                  j                  | j                  j                  dd      |j
                  d   |
z  |j
                  d
   |
z  dd      j                  dd      }|j
                  d   |j
                  d
   f| _        d }| j                  t        j                  j                  | j                  j                  dd      |j
                  d   |
z  |j
                  d
   |
z  dd      j                  dd      }|j
                  d   |j
                  d
   f| _        t        j                  j                  d      }| j                  ||      | _        t        j                  j                  |       | j                   j"                  j$                  }t'        d|z        }||z  }||z  }|j)                  d       |j)                  d       ||dz
  kD  r	d | _        |S | j*                  | j*                  d   |kD  r|	dk(  rKdd | j                   j#                  || j                  j-                  |j.                        ||      ff| _        nJdd | j                   j#                  || j                  j-                  |j.                        ||      ff| _        |	dk(  r| j*                  d   dz   }|| j                   j"                  j1                  || j*                  d   d   |d d d | j*                  d   d   j
                  d   f   d ||      f| _        | j*                  d   d   M|d d d | j*                  d   d   j
                  d   fxx   | j*                  d   d   | j2                  z  z  cc<   |S | j*                  d   |k  r| j*                  d   dz   |k  r| j*                  d   dz   }|| j                   j"                  j5                  || j*                  d   d   |d d d | j*                  d   d   j
                  d   f   d ||      f| _        | j*                  d   |k  r| j*                  d   dz   |k  r|| j*                  d   k(  ri|d d d | j*                  d   d   j
                  d   fxx   | j*                  d   d   | j2                  z  z  cc<   || j*                  d   dz   k(  rd | _        |S )Nr!   rR   	img_inputtxtpevecr   
block_typer   r<   r=   r;   r   r   r  Tr      r   noise_refiner)r   r   r   r   r   rH   r   rA   r   r   r   r  r   r   r   r   r   r   r   r  r   r  r}   r   forward_noise_refiner_blockr   forward_control_block)r   r   r!   rR   r  r  r  r  r   r   r   r   inpaint_scaledr   cnet_blocksdiv
cnet_indexcnet_index_float
next_layers                      r   r   zZImageControlPatch.__call__  s   JJsOjjJJ{+	jjZZjjjj/ZZb1
"hhAAC%)@)@QWWR[SfEfhihohoprhs  wJ  iJ  EK  *KLzz%${{99$**:L:LRQR:SUVU\U\]_U`cvUvxyxx  AC  yD  GZ  yZ  \b  dl   m   u   u  vw  y{   |+7+=+=b+A<CUCUVXCY*Z'!N!!-!&!;!;D<N<N<V<VWY[\<]_`_f_fgi_j  nA  `A  CD  CJ  CJ  KM  CN  Qd  Cd  fl  nv  "w  "  "  @A  CE  "F+9+?+?+C^EYEYZ\E]*^'!22@@UY@ZM!%!8!8~!VD""22=A&&,,==B$%!S(
'#-

5

5{Q/!DNM>>!T^^A%6%C_,"$tT-=-=-C-CCI[I[I^I^_b_h_hIikmor-s&t!u"$tT-=-=-C-CCI[I[I^I^_b_h_hIikmor-s&t!u(*Q.J($*:*:*@*@*\*\]hjnjxjxyzj{|}j~  AJ  KL  Nl  OS  O]  O]  ^_  O`  ab  Oc  Oi  Oi  jk  Ol  Nl  Kl  Am  os  uw  y|  +}  ~DN~~a #/A5q)!,22155564>>!;LQ;ORVR_R_;_`6  ..#j0dnnQ6G!6K{5Z!^^A.2
",d.>.>.D.D.Z.Z[egkguguvwgxyzg{  ~G  HI  Ki  LP  LZ  LZ  [\  L]  ^_  L`  Lf  Lf  gh  Li  Ki  Hi  ~j  lp  rt  vy  /z  "{ ..#j0dnnQ6G!6K{5Z  4>>!#44A5q)!,22155564>>!;LQ;ORVR_R_;_`6$.."3a"77%)DNr   c                     t        |t        j                        r3| j                   | j                  j	                  |      | _        d | _        | S r    )r  r   r   r   r}   r  r  s     r   r}   zZImageControlPatch.to  sA    ou||4!!-%)%7%7%:%:?%K"!DNr   c                     | j                   gS r    r  r  s    r   r  zZImageControlPatch.models  r	  r   )NNr
  r   r   r   r  r  Y  s    0 6;z"r   r  c                   4    e Zd Zed        ZdZdZdZdZddZ	y)	QwenImageDiffsynthControlnetc           
      *    ddddddddd	d
fdddidS )NMODELr   VAEIMAGEFLOAT      ?      $      $@{Gz?defaultminmaxstep)r   r   r   r   r   r   MASKr   optionalr   r   s    r   r   z(QwenImageDiffsynthControlnet.INPUT_TYPES  s:    '1-=%-'1+2EZ^hl4m*n	  $Y/1 	1r   r0  diffsynth_controlnetTzadvanced/loaders/qwenNc           	      .   |j                         }||d d d d d d d df   }||d d d d d d d df   }|E|j                  dk(  r|j                  d      }|j                  dk(  r|j                  d      }d|z
  }t        |j                  t
        j                  j                  j                  j                        r6t        ||||||      }	|j                  |	       |j                  |	       |fS |j                  t        |||||             |fS )Nr?   r;   r>   r:   r7  )r  r   )clonendim	unsqueezer  r   rA   rE   r   r   r   r  set_model_noise_refiner_patchset_model_double_block_patchr   )
r   r   r   r   r   r   r  r   model_patchedpatchs
             r   rD  z1QwenImageDiffsynthControlnet.diffsynth_controlnet  s   !Q2A2+&E$)!Q2A2+6MyyA~~~a(yyA~~~a(:Dk'')9)9)D)D)S)ST&{CXelpqE77>66u=  667I+WZ\ackmq7rsr   )Nr7  NN)
r%   r&   r'   r   r   r   r   r   r   rD  r   r   r   r.  r.    s/    1 1 L%HL&H r   r.  c                        e Zd Zed        ZdZy)ZImageFunControlnetc           	      ,    ddddddddd	fd
dddddS )Nr0  r   r2  r6  r7  r8  r9  r:  r;  )r   r   r   r   r4  r@  )r   r  r   rB  r   r   s    r   r   zZImageFunControlnet.INPUT_TYPES  s<    '1-=%-+2EZ^hl4m*n 
 '1:W`ac 	cr   zadvanced/loaders/zimageN)r%   r&   r'   r   r   r   r   r   r   rN  rN    s    c c )Hr   rN  c                   $    e Zd Zd Zd Zd Zd Zy)UsoStyleProjectorPatchc                      || _         || _        y r    )r   r   )r   r   r   s      r   r   zUsoStyleProjectorPatch.__init__  s    &*r   c           	         |j                  d      }|j                  d      }| j                  j                  | j                  j	                  |j
                              j	                  |j
                        }t        j                  ||gd      }||d<   t        j                  t        j                  |j                  d   |j                  d   d|j
                  |j                        |gd      |d<   |S )Ntxt_idsr  r;   ro   r   r?   )r   r   )r   r   r   r   r}   r   r   rs   zerosrH   r   )r   r   rT  r  siglip_embeddings        r   r   zUsoStyleProjectorPatch.__call__
  s    **Y'jj++11$2D2D2G2G		2RSVVWZW`W`aii)3/Q7u!IIu{{3C3I3I!3LN^NdNdefNgijryrr  IP  IW  IW  (X  Za  'b  hi  jyr   c                 z    t        |t        j                        r | j                  j	                  |      | _        | S r    r   r  s     r   r}   zUsoStyleProjectorPatch.to  r  r   c                     | j                   gS r    r  r  s    r   r  zUsoStyleProjectorPatch.models  r	  r   N)r%   r&   r'   r   r   r}   r  r   r   r   rQ  rQ    s    +
"r   rQ  c                   2    e Zd Zed        ZdZdZdZdZd Z	y)USOStyleReferencec                     dddddiS )Nr   r0  r   )CLIP_VISION_OUTPUT)r   r   clip_vision_outputr   r   s    r   r   zUSOStyleReference.INPUT_TYPES  s    j,<3K  ! 	!r   r0  apply_patchTzmodel/patch/fluxc                     t        j                  |j                  d d df   |j                  d d df   |j                  f      }|j	                         }|j                  t        ||             |fS )Nii)r   stackall_hidden_statespenultimate_hidden_statesrF  set_model_post_input_patchrQ  )r   r   r   r]  r   rK  s         r   r^  zUSOStyleReference.apply_patch)  s~    %7%I%I!S&%QSeSwSwxy{~x~S  BT  Bn  Bn  %o  p001GUb1cdr   N)
r%   r&   r'   r   r   r   r   r   r   r^  r   r   r   rZ  rZ    s/    ! !
 LHL!H r   rZ  c                   N     e Zd Z	 	 	 	 	 	 	 	 d	dededededededef fdZ xZS )
r   r   r   r.   r   r   r   r-   c                     t         |           t        |||z   dz
  |||||	|
      | _        t        j
                  j                  t        |      D cg c]  }t        ||||	|
       c}      | _	        y c c}w )Nr;   )seq_len
seq_len_vfr   r   r   r   r   r   r2   )
r   r   r   
audio_projr   r   r4   r5   r   blocks)r   r   r   r.   r   r   r   r-   r   r   r   r7   r   s               r   r   zMultiTalkModelPatch.__init__1  s     	1$'	1!3!1-%	
 hh)) z**A +676QVcmn*
s   A8)
r@   i   i   i   r   r>   (   NNN)r%   r&   r'   r(   r   r)   r*   s   @r   r   r   0  sk      # ,0

 
 	

 
 
 
 
 
r   r   c                   0   e Zd Zedej
                  fd       Zed        Zedej                  j                  dej                  j                  dej                  j                  dej                  j                  ded	ed
ededej                  fd       Zy)
SUPIRApplyr{   c                    t        j                  dddt         j                  j                  d      t         j                  j                  d      t         j
                  j                  d      t         j                  j                  d      t         j                  j                  dd	d
ddd      t         j                  j                  dd	d
ddd      t         j                  j                  ddd
dddd      t         j                  j                  ddd
d	ddd      gt         j                  j                         g      S )Nrl  zmodel/patch/supirTr   r   r   r   strength_startr7          r9  r:  z7Control strength at the start of sampling (high sigma).)r<  r=  r>  r?  tooltipstrength_endzVControl strength at the end of sampling (low sigma). Linearly interpolated from start.restore_cfgg      @g      4@g?zaPulls denoised output toward the input latent. Higher = stronger fidelity to input. 0 to disable.)r<  r=  r>  r?  advancedrp  restore_cfg_s_tming?z4Sigma threshold below which restore_cfg is disabled.)node_idcategoryis_experimentalinputsoutputs)	r   SchemaModelInput
ModelPatchVaeImageFloatOutput)clss    r   define_schemazSUPIRApply.define_schemaQ  s   yy ( w'##M2U#w'/#4VZ'`  b~sTX'  A}csSVae (K  L3TsPSZ^im']  _ XX__&'%
 	
r   c                 x   t        |j                  dd      }|s|j                  |      S |j                  }|j	                         |_        |j                         D ci c]  \  }}d| |f }}}|j                  j                  |dd       	 |j                  |      ||_        S c c}}w # ||_        w xY w)zHEncode using denoise_encoder weights from SUPIR checkpoint if available.r   Nzencoder.r7  ro  )strength_patchstrength_model)getattrr   r   patcherrF  r   add_patches)	r  r   r   r   
denoise_sdorig_patcherr   vpatchess	            r   _encode_with_denoise_encoderz'SUPIRApply._encode_with_denoise_encoderh  s     [..0DdK
::e$$ {{"((*4>4D4D4FG4FDAqXaS>A4'4FGCP	'::e$&CK H
 'CKs   B*B0 0	B9r   r   r   r   rn  rq  rr  rt  c                <   |j                         }	|j                  d      j                  | j                  |||d d d d d d d df               }
t	        ||j
                  j                  |
||      }|j                  |	       dkD  r{|j                  d      }|j                  |j                  |
            }|j                  |j                  |d d d d d d d df               dfd}|	j                  |       t        j                  |	      S )Nlatent_formatr?   ro  gB>٬:-@c                 \   | d   }| d   }|j                         dkD  r|d   j                         }n|j                         }|	kD  rj                  |j                  |j                        }|j
                  d   }|j
                  d   |k7  r`|j
                  d   dk(  r|j                  |ddd      n9|j                  ||j
                  d   z   dz
  |j
                  d   z  ddd      d | }|j                         dkD  r|j                  dddd      n|}||z
  }|||
z  z  z  z
  }|S )Ndenoisedsigmar   r1   r;   r=   )	r
   itemr}   r   r   rH   expandrepeatrI   )argsr  r  r   refb	sigma_vald_centerrr  rt  	sigma_maxx_centers           r   restore_cfg_functionz0SUPIRApply.execute.<locals>.restore_cfg_function  sg   
+W99;?aA

A))"++X__HNN+SC q)Ayy|q(;>99Q<1;LcjjBB7RUR\R\^_bebkbklmbn^nqr^rwz  xA  xA  BC  xD  ^D  FG  IJ  LM  SN  OQ  PQ  SR;@99;?

2q!Q 7PUI'#~H'(y97LQ\6\*]]Hr   )rF  get_model_objectrD   r  r   r   project_modulesregisterdecodeprocess_outr   #set_model_sampler_post_cfg_functionr   
NodeOutput)r  r   r   r   r   rn  rq  rr  rt  rK  hint_latentrL  r  decodedr  r  r  s          ``      @@r   executezSUPIRApply.executey  s     ,,_=HH,,S+uQ1bqb[?QRT;(9(9(I(I;Xfhtu}%!22?CMjj!:!:;!GHG$//

71aBQB;;O0PQHI " ==>RS}}]++r   N)r%   r&   r'   r   r   rz  r  r  r{  Typer}  r~  r  floatr  r  r   r   r   rl  rl  P  s    
bii 
 
, ' '  ",rxx}} ",2==;M;M ",TVTZTZT_T_ ",hjhphphuhu ", %",5:",IN",di",npn{n{", ",r   rl  )r   r.  rN  rZ  rl  )"r   r   r   comfy.utilsrA   	comfy.opscomfy.model_managementcomfy.ldm.common_ditcomfy.latent_formatscomfy.ldm.lumina.controlnetcomfy.ldm.supir.supir_modulescomfy.ldm.wan.model_multitalkr   r   comfy_api.latestr   comfy.ldm.supir.supir_patchr   r   r	   r,   rY   r   r   r   r  r.  rN  rQ  rZ  r   	ComfyNoderl  NODE_CLASS_MAPPINGSr   r   r   <module>r     s           " $ ]  2EHHOO $N588?? NB@uxx @D:F  F R," ,"\y" y"v#  # J
)6 
)" ".   (
%((// 
@L, L,` )$@.* r   