o
    ۷iQ'                     @   s   d dl mZmZ d dlmZ ddlmZ G dd deZG dd deZG d	d
 d
eeZ	G dd deeZ
G dd de
ZG dd de	ZdS )   )ConfigMixinregister_to_config)QwenImageLoraLoaderMixin   )ModularPipelinec                       B   e Zd ZdZdZeddef fddZdd Zdd
dZ	  Z
S )QwenImagePachifierz;
    A class to pack and unpack latents for QwenImage.
    config.jsonr   
patch_sizec                       t    d S Nsuper__init__selfr
   	__class__ l/home/ubuntu/vllm_env/lib/python3.10/site-packages/diffusers/modular_pipelines/qwenimage/modular_pipeline.pyr         zQwenImagePachifier.__init__c                 C   s   |j dkr|j dkrtd|j  |j dkr|d}|j\}}}}}| jj}|| dks4|| dkrAtd| d| d| ||||| ||| |}|dddd	d
d}|||| ||  || | }|S )N      z-Latents must have 4 or 5 dimensions, but got r       -Latent height and width must be divisible by 
, but got  and    r   )	ndim
ValueError	unsqueezeshapeconfigr
   viewpermutereshape)r   latents
batch_sizenum_channels_latentsnum_latent_frameslatent_heightlatent_widthr
   r   r   r   pack_latents    s6   


zQwenImagePachifier.pack_latents   c           	      C   s   |j dkrtd|j  |j\}}}| jj}|t|||   }|t|||   }|||| || |||  ||}|dddddd}|||||  d||}|S )Nr   (Latents must have 3 dimensions, but got r   r   r   r   r   	r   r   r!   r"   r
   intr#   r$   r%   )	r   r&   heightwidthvae_scale_factorr'   num_patcheschannelsr
   r   r   r   unpack_latentsB   s"   

z!QwenImagePachifier.unpack_latentsr   r-   __name__
__module____qualname____doc__config_namer   r0   r   r,   r6   __classcell__r   r   r   r   r      s    "r   c                       r   )QwenImageLayeredPachifierz
    A class to pack and unpack latents for QwenImage Layered.

    Unlike QwenImagePachifier, this handles 5D latents with shape (B, layers+1, C, H, W).
    r	   r   r
   c                    r   r   r   r   r   r   r   r   f   r   z"QwenImageLayeredPachifier.__init__c              	   C   s   |j dkrtd|j  |j\}}}}}| jj}|| dks%|| dkr2td| d| d| |||||| ||| |}|ddddd	d
d}|||||  ||  || | }|S )zY
        Pack latents from (B, layers, C, H, W) to (B, layers * H/2 * W/2, C*4).
        r   z=Latents must have 5 dimensions (B, layers, C, H, W), but got r   r   r   r   r   r   r   r      )r   r   r!   r"   r
   r#   r$   r%   )r   r&   r'   layersr(   r*   r+   r
   r   r   r   r,   j   s0   
	
z&QwenImageLayeredPachifier.pack_latentsr-   c           
   	   C   s   |j dkrtd|j  |j\}}}| jj}	|	t|||	   }|	t|||	   }|||d ||	 ||	 ||	|	  |	|	}|ddddddd}|||d ||	|	  ||}|ddddd}|S )	zN
        Unpack latents from (B, seq, C*4) to (B, C, layers+1, H, W).
        r   r.   r   r   r   r   r   rA   r/   )
r   r&   r1   r2   rB   r3   r'   _r5   r
   r   r   r   r6      s2   

	
z(QwenImageLayeredPachifier.unpack_latentsr7   r8   r9   r   r   r   r   r@   ]   s    !r@   c                   @   h   e Zd ZdZdZedd Zedd Zedd Zed	d
 Z	edd Z
edd Zedd ZdS )QwenImageModularPipelinez
    A ModularPipeline for QwenImage.

    > [!WARNING] > This is an experimental feature and is likely to change in the future.
    QwenImageAutoBlocksc                 C      | j | j S r   default_sample_sizer3   r   r   r   r   default_height      z'QwenImageModularPipeline.default_heightc                 C   rG   r   rH   rJ   r   r   r   default_width   rL   z&QwenImageModularPipeline.default_widthc                 C      dS N   r   rJ   r   r   r   rI         z,QwenImageModularPipeline.default_sample_sizec                 C   ,   d}t | dr| jd urdt| jj }|S Nr-   vaer   hasattrrT   lentemperal_downsampler   r3   r   r   r   r3         z)QwenImageModularPipeline.vae_scale_factorc                 C   *   d}t | dr| jd ur| jjjd }|S N   transformerr   rV   r^   r"   in_channelsr   r(   r   r   r   r(         z-QwenImageModularPipeline.num_channels_latentsc                 C   &   d}t | dr| jd ur| jjj}|S NFr^   rV   r^   r"   guidance_embedsr   is_guidance_distilledr   r   r   rh         
z.QwenImageModularPipeline.is_guidance_distilledc                 C   0   d}t | dr| jd ur| jjo| jjdk}|S NFguiderr   rV   rl   _enablednum_conditionsr   requires_unconditional_embedsr   r   r   rq         z6QwenImageModularPipeline.requires_unconditional_embedsNr:   r;   r<   r=   default_blocks_namepropertyrK   rM   rI   r3   r(   rh   rq   r   r   r   r   rE      s"    





rE   c                   @   rD   )QwenImageEditModularPipelinez
    A ModularPipeline for QwenImage-Edit.

    > [!WARNING] > This is an experimental feature and is likely to change in the future.
    QwenImageEditAutoBlocksc                 C   rG   r   rH   rJ   r   r   r   rK      rL   z+QwenImageEditModularPipeline.default_heightc                 C   rG   r   rH   rJ   r   r   r   rM      rL   z*QwenImageEditModularPipeline.default_widthc                 C   rN   rO   r   rJ   r   r   r   rI      rQ   z0QwenImageEditModularPipeline.default_sample_sizec                 C   rR   rS   rU   rY   r   r   r   r3      rZ   z-QwenImageEditModularPipeline.vae_scale_factorc                 C   r[   r\   r_   ra   r   r   r   r(      rb   z1QwenImageEditModularPipeline.num_channels_latentsc                 C   rc   rd   re   rg   r   r   r   rh     ri   z2QwenImageEditModularPipeline.is_guidance_distilledc                 C   rj   rk   rm   rp   r   r   r   rq     rr   z:QwenImageEditModularPipeline.requires_unconditional_embedsNrs   r   r   r   r   rv      s"    





rv   c                   @      e Zd ZdZdZdS ) QwenImageEditPlusModularPipelinez
    A ModularPipeline for QwenImage-Edit Plus.

    > [!WARNING] > This is an experimental feature and is likely to change in the future.
    QwenImageEditPlusAutoBlocksNr:   r;   r<   r=   rt   r   r   r   r   ry         ry   c                   @   rx   )QwenImageLayeredModularPipelinez
    A ModularPipeline for QwenImage-Layered.

    > [!WARNING] > This is an experimental feature and is likely to change in the future.
    QwenImageLayeredAutoBlocksNr{   r   r   r   r   r}   "  r|   r}   N)configuration_utilsr   r   loadersr   modular_pipeliner   r   r@   rE   rv   ry   r}   r   r   r   r   <module>   s   HR45
