
    +j                         d dl Z d dlmZ d dlmc mZ d dlZej        j	        Zd Z
 G d dej                  Z G d dej                  Z G d dej                  Z G d	 d
ej                  Zd ZdS )    Nc                    | j         \  }}}}|||f         \  }}t          j        |d d ddf         |d         z  |d d ddf         |d         z  gd                                          }	|                    |ddd          |	z                       dddd          }
t          j        |                                 |
ddd	                              | j	                  S )
Nr            bilinearborderT)modepadding_modealign_corners)
shapetorchcatfloatexpandpermuteFgrid_sampletodtype)imgflow
warp_gridsB_HW	base_gridflow_div	flow_normgrids              M/home/wildlama/comfy/ComfyUI/comfy_extras/frame_interpolation_models/ifnet.py_warpr#   
   s    JAq!Q$aV,Ix	41Q3<(1+5tAAAqsF|hqk7QRTUVV\\^^IQB++i7@@Aq!LLD=d(bfgggjjknktuuu    c                   .     e Zd Zdddef fd	Zd Z xZS )Head   Nc           	         t                                                       |                    ddddd||          | _        |                    ddddd||          | _        |                    ddddd||          | _        |                    d|ddd||          | _        t          j	        dd          | _
        d S )	Nr      r   r   devicer   r'   皙?T)super__init__Conv2dcnn0cnn1cnn2ConvTranspose2dcnn3nn	LeakyReLUrelu)selfout_chr+   r   
operations	__class__s        r"   r.   zHead.__init__   s    %%aQ1V5%QQ	%%b"aAfE%RR	%%b"aAfE%RR	..r61a6Y^.__	Ld++			r$   c                    |                      |                     |                    }|                      |                     |                    }|                      |                     |                    }|                     |          S N)r7   r0   r1   r2   r4   r8   xs     r"   forwardzHead.forward   sc    IIdiill##IIdiill##IIdiill##yy||r$   __name__
__module____qualname__opsr.   r@   __classcell__r;   s   @r"   r&   r&      sU        DS , , , , , ,      r$   r&   c                   ,     e Zd Zddef fd	Zd Z xZS )ResConvNc           	      "   t                                                       |                    ||ddd||          | _        t	          j        t          j        d|ddf||                    | _        t	          j	        dd          | _
        d S )Nr   r   r*   r,   T)r-   r.   r/   convr5   	Parameterr   onesbetar6   r7   )r8   cr+   r   r:   r;   s        r"   r.   zResConv.__init__#   s~    %%aAq!F%%PP	LQ1aLu!U!U!UVV	Ld++			r$   c                     |                      t          j        ||                     |          | j                            S r=   )r7   r   addcmulrK   rN   r>   s     r"   r@   zResConv.forward)   s.    yyq$))A,,	BBCCCr$   rA   rG   s   @r"   rI   rI   "   sZ        !%Tc , , , , , ,D D D D D D Dr$   rI   c                   0     e Zd Zdddef fd	ZddZ xZS )IFBlock@   Nc                 z   t                                                       t          j        t          j                            |dz  ddd          t          j        dd                    t          j                            dz  ddd          t          j        dd                              | _        t          j        fdt          d          D              | _        t          j        	                    d	d
dd          t          j
        d                    | _        d S )Nr   r   r   r*   r,   Tc              3   >   K   | ]}t                     V  dS )r+   r   r:   N)rI   ).0r   rO   r+   r   r:   s     r"   	<genexpr>z#IFBlock.__init__.<locals>.<genexpr>3   s6      (y(ykl6[e)f)f)f(y(y(y(y(y(yr$      4   r'   )r-   r.   r5   
Sequentialr/   r6   conv0range	convblockr3   PixelShufflelastconv)r8   	in_planesrO   r+   r   r:   r;   s     ````r"   r.   zIFBlock.__init__.   sF   ]M*++IqAvq!Qv]b+ccegeqruw{e|e|}}M*++AFAq!QvUZ+[[]_]ijmos]t]tuuw w
 (y(y(y(y(y(y(ypuvwpxpx(y(y(yzj&@&@FAqRS\bjo&@&p&prt  sB  CD  sE  sE  F  Fr$   r   c                    t          j        |d|z  d          }|Dt          j        |d|z  d                              |          }t          j        ||fd          }|                     |                     |                    }t          j        |                     |          |d          }|d d d df         |z  |d d ddf         |d d dd f         fS )N      ?r   )scale_factorr
   r   r'      )r   interpolatediv_r   r   r_   r]   ra   )r8   r?   r   scalefeattmps         r"   r@   zIFBlock.forward6   s    M!#+JGGG=C%KjQQQVVW\]]D	1d)Q''A~~djjmm,,mDMM$//e*UUU111bqb5zE!3qqq!A#v;AAAqrrE
::r$   )Nr   rA   rG   s   @r"   rS   rS   -   s`        $&t4C F F F F F F; ; ; ; ; ; ; ;r$   rS   c                   P     e Zd Zddddef fd	Zd Zd Zd Zd Zd	 Z	ddZ
 xZS )IFNetr'   )      `   rT       Nc                 H   t                                                       t          |          | _        dd|z  z   gdd|z  z   gdz  z   t	          j        fdt          d          D                       | _        g d| _        d	| _	        i | _
        d S )
N)r9   r+   r   r:      r      r'   c           	      P    g | ]"}t          |         |                    #S )rW   )rS   )rX   iblock_inchannelsr+   r   r:   s     r"   
<listcomp>z"IFNet.__init__.<locals>.<listcomp>E   sI      %M  %M  %M~WXa[(1+f\anx%y%y%y  %M  %M  %Mr$   rf   )r)   rZ   r'   r   r   rT   )r-   r.   r&   encoder5   
ModuleListr^   blocks
scale_list	pad_align_warp_grids)r8   head_chrx   r+   r   r:   rw   r;   s     ````@r"   r.   zIFNet.__init__A   s    '&R\]]]GO$	AK(?'@1'DDm  %M  %M  %M  %M  %M  %M  %M  %M  DI  JK  DL  DL  %M  %M  %M  N  N***r$   c                 .    | j         j        j        j        S r=   )rz   r0   weightr   )r8   s    r"   	get_dtypezIFNet.get_dtypeJ   s    {&,,r$   c                 :    d|d         z  |d         z  |j         z  S )Ni,  r   r   )itemsize)r8   r   r   s      r"   memory_used_forwardzIFNet.memory_used_forwardM   s     U1X~a(5>99r$   c           
         ||f| j         v rd S i | _         t          j        t          j        dd||t          j                  t          j        dd||t          j                  d          \  }}t          j        ||fd                              d          t          j        |dz
  dz  |dz
  dz  gt          j        |	          f| j         ||f<   d S )
Ng      rd   r*   ij)indexingr   )dimg       @)r   r+   )r   r   meshgridlinspacefloat32stack	unsqueezetensor)r8   r   r   r+   grid_ygrid_xs         r"   _build_warp_gridszIFNet._build_warp_gridsP   s    q6T%%%FN4aemLLLN4aemLLLW[] ] ] K(a000::1==L1s7c/AGs?;5=Y_```$b!Q   r$   c                 .    t          ||| j                  S r=   )r#   r   )r8   r   r   s      r"   warpz
IFNet.warp[   s    S$ 0111r$   c                 ,    |                      |          S )zEExtract head features for a single frame. Can be cached across pairs.)rz   )r8   r   s     r"   extract_featureszIFNet.extract_features^   s    {{3r$         ?c                    t          |t          j                  sGt          j        |j        d         d|j        d         |j        d         f||j        |j                  }|                     |j        d         |j        d         |j                   |j        d         }|r"d|v r|d                             |ddd          n| 	                    |          }|r"d|v r|d                             |ddd          n| 	                    |          }d x}x}	}
||}}t          | j                  D ]\  }}|6 |t          j        |||||fd          d | j        |         	          \  }}	}
n |t          j        |||                     ||d d d df                   |                     ||d d dd
f                   ||	|
fd          || j        |         	          \  }}	}
|                    |          }|                     ||d d d df                   }|                     ||d d dd
f                   }t          j        ||t          j        |	                    S )Nr   r   r   r   r*   img0r   img1)ri   r'   )
isinstancer   Tensorfullr   r+   r   r   r   rz   	enumerater|   r   r}   r   add_lerpsigmoid)r8   r   r   timestepcacher   f0f1r   maskrj   warped_img0warped_img1rv   blockfds                   r"   r@   zIFNet.forwardb   s   (EL11 	Dz4:a=!TZ]DJqM"RT\eiepx|  yC  D  D  DHtz!}djmT[IIIJqM49dfooU6]!!!RR000SWS^S^_cSdSd49dfooU6]!!!RR000SWS^S^_cSdSd!!!td#'[!$+.. 		8 		8HAu|#(5D$B3QST)U)UW[cgcrstcu#v#v#v dDD!&I{K2tAAArPQrE{9S9SUYU^U^_acghihihiklmnknhncoUpUprz  }A  CG  H  JK  L  L 2"4 "4 "4D$ yy}}))D$qqq"1"u+66K))D$qqq!A#v,77KKz+{EM$4G4GHHHr$   )r   N)rB   rC   rD   rE   r.   r   r   r   r   r   r@   rF   rG   s   @r"   rm   rm   @   s         +A$VZgj      - - -: : :	b 	b 	b2 2 2     I I I I I I I Ir$   rm   c                    | d         j         d         }g }t          d          D ]2}d| d}|| v r&|                    | |         j         d                    3t          |          dk    rt	          dt          |                     ||fS )Nzencode.cnn3.weightr   rf   zblocks.z.conv0.1.0.weightr   z1Unsupported RIFE model: expected 5 blocks, found )r   r^   appendlen
ValueError)
state_dictr   rx   rv   keys        r"   detect_rife_configr   z   s    -.4Q7GH1XX 6 6,,,,*OOJsO1!4555
8}}\SQY]]\\]]]Hr$   )r   torch.nnr5   torch.nn.functional
functionalr   	comfy.opscomfyrE   disable_weight_initr#   Moduler&   rI   rS   rm   r    r$   r"   <module>r      s=                      i#v v v    29    D D D D Dbi D D D; ; ; ; ;bi ; ; ;&7I 7I 7I 7I 7IBI 7I 7I 7It	 	 	 	 	r$   