o
    i                     @   sz   d dl Z d dlZ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ZdefddZdS )    N)override)ComfyExtensionIOc                 C   s   t jj|  dd}t jj|dd}|j\}}}}t j||||f| jd}|d |d }	}
||d|	| |	| |
| |
| f< || }t jj|dd}t jj	|ddj
}|| jS )N))dim)device   .)torchfftfftnfloatfftshiftshapeonesr   	ifftshiftifftnrealtodtype)x	thresholdscalex_freqBCHWmaskcrowccol
x_filtered r"   :/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_freelunch.pyFourier_filter   s   &r$   c                   @   0   e Zd Zedd ZedejfddZeZdS )FreeUc                 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S )Nr&   model_patches/unetmodelb1g?              $@{Gz?Tdefaultminmaxstepadvancedb2g333333?s1?s2皙?node_idcategoryinputsoutputsr   SchemaModelInputFloatOutputclsr"   r"   r#   define_schema      
zFreeU.define_schemareturnc           	         X   |j jjd }|d ||f|d ||fii   fdd}| }|| t|S )Nmodel_channels   r	   c                    s    t| jd d }|d urw| d d d | jd d f |d  | d d d | jd d f< |j vrhzt|d|d d}W | |fS    td|j d |j< t| d|d d	|j}Y | |fS t| d|d d	|j}| |fS )N   r	   r   r   r   \Device {} does not support the torch.fft functions used in the FreeU node, switching to CPU.T)
getintr   r   r$   loggingwarningformatcpur   )hhsptransformer_optionsr   on_cpu_devices
scale_dictr"   r#   output_block_patch3   s   @

 z)FreeU.execute.<locals>.output_block_patchr)   model_configunet_configcloneset_model_output_block_patchr   
NodeOutput	rE   r)   r*   r4   r5   r7   rJ   r[   mr"   rX   r#   execute-   s   

zFreeU.executeN	__name__
__module____qualname__classmethodrF   r   ra   rd   patchr"   r"   r"   r#   r&      s    
r&   c                   @   r%   )FreeU_V2c                 C   r'   )Nrk   r(   r)   r*   g?r+   r,   r-   Tr.   r4   gffffff?r5   r6   r7   r8   r9   r>   rD   r"   r"   r#   rF   K   rG   zFreeU_V2.define_schemarH   c           	         rI   )NrJ   rK   r	   c           	         s|   t| jd d }|d ur| dd}|jd }tj||dddd\}}tj||dddd\}}||dd || dd }| d d d | jd d f |d d | d  | d d d | jd d f< |j	 vrzt
|d|d d}W | |fS    td	|j	 d |j	< t
| d|d d|j	}Y | |fS t
| d|d d|j	}| |fS )
NrL   r   r   T)r   keepdimr	      rM   rN   )rO   rP   r   mean	unsqueezer
   r1   viewr0   r   r$   rQ   rR   rS   rT   r   )	rU   rV   rW   r   hidden_meanr   
hidden_max_
hidden_minrX   r"   r#   r[   b   s&   
(L

 z,FreeU_V2.execute.<locals>.output_block_patchr\   rb   r"   rX   r#   rd   \   s   

zFreeU_V2.executeNre   r"   r"   r"   r#   rk   J   s    
 rk   c                   @   s(   e Zd Zedeeej  fddZdS )FreelunchExtensionrH   c                    s
   t tgS N)r&   rk   )selfr"   r"   r#   get_node_list   s   z FreelunchExtension.get_node_listN)	rf   rg   rh   r   listtyper   	ComfyNoderx   r"   r"   r"   r#   ru      s    ru   rH   c                      s   t  S rv   )ru   r"   r"   r"   r#   comfy_entrypoint   s   r|   )r
   rQ   typing_extensionsr   comfy_api.latestr   r   r$   r{   r&   rk   ru   r|   r"   r"   r"   r#   <module>   s   /6	