
    bi>                         d dl mZmZmZmZmZmZmZ d dlZd dl	m
Z
mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ d	d
lmZmZmZ  e       rd dlmc mZ dZndZdZ G d dee      Z y)    )AnyCallableDictListOptionalTupleUnionN)CLIPTextModelWithProjectionCLIPTokenizer   )VaeImageProcessor)UVit2DModelVQModel)AmusedScheduler)is_torch_xla_availablereplace_example_docstring   )DeprecatedPipelineMixinDiffusionPipelineImagePipelineOutputTFa{  
    Examples:
        ```py
        >>> import torch
        >>> from diffusers import AmusedPipeline

        >>> pipe = AmusedPipeline.from_pretrained("amused/amused-512", variant="fp16", torch_dtype=torch.float16)
        >>> pipe = pipe.to("cuda")

        >>> prompt = "a photo of an astronaut riding a horse on mars"
        >>> image = pipe(prompt).images[0]
        ```
c            /       v    e Zd ZU dZeed<   eed<   eed<   eed<   e	ed<   e
ed<   dZdededede	de
f
 fd	Z ej                          ee      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d deeee   ef      dee   dee   dededeeeee   f      dee   deej.                     deej0                     deej2                     deej2                     deej2                     deej2                     dedeeeeej2                  gd
f      dedeeeef      dedeeef   deeeeef   ee   f   f(d              Z xZ S )!AmusedPipelinez0.33.1image_processorvqvae	tokenizertext_encodertransformer	schedulerz text_encoder->transformer->vqvaec                    t         |           | j                  |||||       t        | dd       r/dt	        | j
                  j                  j                        dz
  z  nd| _        t        | j                  d      | _
        y )N)r   r   r   r   r   r   r         F)vae_scale_factordo_normalize)super__init__register_modulesgetattrlenr   configblock_out_channelsr"   r   r   )selfr   r   r   r   r   	__class__s         e/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/pipelines/amused/pipeline_amused.pyr%   zAmusedPipeline.__init__=   s     	%# 	 	
 ELDRY[_D`A#djj''::;a?@fg 	  1$BWBWfkl    Npromptheightwidthnum_inference_stepsguidance_scalenegative_promptnum_images_per_prompt	generatorlatentsprompt_embedsencoder_hidden_statesnegative_prompt_embedsnegative_encoder_hidden_statesreturn_dictcallbackcallback_stepscross_attention_kwargs"micro_conditioning_aesthetic_scoremicro_conditioning_crop_coordtemperaturec           	         |
||
|t        d      ||||t        d      ||
||
t        d      t        |t              r|g}|t        |      }n|
j                  d   }||z  }|-| j
                  j                  j                  | j                  z  }|-| j
                  j                  j                  | j                  z  }|
|| j                  |ddd| j                  j                  	      j                  j                  | j                        }| j                  |dd
      }|j                  }
|j                   d   }|
j#                  |d      }
|j#                  |dd      }|dkD  r||dgt        |      z  }t        |t              r|g}| j                  |ddd| j                  j                  	      j                  j                  | j                        }| j                  |dd
      }|j                  }|j                   d   }|j#                  |d      }|j#                  |dd      }t%        j&                  ||
g      }
t%        j&                  ||g      }t%        j(                  |||d   |d   |g| j                  |j*                        }|j-                  d      }|j/                  |dkD  rd|z  n|d      }||| j                  z  || j                  z  f}|	Ot%        j0                  || j2                  j                  j4                  t$        j6                  | j                        }	| j2                  j9                  ||| j                         t        | j2                  j:                        || j2                  j<                  z  z
  }| j?                  |      5 }tA        | j2                  j:                        D ]0  \  }}|dkD  rt%        jB                  |	gdz        }n|	}| j                  |||
||      } |dkD  r| jE                  d      \  }!}"|!||"|!z
  z  z   } | j2                  jG                  | ||	|      jH                  }	|t        | j2                  j:                        dz
  k(  s'|dz   |kD  r]|dz   | j2                  j<                  z  dk(  r>|jK                          |,||z  dk(  r$|tM        | j2                  dd      z  }# ||#||	       tN        stQ        jR                          3 	 ddd       |dk(  r|	}$n| jT                  j*                  t$        jV                  k(  xr  | jT                  j                  jX                  }%|%r| jT                  j[                          | jT                  j]                  |	d||| j                  z  || j                  z  | jT                  j                  j^                  f      j`                  jc                  dd      }$| jd                  jg                  |$|      }$|%r| jT                  ji                          | jk                          |s|$fS tm        |$      S # 1 sw Y   DxY w)a  
        The call function to the pipeline for generation.

        Args:
            prompt (`str` or `List[str]`, *optional*):
                The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`.
            height (`int`, *optional*, defaults to `self.transformer.config.sample_size * self.vae_scale_factor`):
                The height in pixels of the generated image.
            width (`int`, *optional*, defaults to `self.unet.config.sample_size * self.vae_scale_factor`):
                The width in pixels of the generated image.
            num_inference_steps (`int`, *optional*, defaults to 16):
                The number of denoising steps. More denoising steps usually lead to a higher quality image at the
                expense of slower inference.
            guidance_scale (`float`, *optional*, defaults to 10.0):
                A higher guidance scale value encourages the model to generate images closely linked to the text
                `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`.
            negative_prompt (`str` or `List[str]`, *optional*):
                The prompt or prompts to guide what to not include in image generation. If not defined, you need to
                pass `negative_prompt_embeds` instead. Ignored when not using guidance (`guidance_scale < 1`).
            num_images_per_prompt (`int`, *optional*, defaults to 1):
                The number of images to generate per prompt.
            generator (`torch.Generator`, *optional*):
                A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make
                generation deterministic.
            latents (`torch.IntTensor`, *optional*):
                Pre-generated tokens representing latent vectors in `self.vqvae`, to be used as inputs for image
                generation. If not provided, the starting latents will be completely masked.
            prompt_embeds (`torch.Tensor`, *optional*):
                Pre-generated text embeddings. Can be used to easily tweak text inputs (prompt weighting). If not
                provided, text embeddings are generated from the `prompt` input argument. A single vector from the
                pooled and projected final hidden states.
            encoder_hidden_states (`torch.Tensor`, *optional*):
                Pre-generated penultimate hidden states from the text encoder providing additional text conditioning.
            negative_prompt_embeds (`torch.Tensor`, *optional*):
                Pre-generated negative text embeddings. Can be used to easily tweak text inputs (prompt weighting). If
                not provided, `negative_prompt_embeds` are generated from the `negative_prompt` input argument.
            negative_encoder_hidden_states (`torch.Tensor`, *optional*):
                Analogous to `encoder_hidden_states` for the positive prompt.
            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.stable_diffusion.StableDiffusionPipelineOutput`] instead of a
                plain tuple.
            callback (`Callable`, *optional*):
                A function that calls every `callback_steps` steps during inference. The function is called with the
                following arguments: `callback(step: int, timestep: int, latents: torch.Tensor)`.
            callback_steps (`int`, *optional*, defaults to 1):
                The frequency at which the `callback` function is called. If not specified, the callback is called at
                every step.
            cross_attention_kwargs (`dict`, *optional*):
                A kwargs dictionary that if specified is passed along to the [`AttentionProcessor`] as defined in
                [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py).
            micro_conditioning_aesthetic_score (`int`, *optional*, defaults to 6):
                The targeted aesthetic score according to the laion aesthetic classifier. See
                https://laion.ai/blog/laion-aesthetics/ and the micro-conditioning section of
                https://huggingface.co/papers/2307.01952.
            micro_conditioning_crop_coord (`Tuple[int]`, *optional*, defaults to (0, 0)):
                The targeted height, width crop coordinates. See the micro-conditioning section of
                https://huggingface.co/papers/2307.01952.
            temperature (`Union[int, Tuple[int, int], List[int]]`, *optional*, defaults to (2, 0)):
                Configures the temperature scheduler on `self.scheduler` see `AmusedScheduler#set_timesteps`.

        Examples:

        Returns:
            [`~pipelines.pipeline_utils.ImagePipelineOutput`] or `tuple`:
                If `return_dict` is `True`, [`~pipelines.pipeline_utils.ImagePipelineOutput`] is returned, otherwise a
                `tuple` is returned where the first element is a list with the generated images.
        NzGpass either both `prompt_embeds` and `encoder_hidden_states` or neitherzXpass either both `negatve_prompt_embeds` and `negative_encoder_hidden_states` or neitherz,pass only one of `prompt` or `prompt_embeds`r   pt
max_lengthT)return_tensorspadding
truncationrE   )r<   output_hidden_statesr    g      ? )devicedtyper   )rM   rL   )total)micro_condspooled_text_embr9   r?   )model_outputtimestepsampler6   orderlatent)force_not_quantizeshape)7
ValueError
isinstancestrr(   rX   r   r)   sample_sizer"   r   model_max_length	input_idsto_execution_devicer   text_embedshidden_statesrepeattorchconcattensorrM   	unsqueezeexpandfullr   mask_token_idlongset_timesteps	timestepsrU   progress_bar	enumeratecatchunkstepprev_sampleupdater'   XLA_AVAILABLExm	mark_stepr   float16force_upcastfloatdecodelatent_channelsrT   clipr   postprocesshalfmaybe_free_model_hooksr   )&r+   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   output_typer<   r=   r>   r?   r@   rA   rB   
batch_sizer^   outputsrP   rX   num_warmup_stepsrn   irS   model_inputrR   uncond_logitscond_logitsstep_idxoutputneeds_upcastings&                                         r-   __call__zAmusedPipeline.__call__S   s[   ~ %*?*G!&;&Gfgg".3Q3Y"*/M/Yj  N}4&:LQ^QjKLLfc"XFVJ&,,Q/J"77
>%%,,884;P;PPF=$$++77$:O:OOE #$>>:: '  i4112  ''	tZ^'_G#//M$+$9$9"$=!%,,-BAF 5 < <=RTUWX YC%-"*')dS[&8Oos3'6&7O NN##'(##~~>> +  )BBt556  ++I4^b+c)0)<)<&181F1Fr1J.%;%B%BCXZ[%\"-K-R-RShjkmn-o*!LL*@-)PQM$)LL2PRg1h$i! ll-a0-a02 ))'--

 "++A.!((>C;OZU_acdVt'<'<<etG\G\>\]?jjt~~,,::%**UYUkUkG 	$$%8+tG]G]^t~~778;NQUQ_Q_QeQe;ee%89 #	#\()A)AB "#8!C'"'))WIM":K")K#// +$1*?+A  0   "C'1=1C1CA1F.M;#0>[S`E`3a#aL..--!-%"'	 . 
 +  DNN44599U..AET^^=Q=Q3QUV3V '')+N0Ba0G#$(K#K 8W= LLNE"##	#J ("F"jj..%--?bDJJDUDUDbDbO

  "ZZ&&#'d333T222JJ%%55	 ' 	 fTT!QZ  ))55fkJF

!##%9"6**C#	# #	#s   0D;Y-YY)NNN   g      $@Nr    NNNNNNpilTNr    N   )r   r   )r   r   )!__name__
__module____qualname___last_supported_versionr   __annotations__r   r   r
   r   r   model_cpu_offload_seqr%   rd   no_gradr   EXAMPLE_DOC_STRINGr   r	   r   r[   intrz   	Generator	IntTensorTensorboolr   r   r   r   r   __classcell__)r,   s   @r-   r   r   2   sa   &&&N-->mm !m 2	m
 !m #m, U]]_12 37 $##% $;?/0/3-1048<9=AE GK;?239?>D-A+tCy#~./A+ A+ }	A+
 !A+ A+ "%T#Y"78A+  (}A+ EOO,A+ %//*A+  -A+  (5A+ !) 6A+ )1(>A+  !A+" 8S#u||$<d$BCD#A+$ %A+& !)c3h 8'A+( -0)A+* (-S#X+A+, 3c3hc:;-A+ 3 A+r.   r   )!typingr   r   r   r   r   r   r	   rd   transformersr
   r   r   r   modelsr   r   
schedulersr   utilsr   r   pipeline_utilsr   r   r   torch_xla.core.xla_modelcore	xla_modelrv   ru   r   r    r.   r-   <module>r      s[    E D D  C 0 * ) F \ \ ))MM d+,.? d+r.   