
    3jD                        S SK rS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
  S SKrS SKrS%S jr " S S\
R                  5      r " S S\
R                  5      r " S	 S
\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S \
R                  5      r " S! S"\	5      rS#\4S$ jrg)&    N)override)ComfyExtensionioc                     UR                   SS  U SS  :w  a(  [        R                  R                  XS   U S   SS5      nU(       a"  [        R                  R	                  XS   5      $ U$ )N   bilinearcenterr   )shapecomfyutilscommon_upscalerepeat_to_batch_size)target_shapelatentrepeat_batchs      9/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_latent.pyreshape_latent_tor   
   sd    ||AB<++++F4DlSUFVXbdlm{{//QHH    c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)	LatentAdd   c           	          [         R                  " SSS/S[         R                  R                  S5      [         R                  R                  S5      /[         R                  R	                  5       /S9$ )Nr   combine latentszsum latentsmodel/latent/advancedsamples1samples2node_idsearch_aliasescategoryinputsoutputsr   SchemaLatentInputOutputclss    r   define_schemaLatentAdd.define_schema   s]    yy-}=,		
+		
+
 		  "
 	
r   returnc                     UR                  5       nUS   nUS   n[        UR                  U5      nXE-   US'   [        R                  " U5      $ Nsamplescopyr   r   r   
NodeOutputr+   r   r   samples_outs1s2s         r   executeLatentAdd.execute#   L    mmoi i rxx,!#I}}[))r    N
__name__
__module____qualname____firstlineno__classmethodr,   r   r4   r9   __static_attributes__r<   r   r   r   r      3    
 
 *BMM * *r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentSubtract.   c           	          [         R                  " SSS/S[         R                  R                  S5      [         R                  R                  S5      /[         R                  R	                  5       /S9$ )NrF   zdifference latentzremove featuresr   r   r   r   r%   r*   s    r   r,   LatentSubtract.define_schema/   s^    yy$/1BC,		
+		
+
 		  "
 	
r   r.   c                     UR                  5       nUS   nUS   n[        UR                  U5      nXE-
  US'   [        R                  " U5      $ r0   r2   r5   s         r   r9   LatentSubtract.execute>   r;   r   r<   Nr=   r<   r   r   rF   rF   .   rD   r   rF   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentMultiplyI   c                     [         R                  " S/ SQS[         R                  R                  S5      [         R                  R                  SSSSS	S
9/[         R                  R                  5       /S9$ )NrM   )zscale latentzamplify latentzlatent gainr   r1   
multiplier      ?g      $      $@{Gz?defaultminmaxstepr   r   r&   r'   r(   Floatr)   r*   s    r   r,   LatentMultiply.define_schemaJ   sc    yy$L,			*|SeTXY
 		  "
 	
r   r.   c                 f    UR                  5       nUS   nXB-  US'   [        R                  " U5      $ r0   r3   r   r4   )r+   r1   rP   r6   r7   s        r   r9   LatentMultiply.executeY   s2    llnY!#I}}[))r   r<   Nr=   r<   r   r   rM   rM   I   s3    
 
 *R]] * *r   rM   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentInterpolatea   c                 (   [         R                  " S/ SQS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SSSSS	S
9/[         R                  R                  5       /S9$ )Nr`   )zblend latentz
mix latentzlerp latent
transitionr   r   r   ratiorQ           rS   rT   r   rY   r*   s    r   r,   LatentInterpolate.define_schemab   sr    yy'V,		
+		
+w#DQ 		  "
 	
r   r.   c                    UR                  5       nUS   nUS   n[        UR                  U5      n[        R                  R                  USS9n[        R                  R                  USS9n[        R                  " XW-  5      n[        R                  " Xh-  5      nXS-  USU-
  -  -   n	[        R                  R                  U	SS9n
[        R                  " X-  5      nXU-  USU-
  -  -   -  US'   [        R                  " U5      $ )Nr1   r   dimrQ   )	r3   r   r   torchlinalgvector_norm
nan_to_numr   r4   )r+   r   r   rd   r6   r7   r8   m1m2tmtsts               r   r9   LatentInterpolate.executer   s    mmoi i rxx,\\%%bq%2\\%%bq%2bg&bg&Z"e,,\\%%aa%1af%!#EzB#+4F'F!GI}}[))r   r<   Nr=   r<   r   r   r`   r`   a   s3    
 
 *2== * *r   r`   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentConcat   c                 &   [         R                  " SSS/S[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S/ SQS	9/[         R                  R                  5       /S
9$ )Nru   join latentszstitch latentsr   r   r   ri   )xz-xyz-yrp   z-toptionsr   r   r&   r'   r(   Combor)   r*   s    r   r,   LatentConcat.define_schema   ss    yy"*,<=,		
+		
+u.OP 		  "
 	
r   r.   c                 6   UR                  5       nUS   nUS   n[        R                  R                  XeR                  S   5      nSU;   a  Xe4nOXV4nSU;   a  SnOSU;   a  SnOSU;   a  S	n[
        R                  " XsS
9US'   [        R                  " U5      $ )Nr1   r   -ry   r   rz   r	   rp   rh   )	r3   r   r   r   r   rj   catr   r4   )r+   r   r   ri   r6   r7   r8   cs           r   r9   LatentConcat.execute   s    mmoi i [[--b((1+>#:AA#:CCZCCZC!&1!6I}}[))r   r<   Nr=   r<   r   r   ru   ru      s3    
 
 * * *r   ru   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)	LatentCut   c                    [         R                  " S/ SQS[         R                  R                  S5      [         R                  R                  S/ SQS9[         R
                  R                  SS	[        R                  * [        R                  S
S9[         R
                  R                  SS
S
[        R                  S
S9/[         R                  R                  5       /S9$ )Nr   )zcrop latentzslice latentzextract regionr   r1   ri   )ry   rz   rp   r{   indexr   r   rT   amountr   	r   r&   r'   r(   r~   IntnodesMAX_RESOLUTIONr)   r*   s    r   r,   LatentCut.define_schema   s    yyL,			*uo>Wae6J6J5JPUPdPdklmXqaU=Q=QXYZ	 		  "
 	
r   r.   c                    UR                  5       nUS   nSU;   a  UR                  S-
  nO+SU;   a  UR                  S-
  nOSU;   a  UR                  S-
  nUS:  a8  [        X6R                  U   S-
  5      n[        UR                  U   U-
  U5      nO&[	        X6R                  U   * 5      n[        U* U5      n[
        R                  " XbX45      US'   [        R                  " U5      $ )	Nr1   ry   r   rz      rp      r   )	r3   ndimrV   r   rW   rj   narrowr   r4   )r+   r1   ri   r   r   r6   r7   s          r   r9   LatentCut.execute   s    llnY#:''A+CCZ''A+CCZ''A+CA:xx}q01E#.7F~.E%(F!&bu!EI}}[))r   r<   Nr=   r<   r   r   r   r      s3    
 
  *R]] * *r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentCutToBatch   c                 F   [         R                  " S/ SQS[         R                  R                  S5      [         R                  R                  S/ SQS9[         R
                  R                  SS	S	[        R                  S	S
9/[         R                  R                  5       /S9$ )Nr   )zslice to batchzsplit latentztile latentr   r1   ri   )rp   ry   rz   r{   
slice_sizer   rT   r   r   r*   s    r   r,   LatentCutToBatch.define_schema   s}    yy&L,			*uo>\1!AUAU\]^ 		  "
 	
r   r.   c                    UR                  5       nUS   nSU;   a  UR                  S-
  nO+SU;   a  UR                  S-
  nOSU;   a  UR                  S-
  nUS:  a  [        R                  " U5      $ UR	                  US5      nUR
                  S   U:  a  UR
                  S   nOHUR
                  S   U-  S:w  a2  US S 2S [        R                  " UR
                  S   U-  5      U-  24   nS	U/[        UR
                  SS  5      -   nUR                  U5      R	                  SU5      US'   [        R                  " U5      $ )
Nr1   ry   r   rz   r   rp   r   r   r   )
r3   r   r   r4   movedimr   mathfloorlistreshape)r+   r1   ri   r   r6   r7   s	new_shapes           r   r9   LatentCutToBatch.execute   s(   llnY#:''A+CCZ''A+CCZ''A+C7==))JJsA771:
"JWWQZ*$)!Fdjjj!89JFFFGA$tAGGABK'88	!"9!5!=!=a!EI}}[))r   r<   Nr=   r<   r   r   r   r      s3    
 
 *"-- * *r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentBatchi  c                     [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  S5      /[         R                  R	                  5       /S9$ )	Nr   )r   zmerge latentsrx   zBatch Latents (DEPRECATED)model/latent/batchTr   r   )r    r!   display_namer"   is_deprecatedr#   r$   r%   r*   s    r   r,   LatentBatch.define_schema  s^    yy!O5)		
+		
+
 		  "
 	
r   r.   c           	         UR                  5       nUS   nUS   n[        UR                  USS9n[        R                  " XE4SS9nXcS'   UR                  S[        SUR                  S   5       Vs/ s H  owPM     sn5      UR                  S[        SUR                  S   5       Vs/ s H  owPM     sn5      -   US'   [        R                  " U5      $ s  snf s  snf )Nr1   F)r   r   rh   batch_index)	r3   r   r   rj   r   getranger   r4   )r+   r   r   r6   r7   r8   r   ry   s           r   r9   LatentBatch.execute  s%   mmoi i rxx%@IIrhA&!"I%-\\-USTVXV^V^_`VaMbAcMb!MbAc%dgogsgs  uB  PU  VW  Y[  Ya  Ya  bc  Yd  Pe  Df  Pe  KL  EF  Pe  Df  hg  &gM"}}[)) Bd  Dfs   1C
)Cr<   Nr=   r<   r   r   r   r     s3    
 
  	*BMM 	* 	*r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentBatchSeedBehaviori!  c                     [         R                  " SS[         R                  R                  S5      [         R                  R                  SSS/SS9/[         R                  R                  5       /S9$ )	Nr   r   r1   seed_behaviorrandomfixed)r|   rU   )r    r"   r#   r$   r}   r*   s    r   r,   %LatentBatchSeedBehavior.define_schema"  sa    yy-,			*78KU\]
 		  "

 
	
r   r.   c                     UR                  5       nUS   nUS:X  a  SU;   a  UR                  S5        O2US:X  a,  UR                  SS/5      S   nU/UR                  S   -  US'   [        R
                  " U5      $ )Nr1   r   r   r   r   )r3   popr   r   r   r4   )r+   r1   r   r6   r   batch_numbers         r   r9   LatentBatchSeedBehavior.execute0  s{    lln#H$+.g%&??=1#>qAL*6&,,q/)IK&}}[))r   r<   Nr=   r<   r   r   r   r   !  s3    
 
 
* 
* 
*r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentApplyOperationi=  c           
          [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  S5      /[         R                  R                  5       /S9$ )Nr   ztransform latent model/latent/advanced/operationsTr1   	operationr    r!   r"   is_experimentalr#   r$   )r   r&   r'   r(   LatentOperationr)   r*   s    r   r,   "LatentApplyOperation.define_schema>  sb    yy*./7 			*""((5
 		  "
 	
r   r.   c                 j    UR                  5       nUS   nU" US9US'   [        R                  " U5      $ )Nr1   r   r]   )r+   r1   r   r6   r7   s        r   r9   LatentApplyOperation.executeN  s5    llnY!*"!5I}}[))r   r<   Nr=   r<   r   r   r   r   =  s3    
 
 *BMM * *r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentApplyOperationCFGiV  c           	          [         R                  " SSS[         R                  R                  S5      [         R                  R                  S5      /[         R                  R                  5       /S9$ )Nr   r   Tmodelr   r    r"   r   r#   r$   )r   r&   Modelr(   r   r)   r*   s    r   r,   %LatentApplyOperationCFG.define_schemaW  sZ    yy-7 w'""((5
 !
 	
r   r.   c                 ~   ^ UR                  5       nU4S jnUR                  U5        [        R                  " U5      $ )Nc                 |   > U S   n[        U5      S:X  a  T" US   US   -
  S9US   -   US'   U$ T" US   S9US'   U$ )N	conds_outr   r   r   r   )len)argsr   r   s     r   pre_cfg_function9LatentApplyOperationCFG.execute.<locals>.pre_cfg_functionj  sb    [)I9~"(1	!1LNQZ[\Q]]	!   )	!=	!r   )clone"set_model_sampler_pre_cfg_functionr   r4   )r+   r   r   mr   s     `  r   r9   LatentApplyOperationCFG.executef  s3    KKM	 	
,,-=>}}Qr   r<   Nr=   r<   r   r   r   r   V  s3    
 
  "--    r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentOperationTonemapReinhardiu  c                     [         R                  " SS/SS[         R                  R                  SSSSS	S
9/[         R                  R                  5       /S9$ )Nr   z
hdr latentr   TrP   rQ   re   g      Y@rS   rT   r   )r   r&   rZ   r(   r   r)   r*   s    r   r,   ,LatentOperationTonemapReinhard.define_schemav  sZ    yy4(>7 |ScuSWX ""))+
 	
r   r.   c                 <   ^ U4S jn[         R                  " U5      $ )Nc                 2  > [         R                  R                  U SS9S-   S S 2S 4   nX-  n[        [	        SUR
                  5      5      n[         R                  " X$SS9n[         R                  " X$SS9nUS-  U-   T	-  nUSU-  -  nX"S-   -  nX-  nX8-  $ )Nr   rh   g|=T)ri   keepdim   rQ   )rj   rk   rl   r   r   r   meanstd)
r   kwargslatent_vector_magnitudenormalized_latentdimsr   r   topnew_magnituderP   s
            r   tonemap_reinhard@LatentOperationTonemapReinhard.execute.<locals>.tonemap_reinhard  s    ',||'?'?Q'?'PS_'_abcgag&h# & @a!8!=!=>?D::5ND))3tLC7T>Z/C $c	2#3QT7TUM M$44r   r   r4   )r+   rP   r   s    ` r   r9   &LatentOperationTonemapReinhard.execute  s    	5  }}-..r   r<   Nr=   r<   r   r   r   r   u  s3    
 
 /BMM / /r   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)LatentOperationSharpeni  c                 2   [         R                  " SSS[         R                  R                  SSSSSSS9[         R                  R                  S	S
SSSSS9[         R                  R                  SSSSSSS9/[         R
                  R                  5       /S9$ )Nr   r   Tsharpen_radius	   r      )rU   rV   rW   rX   advancedsigmarQ   g?rR   alphare   g      @rS   r   )r   r&   r   r(   rZ   r   r)   r*   s    r   r,   $LatentOperationSharpen.define_schema  s    yy,7 -qaRaZ^_w$S[_`w#D[_` ""))+
 	
r   r.   c                 D   ^^^ UUU4S jn[         R                  " U5      $ )Nc                 R  > [         R                  R                  U SS9S-   S S 2S 4   nX-  nU R                  S   nTS-  S-   n[        R
                  R                  UTUR                  S9nUS-  nUT
S-  -  nXgU4   UR                  5       -
  S-   XgU4'   [         R                  R                  R                  UTTTT4S5      n[         R                  R                  R                  XR                  USS5      R                  S5      US-  US	9S S 2S S 2TT* 2TT* 24   n	X)-  $ )
Nr   rh   gư>r   )deviceirQ   reflect)paddinggroups)rj   rk   rl   r   comfy_extrasnodes_post_processinggaussian_kernelr   sumnn
functionalpadconv2drepeat	unsqueeze)r   r   	luminancer   channelskernel_sizekernelr   padded_image	sharpenedr   r   r   s             r   sharpen/LatentOperationSharpen.execute.<locals>.sharpen  s   11&q1BTI1T6RI & 2||AH(1,q0K!77GGUZclcscsGtF A%Feck!F%+FN%;fjjl%JS%PF6>" 88..223D~Vdes  uC  GD  FO  PL++22<xYZ\]A^AhAhijAk  vA  EF  vF  OW2  X  YZ  [\  ]k  m{  l{  ]{  }K  M[  L[  }[  Y[  \I((r   r   )r+   r   r   r   r  s    ``` r   r9   LatentOperationSharpen.execute  s    	)  }}W%%r   r<   Nr=   r<   r   r   r   r     s3    
 
 &bmm & &r   r   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)ReplaceVideoLatentFramesi  c                 ^   [         R                  " SSS[         R                  R                  SSS9[         R                  R                  SSS	S
9[         R                  R                  SS[
        R                  * [
        R                  SSS9/[         R                  R                  5       /S9$ )Nr  zReplace Video Latent Framesr   destinationz5The destination latent where frames will be replaced.)tooltipsourceTzThe source latent providing frames to insert into the destination latent. If not provided, the destination latent is returned unchanged.)optionalr  r   r   r   zThe starting latent frame index in the destination latent where the source latent frames will be placed. Negative values count from the end.)rU   rV   rW   rX   r  )r    r   r"   r#   r$   )r   r&   r'   r(   r   r   r   r)   r*   s    r   r,   &ReplaceVideoLatentFrames.define_schema  s    yy.6)		7no		4  BL  MWae6J6J5JPUPdPdkl  wE  F 		  "
 	
r   Nr.   c           	      8   Uc  [         R                  " U5      $ US   R                  S   nUS   R                  S   nUS:  a  XB-   nX$:  a3  [        R                  " SU SU S35        [         R                  " U5      $ X%-   U:  a6  [        R                  " SU SU S	U S35        [         R                  " U5      $ UR                  5       nUS   nUS   R                  5       nXxS S 2S S 2X"UR                  S   -   24'   XS'   [         R                  " U5      $ )
Nr1   r   r   z ReplaceVideoLatentFrames: Index z0 is out of bounds for destination latent frames .z/ReplaceVideoLatentFrames: Source latent frames z- do not fit within destination latent frames z at the specified index )r   r4   r   loggingwarningr3   r   )	r+   r  r   r  dest_framessource_framesr   s_sources_destinations	            r   r9    ReplaceVideoLatentFrames.execute  sY   >==--!),2215y)//219'EOO>ugEu  wB  vC  CD  E  F==-- ;.OOMm_  ]J  KV  JW  Wo  pu  ov  vw  x  y==--KKM)$#I.446?GaE(..*;";;;<$)}}Qr   r<   Nr=   r<   r   r   r  r    s3    
 
      r   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)LatentExtensioni  r.   c                    #    [         [        [        [        [        [
        [        [        [        [        [        [        [        [        /$ 7fr#  )r   rF   rM   r`   ru   r   r   r   r   r   r   r   r   r  )selfs    r   get_node_listLatentExtension.get_node_list  s;      # #*"$
 	
s   A	Ar<   N)r>   r?   r@   rA   r   r   typer   	ComfyNoder(  rC   r<   r   r   r%  r%    s)    
T$r||*<%= 
 
r   r%  r.   c                     #    [        5       $ 7fr#  )r%  r<   r   r   comfy_entrypointr-    s     s   )T)comfy.utilsr   "comfy_extras.nodes_post_processingr   rj   r   typing_extensionsr   comfy_api.latestr   r   r  r   r   r+  r   rF   rM   r`   ru   r   r   r   r   r   r   r   r   r  r%  r-  r<   r   r   <module>r2     s!    )   & /  * *6*R\\ *6*R\\ *0%* %*N&*2<< &*P'* '*R(*r|| (*T*",, *<*bll *8*2<< *2 bll  >"/R\\ "/H#&R\\ #&J$ r|| $ L
n 
* r   