
    +j                        S SK r S SKJr  S SKJs  Jr  S SKr\R                  R                  rS r
 " S S\R                  5      r " S S\R                  5      r " S S\R                  5      r " S	 S
\R                  5      rS rg)    Nc                    U R                   u  p4pVX%U4   u  px[        R                  " US S 2SS24   US   -  US S 2SS24   US   -  /S5      R                  5       n	UR	                  USSS5      U	-   R                  SSSS5      n
[        R                  " U R                  5       U
SSSS	9R                  U R                  5      $ )
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    JA!$V,I		41Q3<(1+5tAqsF|hqk7QRTUV\\^IQB+i7@@Aq!LD==d(bfgjjknktktuu    c                   :   ^  \ rS rSrSSS\4U 4S jjrS rSrU =r$ )Head      Nc           
      "  > [         TU ]  5         UR                  SSSSSX#S9U l        UR                  SSSSSX#S9U l        UR                  SSSSSX#S9U l        UR                  SUSSSX#S9U l        [        R                  " SS5      U l
        g )	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/   Head.__init__   s    %%aQ1V%Q	%%b"aAf%R	%%b"aAf%R	..r61a6._	LLd+	r$   c                     U R                  U R                  U5      5      nU R                  U R                  U5      5      nU R                  U R                  U5      5      nU R	                  U5      $ N)r8   r1   r2   r3   r5   r9   xs     r"   forwardHead.forward   sR    IIdiil#IIdiil#IIdiil#yy|r$   )r1   r2   r3   r5   r8   	__name__
__module____qualname____firstlineno__opsr/   rB   __static_attributes____classcell__r<   s   @r"   r&   r&      s    DS , r$   r&   c                   8   ^  \ rS rSrSS\4U 4S jjrS rSrU =r$ )ResConv"   Nc           
         > [         TU ]  5         UR                  XSSSX#S9U l        [        R
                  " [        R                  " SUSS4X#S95      U l        [        R                  " SS5      U l
        g )Nr   r   r+   r-   T)r.   r/   r0   convr6   	Parameterr   onesbetar7   r8   )r9   cr,   r   r;   r<   s        r"   r/   ResConv.__init__#   s`    %%aAq!F%P	LLQ1aL!UV	LLd+	r$   c                     U R                  [        R                  " XR                  U5      U R                  5      5      $ r?   )r8   r   addcmulrQ   rT   r@   s     r"   rB   ResConv.forward)   s(    yyq))A,		BCCr$   )rT   rQ   r8   rD   rL   s   @r"   rN   rN   "   s    !%Tc ,D Dr$   rN   c                   >   ^  \ rS rSrSSS\4U 4S jjrSS jrSrU =r$ )IFBlock-   @   Nc                 D  >^^^^ [         TU ]  5         [        R                  " [        R                  " TR	                  UTS-  SSSTTS9[        R
                  " SS5      5      [        R                  " TR	                  TS-  TSSSTTS9[        R
                  " SS5      5      5      U l        [        R                  " UUUU4S j[        S5       5       6 U l        [        R                  " TR                  TS	S
SSTTS9[        R                  " S5      5      U l        g )Nr   r   r   r+   r-   Tc              3   <   >#    U  H  n[        TTTTS 9v   M     g7f)r,   r   r;   N)rN   ).0r   rU   r,   r   r;   s     r"   	<genexpr>#IFBlock.__init__.<locals>.<genexpr>3   s      (ypxkl6[e)fpxs      4   r(   )r.   r/   r6   
Sequentialr0   r7   conv0range	convblockr4   PixelShufflelastconv)r9   	in_planesrU   r,   r   r;   r<   s     ````r"   r/   IFBlock.__init__.   s   ]]MM*++IqAvq!Qv]b+cegeqeqruw{e|}MM*++AFAq!QvUZ+[]_]i]ijmos]tuw
 (ypuvwpx(yzj&@&@FAqRS\bjo&@&prt  sB  sB  CD  sE  Fr$   c                    [         R                  " USU-  SS9nUb@  [         R                  " USU-  SS9R                  U5      n[        R                  " X4S5      nU R                  U R                  U5      5      n[         R                  " U R                  U5      USS9nUS S 2S S24   U-  US S 2SS24   US S 2SS 24   4$ )N      ?r   )scale_factorr
   r   r(      )r   interpolatediv_r   r   ri   rg   rk   )r9   rA   r   scalefeattmps         r"   rB   IFBlock.forward6   s    MM!#+JG==C%KjQVVW\]D		1)Q'A~~djjm,mmDMM$/e*U1bqb5zE!3q!A#v;AqrE
::r$   )rg   ri   rk   )Nr   rD   rL   s   @r"   r[   r[   -   s    $&t4C F; ;r$   r[   c                   ^   ^  \ rS rSrSSSS\4U 4S jjrS rS rS rS	 r	S
 r
SS jrSrU =r$ )IFNetr]   r(   )      `   r]       Nc                 *  > [         TU ]  5         [        XXES9U l        SSU-  -   /SSU-  -   /S-  -   n[        R
                  " [        S5       Vs/ s H  n[        Xg   X'   X4US9PM     sn5      U l        / SQU l	        S	U l
        0 U l        g s  snf )
N)r:   r,   r   r;      r      r(   rq   r`   )r*   rd   r(   r   r   r]   )r.   r/   r&   encoder6   
ModuleListrh   r[   blocks
scale_list	pad_align_warp_grids)	r9   head_chchannelsr,   r   r;   block_inir<   s	           r"   r/   IFNet.__init__A   s    ']GO$	AK(?'@1'DDmm  DI  JK  DL  %M  DL~WX[(+fnx%y  DL  %M  N* %Ms   Bc                 V    U R                   R                  R                  R                  $ r?   )r   r1   weightr   )r9   s    r"   	get_dtypeIFNet.get_dtypeJ   s    {{&&,,,r$   c                 8    SUS   -  US   -  UR                   -  $ )Ni,  r   r   )itemsize)r9   r   r   s      r"   memory_used_forwardIFNet.memory_used_forwardM   s"    U1X~a(5>>99r$   c                    X4U R                   ;   a  g 0 U l         [        R                  " [        R                  " SSX[        R                  S9[        R                  " SSX#[        R                  S9SS9u  pE[        R
                  " XT4SS9R                  S5      [        R                  " US-
  S-  US-
  S-  /[        R                  US	94U R                   X4'   g )
Ng      ro   r+   ij)indexingr   )dimg       @)r   r,   )r   r   meshgridlinspacefloat32stack	unsqueezetensor)r9   r   r   r,   grid_ygrid_xs         r"   _build_warp_gridsIFNet._build_warp_gridsP   s    6T%%%NN4aemmLNN4aemmLW[] KK(a0::1=LL1s7c/AGs?;5==Y_`$b! r$   c                 .    [        XU R                  5      $ r?   )r#   r   )r9   r   r   s      r"   warp
IFNet.warp[   s    S 0 011r$   c                 $    U R                  U5      $ )zEExtract head features for a single frame. Can be cached across pairs.)r   )r9   r   s     r"   extract_featuresIFNet.extract_features^   s    {{3r$   c                    [        U[        R                  5      (       dU  [        R                  " UR                  S   SUR                  S   UR                  S   4X1R
                  UR                  S9nU R                  UR                  S   UR                  S   UR
                  5        UR                  S   nU(       a  SU;   a  US   R                  USSS5      OU R                  U5      nU(       a  SU;   a  US   R                  USSS5      OU R                  U5      nS =n=pXp[        U R                  5       H  u  pUc1  U" [        R                  " XXgU4S5      S U R                  U   S	9u  pn
OrU" [        R                  " XU R                  XhS S 2S S24   5      U R                  XxS S 2SS
24   5      X9U
4S5      XR                  U   S	9u  pn
UR                  U5      nU R                  XS S 2S S24   5      nU R                  X(S S 2SS
24   5      nM     [        R                   " X[        R"                  " U	5      5      $ )Nr   r   r   r   r+   img0r   img1)rt   r(   )
isinstancer   Tensorfullr   r,   r   r   r   r   	enumerater   r   r   r   add_lerpsigmoid)r9   r   r   timestepcacher   f0f1r   maskru   warped_img0warped_img1r   blockfds                   r"   rB   IFNet.forwardb   s,   (ELL11zz4::a=!TZZ]DJJqM"RT\epepx|  yC  yC  DHtzz!}djjmT[[IJJqM49foU6]!!!RR0SWS^S^_cSd49foU6]!!!RR0SWS^S^_cSd!!!t#'[!$++.HA|#(D3QST)UW[cgcrcrstcu#v D!&II{2ArPQrE{9SUYU^U^_ahiklmnknhncoUprz  CG  H  JK  L 2"4$ yy}))Dq"1"u+6K))Dq!A#v,7K / zz+EMM$4GHHr$   )r   r   r   r   r   )g      ?N)rE   rF   rG   rH   rI   r/   r   r   r   r   r   rB   rJ   rK   rL   s   @r"   ry   ry   @   s<     +A$VZgj -:	b2 I Ir$   ry   c                     U S   R                   S   n/ n[        S5       H0  nSU S3nX@;   d  M  UR                  X   R                   S   5        M2     [        U5      S:w  a  [	        S[        U5       35      eX4$ )Nzencode.cnn3.weightr   rq   zblocks.z.conv0.1.0.weightr   z1Unsupported RIFE model: expected 5 blocks, found )r   rh   appendlen
ValueError)
state_dictr   r   r   keys        r"   detect_rife_configr   z   s    -.44Q7GH1Xs+,OOJO11!45  8}LSQY]O\]]r$   )r   torch.nnr6   torch.nn.functional
functionalr   	comfy.opscomfyrI   disable_weight_initr#   Moduler&   rN   r[   ry   r    r$   r"   <module>r      ss        ii##v299  Dbii D;bii ;&7IBII 7It	r$   