
"""simple docstring"""







from typing import Callable, List, Optional, Union

import PIL
import torch
from transformers import (
    CLIPImageProcessor,
    CLIPSegForImageSegmentation,
    CLIPSegProcessor,
    CLIPTextModel,
    CLIPTokenizer,
)

from diffusers import DiffusionPipeline
from diffusers.configuration_utils import FrozenDict
from diffusers.models import AutoencoderKL, UNetaDConditionModel
from diffusers.pipelines.stable_diffusion import StableDiffusionInpaintPipeline
from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker
from diffusers.schedulers import DDIMScheduler, LMSDiscreteScheduler, PNDMScheduler
from diffusers.utils import deprecate, is_accelerate_available, logging


lowerCamelCase__        =		logging.get_logger(__name__)  # pylint: disable=invalid-name




class 			A__	(     _lowerCamelCase):

		def __init__(				self	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		):
			super().__init__()

			if hasattr(scheduler.config	,		'steps_offset'			) and scheduler.config.steps_offset != 1:
				__lowerCAmelCase      :						Optional[Any]						      =				(
				    f"The configuration file of this scheduler: {scheduler} is outdated. `steps_offset`"
				    f" should be set to 1 instead of {scheduler.config.steps_offset}. Please make sure "
				    'to update the config accordingly as leaving `steps_offset` might led to incorrect results'
				    ' in future versions. If you have downloaded this checkpoint from the Hugging Face Hub,'
				    ' it would be very nice if you could open a Pull request for the `scheduler/scheduler_config.json`'
				    ' file'
				)
				deprecate('steps_offset!=1'	,		'1.0.0'	,		_SCREAMING_SNAKE_CASE	,		standard_warn=_SCREAMING_SNAKE_CASE			)
				__lowerCAmelCase      :						Optional[int]						      =				dict(scheduler.config			)
				__lowerCAmelCase      :						str						      =				1
				__lowerCAmelCase      :						Tuple						      =				FrozenDict(_SCREAMING_SNAKE_CASE			)

			if hasattr(scheduler.config	,		'skip_prk_steps'			) and scheduler.config.skip_prk_steps is False:
				__lowerCAmelCase      :						List[Any]						      =				(
				    f"The configuration file of this scheduler: {scheduler} has not set the configuration"
				    ' `skip_prk_steps`. `skip_prk_steps` should be set to True in the configuration file. Please make'
				    ' sure to update the config accordingly as not setting `skip_prk_steps` in the config might lead to'
				    ' incorrect results in future versions. If you have downloaded this checkpoint from the Hugging Face'
				    ' Hub, it would be very nice if you could open a Pull request for the'
				    ' `scheduler/scheduler_config.json` file'
				)
				deprecate('skip_prk_steps not set'	,		'1.0.0'	,		_SCREAMING_SNAKE_CASE	,		standard_warn=_SCREAMING_SNAKE_CASE			)
				__lowerCAmelCase      :						Optional[Any]						      =				dict(scheduler.config			)
				__lowerCAmelCase      :						List[str]						      =				True
				__lowerCAmelCase      :						Union[str, Any]						      =				FrozenDict(_SCREAMING_SNAKE_CASE			)

			if safety_checker is None:
				logger.warning(
				    f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure"
				    ' that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered'
				    ' results in services or applications open to the public. Both the diffusers team and Hugging Face'
				    ' strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling'
				    ' it only for use-cases that involve analyzing network behavior or auditing its results. For more'
				    ' information, please have a look at https://github.com/huggingface/diffusers/pull/254 .'			)

			self.register_modules(
			    segmentation_model=_SCREAMING_SNAKE_CASE	,		segmentation_processor=_SCREAMING_SNAKE_CASE	,		vae=_SCREAMING_SNAKE_CASE	,		text_encoder=_SCREAMING_SNAKE_CASE	,		tokenizer=_SCREAMING_SNAKE_CASE	,		unet=_SCREAMING_SNAKE_CASE	,		scheduler=_SCREAMING_SNAKE_CASE	,		safety_checker=_SCREAMING_SNAKE_CASE	,		feature_extractor=_SCREAMING_SNAKE_CASE	,		)

		def 							__lowerCamelCase							(				self	,		_SCREAMING_SNAKE_CASE = "auto"			):
			if slice_size == "auto":
				# half the attention head size is usually a good trade-off between
				# speed and memory
				__lowerCAmelCase      :						Any						      =				self.unet.config.attention_head_dim // 2
			self.unet.set_attention_slice(_SCREAMING_SNAKE_CASE			)

		def 							__lowerCamelCase							(				self			):
			self.enable_attention_slicing(_SCREAMING_SNAKE_CASE			)

		def 							__lowerCamelCase							(				self			):
			if is_accelerate_available():
				from accelerate import cpu_offload
			else:
				raise ImportError('Please install accelerate via `pip install accelerate`'			)

			__lowerCAmelCase      :						Any						      =				torch.device('cuda'			)

			for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae, self.safety_checker]:
				if cpu_offloaded_model is not None:
					cpu_offload(_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE			)

		@property
		# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device
		def 							__lowerCamelCase							(				self			):
			if self.device != torch.device('meta'			) or not hasattr(self.unet	,		'_hf_hook'			):
				return self.device
			for module in self.unet.modules():
				if (
				    hasattr(_SCREAMING_SNAKE_CASE	,		'_hf_hook'			)
				    and hasattr(module._hf_hook	,		'execution_device'			)
				    and module._hf_hook.execution_device is not None
				):
					return torch.device(module._hf_hook.execution_device			)
			return self.device







		@torch.no_grad()
		def __call__(				self	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE	,		_SCREAMING_SNAKE_CASE = 5_12	,		_SCREAMING_SNAKE_CASE = 5_12	,		_SCREAMING_SNAKE_CASE = 50	,		_SCREAMING_SNAKE_CASE = 7.5	,		_SCREAMING_SNAKE_CASE = None	,		_SCREAMING_SNAKE_CASE = 1	,		_SCREAMING_SNAKE_CASE = 0.0	,		_SCREAMING_SNAKE_CASE = None	,		_SCREAMING_SNAKE_CASE = None	,		_SCREAMING_SNAKE_CASE = "pil"	,		_SCREAMING_SNAKE_CASE = True	,		_SCREAMING_SNAKE_CASE = None	,		_SCREAMING_SNAKE_CASE = 1	,		**_SCREAMING_SNAKE_CASE	,		):
			__lowerCAmelCase      :						List[str]						      =				self.segmentation_processor(
			    text=[text]	,		images=[image]	,		padding='max_length'	,		return_tensors='pt'			).to(self.device			)
			__lowerCAmelCase      :						int						      =				self.segmentation_model(**_SCREAMING_SNAKE_CASE			)
			__lowerCAmelCase      :						str						      =				torch.sigmoid(outputs.logits			).cpu().detach().unsqueeze(-1			).numpy()
			__lowerCAmelCase      :						Tuple						      =				self.numpy_to_pil(_SCREAMING_SNAKE_CASE			)[0].resize(image.size			)

			# Run inpainting pipeline with the generated mask
			__lowerCAmelCase      :						Optional[int]						      =				StableDiffusionInpaintPipeline(
			    vae=self.vae	,		text_encoder=self.text_encoder	,		tokenizer=self.tokenizer	,		unet=self.unet	,		scheduler=self.scheduler	,		safety_checker=self.safety_checker	,		feature_extractor=self.feature_extractor	,		)
			return inpainting_pipeline(
			    prompt=_SCREAMING_SNAKE_CASE	,		image=_SCREAMING_SNAKE_CASE	,		mask_image=_SCREAMING_SNAKE_CASE	,		height=_SCREAMING_SNAKE_CASE	,		width=_SCREAMING_SNAKE_CASE	,		num_inference_steps=_SCREAMING_SNAKE_CASE	,		guidance_scale=_SCREAMING_SNAKE_CASE	,		negative_prompt=_SCREAMING_SNAKE_CASE	,		num_images_per_prompt=_SCREAMING_SNAKE_CASE	,		eta=_SCREAMING_SNAKE_CASE	,		generator=_SCREAMING_SNAKE_CASE	,		latents=_SCREAMING_SNAKE_CASE	,		output_type=_SCREAMING_SNAKE_CASE	,		return_dict=_SCREAMING_SNAKE_CASE	,		callback=_SCREAMING_SNAKE_CASE	,		callback_steps=_SCREAMING_SNAKE_CASE	,		)

"""simple docstring"""







from ...configuration_utils import PretrainedConfig
from ...utils import logging


lowerCamelCase__        =		logging.get_logger(__name__)

lowerCamelCase__        =		{
    """facebook/nllb-moe-54B""": """https://huggingface.co/facebook/nllb-moe-54b/resolve/main/config.json""",
}




class 			A__	(     _lowerCamelCase):
		A_						:	str           =     'nllb-moe'
		A_						:	Optional[Any]           =     ['past_key_values']
		A_						:	List[str]           =     {'num_attention_heads': 'encoder_attention_heads', 'hidden_size': 'd_model'}

		def __init__(				self	,		_SCREAMING_SNAKE_CASE=12_81_12	,		_SCREAMING_SNAKE_CASE=10_24	,		_SCREAMING_SNAKE_CASE=12	,		_SCREAMING_SNAKE_CASE=40_96	,		_SCREAMING_SNAKE_CASE=16	,		_SCREAMING_SNAKE_CASE=12	,		_SCREAMING_SNAKE_CASE=40_96	,		_SCREAMING_SNAKE_CASE=16	,		_SCREAMING_SNAKE_CASE=0.05	,		_SCREAMING_SNAKE_CASE=0.05	,		_SCREAMING_SNAKE_CASE=True	,		_SCREAMING_SNAKE_CASE=True	,		_SCREAMING_SNAKE_CASE="relu"	,		_SCREAMING_SNAKE_CASE=10_24	,		_SCREAMING_SNAKE_CASE=0.1	,		_SCREAMING_SNAKE_CASE=0.1	,		_SCREAMING_SNAKE_CASE=0.0	,		_SCREAMING_SNAKE_CASE=0.02	,		_SCREAMING_SNAKE_CASE=2	,		_SCREAMING_SNAKE_CASE=True	,		_SCREAMING_SNAKE_CASE=False	,		_SCREAMING_SNAKE_CASE="float32"	,		_SCREAMING_SNAKE_CASE=False	,		_SCREAMING_SNAKE_CASE=1_28	,		_SCREAMING_SNAKE_CASE=64	,		_SCREAMING_SNAKE_CASE=4	,		_SCREAMING_SNAKE_CASE=4	,		_SCREAMING_SNAKE_CASE=0.001	,		_SCREAMING_SNAKE_CASE=0.001	,		_SCREAMING_SNAKE_CASE="all"	,		_SCREAMING_SNAKE_CASE=False	,		_SCREAMING_SNAKE_CASE=False	,		_SCREAMING_SNAKE_CASE=1.0	,		_SCREAMING_SNAKE_CASE=0.2	,		_SCREAMING_SNAKE_CASE=1	,		_SCREAMING_SNAKE_CASE=0	,		_SCREAMING_SNAKE_CASE=2	,		_SCREAMING_SNAKE_CASE=False	,		**_SCREAMING_SNAKE_CASE	,		):
			__lowerCAmelCase      :						int						      =				vocab_size
			__lowerCAmelCase      :						str						      =				max_position_embeddings
			__lowerCAmelCase      :						Dict						      =				d_model
			__lowerCAmelCase      :						Tuple						      =				encoder_ffn_dim
			__lowerCAmelCase      :						Optional[Any]						      =				encoder_layers
			__lowerCAmelCase      :						Any						      =				encoder_attention_heads
			__lowerCAmelCase      :						Tuple						      =				decoder_ffn_dim
			__lowerCAmelCase      :						Dict						      =				decoder_layers
			__lowerCAmelCase      :						str						      =				decoder_attention_heads
			__lowerCAmelCase      :						str						      =				dropout
			__lowerCAmelCase      :						List[str]						      =				attention_dropout
			__lowerCAmelCase      :						Optional[int]						      =				activation_dropout
			__lowerCAmelCase      :						List[Any]						      =				activation_function
			__lowerCAmelCase      :						List[str]						      =				init_std
			__lowerCAmelCase      :						Union[str, Any]						      =				encoder_layerdrop
			__lowerCAmelCase      :						List[Any]						      =				decoder_layerdrop
			__lowerCAmelCase      :						Optional[int]						      =				use_cache
			__lowerCAmelCase      :						Optional[Any]						      =				encoder_layers
			__lowerCAmelCase      :						Optional[int]						      =				scale_embedding  # scale factor will be sqrt(d_model) if True
			__lowerCAmelCase      :						Union[str, Any]						      =				router_z_loss_coef
			__lowerCAmelCase      :						Optional[Any]						      =				router_aux_loss_coef
			__lowerCAmelCase      :						int						      =				decoder_sparse_step
			__lowerCAmelCase      :						str						      =				encoder_sparse_step
			__lowerCAmelCase      :						Tuple						      =				num_experts
			__lowerCAmelCase      :						Dict						      =				expert_capacity
			__lowerCAmelCase      :						Union[str, Any]						      =				router_bias
			if router_dtype not in ["float32", "float16", "bfloat16"]:
				raise ValueError(f"`router_dtype` must be one of 'float32', 'float16' or 'bfloat16', got {router_dtype}"			)
			__lowerCAmelCase      :						Union[str, Any]						      =				router_dtype

			__lowerCAmelCase      :						Any						      =				router_ignore_padding_tokens
			__lowerCAmelCase      :						str						      =				batch_prioritized_routing
			__lowerCAmelCase      :						Tuple						      =				second_expert_policy
			__lowerCAmelCase      :						List[str]						      =				normalize_router_prob_before_dropping
			__lowerCAmelCase      :						Dict						      =				moe_eval_capacity_token_fraction
			__lowerCAmelCase      :						Union[str, Any]						      =				moe_token_dropout
			__lowerCAmelCase      :						List[Any]						      =				output_router_logits
			super().__init__(
			    pad_token_id=_SCREAMING_SNAKE_CASE	,		bos_token_id=_SCREAMING_SNAKE_CASE	,		eos_token_id=_SCREAMING_SNAKE_CASE	,		is_encoder_decoder=_SCREAMING_SNAKE_CASE	,		decoder_start_token_id=_SCREAMING_SNAKE_CASE	,		**_SCREAMING_SNAKE_CASE	,		)