


class 					snake_case__  :





 def __init__(  self							)		->			None:
        """simple docstring"""






        a_       :   int			=	{}
        # indexmap keys are an index and it's values are the number at that index
        a_       :   List[str]			=	{}





 def     A				(  self				,    UpperCamelCase_				,    UpperCamelCase_							)		->			list[int]:
        """simple docstring"""






        if isinstance(UpperCamelCase_				,    (range, str)							):
               a_       :   int			=	list(UpperCamelCase_							)
        elif not isinstance(UpperCamelCase_				,    UpperCamelCase_							):
               raise TypeError(
                   """binary_search_delete() only accepts either a list, range or str"""							)

        a_       :   List[str]			=	0
        a_       :   Optional[int]			=	len(UpperCamelCase_							) - 1

        while low <= high:
               a_       :   List[Any]			=	(low + high) // 2
               if array[mid] == item:
                      array.pop(UpperCamelCase_							)
                      return array
               elif array[mid] < item:
                      a_       :   str			=	mid + 1
               else:
                      a_       :   List[str]			=	mid - 1
        raise ValueError(
            """Either the item is not in the array or the array was unsorted"""							)





 def     A				(  self				,    UpperCamelCase_				,    UpperCamelCase_							)		->			list[int]:
        """simple docstring"""






        if isinstance(UpperCamelCase_				,    (range, str)							):
               a_       :   str			=	list(UpperCamelCase_							)
        elif not isinstance(UpperCamelCase_				,    UpperCamelCase_							):
               raise TypeError(
                   """binary_search_insert() only accepts either a list, range or str"""							)

        a_       :   int			=	0
        a_       :   List[str]			=	len(UpperCamelCase_							) - 1

        while low <= high:
               a_       :   List[str]			=	(low + high) // 2
               if array[mid] == index:
                      # If the item already exists in the array,
                      # insert it after the existing item
                      array.insert(mid + 1				,    UpperCamelCase_							)
                      return array
               elif array[mid] < index:
                      a_       :   Union[str, Any]			=	mid + 1
               else:
                      a_       :   List[str]			=	mid - 1

               # If the item doesn't exist in the array, insert it at the appropriate position
        array.insert(UpperCamelCase_				,    UpperCamelCase_							)
        return array





 def     A				(  self				,    UpperCamelCase_				,    UpperCamelCase_							)		->			None:
        """simple docstring"""






        if index in self.indexmap:
               a_       :   Optional[int]			=	self.indexmap[index]
               if len(self.numbermap[n]							) == 1:
                      del self.numbermap[n]
               else:
                      a_       :   Tuple			=	self.binary_search_delete(self.numbermap[n]				,    UpperCamelCase_							)

               # Set new index
        a_       :   Optional[int]			=	number

        # Number not seen before or empty so insert number value
        if number not in self.numbermap:
               a_       :   Any			=	[index]

        # Here we need to perform a binary search insertion in order to insert
        # The item in the correct place
        else:
               a_       :   List[str]			=	self.binary_search_insert(
                   self.numbermap[number]				,    UpperCamelCase_							)





 def     A				(  self				,    UpperCamelCase_							)		->			int:
        """simple docstring"""






        return self.numbermap.get(UpperCamelCase_				,    [-1]							)[0]


if __name__ == "__main__":
 import doctest

 doctest.testmod()






from dataclasses import dataclass
from typing import Any, Dict, Optional

import torch
import torch.nn.functional as F
from torch import nn

from ..configuration_utils import ConfigMixin, register_to_config
from ..models.embeddings import ImagePositionalEmbeddings
from ..utils import BaseOutput, deprecate
from .attention import BasicTransformerBlock
from .embeddings import PatchEmbed
from .modeling_utils import ModelMixin





@dataclass
class 					snake_case__  ( __A       ):
	UpperCAmelCase   :							torch.FloatTensor





class 					snake_case__  ( __A      ,    __A       ):





	@register_to_config
	def __init__(  self				,    UpperCamelCase_ = 16				,    UpperCamelCase_ = 88				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = 1				,    UpperCamelCase_ = 0.0				,    UpperCamelCase_ = 32				,    UpperCamelCase_ = None				,    UpperCamelCase_ = False				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = "geglu"				,    UpperCamelCase_ = None				,    UpperCamelCase_ = False				,    UpperCamelCase_ = False				,    UpperCamelCase_ = False				,    UpperCamelCase_ = "layer_norm"				,    UpperCamelCase_ = True				,    )		->			Union[str, Any]:
								"""simple docstring"""






								super().__init__()
								a_       :   Dict			=	use_linear_projection
								a_       :   Tuple			=	num_attention_heads
								a_       :   List[Any]			=	attention_head_dim
								a_       :   Dict			=	num_attention_heads * attention_head_dim

								# 1. Transformer2DModel can process both standard continuous images of shape `(batch_size, num_channels, width, height)` as well as quantized image embeddings of shape `(batch_size, num_image_vectors)`
								# Define whether input is continuous or discrete depending on configuration
								a_       :   List[Any]			=	(in_channels is not None) and (patch_size is None)
								a_       :   Dict			=	num_vector_embeds is not None
								a_       :   Union[str, Any]			=	in_channels is not None and patch_size is not None

								if norm_type == "layer_norm" and num_embeds_ada_norm is not None:
															a_       :   int			=	(
															    f"""The configuration file of this model: {self.__class__} is outdated. `norm_type` is either not set or"""
															    """ incorrectly set to `'layer_norm'`.Make sure to set `norm_type` to `'ada_norm'` in the config."""
															    """ Please make sure to update the config accordingly as leaving `norm_type` 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 `transformer/config.json` file"""
															)
															deprecate("""norm_type!=num_embeds_ada_norm"""				,    """1.0.0"""				,    UpperCamelCase_				,    standard_warn=UpperCamelCase_							)
															a_       :   List[Any]			=	"""ada_norm"""

								if self.is_input_continuous and self.is_input_vectorized:
															raise ValueError(
															    f"""Cannot define both `in_channels`: {in_channels} and `num_vector_embeds`: {num_vector_embeds}. Make"""
															    """ sure that either `in_channels` or `num_vector_embeds` is None."""							)
								elif self.is_input_vectorized and self.is_input_patches:
															raise ValueError(
															    f"""Cannot define both `num_vector_embeds`: {num_vector_embeds} and `patch_size`: {patch_size}. Make"""
															    """ sure that either `num_vector_embeds` or `num_patches` is None."""							)
								elif not self.is_input_continuous and not self.is_input_vectorized and not self.is_input_patches:
															raise ValueError(
															    f"""Has to define `in_channels`: {in_channels}, `num_vector_embeds`: {num_vector_embeds}, or patch_size:"""
															    f""" {patch_size}. Make sure that `in_channels`, `num_vector_embeds` or `num_patches` is not None."""							)

								# 2. Define input layers
								if self.is_input_continuous:
															a_       :   List[Any]			=	in_channels

															a_       :   List[str]			=	torch.nn.GroupNorm(num_groups=UpperCamelCase_				,    num_channels=UpperCamelCase_				,    eps=1e-6				,    affine=UpperCamelCase_							)
															if use_linear_projection:
																						a_       :   int			=	nn.Linear(UpperCamelCase_				,    UpperCamelCase_							)
															else:
																						a_       :   Optional[Any]			=	nn.Convad(UpperCamelCase_				,    UpperCamelCase_				,    kernel_size=1				,    stride=1				,    padding=0							)
								elif self.is_input_vectorized:
															assert sample_size is not None, "Transformer2DModel over discrete input must provide sample_size"
															assert num_vector_embeds is not None, "Transformer2DModel over discrete input must provide num_embed"

															a_       :   Optional[Any]			=	sample_size
															a_       :   str			=	sample_size
															a_       :   str			=	num_vector_embeds
															a_       :   str			=	self.height * self.width

															a_       :   int			=	ImagePositionalEmbeddings(
															    num_embed=UpperCamelCase_				,    embed_dim=UpperCamelCase_				,    height=self.height				,    width=self.width							)
								elif self.is_input_patches:
															assert sample_size is not None, "Transformer2DModel over patched input must provide sample_size"

															a_       :   Dict			=	sample_size
															a_       :   List[Any]			=	sample_size

															a_       :   Tuple			=	patch_size
															a_       :   Optional[Any]			=	PatchEmbed(
															    height=UpperCamelCase_				,    width=UpperCamelCase_				,    patch_size=UpperCamelCase_				,    in_channels=UpperCamelCase_				,    embed_dim=UpperCamelCase_				,    )

								# 3. Define transformers blocks
								a_       :   List[Any]			=	nn.ModuleList(
								    [
								        BasicTransformerBlock(
								            UpperCamelCase_				,    UpperCamelCase_				,    UpperCamelCase_				,    dropout=UpperCamelCase_				,    cross_attention_dim=UpperCamelCase_				,    activation_fn=UpperCamelCase_				,    num_embeds_ada_norm=UpperCamelCase_				,    attention_bias=UpperCamelCase_				,    only_cross_attention=UpperCamelCase_				,    upcast_attention=UpperCamelCase_				,    norm_type=UpperCamelCase_				,    norm_elementwise_affine=UpperCamelCase_				,    )
								        for d in range(UpperCamelCase_							)
								    ]							)

								# 4. Define output layers
								a_       :   str			=	in_channels if out_channels is None else out_channels
								if self.is_input_continuous:
															# TODO: should use out_channels for continuous projections
															if use_linear_projection:
																						a_       :   Optional[int]			=	nn.Linear(UpperCamelCase_				,    UpperCamelCase_							)
															else:
																						a_       :   Any			=	nn.Convad(UpperCamelCase_				,    UpperCamelCase_				,    kernel_size=1				,    stride=1				,    padding=0							)
								elif self.is_input_vectorized:
															a_       :   Optional[int]			=	nn.LayerNorm(UpperCamelCase_							)
															a_       :   str			=	nn.Linear(UpperCamelCase_				,    self.num_vector_embeds - 1							)
								elif self.is_input_patches:
															a_       :   int			=	nn.LayerNorm(UpperCamelCase_				,    elementwise_affine=UpperCamelCase_				,    eps=1e-6							)
															a_       :   str			=	nn.Linear(UpperCamelCase_				,    2 * inner_dim							)
															a_       :   Optional[int]			=	nn.Linear(UpperCamelCase_				,    patch_size * patch_size * self.out_channels							)





	def     A				(  self				,    UpperCamelCase_				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = None				,    UpperCamelCase_ = True				,    )		->			str:
								"""simple docstring"""






								if attention_mask is not None and attention_mask.ndim == 2:
															# assume that mask is expressed as:
															#   (1 = keep,      0 = discard)
															# convert mask into a bias that can be added to attention scores:
															#       (keep = +0,     discard = -10000.0)
															a_       :   str			=	(1 - attention_mask.to(hidden_states.dtype							)) * -1_0000.0
															a_       :   Union[str, Any]			=	attention_mask.unsqueeze(1							)

								# convert encoder_attention_mask to a bias the same way we do for attention_mask
								if encoder_attention_mask is not None and encoder_attention_mask.ndim == 2:
															a_       :   Any			=	(1 - encoder_attention_mask.to(hidden_states.dtype							)) * -1_0000.0
															a_       :   List[str]			=	encoder_attention_mask.unsqueeze(1							)

								# 1. Input
								if self.is_input_continuous:
															a_		,				a_		,				a_		,				a_       :   str			=	hidden_states.shape
															a_       :   Optional[Any]			=	hidden_states

															a_       :   Optional[int]			=	self.norm(UpperCamelCase_							)
															if not self.use_linear_projection:
																						a_       :   int			=	self.proj_in(UpperCamelCase_							)
																						a_       :   str			=	hidden_states.shape[1]
																						a_       :   List[str]			=	hidden_states.permute(0				,    2				,    3				,    1							).reshape(UpperCamelCase_				,    height * width				,    UpperCamelCase_							)
															else:
																						a_       :   int			=	hidden_states.shape[1]
																						a_       :   Optional[int]			=	hidden_states.permute(0				,    2				,    3				,    1							).reshape(UpperCamelCase_				,    height * width				,    UpperCamelCase_							)
																						a_       :   Tuple			=	self.proj_in(UpperCamelCase_							)
								elif self.is_input_vectorized:
															a_       :   List[str]			=	self.latent_image_embedding(UpperCamelCase_							)
								elif self.is_input_patches:
															a_       :   Optional[int]			=	self.pos_embed(UpperCamelCase_							)

								# 2. Blocks
								for block in self.transformer_blocks:
															a_       :   int			=	block(
															    UpperCamelCase_				,    attention_mask=UpperCamelCase_				,    encoder_hidden_states=UpperCamelCase_				,    encoder_attention_mask=UpperCamelCase_				,    timestep=UpperCamelCase_				,    cross_attention_kwargs=UpperCamelCase_				,    class_labels=UpperCamelCase_				,    )

								# 3. Output
								if self.is_input_continuous:
															if not self.use_linear_projection:
																						a_       :   Dict			=	hidden_states.reshape(UpperCamelCase_				,    UpperCamelCase_				,    UpperCamelCase_				,    UpperCamelCase_							).permute(0				,    3				,    1				,    2							).contiguous()
																						a_       :   List[Any]			=	self.proj_out(UpperCamelCase_							)
															else:
																						a_       :   Optional[int]			=	self.proj_out(UpperCamelCase_							)
																						a_       :   int			=	hidden_states.reshape(UpperCamelCase_				,    UpperCamelCase_				,    UpperCamelCase_				,    UpperCamelCase_							).permute(0				,    3				,    1				,    2							).contiguous()

															a_       :   int			=	hidden_states + residual
								elif self.is_input_vectorized:
															a_       :   str			=	self.norm_out(UpperCamelCase_							)
															a_       :   str			=	self.out(UpperCamelCase_							)
															# (batch, self.num_vector_embeds - 1, self.num_latent_pixels)
															a_       :   int			=	logits.permute(0				,    2				,    1							)

															# log(p(x_0))
															a_       :   int			=	F.log_softmax(logits.double()				,    dim=1							).float()
								elif self.is_input_patches:
															# TODO: cleanup!
															a_       :   Union[str, Any]			=	self.transformer_blocks[0].norma.emb(
															    UpperCamelCase_				,    UpperCamelCase_				,    hidden_dtype=hidden_states.dtype							)
															a_		,				a_       :   int			=	self.proj_out_a(F.silu(UpperCamelCase_							)							).chunk(2				,    dim=1							)
															a_       :   Union[str, Any]			=	self.norm_out(UpperCamelCase_							) * (1 + scale[:, None]) + shift[:, None]
															a_       :   Union[str, Any]			=	self.proj_out_a(UpperCamelCase_							)

															# unpatchify
															a_       :   Any			=	int(hidden_states.shape[1] ** 0.5							)
															a_       :   str			=	hidden_states.reshape(
															    shape=(-1, height, width, self.patch_size, self.patch_size, self.out_channels)							)
															a_       :   Union[str, Any]			=	torch.einsum("""nhwpqc->nchpwq"""				,    UpperCamelCase_							)
															a_       :   List[Any]			=	hidden_states.reshape(
															    shape=(-1, self.out_channels, height * self.patch_size, width * self.patch_size)							)

								if not return_dict:
															return (output,)

								return TransformeraDModelOutput(sample=UpperCamelCase_							)


