



"""simple docstring"""






import collections
from typing import List, Optional, Union

from ...tokenization_utils_base import BatchEncoding
from ...utils import TensorType, add_end_docstrings, add_start_docstrings, logging
from ..bert.tokenization_bert import BertTokenizer


lowerCAmelCase__      =    logging.get_logger(__name__)

lowerCAmelCase__      =    {'''vocab_file''': '''vocab.txt''', '''tokenizer_file''': '''tokenizer.json'''}

lowerCAmelCase__      =    {
    '''vocab_file''': {
        '''facebook/dpr-ctx_encoder-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-ctx_encoder-single-nq-base/resolve/main/vocab.txt'''
        ),
        '''facebook/dpr-ctx_encoder-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-ctx_encoder-multiset-base/resolve/main/vocab.txt'''
        ),
    },
    '''tokenizer_file''': {
        '''facebook/dpr-ctx_encoder-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-ctx_encoder-single-nq-base/resolve/main/tokenizer.json'''
        ),
        '''facebook/dpr-ctx_encoder-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-ctx_encoder-multiset-base/resolve/main/tokenizer.json'''
        ),
    },
}
lowerCAmelCase__      =    {
    '''vocab_file''': {
        '''facebook/dpr-question_encoder-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-question_encoder-single-nq-base/resolve/main/vocab.txt'''
        ),
        '''facebook/dpr-question_encoder-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-question_encoder-multiset-base/resolve/main/vocab.txt'''
        ),
    },
    '''tokenizer_file''': {
        '''facebook/dpr-question_encoder-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-question_encoder-single-nq-base/resolve/main/tokenizer.json'''
        ),
        '''facebook/dpr-question_encoder-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-question_encoder-multiset-base/resolve/main/tokenizer.json'''
        ),
    },
}
lowerCAmelCase__      =    {
    '''vocab_file''': {
        '''facebook/dpr-reader-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-reader-single-nq-base/resolve/main/vocab.txt'''
        ),
        '''facebook/dpr-reader-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-reader-multiset-base/resolve/main/vocab.txt'''
        ),
    },
    '''tokenizer_file''': {
        '''facebook/dpr-reader-single-nq-base''': (
            '''https://huggingface.co/facebook/dpr-reader-single-nq-base/resolve/main/tokenizer.json'''
        ),
        '''facebook/dpr-reader-multiset-base''': (
            '''https://huggingface.co/facebook/dpr-reader-multiset-base/resolve/main/tokenizer.json'''
        ),
    },
}

lowerCAmelCase__      =    {
    '''facebook/dpr-ctx_encoder-single-nq-base''': 512,
    '''facebook/dpr-ctx_encoder-multiset-base''': 512,
}
lowerCAmelCase__      =    {
    '''facebook/dpr-question_encoder-single-nq-base''': 512,
    '''facebook/dpr-question_encoder-multiset-base''': 512,
}
lowerCAmelCase__      =    {
    '''facebook/dpr-reader-single-nq-base''': 512,
    '''facebook/dpr-reader-multiset-base''': 512,
}


lowerCAmelCase__      =    {
    '''facebook/dpr-ctx_encoder-single-nq-base''': {'''do_lower_case''': True},
    '''facebook/dpr-ctx_encoder-multiset-base''': {'''do_lower_case''': True},
}
lowerCAmelCase__      =    {
    '''facebook/dpr-question_encoder-single-nq-base''': {'''do_lower_case''': True},
    '''facebook/dpr-question_encoder-multiset-base''': {'''do_lower_case''': True},
}
lowerCAmelCase__      =    {
    '''facebook/dpr-reader-single-nq-base''': {'''do_lower_case''': True},
    '''facebook/dpr-reader-multiset-base''': {'''do_lower_case''': True},
}






class 	__snake_case	(     _lowercase):
  snake_case__    :       Dict        =						VOCAB_FILES_NAMES
  snake_case__    :       Tuple        =						CONTEXT_ENCODER_PRETRAINED_VOCAB_FILES_MAP
  snake_case__    :       str        =						CONTEXT_ENCODER_PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
  snake_case__    :       Union[str, Any]        =						CONTEXT_ENCODER_PRETRAINED_INIT_CONFIGURATION






class 	__snake_case	(     _lowercase):
  snake_case__    :       int        =						VOCAB_FILES_NAMES
  snake_case__    :       Optional[Any]        =						QUESTION_ENCODER_PRETRAINED_VOCAB_FILES_MAP
  snake_case__    :       int        =						QUESTION_ENCODER_PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
  snake_case__    :       List[Any]        =						QUESTION_ENCODER_PRETRAINED_INIT_CONFIGURATION


lowerCAmelCase__      =    collections.namedtuple(
    '''DPRSpanPrediction''', ['''span_score''', '''relevance_score''', '''doc_id''', '''start_index''', '''end_index''', '''text''']
)

lowerCAmelCase__      =    collections.namedtuple('''DPRReaderOutput''', ['''start_logits''', '''end_logits''', '''relevance_logits'''])


lowerCAmelCase__      =    R'''
    Return a dictionary with the token ids of the input strings and other information to give to `.decode_best_spans`.
    It converts the strings of a question and different passages (title and text) in a sequence of IDs (integers),
    using the tokenizer and vocabulary. The resulting `input_ids` is a matrix of size `(n_passages, sequence_length)`
    with the format:

    ```
    [CLS] <question token ids> [SEP] <titles ids> [SEP] <texts ids>
    ```

    Args:
        questions (`str` or `List[str]`):
            The questions to be encoded. You can specify one question for many passages. In this case, the question
            will be duplicated like `[questions] * n_passages`. Otherwise you have to specify as many questions as in
            `titles` or `texts`.
        titles (`str` or `List[str]`):
            The passages titles to be encoded. This can be a string or a list of strings if there are several passages.
        texts (`str` or `List[str]`):
            The passages texts to be encoded. This can be a string or a list of strings if there are several passages.
        padding (`bool`, `str` or [`~utils.PaddingStrategy`], *optional*, defaults to `False`):
            Activates and controls padding. Accepts the following values:

            - `True` or `\'longest\'`: Pad to the longest sequence in the batch (or no padding if only a single sequence
              if provided).
            - `\'max_length\'`: Pad to a maximum length specified with the argument `max_length` or to the maximum
              acceptable input length for the model if that argument is not provided.
            - `False` or `\'do_not_pad\'` (default): No padding (i.e., can output a batch with sequences of different
              lengths).
        truncation (`bool`, `str` or [`~tokenization_utils_base.TruncationStrategy`], *optional*, defaults to `False`):
            Activates and controls truncation. Accepts the following values:

            - `True` or `\'longest_first\'`: Truncate to a maximum length specified with the argument `max_length` or to
              the maximum acceptable input length for the model if that argument is not provided. This will truncate
              token by token, removing a token from the longest sequence in the pair if a pair of sequences (or a batch
              of pairs) is provided.
            - `\'only_first\'`: Truncate to a maximum length specified with the argument `max_length` or to the maximum
              acceptable input length for the model if that argument is not provided. This will only truncate the first
              sequence of a pair if a pair of sequences (or a batch of pairs) is provided.
            - `\'only_second\'`: Truncate to a maximum length specified with the argument `max_length` or to the maximum
              acceptable input length for the model if that argument is not provided. This will only truncate the
              second sequence of a pair if a pair of sequences (or a batch of pairs) is provided.
            - `False` or `\'do_not_truncate\'` (default): No truncation (i.e., can output batch with sequence lengths
              greater than the model maximum admissible input size).
        max_length (`int`, *optional*):
                Controls the maximum length to use by one of the truncation/padding parameters.

                If left unset or set to `None`, this will use the predefined model maximum length if a maximum length
                is required by one of the truncation/padding parameters. If the model has no specific maximum input
                length (like XLNet) truncation/padding to a maximum length will be deactivated.
        return_tensors (`str` or [`~utils.TensorType`], *optional*):
                If set, will return tensors instead of list of python integers. Acceptable values are:

                - `\'tf\'`: Return TensorFlow `tf.constant` objects.
                - `\'pt\'`: Return PyTorch `torch.Tensor` objects.
                - `\'np\'`: Return Numpy `np.ndarray` objects.
        return_attention_mask (`bool`, *optional*):
            Whether or not to return the attention mask. If not set, will return the attention mask according to the
            specific tokenizer\'s default, defined by the `return_outputs` attribute.

            [What are attention masks?](../glossary#attention-mask)

    Returns:
        `Dict[str, List[List[int]]]`: A dictionary with the following keys:

        - `input_ids`: List of token ids to be fed to a model.
        - `attention_mask`: List of indices specifying which tokens should be attended to by the model.
    '''






@add_start_docstrings(_lowercase)
class 	__snake_case	:




  def __call__(			self					:						Optional[int]						, __lowerCAmelCase					:						Any						, __lowerCAmelCase					:						Optional[str] = None						, __lowerCAmelCase					:						Optional[str] = None						, __lowerCAmelCase					:						Union[bool, str] = False						, __lowerCAmelCase					:						Union[bool, str] = False						, __lowerCAmelCase					:						Optional[int] = None						, __lowerCAmelCase					:						Optional[Union[str, TensorType]] = None						, __lowerCAmelCase					:						Optional[bool] = None						, **__lowerCAmelCase					:						List[Any]						, ):






         """simple docstring"""






         if titles is None and texts is None:
                return super().__call__(
                    _a						, padding=_a						, truncation=_a						, max_length=_a						, return_tensors=_a						, return_attention_mask=_a						, **_a						, )
         elif titles is None or texts is None:
                _lowerCamelCase						:    Tuple         =			titles if texts is None else texts
                return super().__call__(
                    _a						, _a						, padding=_a						, truncation=_a						, max_length=_a						, return_tensors=_a						, return_attention_mask=_a						, **_a						, )
         _lowerCamelCase						:    Union[str, Any]         =			titles if not isinstance(_a						, _a		) else [titles]
         _lowerCamelCase						:    Optional[Any]         =			texts if not isinstance(_a						, _a		) else [texts]
         _lowerCamelCase						:    List[str]         =			len(_a		)
         _lowerCamelCase						:    Tuple         =			questions if not isinstance(_a						, _a		) else [questions] * n_passages
         if len(_a		) != len(_a		):
                raise ValueError(
                    f'''There should be as many titles than texts but got {len(_a		)} titles and {len(_a		)} texts.'''		)
         _lowerCamelCase						:    Union[str, Any]         =			super().__call__(_a						, _a						, padding=_a						, truncation=_a		)['''input_ids''']
         _lowerCamelCase						:    List[Any]         =			super().__call__(_a						, add_special_tokens=_a						, padding=_a						, truncation=_a		)['''input_ids''']
         _lowerCamelCase						:    str         =			{
             '''input_ids''': [
                 (encoded_question_and_title + encoded_text)[:max_length]
                 if max_length is not None and truncation
                 else encoded_question_and_title + encoded_text
                 for encoded_question_and_title, encoded_text in zip(_a						, _a		)
             ]
         }
         if return_attention_mask is not False:
                _lowerCamelCase						:    Tuple         =			[]
                for input_ids in encoded_inputs["input_ids"]:
                       attention_mask.append([int(input_id != self.pad_token_id		) for input_id in input_ids]		)
                _lowerCamelCase						:    Optional[Any]         =			attention_mask
         return self.pad(_a						, padding=_a						, max_length=_a						, return_tensors=_a		)




  def 						SCREAMING_SNAKE_CASE    (			self					:						Union[str, Any]						, __lowerCAmelCase					:						BatchEncoding						, __lowerCAmelCase					:						DPRReaderOutput						, __lowerCAmelCase					:						int = 1_6						, __lowerCAmelCase					:						int = 6_4						, __lowerCAmelCase					:						int = 4						, ):






         """simple docstring"""






         _lowerCamelCase						:    Optional[int]         =			reader_input['''input_ids''']
         _lowerCamelCase      ,   _lowerCamelCase      ,   _lowerCamelCase						:    Optional[Any]         =			reader_output[:3]
         _lowerCamelCase						:    int         =			len(_a		)
         _lowerCamelCase						:    int         =			sorted(range(_a		)						, reverse=_a						, key=relevance_logits.__getitem__		)
         _lowerCamelCase						:    str         =			[]
         for doc_id in sorted_docs:
                _lowerCamelCase						:    Union[str, Any]         =			list(input_ids[doc_id]		)
                # assuming question & title information is at the beginning of the sequence
                _lowerCamelCase						:    Optional[int]         =			sequence_ids.index(self.sep_token_id						, 2		) + 1  # second sep id
                if sequence_ids[-1] == self.pad_token_id:
                       _lowerCamelCase						:    Optional[Any]         =			sequence_ids.index(self.pad_token_id		)
                else:
                       _lowerCamelCase						:    List[str]         =			len(_a		)

                _lowerCamelCase						:    List[str]         =			self._get_best_spans(
                    start_logits=start_logits[doc_id][passage_offset:sequence_len]						, end_logits=end_logits[doc_id][passage_offset:sequence_len]						, max_answer_length=_a						, top_spans=_a						, )
                for start_index, end_index in best_spans:
                       start_index += passage_offset
                       end_index += passage_offset
                       nbest_spans_predictions.append(
                           DPRSpanPrediction(
                               span_score=start_logits[doc_id][start_index] + end_logits[doc_id][end_index]						, relevance_score=relevance_logits[doc_id]						, doc_id=_a						, start_index=_a						, end_index=_a						, text=self.decode(sequence_ids[start_index : end_index + 1]		)						, )		)
                if len(_a		) >= num_spans:
                       break
         return nbest_spans_predictions[:num_spans]




  def 						SCREAMING_SNAKE_CASE    (			self					:						Optional[int]						, __lowerCAmelCase					:						List[int]						, __lowerCAmelCase					:						List[int]						, __lowerCAmelCase					:						int						, __lowerCAmelCase					:						int						, ):






         """simple docstring"""






         _lowerCamelCase						:    Tuple         =			[]
         for start_index, start_score in enumerate(_a		):
                for answer_length, end_score in enumerate(end_logits[start_index : start_index + max_answer_length]		):
                       scores.append(((start_index, start_index + answer_length), start_score + end_score)		)
         _lowerCamelCase						:    Dict         =			sorted(_a						, key=lambda __lowerCAmelCase		: x[1]						, reverse=_a		)
         _lowerCamelCase						:    List[Any]         =			[]
         for (start_index, end_index), score in scores:
                if start_index > end_index:
                       raise ValueError(f'''Wrong span indices: [{start_index}:{end_index}]'''		)
                _lowerCamelCase						:    str         =			end_index - start_index + 1
                if length > max_answer_length:
                       raise ValueError(f'''Span is too long: {length} > {max_answer_length}'''		)
                if any(
                    start_index <= prev_start_index <= prev_end_index <= end_index
                    or prev_start_index <= start_index <= end_index <= prev_end_index
                    for (prev_start_index, prev_end_index) in chosen_span_intervals		):
                       continue
                chosen_span_intervals.append((start_index, end_index)		)

                if len(_a		) == top_spans:
                       break
         return chosen_span_intervals






@add_end_docstrings(_lowercase)
class 	__snake_case	(     _lowercase  ,					_lowercase):
  snake_case__    :       List[str]        =						VOCAB_FILES_NAMES
  snake_case__    :       int        =						READER_PRETRAINED_VOCAB_FILES_MAP
  snake_case__    :       Optional[Any]        =						READER_PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
  snake_case__    :       List[Any]        =						READER_PRETRAINED_INIT_CONFIGURATION
  snake_case__    :       Union[str, Any]        =						['''input_ids''', '''attention_mask''']







"""simple docstring"""






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

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

from ..configuration_utils import ConfigMixin, register_to_config
from ..utils import BaseOutput
from .attention import BasicTransformerBlock
from .attention_processor import AttentionProcessor, AttnProcessor
from .embeddings import TimestepEmbedding, Timesteps
from .modeling_utils import ModelMixin






@dataclass
class 	__snake_case	(     _lowercase):
  snake_case__    :       torch.FloatTensor






class 	__snake_case	(     _lowercase  ,					_lowercase):




  @register_to_config
  def __init__(			self					:						int						, __lowerCAmelCase					:						int = 3_2						, __lowerCAmelCase					:						int = 6_4						, __lowerCAmelCase					:						int = 2_0						, __lowerCAmelCase					:						int = 7_6_8						, __lowerCAmelCase					:						Tuple=7_7						, __lowerCAmelCase					:						Tuple=4						, __lowerCAmelCase					:						float = 0.0						, __lowerCAmelCase					:						str = "silu"						, __lowerCAmelCase					:						Optional[str] = None						, __lowerCAmelCase					:						Optional[str] = None						, __lowerCAmelCase					:						Optional[str] = "linear"						, __lowerCAmelCase					:						Optional[str] = "prd"						, __lowerCAmelCase					:						Optional[int] = None						, __lowerCAmelCase					:						Optional[int] = None						, __lowerCAmelCase					:						Optional[int] = None						, ):






         """simple docstring"""






         super().__init__()
         _lowerCamelCase						:    Any         =			num_attention_heads
         _lowerCamelCase						:    Optional[int]         =			attention_head_dim
         _lowerCamelCase						:    Dict         =			num_attention_heads * attention_head_dim
         _lowerCamelCase						:    Optional[Any]         =			additional_embeddings

         _lowerCamelCase						:    List[Any]         =			time_embed_dim or inner_dim
         _lowerCamelCase						:    Optional[Any]         =			embedding_proj_dim or embedding_dim
         _lowerCamelCase						:    Tuple         =			clip_embed_dim or embedding_dim

         _lowerCamelCase						:    int         =			Timesteps(__lowerCAmelCase						, __lowerCAmelCase						, 0		)
         _lowerCamelCase						:    str         =			TimestepEmbedding(__lowerCAmelCase						, __lowerCAmelCase						, out_dim=__lowerCAmelCase						, act_fn=__lowerCAmelCase		)

         _lowerCamelCase						:    Union[str, Any]         =			nn.Linear(__lowerCAmelCase						, __lowerCAmelCase		)

         if embedding_proj_norm_type is None:
                _lowerCamelCase						:    Dict         =			None
         elif embedding_proj_norm_type == "layer":
                _lowerCamelCase						:    Any         =			nn.LayerNorm(__lowerCAmelCase		)
         else:
                raise ValueError(f'''unsupported embedding_proj_norm_type: {embedding_proj_norm_type}'''		)

         _lowerCamelCase						:    List[str]         =			nn.Linear(__lowerCAmelCase						, __lowerCAmelCase		)

         if encoder_hid_proj_type is None:
                _lowerCamelCase						:    Any         =			None
         elif encoder_hid_proj_type == "linear":
                _lowerCamelCase						:    List[str]         =			nn.Linear(__lowerCAmelCase						, __lowerCAmelCase		)
         else:
                raise ValueError(f'''unsupported encoder_hid_proj_type: {encoder_hid_proj_type}'''		)

         _lowerCamelCase						:    Optional[int]         =			nn.Parameter(torch.zeros(1						, num_embeddings + additional_embeddings						, __lowerCAmelCase		)		)

         if added_emb_type == "prd":
                _lowerCamelCase						:    Optional[Any]         =			nn.Parameter(torch.zeros(1						, 1						, __lowerCAmelCase		)		)
         elif added_emb_type is None:
                _lowerCamelCase						:    Union[str, Any]         =			None
         else:
                raise ValueError(
                    f'''`added_emb_type`: {added_emb_type} is not supported. Make sure to choose one of `\'prd\'` or `None`.'''		)

         _lowerCamelCase						:    Tuple         =			nn.ModuleList(
             [
                 BasicTransformerBlock(
                     __lowerCAmelCase						, __lowerCAmelCase						, __lowerCAmelCase						, dropout=__lowerCAmelCase						, activation_fn='''gelu'''						, attention_bias=__lowerCAmelCase						, )
                 for d in range(__lowerCAmelCase		)
             ]		)

         if norm_in_type == "layer":
                _lowerCamelCase						:    Any         =			nn.LayerNorm(__lowerCAmelCase		)
         elif norm_in_type is None:
                _lowerCamelCase						:    Any         =			None
         else:
                raise ValueError(f'''Unsupported norm_in_type: {norm_in_type}.'''		)

         _lowerCamelCase						:    str         =			nn.LayerNorm(__lowerCAmelCase		)

         _lowerCamelCase						:    List[Any]         =			nn.Linear(__lowerCAmelCase						, __lowerCAmelCase		)

         _lowerCamelCase						:    Optional[int]         =			torch.full(
             [num_embeddings + additional_embeddings, num_embeddings + additional_embeddings]						, -1_00_00.0		)
         causal_attention_mask.triu_(1		)
         _lowerCamelCase						:    Dict         =			causal_attention_mask[None, ...]
         self.register_buffer('''causal_attention_mask'''						, __lowerCAmelCase						, persistent=__lowerCAmelCase		)

         _lowerCamelCase						:    int         =			nn.Parameter(torch.zeros(1						, __lowerCAmelCase		)		)
         _lowerCamelCase						:    Tuple         =			nn.Parameter(torch.zeros(1						, __lowerCAmelCase		)		)




  @property
  # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
  def 						SCREAMING_SNAKE_CASE    (			self					:						int		):






         """simple docstring"""






         _lowerCamelCase						:    Any         =			{}

         def fn_recursive_add_processors(__lowerCAmelCase					:						str						, __lowerCAmelCase					:						torch.nn.Module						, __lowerCAmelCase					:						Dict[str, AttentionProcessor]		):
                if hasattr(__lowerCAmelCase						, '''set_processor'''		):
                       _lowerCamelCase						:    str         =			module.processor

                for sub_name, child in module.named_children():
                       fn_recursive_add_processors(f'''{name}.{sub_name}'''						, __lowerCAmelCase						, __lowerCAmelCase		)

                return processors

         for name, module in self.named_children():
                fn_recursive_add_processors(__lowerCAmelCase						, __lowerCAmelCase						, __lowerCAmelCase		)

         return processors




  def 						SCREAMING_SNAKE_CASE    (			self					:						Any						, __lowerCAmelCase					:						Union[AttentionProcessor, Dict[str, AttentionProcessor]]		):






         """simple docstring"""






         _lowerCamelCase						:    Optional[Any]         =			len(self.attn_processors.keys()		)

         if isinstance(__lowerCAmelCase						, __lowerCAmelCase		) and len(__lowerCAmelCase		) != count:
                raise ValueError(
                    f'''A dict of processors was passed, but the number of processors {len(__lowerCAmelCase		)} does not match the'''
                    f''' number of attention layers: {count}. Please make sure to pass {count} processor classes.'''		)

         def fn_recursive_attn_processor(__lowerCAmelCase					:						str						, __lowerCAmelCase					:						torch.nn.Module						, __lowerCAmelCase					:						Tuple		):
                if hasattr(__lowerCAmelCase						, '''set_processor'''		):
                       if not isinstance(__lowerCAmelCase						, __lowerCAmelCase		):
                              module.set_processor(__lowerCAmelCase		)
                       else:
                              module.set_processor(processor.pop(f'''{name}.processor'''		)		)

                for sub_name, child in module.named_children():
                       fn_recursive_attn_processor(f'''{name}.{sub_name}'''						, __lowerCAmelCase						, __lowerCAmelCase		)

         for name, module in self.named_children():
                fn_recursive_attn_processor(__lowerCAmelCase						, __lowerCAmelCase						, __lowerCAmelCase		)




  def 						SCREAMING_SNAKE_CASE    (			self					:						List[Any]		):






         """simple docstring"""






         self.set_attn_processor(AttnProcessor()		)




  def 						SCREAMING_SNAKE_CASE    (			self					:						str						, __lowerCAmelCase					:						List[str]						, __lowerCAmelCase					:						Union[torch.Tensor, float, int]						, __lowerCAmelCase					:						torch.FloatTensor						, __lowerCAmelCase					:						Optional[torch.FloatTensor] = None						, __lowerCAmelCase					:						Optional[torch.BoolTensor] = None						, __lowerCAmelCase					:						bool = True						, ):






         """simple docstring"""






         _lowerCamelCase						:    Optional[int]         =			hidden_states.shape[0]

         _lowerCamelCase						:    Union[str, Any]         =			timestep
         if not torch.is_tensor(__lowerCAmelCase		):
                _lowerCamelCase						:    Dict         =			torch.tensor([timesteps]						, dtype=torch.long						, device=hidden_states.device		)
         elif torch.is_tensor(__lowerCAmelCase		) and len(timesteps.shape		) == 0:
                _lowerCamelCase						:    str         =			timesteps[None].to(hidden_states.device		)

         # broadcast to batch dimension in a way that's compatible with ONNX/Core ML
         _lowerCamelCase						:    Tuple         =			timesteps * torch.ones(__lowerCAmelCase						, dtype=timesteps.dtype						, device=timesteps.device		)

         _lowerCamelCase						:    Tuple         =			self.time_proj(__lowerCAmelCase		)

         # timesteps does not contain any weights and will always return f32 tensors
         # but time_embedding might be fp16, so we need to cast here.
         _lowerCamelCase						:    Union[str, Any]         =			timesteps_projected.to(dtype=self.dtype		)
         _lowerCamelCase						:    Any         =			self.time_embedding(__lowerCAmelCase		)

         if self.embedding_proj_norm is not None:
                _lowerCamelCase						:    str         =			self.embedding_proj_norm(__lowerCAmelCase		)

         _lowerCamelCase						:    Optional[Any]         =			self.embedding_proj(__lowerCAmelCase		)
         if self.encoder_hidden_states_proj is not None and encoder_hidden_states is not None:
                _lowerCamelCase						:    Optional[Any]         =			self.encoder_hidden_states_proj(__lowerCAmelCase		)
         elif self.encoder_hidden_states_proj is not None and encoder_hidden_states is None:
                raise ValueError('''`encoder_hidden_states_proj` requires `encoder_hidden_states` to be set'''		)

         _lowerCamelCase						:    str         =			self.proj_in(__lowerCAmelCase		)

         _lowerCamelCase						:    Tuple         =			self.positional_embedding.to(hidden_states.dtype		)

         _lowerCamelCase						:    Tuple         =			[]
         _lowerCamelCase						:    Dict         =			0

         if encoder_hidden_states is not None:
                additional_embeds.append(__lowerCAmelCase		)
                additional_embeddings_len += encoder_hidden_states.shape[1]

         if len(proj_embeddings.shape		) == 2:
                _lowerCamelCase						:    str         =			proj_embeddings[:, None, :]

         if len(hidden_states.shape		) == 2:
                _lowerCamelCase						:    Dict         =			hidden_states[:, None, :]

         _lowerCamelCase						:    int         =			additional_embeds + [
             proj_embeddings,
             time_embeddings[:, None, :],
             hidden_states,
         ]

         if self.prd_embedding is not None:
                _lowerCamelCase						:    int         =			self.prd_embedding.to(hidden_states.dtype		).expand(__lowerCAmelCase						, -1						, -1		)
                additional_embeds.append(__lowerCAmelCase		)

         _lowerCamelCase						:    str         =			torch.cat(
             __lowerCAmelCase						, dim=1						, )

         # Allow positional_embedding to not include the `addtional_embeddings` and instead pad it with zeros for these additional tokens
         _lowerCamelCase						:    Dict         =			additional_embeddings_len + proj_embeddings.shape[1] + 1
         if positional_embeddings.shape[1] < hidden_states.shape[1]:
                _lowerCamelCase						:    List[Any]         =			F.pad(
                    __lowerCAmelCase						, (
                        0,
                        0,
                        additional_embeddings_len,
                        self.prd_embedding.shape[1] if self.prd_embedding is not None else 0,
                    )						, value=0.0						, )

         _lowerCamelCase						:    Any         =			hidden_states + positional_embeddings

         if attention_mask is not None:
                _lowerCamelCase						:    Union[str, Any]         =			(1 - attention_mask.to(hidden_states.dtype		)) * -1_00_00.0
                _lowerCamelCase						:    Tuple         =			F.pad(__lowerCAmelCase						, (0, self.additional_embeddings)						, value=0.0		)
                _lowerCamelCase						:    Any         =			(attention_mask[:, None, :] + self.causal_attention_mask).to(hidden_states.dtype		)
                _lowerCamelCase						:    int         =			attention_mask.repeat_interleave(self.config.num_attention_heads						, dim=0		)

         if self.norm_in is not None:
                _lowerCamelCase						:    List[str]         =			self.norm_in(__lowerCAmelCase		)

         for block in self.transformer_blocks:
                _lowerCamelCase						:    List[str]         =			block(__lowerCAmelCase						, attention_mask=__lowerCAmelCase		)

         _lowerCamelCase						:    Optional[Any]         =			self.norm_out(__lowerCAmelCase		)

         if self.prd_embedding is not None:
                _lowerCamelCase						:    Any         =			hidden_states[:, -1]
         else:
                _lowerCamelCase						:    Dict         =			hidden_states[:, additional_embeddings_len:]

         _lowerCamelCase						:    str         =			self.proj_to_clip_embeddings(__lowerCAmelCase		)

         if not return_dict:
                return (predicted_image_embedding,)

         return PriorTransformerOutput(predicted_image_embedding=__lowerCAmelCase		)




  def 						SCREAMING_SNAKE_CASE    (			self					:						Union[str, Any]						, __lowerCAmelCase					:						Tuple		):






         """simple docstring"""






         _lowerCamelCase						:    Dict         =			(prior_latents * self.clip_std) + self.clip_mean
         return prior_latents


