o >g@sBddlZddlZddZGdddZGdddZeedZdS) Nc Cstjj|dd}tjj|dd}|j\}}}}tj||||f|jd}|d|d} } ||d| || || || |f<||}tjj|dd}tjj |ddj } | |j S)N))dim)device.) torchfftfftnfloatfftshiftshapeonesr ifftshiftifftnrealtodtype) x thresholdscaleZx_freqBCHWmaskcrowZccol x_filteredrF/home/comdoleger1/zen-flux-style-shape/comfy_extras/nodes_freelunch.pyFourier_filters& rc@,eZdZeddZdZdZdZddZdS) FreeUc CLddddddddfdd ddddfdd ddddfdd ddddfd iS) NrequiredMODELFLOATg?$@{Gz?defaultminmaxstepg333333??皙?modelb1b2s1s2rsrrr INPUT_TYPES zFreeU.INPUT_TYPESr$patchmodel_patches/unetc T|jjjd}|d||f|d||fiifdd}|}|||fS)Nmodel_channelsrcst|jdd}|durw|ddd|jddf|d|ddd|jddf<|jvrhzt|d|dd}W||fStd|jd|j<t|d|dd |j}Y||fSt|d|dd |j}||fS)Nrrrr\Device {} does not support the torch.fft functions used in the FreeU node, switching to CPU.T) getintr rrloggingwarningformatcpur)hhsptransformer_optionsrZon_cpu_devicesZ scale_dictrroutput_block_patch,s@   z'FreeU.patch..output_block_patchr2 model_config unet_configcloneset_model_output_block_patch selfr2r3r4r5r6r>rMmrrLrr;'s z FreeU.patchN __name__ __module__ __qualname__ classmethodr9 RETURN_TYPESFUNCTIONCATEGORYr;rrrrr!  r!c@r ) FreeU_V2c Cr") Nr#r$r&g?r'r(r)r*gffffff?r/r0r1rr7rrrr9Ar:zFreeU_V2.INPUT_TYPESr$r;r<c r=)Nr>r?rc s|t|jdd}|dur|dd}|jd}tj||dddd\}}tj||dddd\}}||dd||dd}|ddd|jddf|dd|d|ddd|jddf<|j vrzt |d|dd}W||fSt d |j d|j <t |d|dd|j }Y||fSt |d|dd|j }||fS) Nr@rrT)rkeepdimrrArB)rCrDr mean unsqueezerr-viewr,rrrErFrGrHr) rIrJrKrZ hidden_meanrZ hidden_max_Z hidden_minrLrrrMSs& (L   z*FreeU_V2.patch..output_block_patchrNrSrrLrr;Ns zFreeU_V2.patchNrVrrrrr_@r^r_)r!r_)rrErr!r_NODE_CLASS_MAPPINGSrrrrs'/