o >g> @sddlZddlmZddlZddlZddlZddlZdddddddd d d ZGd d d ej Z Gdddej Z Gdddej j ZGdddZGdddZeedZdS)Nii quick_gelu) hidden_size image_sizeintermediate_sizenum_attention_heads num_channelsnum_hidden_layers patch_sizeprojection_dim hidden_actcs,eZdZdejffdd ZddZZS)MLPTcsVt|r ||ks J|||_||||_||||_||_t |_ dSN) super__init__ LayerNorm layernormLinearfc1fc2 use_residualnnGELUact_fn)selfin_dimout_dim hidden_dimr operations __class__G/home/comdoleger1/zen-flux-style-shape/comfy_extras/nodes_photomaker.pyrs   z MLP.__init__cCs>|}||}||}||}||}|jr||}|Sr)rrrrr)rxresidualr&r&r'forward s    z MLP.forward)__name__ __module__ __qualname__comfyopsrr* __classcell__r&r&r$r'rs rcs4eZdZfddZddZdejfddZZS) FuseModulecsFtt|d||d|d|_t|||d|d|_|||_dS)NF)rr#T)rrrmlp1mlp2r layer_norm)r embed_dimr#r$r&r'r,s zFuseModule.__init__cCs8tj||gdd}|||}||}||}|S)Ndim)torchcatr3r4r5)r prompt_embeds id_embedsstacked_id_embedsr&r&r'fuse_fn2s   zFuseModule.fuse_fnreturncCs*||j}|d}|jdd\}}|jd}|d|jd|jd}tj||jddddf|dddfk} || } |d|jd}|d}| d| jd} ||} | | | } || jdks|J|d| jd| |dddf| |j|||d} | S)Nrr2r7)devicez != ) todtypesum unsqueezeshapeviewr:arangerCflattenr?masked_scatter_)rr<r=class_tokens_mask num_inputs batch_sizeZmax_num_inputs seq_lengthZflat_id_embedsZ valid_id_maskZvalid_id_embedsZimage_token_embedsr>updated_prompt_embedsr&r&r'r*9s*     . zFuseModule.forward) r+r,r-rr?r:Tensorr*r0r&r&r$r'r1+s  r1cs$eZdZfddZddZZS)PhotoMakerIDEncodercsdtj|_tj}tj|j}tt||tj j tj j j dddd|_ t dtj j |_dS)NriF)biasi)r.model_managementtext_encoder_device load_devicetext_encoder_offload_devicetext_encoder_dtyperrVISION_CONFIG_DICTr/ manual_castrvisual_projection_2r1 fuse_module)roffload_devicerEr$r&r'r\s  zPhotoMakerIDEncoder.__init__c Cs|j\}}}}}||||||}||d} || } || } | ||dd} | ||dd} tj| | fdd} ||| |} | S)Nr2rAr7r8)rHrI vision_modelvisual_projectionr\r:r;r]) rid_pixel_valuesr<rMbrNchwZshared_id_embedsr=Z id_embeds_2rQr&r&r'r*es  zPhotoMakerIDEncoder.forward)r+r,r-rr*r0r&r&r$r'rS[s  rSc@,eZdZeddZdZdZdZddZdS) PhotoMakerLoadercCsddtdfiiS)Nrequiredphotomaker_model_name photomaker) folder_pathsget_filename_listsr&r&r' INPUT_TYPESwszPhotoMakerLoader.INPUT_TYPESZ PHOTOMAKERload_photomaker_model_for_testing/photomakercCsBtd|}t}tjj|dd}d|vr|d}|||fS)NrjT) safe_loadZ id_encoder)rkget_full_path_or_raiserSr.utilsload_torch_fileload_state_dict)rriZphotomaker_model_pathZphotomaker_modeldatar&r&r'rqs  z&PhotoMakerLoader.load_photomaker_modelN) r+r,r- classmethodro RETURN_TYPESFUNCTIONCATEGORYrqr&r&r&r'rgvs  rgc@rf) PhotoMakerEncodec Csdddddddddfd iS) Nrhrp)IMAGE)CLIPSTRINGTzphotograph of photomaker) multilinedynamicPromptsdefault)rjimagecliptextr&rmr&r&r'ros zPhotoMakerEncode.INPUT_TYPES) CONDITIONINGapply_photomakerrrcsVd}tj||j}z |d|dWn ty%dYnw|j |dd}i}|D]6} g|| <|| D]+} t t fdd| } t | t | kr_| | dt | t | ksP||  | q;q1|j|dd \} } d krddfd d td D}||d | |jtj|tj|jdd d}n| }|d| iggfS)Nrj rAr7T)return_word_idscs |dkS)Nr2r&)r()indexr&r's z3PhotoMakerEncode.apply_photomaker..) return_pooledrcs0g|]}|krkrnndndqS)TFr&).0i) num_id_images token_indexr&r' s0z5PhotoMakerEncode.apply_photomaker..M)rErC)rar<rM pooled_output)r. clip_visionclip_preprocessrDrWfloatsplitr ValueErrortokenizelistfilterlenappendencode_from_tokensrangerGr:tensorbool)rrjrrr special_token pixel_valuestokens out_tokensktfcondpooledrMoutr&)rrrr'rs8  z!PhotoMakerEncode.apply_photomakerN) r+r,r-ryrorzr{r|rr&r&r&r'r}s  r})rgr})r:torch.nnrrkcomfy.clip_modelr.Zcomfy.clip_vision comfy.opsrZModulerr1 clip_modelCLIPVisionModelProjectionrSrgr}NODE_CLASS_MAPPINGSr&r&r&r's0  0.