o
    iG                     @   sx   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 Z
G dd dejZG dd	 d	eZd
efddZdS )    N)IOComfyExtension)overridec              
   C   s  t jj| dd}|dd}|dd}|dd}|dd}|d	d}tjjtjjtjjtjj	tjj
tjjtjjtjjtjjd
	}||vrWtd| ||||| d S i }	|D ]}
zt|
}W n   Y q[g }dD ]}|| | }| }tdd |}ttdd |}g }d}|t|k r/|| }|t|d k}|t|d k}|d| }|d| }tj|jd |jd }|||d || |dkr|r|r|||   |r|d7 }|| }|d| }|d| }tj|jd }|||d || |r%|s%|r|r%|tjjdd |d7 }|t|k s|tjj|  qmtj||	|< q[G dd d}||	|S )NT)	safe_loadactivation_funclinearis_layer_normFuse_dropoutactivate_outputlast_layer_dropout)	r   relu	leakyrelueluswishtanhsigmoidsoftsignmishz[Unsupported Hypernetwork format, if you report it I might implement it. {}   {} {} {} {} {})r      c                 S   s
   |  dS Nz.weight)endswitha r   =/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_hypernetwork.py<lambda>.   s   
 z)load_hypernetwork_patch.<locals>.<lambda>c                 S   s   | d t d  S r   )lenr   r   r   r   r   /   s    r   r      z	{}.weightz{}.bias)weightbiasg333333?)pc                   @   s$   e Zd Zdd Zdd Zdd ZdS )z3load_hypernetwork_patch.<locals>.hypernetwork_patchc                 S   s   || _ || _d S N)hypernetstrength)selfr"   r#   r   r   r   __init__Q   s   
z<load_hypernetwork_patch.<locals>.hypernetwork_patch.__init__c                 S   sT   |j d }|| jv r%| j| }||d || j  }||d || j  }|||fS )Nr   r   )shaper"   r#   )r$   qkvextra_optionsdimhnr   r   r   __call__T   s   



z<load_hypernetwork_patch.<locals>.hypernetwork_patch.__call__c                 S   s*   | j  D ]}| j | || j |< q| S r!   )r"   keysto)r$   devicedr   r   r   r0   ]   s   z6load_hypernetwork_patch.<locals>.hypernetwork_patch.toN)__name__
__module____qualname__r%   r.   r0   r   r   r   r   hypernetwork_patchP   s    	r6   ) comfyutilsload_torch_filegettorchnnIdentityReLU	LeakyReLUELU	HardswishTanhSigmoidSoftsignMishloggingerrorformatintr/   filterlistmapr   Linearr'   load_state_dictappend	LayerNormDropout
Sequential
ModuleList)pathr#   sdr   r   r	   r
   r   valid_activationoutr2   r,   outputindexattn_weightsr/   linearslayersilin_name
last_layerpenultimate_layer
lin_weightlin_biaslayerln_name	ln_weightln_biaslnr6   r   r   r   load_hypernetwork_patch	   s|   


rh   c                   @   s0   e Zd Zedd ZedejfddZeZdS )HypernetworkLoaderc                 C   sL   t jddt jdt jjdtddt jjddd	d
ddgt j gdS )Nri   loadersmodelhypernetwork_namehypernetworks)optionsr#   g      ?g      $g      $@g{Gz?)defaultminmaxstep)node_idcategoryinputsoutputs)	r   SchemaModelInputCombofolder_pathsget_filename_listFloatOutput)clsr   r   r   define_schemae   s   
z HypernetworkLoader.define_schemareturnc                 C   sD   t d|}| }t||}|d ur|| || t|S )Nrm   )r{   get_full_path_or_raiseclonerh   set_model_attn1_patchset_model_attn2_patchr   
NodeOutput)r   rk   rl   r#   hypernetwork_pathmodel_hypernetworkpatchr   r   r   executet   s   



zHypernetworkLoader.executeN)	r3   r4   r5   classmethodr   r   r   r   load_hypernetworkr   r   r   r   ri   d   s    
	ri   c                   @   s(   e Zd Zedeeej  fddZdS )HyperNetworkExtensionr   c                    s   t gS r!   )ri   )r$   r   r   r   get_node_list   s   z#HyperNetworkExtension.get_node_listN)	r3   r4   r5   r   rK   typer   	ComfyNoder   r   r   r   r   r      s    r   r   c                      s   t  S r!   )r   r   r   r   r   comfy_entrypoint   s   r   )comfy.utilsr7   r{   r;   rF   comfy_api.latestr   r   typing_extensionsr   rh   r   ri   r   r   r   r   r   r   <module>   s    [