
    +j                        S SK r S SKJrJrJr  S SKJr  S SKJrJ	r	  S SK
r
SS\ R                  S\4S jjrS r SS	\ R                  S
\S\S\S\S\S\S\\\4   4S jjrS r " S S\	R&                  5      r " S S\5      rS\4S jrg)    N)TupleCallableOptional)override)ComfyExtensionioxmodec                     U $ N )r	   r
   s     9/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_tomesd.py
do_nothingr   	   s    H    c                     U R                   S   S:X  aP  [        R                  " U R                  S5      US:  a  US-
  OUUR                  S5      5      R	                  S5      $ [        R                  " XU5      $ )N   r   )shapetorchgather	unsqueezesqueeze)inputdimindexs      r   mps_gather_workaroundr      sh    {{2!||OOBQwC!GCOOB
 '"+		 ||E..r   metricwhsxsyrno_randreturnc                 B  ^^^^^^^^^^^ U R                   u  mmnTS::  d  US:X  d  US:X  a  [        [        4$ U R                  R                  S:X  a  [        O[
        R                  m[
        R                  " 5          X$-  X-  pU(       a0  [
        R                  " XSU R                  [
        R                  S9n
O$[
        R                  " XC-  XS4U R                  S9n
[
        R                  " XXC-  U R                  [
        R                  S9nUR                  SU
[
        R                  " XR                  S9* S9  UR                  XXC5      R                  SS5      R!                  X-  X-  5      nX-  U:  d  X-  U:  a=  [
        R                  " X!U R                  [
        R                  S9nXS	X-  2S	X-  24'   OUnUR!                  SS
S5      R#                  SS9n
AAX-  mU
S	S	2TS	2S	S	24   mU
S	S	2S	T2S	S	24   mUUUUUU4S jmX R%                  S
SS9-  n T" U 5      u  pXR                  S
S5      -  n['        UR                   S   T5      mUR)                  S
S9u  nnUR#                  S
SS9S   nUSTS	2S	S	24   mUSS	T2S	S	24   mT" US   STS9mS	S	S	5        SS[
        R*                  S[
        R*                  4UUUUUU4S jjjnS[
        R*                  S[
        R*                  4UUUUUUUUUU4
S jjnUU4$ ! , (       d  f       Nr= f)a  
Partitions the tokens into src and dst and merges r tokens from src to dst.
Dst tokens are partitioned by choosing one randomy in each (sx, sy) region.
Args:
 - metric [B, N, C]: metric to use for similarity
 - w: image width in tokens
 - h: image height in tokens
 - sx: stride in the x dimension for dst, must divide w
 - sy: stride in the y dimension for dst, must divide h
 - r: number of tokens to remove (by merging)
 - no_rand: if true, disable randomness (use top left corner only)
r   r   mpsdevicedtype)sizer(      )r)   r   r   srcNr   r   c           	         > U R                   S   nT" U STR                  TTT	-
  U5      S9nT" U STR                  TT	U5      S9nX#4$ )Nr   r   r   r   )r   expand)
r	   Cr-   dstBNa_idxb_idxr   num_dsts
       r   split/bipartite_soft_matching_random2d.<locals>.splitN   sQ    AaWa)HICa!)DEC8Or   T)r   keepdim)r   
descending).N.r0   r	   r$   c           	        > T" U 5      u  p#UR                   u  pEnT	" USTR                  XET
-
  U5      S9nT	" USTR                  UT
U5      S9nUR                  STR                  UT
U5      X!S9n[        R                  " Xs/SS9$ )Nr<   r0   )reducer   r.   )r   r1   scatter_reducer   cat)r	   r
   r-   r3   nt1cunmdst_idxr   r"   r9   src_idxunm_idxs           r   merge/bipartite_soft_matching_random2d.<locals>.merged   s    899qSbqq&!(DESbq!Q(?@  W^^Aq!%<c Oyy#++r   c           
      T  >
 TR                   S   nU SS U2S S 24   U SUS 2S S 24   p2UR                   u    pET" USTR                  TTU5      S9n[        R                  " TT	XPR                  U R
                  S9nUR                  STR                  TTU5      US9  UR                  ST" T
R                  TT
R                   S   S5      STS9R                  TX5      US9  UR                  ST" T
R                  TT
R                   S   S5      STS9R                  TTU5      US9  U$ )Nr   .r<   r0   r'   r,   )r   r1   r   zerosr(   r)   scatter_)r	   unm_lenrE   r3   _rD   r-   outr4   r5   r6   r7   rF   r   r8   r"   rG   rH   s           r   unmerge1bipartite_soft_matching_random2d.<locals>.unmergen   s.   --"S(7(A%&#wx*:(;S))1Sbq!Q(?@ kk!Q((!''B5<<7A#>CH6%,,q%++a.!*LRS[b#c#j#jklnu#y  @C  	D6%,,q%++a.!*LRS[b#c#j#jklnoqr#sy|}
r   )mean)r   r   r(   typer   r   r   no_gradrL   int64randintrM   	ones_liker)   view	transposereshapeargsortnormminmaxTensor)r   r   r   r    r!   r"   r#   rO   hsywsxrand_idxidx_buffer_view
idx_bufferabscoresnode_maxnode_idxedge_idxrI   rQ   r4   r5   r6   r7   rF   r   r8   r9   rG   rH   s        `               @@@@@@@@@@r    bipartite_soft_matching_random2drl      s    llGAq!Ava16:%%&,mm&8&8E&A"u||F	7AGS {{3Qv}}EKKXH}}RU#Av}}UH  ++cfmmSXS^S^_  QhU__X]k]k=l<l m)..s@JJ1aPXXY\Yacfckl H>ch!^Q&--u{{SJ3B{{KchK/0(J %%aQ/77A7>  )GHa(HWHa(	 	 ++"d+;;V}[[R(( 
A $ZZBZ/(##t#<YG3A:&3A:&),"GDi 
l, ,u|| , ,5<< ELL    '>_ 
s   ?H%L
Lc           	         Uu  p4pVXV-  n[        [        R                  " [        R                  " XpR                  S   -  5      5      5      nSn	Sn
SnX::  at  [        [        R                  " Xh-  5      5      n[        [        R                  " XX-  5      5      n[        U R                  S   U-  5      nSn[        XXXU5      u  nnUU4$ S nUU4$ )Nr   r+   Fc                     U $ r   r   )ys    r   <lambda>get_functions.<locals>.<lambda>   s    r   )intmathceilsqrtr   rl   )r	   ratiooriginal_shaperg   rD   
original_h
original_woriginal_tokens
downsamplestride_xstride_ymax_downsampler   r   r"   r#   munothings                      r   get_functionsr      s    #1 A* -OTYYtyyGGAJ)FGHIJHHN#		*123		*123
U"#/a8PWX1!tGGr   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)TomePatchModel   c                     [         R                  " SS[         R                  R                  S5      [         R                  R                  SSSSSS	9/[         R                  R                  5       /S
9$ )Nr   zmodel/patch/unetmodelrv   g333333?g        g      ?g{Gz?)defaultr^   r_   step)node_idcategoryinputsoutputs)r   SchemaModelInputFloatOutput)clss    r   define_schemaTomePatchModel.define_schema   s[    yy$'w'w#DQ XX__&'
 	
r   r$   c                    ^^ S mUU4S jnU4S jnUR                  5       nUR                  U5        UR                  U5        [        R                  " U5      $ )Nc                 >   > [        U TUS   5      u  nmU" U 5      X4$ )Nrw   )r   )qkvextra_optionsr   rv   r   s        r   tomesd_m(TomePatchModel.execute.<locals>.tomesd_m   s+     !E=9I+JKDAqQ4:r   c                    > T" U 5      $ r   r   )rB   r   r   s     r   tomesd_u(TomePatchModel.execute.<locals>.tomesd_u   s    Q4Kr   )cloneset_model_attn1_patchset_model_attn1_output_patchr   
NodeOutput)r   r   rv   r   r   r   r   s     `   @r   executeTomePatchModel.execute   sJ     $		 KKM	)	&&x0}}Qr   r   N)
__name__
__module____qualname____firstlineno__classmethodr   r   r   r   __static_attributes__r   r   r   r   r      s3    	
 	
  bmm    r   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)TomePatchModelExtension   r$   c                    #    [         /$ 7fr   )r   )selfs    r   get_node_list%TomePatchModelExtension.get_node_list   s      
 	
s   
r   N)r   r   r   r   r   listrT   r   	ComfyNoder   r   r   r   r   r   r      s)    
T$r||*<%= 
 
r   r   c                     #    [        5       $ 7fr   )r   r   r   r   comfy_entrypointr      s     "$$s   r   )F)r   typingr   r   r   typing_extensionsr   comfy_api.latestr   r   rs   r`   strr   r   rr   boolrl   r   r   r   r   r   r   r   r   <module>r      s     , , & / %,, S / 6;eU\\ e(+e03e9<eBEeJMe.2e?DXxEW?XeP* R\\  @
n 
% 7 %r   