
    +j                        d dl Z d dlmZmZmZ d dlmZ d dlmZm	Z	 d dl
Z
dde j        defdZd Z	 dd
e j        dededededededeeef         fdZd Z G d de	j                  Z G d de          ZdefdZdS )    N)TupleCallableOptional)override)ComfyExtensionioxmodec                     | S N )r	   r
   s     9/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_tomesd.py
do_nothingr   	   s    H    c                    | j         d         dk    rZt          j        |                     d          |dk     r|dz
  n||                    d                                        d          S t          j        | ||          S )N   r   )shapetorchgather	unsqueezesqueeze)inputdimindexs      r   mps_gather_workaroundr      s{    {2!|OOBQwwC!GGCOOB
 
 '"++		 |E3...r   Fmetricwhsxsyrno_randreturnc                 z   | j         \  }dk    s|dk    s|dk    rt          t          fS | j        j        dk    rt          nt
          j        t          j                    5  ||z  ||z  }	}|r)t          j        ||	d| j        t
          j	                  }
n"t          j
        ||z  ||	df| j                  }
t          j        ||	||z  | j        t
          j	                  }|                    d|
t          j        |
|
j                              |                    ||	||                              dd                              ||z  |	|z            }||z  |k     s	|	|z  |k     r9t          j        ||| j        t
          j	                  }||d	||z  d	|	|z  f<   n|}|                    dd
d                              d          }
~~||	z  |
d	d	d	d	d	f         |
d	d	d	d	d	f         fd| |                     d
d          z  }  |           \  }}||                    d
d          z  }t'          |j         d                   |                    d
          \  }}|                    d
d          d         }|dd	d	d	f         |dd	d	d	f          |d         d          d	d	d	           n# 1 swxY w Y   ddt
          j        dt
          j        ffd}dt
          j        dt
          j        ff
d}||fS )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           	          | j         d         } | d                    	z
  |                    } | d                    	|                    }||fS )Nr   r   r   r   )r   expand)
r	   Cr-   dstBNa_idxb_idxr   num_dsts
       r   splitz/bipartite_soft_matching_random2d.<locals>.splitN   sg    A&aWa)H)HIIIC&a!)D)DEEEC8Or   T)r   keepdim)r   
descending).N.r0   meanr	   r$   c           	      T    |           \  }}|j         \  }}} 	|d                    ||
z
  |                    } 	|d                    |
|                    }|                    d                    |
|          ||          }t          j        ||gd          S )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   mergez/bipartite_soft_matching_random2d.<locals>.merged   s    588S92qfSbq"q&!(D(DEEEfSbq!Q(?(?@@@  W^^Aq!%<%<c$ OOy#s++++r   c           
        
 j         d         }| dd |d d f         | d|d d d f         }}|j         \  }}} |d                    |                    }t          j        	|| j        | j                  }|                    d                    |          |           |                    d 
                    
j         d         d          d                              ||          |           |                    d 
                    
j         d         d          d                              |          |           |S )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   unmergez1bipartite_soft_matching_random2d.<locals>.unmergen   s{   -"S(7(AAA%&#wxx*:(;S)1afSbq!Q(?(?@@@ k!Q!(!'BBB5<<7A#>#>CHHH66%,,q%+a.!*L*LRS[b#c#c#c#j#jklnuwx#y#y  @C  	D  	D  	D66%,,q%+a.!*L*LRS[b#c#c#c#j#jklnoqr#s#sy|}}}
r   )r=   )r   r   r(   typer   r   r   no_gradrK   int64randintrL   	ones_liker)   view	transposereshapeargsortnormminmaxTensor)r   r   r   r    r!   r"   r#   rN   hsywsxrand_idxidx_buffer_view
idx_bufferabscoresnode_maxnode_idxedge_idxrI   rP   r4   r5   r6   r7   rF   r   r8   r9   rG   rH   s        `               @@@@@@@@@@r    bipartite_soft_matching_random2dri      se    lGAq!Avva166:%%&,m&8E&A&A""u|F	 4E 4E7AGS  	V{3Qv}EKXXXHH}RU#sAv}UUUH  +c32fmSXS^___  QhU_X]e]k=l=l=l<l mmm)..sCR@@JJ1aPPXXY\_aYacfikckll "H>>cBh!^^Q&-u{SSSJ3BJ{r{KcBhK/00(J %%aQ//77A7>>  )GHHaaa(HWHaaa(	 	 	 	 	 	 	 	 	 	 &++"d+;;;uV}}1Q[[R((( 
A $ZZBZ//(##t#<<YG3AAA:&3AAA:&&),"GDDDi4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4El, , ,u| , , , , , , , , , , ,5< EL                '>s   -I*K##K'*K'c           	         |\  }}}}||z  }t          t          j        t          j        || j        d         z                                }d}	d}
d}||k    rt          t          j        ||z                      }t          t          j        ||z                      }t          | j        d         |z            }d}t          | |||	|
||          \  }}||fS d }||fS )Nr   r+   Fc                     | S r   r   )ys    r   <lambda>zget_functions.<locals>.<lambda>   s     r   )intmathceilsqrtr   ri   )r	   ratiooriginal_shaperd   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 Aq*j :-OTYtyAGAJ)FGGHHIIJHHN^##	*z12233	*z12233
U"##/1a8QPWXX1!tkGGr   c                   J    e Zd Zed             Zedej        fd            ZdS )TomePatchModelc                     t          j        ddt           j                            d          t           j                            ddddd	          gt           j                                        g
          S )Nr   zmodel/patch/unetmodelrr   g333333?g        g      ?g{Gz?)defaultr[   r\   step)node_idcategoryinputsoutputs)r   SchemaModelInputFloatOutput)clss    r   define_schemazTomePatchModel.define_schema   sf    y$'w''w#DQQ X__&&'
 
 
 	
r   r$   c                     d fd}fd}|                                 }|                    |           |                    |           t          j        |          S )Nc                 T    t          | |d                   \  } ||           ||fS )Nrs   )r~   )qkvextra_optionsr{   rr   r|   s        r   tomesd_mz(TomePatchModel.execute.<locals>.tomesd_m   s4     !E=9I+JKKDAq1Q44A:r   c                      |           S r   r   )rB   r   r|   s     r   tomesd_uz(TomePatchModel.execute.<locals>.tomesd_u   s    1Q44Kr   )cloneset_model_attn1_patchset_model_attn1_output_patchr   
NodeOutput)r   r   rr   r   r   r{   r|   s     `   @r   executezTomePatchModel.execute   s     $	 	 	 	 	 		 	 	 	 	 KKMM	)))	&&x000}Qr   N)__name__
__module____qualname__classmethodr   r   r   r   r   r   r   r   r      sV        	
 	
 [	
  bm       [     r   r   c                   L    e Zd Zedeeej                          fd            ZdS )TomePatchModelExtensionr$   c                    K   t           gS r   )r   )selfs    r   get_node_listz%TomePatchModelExtension.get_node_list   s       
 	
r   N)	r   r   r   r   listrQ   r   	ComfyNoder   r   r   r   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r   r   c                  "   K   t                      S r   )r   r   r   r   comfy_entrypointr      s      "$$$r   r   )F)r   typingr   r   r   typing_extensionsr   comfy_api.latestr   r   ro   r]   strr   r   rn   boolri   r~   r   r   r   r   r   r   r   <module>r      s    , , , , , , , , , , & & & & & & / / / / / / / /  %, S    / / / 6;e eU\ e(+e03e9<eBEeJMe.2e?DXxEW?Xe e e eP  *         R\      @
 
 
 
 
n 
 
 
% 7 % % % % % %r   