
    +j                     `   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m	Z	 d dl
mZmZ dddddd	d
dddd
Z G d dej                  Z G d dej                  Z G d dej        j                  Z G d dej                  Z G d dej                  Z G d de          ZdefdZdS )    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                   4     e Zd Zdej        f fd	Zd Z xZS )MLPTc                 :   t                                                       |r||k    sJ |                    |          | _        |                    ||          | _        |                    ||          | _        || _        t          j	                    | _
        d S 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   zMLP.__init__   s     	%W$$$$#--f55$$VZ88$$Z99(gii    c                     |}|                      |          }|                     |          }|                     |          }|                     |          }| j        r||z   }|S r   )r   r!   r&   r"   r#   )r'   xresiduals      r-   forwardzMLP.forward#   s^    NN1HHQKKKKNNHHQKK 	HAr.   )__name__
__module____qualname__comfyopsr   r2   __classcell__r,   s   @r-   r   r      sU        AERWR[                  r.   r   c                   :     e Zd Z fdZd Zdej        fdZ xZS )
FuseModulec                     t                                                       t          |dz  ||d|          | _        t          |||d|          | _        |                    |          | _        d S )N   F)r#   r+   T)r   r   r   mlp1mlp2r   
layer_norm)r'   	embed_dimr+   r,   s      r-   r   zFuseModule.__init__/   sl    	Ay)%\fggg		9idWabbb	$..y99r.   c                     t          j        ||gd          }|                     |          |z   }|                     |          }|                     |          }|S )Ndim)torchcatr>   r?   r@   )r'   prompt_embeds	id_embedsstacked_id_embedss       r-   fuse_fnzFuseModule.fuse_fn5   s`    !I}i&@bIII II&788=H II&788 OO,=>>  r.   returnc                    |                     |j                  }|                                                    d          }|j        d d         \  }}|j        d         }|                    d|j        d         |j        d                   }t          j        ||j                  d d d f         |d d d f         k     }	||		                                         }
|                    d|j        d                   }|                    d          }|
                    d|
j        d                   }
||         }| 
                    ||
          }|                                |j        d         k    s,J |                                 d|j        d                      |                    |d d d f         |                     |j                             |                    ||d          }|S )Nr   r=      rC   )devicez != )todtypesum	unsqueezeshapeviewrF   arangerP   flattenrK   masked_scatter_)r'   rH   rI   class_tokens_mask
num_inputs
batch_sizemax_num_inputs
seq_lengthflat_id_embedsvalid_id_maskvalid_id_embedsimage_token_embedsrJ   updated_prompt_embedss                 r-   r2   zFuseModule.forward<   s    LL!455	&**,,66q99
%._RaR%8"
N"(+
"	#Y_R%8
 

 L0EFFFtQQQwOD!" 	 ))>)>)@)@A%**2}/B2/FGG-22266)..r?3H3LMM*+<= LL);_MM $$&&*;*A!*DDDDIZI^I^I`I`  GC  GCfwf}~  gA  GC  GCDDD%%&74&@BSBVBVWdWjBkBklll - 2 2:z2 N N$$r.   )	r3   r4   r5   r   rK   rF   Tensorr2   r8   r9   s   @r-   r;   r;   .   sg        : : : : :! ! ! %
 
 %  %  %  %  %  %  %  %r.   r;   c                   $     e Zd Z fdZd Z xZS )PhotoMakerIDEncoderc                    t           j                                        | _        t           j                                        }t           j                            | j                  }t                                          t          ||t           j	        j
                   t           j	        j
                            ddd          | _        t          dt           j	        j
                  | _        d S )Nr   i   F)biasi   )r6   model_managementtext_encoder_deviceload_devicetext_encoder_offload_devicetext_encoder_dtyper   r   VISION_CONFIG_DICTr7   manual_castr    visual_projection_2r;   fuse_module)r'   offload_devicerR   r,   s      r-   r   zPhotoMakerIDEncoder.__init___   s     1EEGG/KKMM&99$:JKK+UNEIDYZZZ#(9#8#?#?dQV#?#W#W %dEI,ABBr.   c                    |j         \  }}}}}|                    ||z  |||          }|                     |          d         }	|                     |	          }
|                     |	          }|
                    ||dd          }
|                    ||dd          }t          j        |
|fd          }
|                     ||
|          }|S )Nr=   rN   rC   rD   )rU   rV   vision_modelvisual_projectionrp   rF   rG   rq   )r'   id_pixel_valuesrH   rZ   br[   chwshared_id_embedsrI   id_embeds_2rc   s                r-   r2   zPhotoMakerIDEncoder.forwardh   s    !0!6:q!Q)..q:~q!QGG,,_==a@**+;<<	../?@@NN1j!R88	!&&q*a<<Iy+6B???	 $ 0 0	K\ ] ]$$r.   )r3   r4   r5   r   r2   r8   r9   s   @r-   rf   rf   ^   sL        C C C C C% % % % % % %r.   rf   c                   :    e Zd Zed             Zed             ZdS )PhotoMakerLoaderc           
          t          j        ddt           j                            dt	          j        d                    gt           j                                        gd          S )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_schemazPhotoMakerLoader.define_schemaz   se    y&.6@^_k@l@lmm $$&& !

 

 

 
	
r.   c                     t          j        d|          }t                      }t          j                            |d          }d|v r|d         }|                    |           t          j        |          S )Nr   T)	safe_load
id_encoder)	r   get_full_path_or_raiserf   r6   utilsload_torch_fileload_state_dictr   
NodeOutput)r   r   photomaker_model_pathphotomaker_modeldatas        r-   executezPhotoMakerLoader.execute   sw     , CLRg h h.00{**+@D*QQ4%D((...}-...r.   Nr3   r4   r5   classmethodr   r    r.   r-   r~   r~   y   sH        
 
 [
 / / [/ / /r.   r~   c                   :    e Zd Zed             Zed             ZdS )PhotoMakerEncodec                 f   t          j        ddt           j                            d          t           j                            d          t           j                            d          t           j                            dddd	          gt           j                                        gd
          S )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   zPhotoMakerEncode.define_schema   s    y&.##L11w''f%%	$Vpqq	 &&(( !
 
 
 	
r.   c           	      B   d}t           j                            |                    |j                                                            }	 |                    d                              |          dz   n# t          $ r dY nw xY w|	                    |d          }i }|D ]}	g ||	<   ||	         D ]}
t          t          fd|
                    }t          |          t          |
          k     r;|                    |
d                    t          |          t          |
          k     ;||	                             |           |                    |d          \  }}d	k    rdz
  dfd
t          d          D             } ||                    d	          |                    |j                  t#          j        |t"          j        |j                                      d	                    }n|}t)          j        |d|igg          S )Nr    rN   rC   T)return_word_idsc                     | d         k    S )Nr=   r   )r0   indexs    r-   <lambda>z*PhotoMakerEncode.execute.<locals>.<lambda>   s    !A$%- r.   )return_pooledr   c                 >    g | ]}|cxk    r	z   k     rn nd ndS )TFr   ).0inum_id_imagestoken_indexs     r-   
<listcomp>z,PhotoMakerEncode.execute.<locals>.<listcomp>   sE     t t tef)U)U)U)UK<U)U)U)U)U)U[` t t tr.   M   )rR   rP   )rv   rH   rZ   pooled_output)r6   clip_visionclip_preprocessrQ   rk   floatsplitr   
ValueErrortokenizelistfilterlenappendencode_from_tokensrangerT   rF   tensorboolr   r   )r   r   r   r   r   special_tokenpixel_valuestokens
out_tokensktfcondpooledrZ   outr   r   r   s                   @@@r-   r   zPhotoMakerEncode.execute   sI   $(88*BX9Y9YZZ``bb	JJsOO))-881<EE 	 	 	EEE	tT::
 	( 	(AJqMAY ( ( 7 7 7 7;;<<!ffs1vvooHHQrUOOO !ffs1vvoo1$$Q''''	( ..z.NNf199!)KM t t t t tjoprjsjs t t t*\-C-CA-F-FVZV]V]^h^tVuVu.3l;LTYT^gqg}.~.~.~  /I  /I  JK  /L  /LM M MCC C}s_f$=>?@@@s   +A< <B
BNr   r   r.   r-   r   r      sM        
 
 [
  A A [A A Ar.   r   c                   L    e Zd Zedeeej                          fd            ZdS )PhotomakerExtensionrL   c                 "   K   t           t          gS r   )r~   r   )r'   s    r-   get_node_listz!PhotomakerExtension.get_node_list   s       
 	
r.   N)	r3   r4   r5   r   r   typer   	ComfyNoder   r   r.   r-   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r.   r   rL   c                  "   K   t                      S r   )r   r   r.   r-   comfy_entrypointr      s         r.   )rF   torch.nnr$   r   comfy.clip_modelr6   comfy.clip_vision	comfy.opstyping_extensionsr   comfy_api.latestr   r   rn   Moduler   r;   
clip_modelCLIPVisionModelProjectionrf   r   r~   r   r   r   r   r.   r-   <module>r      s                          & & & & & & / / / / / / / / %      ")   ,.% .% .% .% .% .% .% .%`% % % % %%*D % % %6/ / / / /r| / / /4/A /A /A /A /Ar| /A /A /Ad
 
 
 
 
. 
 
 
! 3 ! ! ! ! ! !r.   