
    
3j                     n    S SK r S SKrS SKJr  S SKJr  SSKJr   " S S5      rS r	 " S	 S
5      r
\
\/rg)    N)
functional)_pair   )logc                   B    \ rS rSrSr\S 5       rSrSrSr	  S
S jr
Srg	)MTB_VaeDecode
   zmWrapper for the 2 core decoders but also adding the sd seamless hack, taken from: FlyingFireCo/tiled_ksamplerc                 4    SSSSSS04SSS04SS	S
SSS.4S.0$ )Nrequired)LATENT)VAEBOOLEANdefaultFTINT   i@  i   @   )r   minmaxstep)samplesvaeseamless_modeluse_tiling_decoder	tile_size clss    B/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/model.pyINPUT_TYPESMTB_VaeDecode.INPUT_TYPES   sJ     &#,y%.@"A'09d2C&D #CbI	
 	
    )IMAGEdecodez
mtb/decodec                    U(       a  U(       a  [         R                  " S5        SnUR                  R                  5        Vs/ s H0  n[	        U[
        R                  R                  5      (       d  M.  UPM2     sn H
  nSUl        M     U(       a  UR                  US   US-  US-  S94$ UR                  US   5      4$ s  snf )NzKYou cannot use seamless mode with tiling decoder together, skipping tiling.Fcircularr      )tile_xtile_y)r   errorfirst_stage_modelmodules
isinstancetorchnnConv2dpadding_modedecode_tiledr#   )selfr   r   r   r   r   layers          r   r#   MTB_VaeDecode.decode!   s     !		a &+" !22::<<EeUXX__5 <
 &0"   I&$>$> !   JJwy1244s   -C4Cr   N)Tr   )__name__
__module____qualname____firstlineno____doc__classmethodr   RETURN_TYPESFUNCTIONCATEGORYr#   __static_attributes__r   r!   r   r   r   
   s5    w
 
 LHH  5r!   r   c           	      d   U R                   nU R                  S:  d  X@R                  :  ar  U R                  S:  d  X@R                  ::  aS  [        R                  " XR
                  U R                  S9n[        R                  " XPR                  U R                  S9nO>[        R                  " XR
                  SS9n[        R                  " XPR                  SS9nU =R                   S-  sl         [        R                  " XRX0R                  [        S5      U R                  U R                  5      $ )Nr   )modeconstant   )timesteppaddingStartSteppaddingStopStepFpadpaddingXpadding_modeXpaddingYpadding_modeYconv2dstrider   dilationgroups)lyrtensorweightbiasr   workings         r   conv_forwardrU   A   s    <<Dq D,@,@$@a4+>+>#>%%33D3DE%%C4E4EF%%:>%%J?LLAL88zz58S\\3:: r!   c                   D    \ rS rSrSr\S 5       rSrSrSr	Sr
S rS	 rS
rg)MTB_ModelPatchSeamlessS   z}Uses the stable diffusion 'hack' to infer seamless images by setting the model layers padding mode to circular (experimental)c                 6    SSSSS04SSS04SSS04SSS04S	.0$ )
Nr   )MODELr   r   r   i  r   T)model	startStepstopSteptilingXtilingYr   r   s    r   r   "MTB_ModelPatchSeamless.INPUT_TYPESV   sT     ##i^4"Y$45%
 %
 	
r!   )rZ   rZ   )zOriginal Model (passthrough)zPatched Modelhackzmtb/texturesc                    UR                  5        Vs/ s H0  n[        U[        R                  R                  5      (       d  M.  UPM2     sn H  nU(       a  SOSUl        U(       a  SOSUl        UR                  S   UR                  S   SS4Ul        SSUR                  S   UR                  S   4Ul	        X&l
        X6l        SUl        [        R                  U[        R                  R                  5      Ul        M     U$ s  snf )Nr%   rA   r   rB   r      )r+   r,   r-   r.   r/   rI   rK    _reversed_padding_repeated_twicerH   rJ   rD   rE   rC   rU   __get___conv_forward)r2   r[   r\   r]   xyr3   s          r   apply_circular%MTB_ModelPatchSeamless.apply_circularq   s     
(%1 (
E
 12*zE01*zE66q966q9	EN 66q966q9	EN &/"$,!EN"."6"6uehhoo"NE-
0 1
s   -DDc                 b    UR                  5       nU R                  UR                  X#XE5        X4$ )N)cloneri   r[   )r2   r[   r\   r]   r^   r_   hacked_models          r   ra   MTB_ModelPatchSeamless.hack   s5     {{}	W	
 $$r!   r   N)r5   r6   r7   r8   r9   r:   r   r;   RETURN_NAMESr<   r=   ri   ra   r>   r   r!   r   rW   rW   S   s>     H
 
" &LL HH6%r!   rW   )copyr-   torch.nnr   rF   torch.nn.modules.utilsr   r   r   rU   rW   	__nodes__r   r!   r   <module>rt      s=      $ ( 45 45n$E% E%P $]3	r!   