o
    i                     @   s   d dl Z d dlmZ d dlm  mZ d dlmZmZ d dl	m
Z
 d dlZd dlZG dd dejZG dd dejZG dd	 d	ejZeed
ZG dd dZdS )    N)ResnetBlockVideoConv3d)RMS_normc                       s8   e Zd Zdef fddZdejdejfddZ  ZS )SRResidualCausalBlock3Dchannelsc                    sP   t    tt||ddtjddt||ddtjddt||dd| _d S )N   kernel_sizeT)inplace)super__init__nn
Sequentialr   SiLUblock)selfr   	__class__ ?/mnt/c/Users/fbmor/ComfyUI/comfy/ldm/hunyuan_video/upsampler.pyr   
   s   



z SRResidualCausalBlock3D.__init__xreturnc                 C   s   ||  | S N)r   )r   r   r   r   r   forward   s   zSRResidualCausalBlock3D.forward)	__name__
__module____qualname__intr   torchTensorr   __classcell__r   r   r   r   r   	   s    
r   c                       sP   e Zd Z			ddededededef
 fd	d
ZdejdejfddZ  Z	S )SRModel3DV2@      Fin_channelsout_channelshidden_channels
num_blocksglobal_residualc                    sV   t    t| dd| _t fddt|D | _t |dd| _t	|| _
d S )Nr   r   c                    s   g | ]}t  qS r   )r   ).0_r&   r   r   
<listcomp>"   s    z(SRModel3DV2.__init__.<locals>.<listcomp>)r   r   r   in_convr   
ModuleListrangeblocksout_convboolr(   )r   r$   r%   r&   r'   r(   r   r+   r   r      s
   
zSRModel3DV2.__init__r   r   c                 C   sJ   |}|  |}| jD ]}||}q
| |}| jr#|j|jkr#|| }|S r   )r-   r0   r1   r(   shape)r   r   residualyblkr   r   r   r   &   s   



zSRModel3DV2.forward)r"   r#   F)
r   r   r   r   r2   r   r   r   r   r    r   r   r   r   r!      s     r!   c                	       sB   e Zd Z	ddededeedf def fddZd	d
 Z  ZS )	Upsampler   
z_channelsr%   block_out_channels.num_res_blocksc                    s   t    || _|| _|| _|d  t| dd| _t | _	t
|D ]"\}t }t fddt|d D |_ | j	| q#t | _t |dd| _d S )Nr   r   r   c              
      s,   g | ]}t |d kr nd dttdqS )r   F)r$   r%   temb_channelsconv_shortcutconv_opnorm_op)r   r   r   )r)   jchtgtr   r   r,   E   s    
z&Upsampler.__init__.<locals>.<listcomp>   )r   r   r;   r:   r9   r   conv_inr   r.   up	enumerateModuler/   r   appendr   norm_outconv_out)r   r9   r%   r:   r;   istager   rA   r   r   2   s    




zUpsampler.__init__c                 C   sb   | j d | j }| ||j|dd }| jD ]}|jD ]}||}qq| t| 	|}|S )zW
        Args:
            z: (B, C, T, H, W)
            target_shape: (H, W)
        r   rD   )repeatsdim)
r:   r9   rE   repeat_interleaverF   r   rK   FsilurJ   )r   zrN   r   rM   r6   outr   r   r   r   Q   s   


zUpsampler.forward)r8   )r   r   r   r   tupler   r   r    r   r   r   r   r7   1   s    
r7   )720p1080pc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
HunyuanVideo15SRModelc                 C   sd   t j | _t j }t j| j| _t|| _	| j	di |
 | _t jj| j| j|d| _d S )N)load_deviceoffload_devicer   )comfymodel_management
vae_devicerY   vae_offload_device	vae_dtypedtype
UPSAMPLERSgetmodel_classevalmodelmodel_patcherCoreModelPatcherpatcher)r   
model_typeconfigrZ   r   r   r   r   i   s   
zHunyuanVideo15SRModel.__init__c                 C   s   | j j|d| j dS )NT)strictassign)re   load_state_dictrh   
is_dynamic)r   sdr   r   r   load_sdr   s   zHunyuanVideo15SRModel.load_sdc                 C   s
   | j  S r   )re   
state_dict)r   r   r   r   get_sdu   s   
zHunyuanVideo15SRModel.get_sdc                 C   s    t j| j | || jS r   )r[   r\   load_model_gpurh   re   torY   )r   latentr   r   r   resample_latentx   s   z%HunyuanVideo15SRModel.resample_latentN)r   r   r   r   rp   rr   rv   r   r   r   r   rX   h   s
    	rX   )r   torch.nnr   torch.nn.functional
functionalrQ   (comfy.ldm.modules.diffusionmodules.modelr   r   #comfy.ldm.hunyuan_video.vae_refinerr   comfy.model_managementr[   comfy.model_patcherrH   r   r!   r7   ra   rX   r   r   r   r   <module>   s    3