o
    i#                     @   s   d dl Z d dlmZ d dlm  mZ d dlmZ d dlm	Z	m
Z
 d dlZejjZe	ddZe	ddZdd	 ZG d
d dejZG dd dejZG dd dejZG dd dejZdd ZG dd dejZdS )    N)tqdm)
namedtupledequeDecoderResult)framememory	TWorkItem)input_tensorblock_indexc                 K   s   t j| |dfddi|S )N   padding   )
operationsConv2d)n_inn_outkwargs r   //mnt/c/Users/fbmor/ComfyUI/comfy/taesd/taehv.pyconv   s   r   c                   @   s   e Zd Zdd ZdS )Clampc                 C   s   t |d d S )Nr   )torchtanh)selfxr   r   r   forward   s   zClamp.forwardN)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                       $   e Zd Z fddZdd Z  ZS )MemBlockc              	      sb   t    tt|d ||t|||t||| _||kr'tj||dddnt | _|| _	d S )N   r   Fbias)
super__init__nn
Sequentialr   r   r   Identityskipact)r   r   r   act_func	__class__r   r   r%      s   
*$
zMemBlock.__init__c                 C   s&   |  | t||gd| | S )Nr   )r*   r   r   catr)   )r   r   pastr   r   r   r      s   &zMemBlock.forwardr   r   r   r%   r   __classcell__r   r   r,   r   r       s    r    c                       r   )TPoolc                    s,   t    || _tj|| |ddd| _d S Nr   Fr"   r$   r%   strider   r   r   r   n_fr5   r,   r   r   r%          
zTPool.__init__c                 C   s*   |j \}}}}| |d| j| ||S N)shaper   reshaper5   r   r   _NTCHWr   r   r   r   $   s   zTPool.forwardr0   r   r   r,   r   r2          r2   c                       r   )TGrowc                    s,   t    || _tj||| ddd| _d S r3   r4   r6   r,   r   r   r%   )   r8   zTGrow.__init__c                 C   s(   |j \}}}}| |}|d|||S r9   )r;   r   r<   r=   r   r   r   r   -   s   
zTGrow.forwardr0   r   r   r,   r   rC   (   rB   rC   c              	   C   s  |j \}}}}}|rk||| |||}t| | dD ]9}	t|	trP|j \}
}}}|
| }||||||}tj|dddd d d |f |j }|	||}q|	|}q|j \}
}}}|
| }||||||}|S g }tdd t	|||| ||j
|ddD }tt|| d}d gt|  }|r| \}}|dkr|d |t| kr|| ~n| | }	t|	tr|| d u r|	||d }|  ||< n|	||| }|  ||< ~|t||d  nt|	tr<|| d u rg ||< || |   t|| |	jkr;|j \}}}}|	t|| d||	j |||}g ||< |t||d  nAt|	tro|	|}|j \}}}}t|||	j| ||
|	jdD ]}|t||d  q_~n|	|}|t||d  |s|  t|d}|S )	N)disable)r   r   r   r   r   r   r   r   r   )valuec                 S   s   g | ]	\}}t |d qS )r   )r   ).0txtr   r   r   
<listcomp>F   s    z.apply_model_with_memblocks.<locals>.<listcomp>r   dim)r;   r<   r   
isinstancer    Fpadviewr   	enumeratechunkrangelenpopleftupdateappenddetachclone
appendleftr   r2   r5   r   r.   rC   reversedclosestack)modelr   parallelshow_progress_barBTr?   r@   rA   bBT_xmemout
work_queueprogress_barrH   ixt_newNTxt_nextr   r   r   apply_model_with_memblocks2   sr   
(
,0


&($rm   c                       sL   e Zd Z		d fdd	Zedd	 Zejd
d	 Zdd Zdd Z  Z	S )TAEHVFTTFFTTTTTNc           
         s  t    d| _d| _|| _|| _|| _|| _|d ur| jndd | _|d ur,| j	ndd | _	| jdv r:d| _n| jdkrGd	\| _| _}}| jd
krTt
jddd}nt
jdd}t
t| j| jd  d|td|d rodndtdddddtdd|tdd|tdd|td|d rdndtdddddtdd|tdd|tdd|td|d rdndtdddddtdd|tdd|tdd|td| j| _g d}	t
t t| j|	d |t|	d |	d |t|	d |	d |t|	d |	d |t
j|d rdnddt|	d |d rdndt|	d |	d ddt|	d |	d |t|	d |	d |t|	d |	d |t
j|d rAdnddt|	d |d rOdndt|	d |	d ddt|	d |	d |t|	d |	d |t|	d |	d |t
j|d rdnddt|	d |d rdndt|	d |	d dd|t|	d | j| jd  | _dtdd | jD  | _dtdd | jD  | _| jd | _|| _d S )Nr   r   c                 S      | S Nr   r   r   r   r   <lambda>|       z TAEHV.__init__.<locals>.<lambda>c                 S   rr   rs   r   rt   r   r   r   ru   }   rv   )0       r!      )   ry   rq   rq   rx   g?T)inplace@   r   F)r5   r#   )   ry   r|   r|   )scale_factorr"   c                 s   $    | ]}t |tr|jd kV  qdS r!   N)rL   r2   r5   rF   rG   r   r   r   	<genexpr>      " z!TAEHV.__init__.<locals>.<genexpr>c                 s   r   r   )rL   rC   r5   r   r   r   r   r      r   )r$   r%   image_channels
patch_sizelatent_channelsr^   latent_formatr_   
process_inprocess_outr&   	LeakyReLUReLUr'   r   r2   r    encoderr   UpsamplerC   decodersumt_downscale	t_upscaleframes_to_trim_show_progress_bar)
r   r   r^   encoder_time_downscaledecoder_time_upscaledecoder_space_upscaler   r_   r+   r7   r,   r   r   r%   s   sF   



@@@
|||
zTAEHV.__init__c                 C   s   | j S rs   r   )r   r   r   r   r_      s   zTAEHV.show_progress_barc                 C   s
   || _ d S rs   r   )r   rE   r   r   r   r_      s   
c           
      K   s   | dd}| jdkr8|j\}}}}}||| |||}t|| j}||||| jd  || j || j }|jd | j dkrd| j|jd | j  }|d d dd f j|dd}	t	||	gd}t
| j|| j| j dd}| |S )Nr!   r   r   r:   rJ   )movedimr   r;   r<   rM   pixel_unshuffler   repeat_interleaver   r.   rm   r   r^   r_   r   )
r   r   r   r`   ra   r?   r@   rA   n_padr   r   r   r   encode   s   
(
zTAEHV.encodec                 K   s   |j dkr
|dn|}|jd | jkr|ddn|}| |dd}t| j|| j| j	}| j
dkr;t|| j
}|d d | jd f ddS )Nrz   r   r   r!   )ndim	unsqueezer;   r   r   r   rm   r   r^   r_   r   rM   pixel_shuffler   )r   r   r   r   r   r   decode   s    
zTAEHV.decode)Fro   rp   rq   NF)
r   r   r   r%   propertyr_   setterr   r   r1   r   r   r,   r   rn   r   s    +

rn   )r   torch.nnr&   torch.nn.functional
functionalrM   	tqdm.autor   collectionsr   r   	comfy.opscomfyopsdisable_weight_initr   r   r   r   Moduler   r    r2   rC   rm   rn   r   r   r   r   <module>   s    

		
@