o
    ·Ïi
  ã                   @   sŽ   d dl mZ d dlmZmZ dd„ ZG dd„ dejƒZG dd„ dejƒZG d	d
„ d
ejƒZ	G dd„ dejƒZ
G dd„ deƒZdefdd„ZdS )é    )Úoverride)ÚComfyExtensionÚioc           	      C   sæ   |  ¡ }| ¡ }|D ]f}| d | ¡¡s| d | ¡¡r%| |did|¡ | d | ¡¡s5| d | ¡¡r>| |did|¡ | d | ¡¡sN| d | ¡¡rW| |did|¡ | d	 | ¡¡sg| d
 | ¡¡rp| |did|¡ q
|S )Nz{}.to_q.biasz{}.to_q.weight©Nç        z{}.to_k.biasz{}.to_k.weightz{}.to_v.biasz{}.to_v.weightz{}.to_out.0.biasz{}.to_out.0.weight)ÚcloneÚmodel_state_dictÚendswithÚformatÚadd_patches)	ÚattnÚmodelÚqÚkÚvÚoutÚmÚsdÚkey© r   úC/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_attention_multiply.pyÚattention_multiply   s       €r   c                   @   ó4   e Zd Zedejfdd„ƒZedejfdd„ƒZdS )ÚUNetSelfAttentionMultiplyÚreturnc                 C   ó~   t jddt j d¡t jjd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
t jjdddddd	d
gt j ¡ gd	dS )Nr   ú"_for_testing/attention_experimentsr   r   ç      ð?r   ç      $@ç{®Gáz„?T©ÚdefaultÚminÚmaxÚstepÚadvancedr   r   r   ©Únode_idÚcategoryÚinputsÚoutputsÚis_experimental©r   ÚSchemaÚModelÚInputÚFloatÚOutput©Úclsr   r   r   Údefine_schema   ó   
û
õz'UNetSelfAttentionMultiply.define_schemac                 C   ó   t d|||||ƒ}t |¡S )NÚattn1©r   r   Ú
NodeOutput©r3   r   r   r   r   r   r   r   r   r   Úexecute(   ó   
z!UNetSelfAttentionMultiply.executeN©	Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r-   r4   r9   r;   r   r   r   r   r      ó
    r   c                   @   r   )ÚUNetCrossAttentionMultiplyr   c                 C   r   )NrC   r   r   r   r   r   r   r   Tr    r   r   r   r&   r,   r2   r   r   r   r4   /   r5   z(UNetCrossAttentionMultiply.define_schemac                 C   r6   )NÚattn2r8   r:   r   r   r   r;   ?   r<   z"UNetCrossAttentionMultiply.executeNr=   r   r   r   r   rC   .   rB   rC   c                   @   r   )ÚCLIPAttentionMultiplyr   c                 C   s„   t jdddgdt j d¡t jjd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t jjdddd	d
ddgt j ¡ gddS )NrE   zclip attention scaleztext encoder attentionr   Úclipr   r   r   r   r   Tr    r   r   r   )r'   Úsearch_aliasesr(   r)   r*   r+   )r   r-   ÚClipr/   r0   r1   r2   r   r   r   r4   F   s   
û
ôz#CLIPAttentionMultiply.define_schemac           	      C   s¾   |  ¡ }|j ¡ }|D ]N}| d¡s| d¡r | |did|¡ | d¡s*| d¡r3| |did|¡ | d¡s=| d¡rF| |did|¡ | d	¡sP| d
¡rY| |did|¡ qt |¡S )Nzself_attn.q_proj.weightzself_attn.q_proj.biasr   r   zself_attn.k_proj.weightzself_attn.k_proj.biaszself_attn.v_proj.weightzself_attn.v_proj.biaszself_attn.out_proj.weightzself_attn.out_proj.bias)r   Úpatcherr   r	   r   r   r9   )	r3   rF   r   r   r   r   r   r   r   r   r   r   r;   W   s   
€
zCLIPAttentionMultiply.executeNr=   r   r   r   r   rE   E   s
    rE   c                   @   r   )ÚUNetTemporalAttentionMultiplyr   c                 C   r   )NrJ   r   r   Úself_structuralr   r   r   r   Tr    Úself_temporalÚcross_structuralÚcross_temporalr&   r,   r2   r   r   r   r4   i   r5   z+UNetTemporalAttentionMultiply.define_schemac           	      C   sª   |  ¡ }| ¡ }|D ]E}| d¡s| d¡r.d|v r$| |did|¡ q
| |did|¡ q
| d¡s8| d¡rOd|v rF| |did|¡ q
| |did|¡ q
t |¡S )Nzattn1.to_out.0.biaszattn1.to_out.0.weightz.time_stack.r   r   zattn2.to_out.0.biaszattn2.to_out.0.weight)r   r   r	   r   r   r9   )	r3   r   rK   rL   rM   rN   r   r   r   r   r   r   r;   y   s   €
z%UNetTemporalAttentionMultiply.executeNr=   r   r   r   r   rJ   h   rB   rJ   c                   @   s(   e Zd Zedeeej  fdd„ƒZdS )ÚAttentionMultiplyExtensionr   c                 Ã   s   t tttgS r   )r   rC   rE   rJ   )Úselfr   r   r   Úget_node_list   s   €üz(AttentionMultiplyExtension.get_node_listN)	r>   r?   r@   r   ÚlistÚtyper   Ú	ComfyNoderQ   r   r   r   r   rO   Œ   s    rO   r   c                   Ã   s   t ƒ S r   )rO   r   r   r   r   Úcomfy_entrypoint–   s   €rU   N)Útyping_extensionsr   Úcomfy_api.latestr   r   r   rT   r   rC   rE   rJ   rO   rU   r   r   r   r   Ú<module>   s    #$
