
    +jt                         d dl Z d dlZd dlmZ d dlmZmZ d 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IOc                    t           j                            |                                 d          }t           j                            |d          }|j        \  }}}}t          j        ||||f| j                  }|dz  |dz  }
}	||d|	|z
  |	|z   |
|z
  |
|z   f<   ||z  }t           j                            |d          }t           j        	                    |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_filtereds               </home/wildlama/comfy/ComfyUI/comfy_extras/nodes_freelunch.pyFourier_filterr%      s    Y^^AGGII8^44FYH55FJAq!Q:q!Ql18444DaQ$DV[DdYti//	1A$BR1R	RSd]F Y  X 66FX66;J==!!!    c                   N    e Zd Zed             Zedej        fd            ZeZdS )FreeUc                    t          j        ddt           j                            d          t           j                            dddddd	
          t           j                            dddddd	
          t           j                            dddddd	
          t           j                            dddddd	
          gt           j                                        g          S )Nr(   model/patch/unetmodelb1g?              $@{Gz?Tdefaultminmaxstepadvancedb2g333333?s1?s2皙?node_idcategoryinputsoutputsr   SchemaModelInputFloatOutputclss    r$   define_schemazFreeU.define_schema   s    y'w''tSct$Y]^^tSct$Y]^^tSct$Y]^^tSct$Y]^^ !!
 
 
 	
r&   returnc                    	
 |j         j        j        d         }|dz  ||f|dz  ||fi
i 		
fd}|                                }|                    |           t          j        |          S )Nmodel_channels   r   c                                         t          | j        d                   d           }| | d d d | j        d         dz  f         |d         z  | d d d | j        d         dz  f<   |j        vr	 t	          |d|d                   }n#  t          j        d                    |j                             d|j        <   t	          |                                d|d                   	                    |j                  }Y nExY wt	          |                                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_dicts       r$   output_block_patchz)FreeU.execute.<locals>.output_block_patch3   sj   NN3qwqz??D99E ()!!!,<QWQZ1_,<*<(=a(H!!!$QWQZ1_$$%:^33d,SAU1XNNNd  )G  )N  )N  OR  OY  )Z  )Z  [  [  [59sz2,SWWYY!5QR8TTTWWX[Xbcc(auQxPPPSSTWT^__Cc6Ms   9B A:Dr+   model_configunet_configcloneset_model_output_block_patchr   
NodeOutputrG   r+   r,   r6   r7   r9   rK   r\   mrZ   r[   s            @@r$   executezFreeU.execute-   s    1=>NO$q(2r(NQ4FRQ
	 	 	 	 	 	  KKMM	&&'9:::}Qr&   N	__name__
__module____qualname__classmethodrH   r   rb   re   patch r&   r$   r(   r(      sW        
 
 [
   r}       [ 2 EEEr&   r(   c                   N    e Zd Zed             Zedej        fd            ZeZdS )FreeU_V2c                    t          j        ddt           j                            d          t           j                            dddddd	
          t           j                            dddddd	
          t           j                            dddddd	
          t           j                            dddddd	
          gt           j                                        g          S )Nrn   r*   r+   r,   g?r-   r.   r/   Tr0   r6   gffffff?r7   r8   r9   r:   r;   r@   rF   s    r$   rH   zFreeU_V2.define_schemaK   s    y'w''tSct$Y]^^tSct$Y]^^tSct$Y]^^tSct$Y]^^ !!
 
 
 	
r&   rI   c                    	
 |j         j        j        d         }|dz  ||f|dz  ||fi
i 		
fd}|                                }|                    |           t          j        |          S )NrK   rL   r   c                    
                     t          | j        d                   d           }||                     d                              d          }|j        d         }t          j        |                    |d          dd          \  }}t          j        |                    |d          dd          \  }}||                    d                              d          z
  ||z
                      d                              d          z  }| d d d | j        d         dz  f         |d         dz
  |z  dz   z  | d d d | j        d         dz  f<   |j	        	vr	 t          |d|d                   }n#  t          j        d	                    |j	                             d	|j	        <   t          |                                d|d                                       |j	                  }Y nExY wt          |                                d|d                                       |j	                  }| |fS )
NrN   r   r   T)r	   keepdimr      rO   rP   )rQ   rR   r   mean	unsqueezer   r3   viewr2   r
   r%   rS   rT   rU   rV   r   )rW   rX   rY   r   hidden_meanr   
hidden_max_
hidden_minrZ   r[   s            r$   r\   z,FreeU_V2.execute.<locals>.output_block_patchb   sa   NN3qwqz??D99E ffQii11!44%a( %	+*:*:1b*A*ArSW X X X
A %	+*:*:1b*A*ArSW X X X
A*Z-A-A!-D-D-N-Nq-Q-QQV`cmVmUxUxyzU{U{  VF  VF  GH  VI  VI  I()!!!,<QWQZ1_,<*<(=%(Q,S^A^abAb(c!!!$QWQZ1_$$%:^33d,SAU1XNNNd  )G  )N  )N  OR  OY  )Z  )Z  [  [  [59sz2,SWWYY!5QR8TTTWWX[Xbcc(auQxPPPSSTWT^__Cc6Ms   *F A:G?r]   rc   s            @@r$   re   zFreeU_V2.execute\   s    1=>NO$q(2r(NQ4FRQ
	 	 	 	 	 	. KKMM	&&'9:::}Qr&   Nrf   rl   r&   r$   rn   rn   J   sX        
 
 [
   r}       [ @ EEEr&   rn   c                   L    e Zd Zedeeej                          fd            ZdS )FreelunchExtensionrI   c                 "   K   t           t          gS N)r(   rn   )selfs    r$   get_node_listz FreelunchExtension.get_node_list   s       
 	
r&   N)	rg   rh   ri   r   listtyper   	ComfyNoder   rl   r&   r$   r|   r|      sE        
T$r|*<%= 
 
 
 X
 
 
r&   r|   rI   c                  "   K   t                      S r~   )r|   rl   r&   r$   comfy_entrypointr      s      r&   )r   rS   typing_extensionsr   comfy_api.latestr   r   r%   r   r(   rn   r|   r   rl   r&   r$   <module>r      s      & & & & & & / / / / / / / /" " "&, , , , ,BL , , ,^3 3 3 3 3r| 3 3 3l
 
 
 
 
 
 
 
  2            r&   