
    +j                     x   S SK r S SKJr  S SKrS SKrS SKrS SKrS SKJ	r	  S SK
JrJr  SSSSSS	S
SSSS.
r " S S\R                  5      r " S S\R                  5      r " S S\R"                  R$                  5      r " S S\R(                  5      r " S S\R(                  5      r " S S\5      rS\4S jrg)    N)override)ComfyExtensionio      i               i   
quick_geluclip_vision_model)
hidden_size
image_sizeintermediate_sizenum_attention_headsnum_channelsnum_hidden_layers
patch_sizeprojection_dim
hidden_act
model_typec                   J   ^  \ rS rSrS\R
                  4U 4S jjrS rSrU =r	$ )MLPr
   Tc                   > [         TU ]  5         U(       a  X:X  d   eUR                  U5      U l        UR	                  X5      U l        UR	                  X25      U l        X@l        [        R                  " 5       U l
        g N)super__init__	LayerNorm	layernormLinearfc1fc2use_residualnnGELUact_fn)selfin_dimout_dim
hidden_dimr#   
operations	__class__s         =/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_photomaker.pyr   MLP.__init__   sf    $$$#--f5$$V8$$Z9(ggi    c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  X-   nU$ r   )r   r!   r&   r"   r#   )r'   xresiduals      r-   forwardMLP.forward#   sQ    NN1HHQKKKNHHQKAr/   )r&   r!   r"   r   r#   )
__name__
__module____qualname____firstlineno__comfyopsr   r3   __static_attributes____classcell__r,   s   @r-   r   r      s    AERWR[R[   r/   r   c                   P   ^  \ rS rSrU 4S jrS rS\R                  4S jrSr	U =r
$ )
FuseModule.   c                    > [         TU ]  5         [        US-  XSUS9U l        [        XUSUS9U l        UR                  U5      U l        g )N   F)r#   r+   T)r   r   r   mlp1mlp2r   
layer_norm)r'   	embed_dimr+   r,   s      r-   r   FuseModule.__init__/   sJ    	Ay%\fg		idWab	$..y9r/   c                     [         R                  " X/SS9nU R                  U5      U-   nU R                  U5      nU R	                  U5      nU$ )Ndim)torchcatrC   rD   rE   )r'   prompt_embeds	id_embedsstacked_id_embedss       r-   fuse_fnFuseModule.fuse_fn5   sQ    !II}&@bI II&78=H II&78 OO,=>  r/   returnc                 v   UR                  UR                  5      nUR                  5       R                  S5      nUR                  S S u  pVUR                  S   nUR                  SUR                  S   UR                  S   5      n[        R                  " XhR                  S9S S S 24   US S 2S 4   :  n	XR                  5          n
UR                  SUR                  S   5      nUR                  S5      nU
R                  SU
R                  S   5      n
X   nU R                  X5      nUR                  5       UR                  S   :X  d'   UR                  5        SUR                  S    35       eUR                  US S 2S 4   UR                  UR                  5      5        UR                  XWS5      nU$ )Nr   rB      rI   )devicez != )todtypesum	unsqueezeshapeviewrL   arangerW   flattenrQ   masked_scatter_)r'   rN   rO   class_tokens_mask
num_inputs
batch_sizemax_num_inputs
seq_lengthflat_id_embedsvalid_id_maskvalid_id_embedsimage_token_embedsrP   updated_prompt_embedss                 r-   r3   FuseModule.forward<   s    LL!4!45	&**,66q9
%.__Ra%8"
"((+
"	#Y__R%8

 LL0E0EFtQwOD!" 	 ))>)>)@A%**2}/B/B2/FG-2226)..r?3H3H3LM*= LL);M $$&*;*A*A!*DD  	CIZI^I^I`Haaefwf}f}~  gA  fB  GC  	CD%%&74&@BSBVBVWdWjWjBkl - 2 2:2 N$$r/   )rE   rC   rD   )r5   r6   r7   r8   r   rQ   rL   Tensorr3   r;   r<   r=   s   @r-   r?   r?   .   s%    :! %
 
 %  %r/   r?   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )PhotoMakerIDEncoder^   c                   > [         R                  R                  5       U l        [         R                  R	                  5       n[         R                  R                  U R                  5      n[        TU ]  [        X![         R                  R                  5        [         R                  R                  R                  SSSS9U l        [        S[         R                  R                  5      U l        g )Nr   i   F)biasi   )r9   model_managementtext_encoder_deviceload_devicetext_encoder_offload_devicetext_encoder_dtyper   r   VISION_CONFIG_DICTr:   manual_castr    visual_projection_2r?   fuse_module)r'   offload_devicerY   r,   s      r-   r   PhotoMakerIDEncoder.__init___   s     11EEG//KKM&&99$:J:JK+UEIIDYDYZ#(99#8#8#?#?dQV#?#W %dEII,A,ABr/   c                 X   UR                   u  pEpgnUR                  XE-  XgU5      nU R                  U5      S   n	U R                  U	5      n
U R	                  U	5      nU
R                  XESS5      n
UR                  XESS5      n[
        R                  " X4SS9n
U R                  X*U5      nU$ )NrB   rU   rI   rJ   )r\   r]   vision_modelvisual_projectionry   rL   rM   rz   )r'   id_pixel_valuesrN   ra   brb   chwshared_id_embedsrO   id_embeds_2rj   s                r-   r3   PhotoMakerIDEncoder.forwardh   s    !0!6!6qQ)..q~qQG,,_=a@**+;<	../?@NN1!R8	!&&qa<IIy6B?	 $ 0 0K\ ]$$r/   )rz   rt   ry   )r5   r6   r7   r8   r   r3   r;   r<   r=   s   @r-   rn   rn   ^   s    C% %r/   rn   c                   4    \ rS rSr\S 5       r\S 5       rSrg)PhotoMakerLoadery   c           
          [         R                  " SS[         R                  R                  S[        R
                  " S5      S9/[         R                  R                  5       /SS9$ )Nr   experimental/photomakerphotomaker_model_name
photomaker)optionsTnode_idcategoryinputsoutputsis_experimental)r   SchemaComboInputfolder_pathsget_filename_list
PhotomakerOutputclss    r-   define_schemaPhotoMakerLoader.define_schemaz   s[    yy&.6@^@^_k@lm $$& !

 
	
r/   c                     [         R                  " SU5      n[        5       n[        R                  R                  USS9nSU;   a  US   nUR                  U5        [        R                  " U5      $ )Nr   T)	safe_load
id_encoder)	r   get_full_path_or_raisern   r9   utilsload_torch_fileload_state_dictr   
NodeOutput)r   r   photomaker_model_pathphotomaker_modeldatas        r-   executePhotoMakerLoader.execute   si     , C CLRg h.0{{**+@D*Q4%D((.}}-..r/    Nr5   r6   r7   r8   classmethodr   r   r;   r   r/   r-   r   r   y   s(    
 
 / /r/   r   c                   4    \ rS rSr\S 5       r\S 5       rSrg)PhotoMakerEncode   c                 ^   [         R                  " SS[         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  S5      [         R                  R                  SSSSS	9/[         R                  R                  5       /SS
9$ )Nr   r   r   imagecliptextTzphotograph of photomaker)	multilinedynamic_promptsdefaultr   )	r   r   r   r   ImageClipStringConditioningr   r   s    r-   r   PhotoMakerEncode.define_schema   s    yy&.##L1w'f%		$Vpq	 &&( !
 	
r/   c           
        ^ Sn[         R                  R                  UR                  UR                  5      5      R                  5       n UR                  S5      R                  U5      S-   mUR                  USS9n0 nU H  n	/ X'   Xy    Hu  n
[        [        U4S jU
5      5      n[        U5      [        U
5      :  a.  UR                  U
S   5        [        U5      [        U
5      :  a  M.  X   R                  U5        Mw     M     UR                  USS9u  pTS	:  a  TS-
  nSn[        S
5       Vs/ s H  nUUs=::  a  X-   :  a  O  OSOSPM     nnU" UR!                  S	5      UR                  UR                  5      ["        R$                  " U["        R&                  UR                  S9R!                  S	5      S9nOUn[(        R*                  " USU0//5      $ ! [         a    Sm GNf = fs  snf )Nr    rU   rI   T)return_word_idsc                    > U S   T:g  $ )NrB   r   )r1   indexs    r-   <lambda>*PhotoMakerEncode.execute.<locals>.<lambda>   s    !A$%-r/   )return_pooledr   M   F)rY   rW   )r   rN   ra   pooled_output)r9   clip_visionclip_preprocessrX   rt   floatsplitr   
ValueErrortokenizelistfilterlenappendencode_from_tokensranger[   rL   tensorboolr   r   )r   r   r   r   r   special_tokenpixel_valuestokens
out_tokensktfcondpooledtoken_indexnum_id_imagesira   outr   s                      @r-   r   PhotoMakerEncode.execute   s   $((88*BXBX9YZ``b	JJsO))-81<E tT:
AJMY 7;<!fs1voHHQrUO !fs1vo$$Q'	   ..z.N19!)KMjoprjs tjsef)UK<U)U[`!`js t\-C-CA-FVZV]V]^h^t^tVu.3ll;LTYT^T^gqg}g}.~  /I  /I  JK  /LMC C}}s_f$=>?@@/  	E	" !us   #G! 6 G4!G10G1r   Nr   r   r/   r-   r   r      s*    
 
  A Ar/   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)PhotomakerExtension   rS   c                 "   #    [         [        /$ 7fr   )r   r   )r'   s    r-   get_node_list!PhotomakerExtension.get_node_list   s      
 	
s   r   N)r5   r6   r7   r8   r   r   typer   	ComfyNoder   r;   r   r/   r-   r   r      s)    
T$r||*<%= 
 
r/   r   rS   c                     #    [        5       $ 7fr   )r   r   r/   r-   comfy_entrypointr      s       s   )rL   torch.nnr$   r   comfy.clip_modelr9   comfy.clip_vision	comfy.opstyping_extensionsr   comfy_api.latestr   r   rw   Moduler   r?   
clip_modelCLIPVisionModelProjectionrn   r   r   r   r   r   r   r/   r-   <module>r      s          & / % ")) ,.% .%`%%**DD %6/r|| /4/Ar|| /Ad
. 
! 3 !r/   