o
    ۷i                     @   s~   d dl Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ e r3d dlm  mZ d	Znd
ZG dd de
ZdS )    N   )UNet2DModel)DDPMScheduler)is_torch_xla_available)randn_tensor   )DiffusionPipelineImagePipelineOutputTFc                       s|   e Zd ZdZdZdedef fddZe	 						
dde
dejeej B dB de
dedB dedeeB fddZ  ZS )DDPMPipelinea1  
    Pipeline for image generation.

    This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods
    implemented for all pipelines (downloading, saving, running on a particular device, etc.).

    Parameters:
        unet ([`UNet2DModel`]):
            A `UNet2DModel` to denoise the encoded image latents.
        scheduler ([`SchedulerMixin`]):
            A scheduler to be used in combination with `unet` to denoise the encoded image. Can be one of
            [`DDPMScheduler`], or [`DDIMScheduler`].
    unet	schedulerc                    s   t    | j||d d S )N)r   r   )super__init__register_modules)selfr   r   	__class__ \/home/ubuntu/vllm_env/lib/python3.10/site-packages/diffusers/pipelines/ddpm/pipeline_ddpm.pyr   2   s   
zDDPMPipeline.__init__   N  pilT
batch_size	generatornum_inference_stepsoutput_typereturn_dictreturnc           
      C   s.  t | jjjtr|| jjj| jjj| jjjf}n|| jjjg| jjjR }| jjdkr;t||| jj	d}|
| j}nt||| j| jj	d}| j| | | jjD ]}| ||j}	| jj|	|||dj}trmt  qS|d d dd}| ddd	d }|d
kr| |}|s|fS t|dS )aa  
        The call function to the pipeline for generation.

        Args:
            batch_size (`int`, *optional*, defaults to 1):
                The number of images to generate.
            generator (`torch.Generator`, *optional*):
                A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make
                generation deterministic.
            num_inference_steps (`int`, *optional*, defaults to 1000):
                The number of denoising steps. More denoising steps usually lead to a higher quality image at the
                expense of slower inference.
            output_type (`str`, *optional*, defaults to `"pil"`):
                The output format of the generated image. Choose between `PIL.Image` or `np.array`.
            return_dict (`bool`, *optional*, defaults to `True`):
                Whether or not to return a [`~pipelines.ImagePipelineOutput`] instead of a plain tuple.

        Example:

        ```py
        >>> from diffusers import DDPMPipeline

        >>> # load model and scheduler
        >>> pipe = DDPMPipeline.from_pretrained("google/ddpm-cat-256")

        >>> # run pipeline in inference (sample random noise and denoise)
        >>> image = pipe().images[0]

        >>> # save image
        >>> image.save("ddpm_generated_image.png")
        ```

        Returns:
            [`~pipelines.ImagePipelineOutput`] or `tuple`:
                If `return_dict` is `True`, [`~pipelines.ImagePipelineOutput`] is returned, otherwise a `tuple` is
                returned where the first element is a list with the generated images
        mps)r   dtype)r   devicer   )r   r   g      ?r   r   r   r   )images)
isinstancer   configsample_sizeintin_channelsr    typer   r   tor   set_timestepsprogress_bar	timestepssamplestepprev_sampleXLA_AVAILABLExm	mark_stepclampcpupermutenumpynumpy_to_pilr	   )
r   r   r   r   r   r   image_shapeimagetmodel_outputr   r   r   __call__6   s2   /

zDDPMPipeline.__call__)r   Nr   r   T)__name__
__module____qualname____doc__model_cpu_offload_seqr   r   r   torchno_gradr%   	Generatorliststrboolr	   tupler;   __classcell__r   r   r   r   r
   !   s.    r
   )rA   modelsr   
schedulersr   utilsr   utils.torch_utilsr   pipeline_utilsr   r	   torch_xla.core.xla_modelcore	xla_modelr0   r/   r
   r   r   r   r   <module>   s   