'''simple docstring'''






from dataclasses import dataclass
from typing import Optional

import numpy as np
import torch
import torch.nn as nn

from ..utils import BaseOutput, is_torch_version, randn_tensor
from .attention_processor import SpatialNorm
from .unet_ad_blocks import UNetMidBlockaD, get_down_block, get_up_block







@dataclass
class lowercase_       (		SCREAMING_SNAKE_CASE__			):







   """simple docstring"""

   __lowerCAmelCase         =   42







class lowercase_       (		nn.Module			):







   """simple docstring"""

   def __init__(      self      :			Tuple, UpperCamelCase__      :			Any=3, UpperCamelCase__      :			Union[str, Any]=3, UpperCamelCase__      :			str=("DownEncoderBlock2D",), UpperCamelCase__      :			Union[str, Any]=(64,), UpperCamelCase__      :			List[str]=2, UpperCamelCase__      :			List[str]=32, UpperCamelCase__      :			Optional[int]="silu", UpperCamelCase__      :			Optional[int]=True, )  ->			Union[str, Any]:
        super().__init__()
        _A    		=  layers_per_block

        _A    		=  torch.nn.Convad(
            __lowerCAmelCase, block_out_channels[0], kernel_size=3, stride=1, padding=1, )

        _A    		=  None
        _A    		=  nn.ModuleList([]     )

        # down
        _A    		=  block_out_channels[0]
        for i, down_block_type in enumerate(__lowerCAmelCase     ):
             _A    		=  output_channel
             _A    		=  block_out_channels[i]
             _A    		=  i == len(__lowerCAmelCase     ) - 1

             _A    		=  get_down_block(
                 __lowerCAmelCase, num_layers=self.layers_per_block, in_channels=__lowerCAmelCase, out_channels=__lowerCAmelCase, add_downsample=not is_final_block, resnet_eps=1e-6, downsample_padding=0, resnet_act_fn=__lowerCAmelCase, resnet_groups=__lowerCAmelCase, attention_head_dim=__lowerCAmelCase, temb_channels=__lowerCAmelCase, )
             self.down_blocks.append(__lowerCAmelCase     )

        # mid
        _A    		=  UNetMidBlockaD(
            in_channels=block_out_channels[-1], resnet_eps=1e-6, resnet_act_fn=__lowerCAmelCase, output_scale_factor=1, resnet_time_scale_shift='default', attention_head_dim=block_out_channels[-1], resnet_groups=__lowerCAmelCase, temb_channels=__lowerCAmelCase, )

        # out
        _A    		=  nn.GroupNorm(num_channels=block_out_channels[-1], num_groups=__lowerCAmelCase, eps=1e-6     )
        _A    		=  nn.SiLU()

        _A    		=  2 * out_channels if double_z else out_channels
        _A    		=  nn.Convad(block_out_channels[-1], __lowerCAmelCase, 3, padding=1     )

        _A    		=  False

   def 	__UpperCAmelCase   (      self      :			str, UpperCamelCase__      :			List[Any]     )  ->			Union[str, Any]:
        _A    		=  x
        _A    		=  self.conv_in(__lowerCAmelCase     )

        if self.training and self.gradient_checkpointing:

             def create_custom_forward(UpperCamelCase__      :			Tuple     ):
                  def custom_forward(*UpperCamelCase__      :			List[str]     ):
                       return module(*__lowerCAmelCase     )

                  return custom_forward

             # down
             if is_torch_version('>=', '1.11.0'     ):
                  for down_block in self.down_blocks:
                       _A    		=  torch.utils.checkpoint.checkpoint(
                           create_custom_forward(__lowerCAmelCase     ), __lowerCAmelCase, use_reentrant=__lowerCAmelCase     )
                  # middle
                  _A    		=  torch.utils.checkpoint.checkpoint(
                      create_custom_forward(self.mid_block     ), __lowerCAmelCase, use_reentrant=__lowerCAmelCase     )
             else:
                  for down_block in self.down_blocks:
                       _A    		=  torch.utils.checkpoint.checkpoint(create_custom_forward(__lowerCAmelCase     ), __lowerCAmelCase     )
                  # middle
                  _A    		=  torch.utils.checkpoint.checkpoint(create_custom_forward(self.mid_block     ), __lowerCAmelCase     )

        else:
             # down
             for down_block in self.down_blocks:
                  _A    		=  down_block(__lowerCAmelCase     )

             # middle
             _A    		=  self.mid_block(__lowerCAmelCase     )

        # post-process
        _A    		=  self.conv_norm_out(__lowerCAmelCase     )
        _A    		=  self.conv_act(__lowerCAmelCase     )
        _A    		=  self.conv_out(__lowerCAmelCase     )

        return sample







class lowercase_       (		nn.Module			):







   """simple docstring"""

   def __init__(      self      :			Dict, UpperCamelCase__      :			str=3, UpperCamelCase__      :			List[str]=3, UpperCamelCase__      :			Dict=("UpDecoderBlock2D",), UpperCamelCase__      :			Union[str, Any]=(64,), UpperCamelCase__      :			Optional[Any]=2, UpperCamelCase__      :			int=32, UpperCamelCase__      :			Any="silu", UpperCamelCase__      :			Dict="group", )  ->			Optional[int]:
        super().__init__()
        _A    		=  layers_per_block

        _A    		=  nn.Convad(
            __lowerCAmelCase, block_out_channels[-1], kernel_size=3, stride=1, padding=1, )

        _A    		=  None
        _A    		=  nn.ModuleList([]     )

        _A    		=  in_channels if norm_type == """spatial""" else None

        # mid
        _A    		=  UNetMidBlockaD(
            in_channels=block_out_channels[-1], resnet_eps=1e-6, resnet_act_fn=__lowerCAmelCase, output_scale_factor=1, resnet_time_scale_shift='default' if norm_type == 'group' else norm_type, attention_head_dim=block_out_channels[-1], resnet_groups=__lowerCAmelCase, temb_channels=__lowerCAmelCase, )

        # up
        _A    		=  list(reversed(__lowerCAmelCase     )     )
        _A    		=  reversed_block_out_channels[0]
        for i, up_block_type in enumerate(__lowerCAmelCase     ):
             _A    		=  output_channel
             _A    		=  reversed_block_out_channels[i]

             _A    		=  i == len(__lowerCAmelCase     ) - 1

             _A    		=  get_up_block(
                 __lowerCAmelCase, num_layers=self.layers_per_block + 1, in_channels=__lowerCAmelCase, out_channels=__lowerCAmelCase, prev_output_channel=__lowerCAmelCase, add_upsample=not is_final_block, resnet_eps=1e-6, resnet_act_fn=__lowerCAmelCase, resnet_groups=__lowerCAmelCase, attention_head_dim=__lowerCAmelCase, temb_channels=__lowerCAmelCase, resnet_time_scale_shift=__lowerCAmelCase, )
             self.up_blocks.append(__lowerCAmelCase     )
             _A    		=  output_channel

        # out
        if norm_type == "spatial":
             _A    		=  SpatialNorm(block_out_channels[0], __lowerCAmelCase     )
        else:
             _A    		=  nn.GroupNorm(num_channels=block_out_channels[0], num_groups=__lowerCAmelCase, eps=1e-6     )
        _A    		=  nn.SiLU()
        _A    		=  nn.Convad(block_out_channels[0], __lowerCAmelCase, 3, padding=1     )

        _A    		=  False

   def 	__UpperCAmelCase   (      self      :			int, UpperCamelCase__      :			Union[str, Any], UpperCamelCase__      :			str=None     )  ->			int:
        _A    		=  z
        _A    		=  self.conv_in(__lowerCAmelCase     )

        _A    		=  next(iter(self.up_blocks.parameters()     )     ).dtype
        if self.training and self.gradient_checkpointing:

             def create_custom_forward(UpperCamelCase__      :			str     ):
                  def custom_forward(*UpperCamelCase__      :			int     ):
                       return module(*__lowerCAmelCase     )

                  return custom_forward

             if is_torch_version('>=', '1.11.0'     ):
                  # middle
                  _A    		=  torch.utils.checkpoint.checkpoint(
                      create_custom_forward(self.mid_block     ), __lowerCAmelCase, __lowerCAmelCase, use_reentrant=__lowerCAmelCase     )
                  _A    		=  sample.to(__lowerCAmelCase     )

                  # up
                  for up_block in self.up_blocks:
                       _A    		=  torch.utils.checkpoint.checkpoint(
                           create_custom_forward(__lowerCAmelCase     ), __lowerCAmelCase, __lowerCAmelCase, use_reentrant=__lowerCAmelCase     )
             else:
                  # middle
                  _A    		=  torch.utils.checkpoint.checkpoint(
                      create_custom_forward(self.mid_block     ), __lowerCAmelCase, __lowerCAmelCase     )
                  _A    		=  sample.to(__lowerCAmelCase     )

                  # up
                  for up_block in self.up_blocks:
                       _A    		=  torch.utils.checkpoint.checkpoint(create_custom_forward(__lowerCAmelCase     ), __lowerCAmelCase, __lowerCAmelCase     )
        else:
             # middle
             _A    		=  self.mid_block(__lowerCAmelCase, __lowerCAmelCase     )
             _A    		=  sample.to(__lowerCAmelCase     )

             # up
             for up_block in self.up_blocks:
                  _A    		=  up_block(__lowerCAmelCase, __lowerCAmelCase     )

        # post-process
        if latent_embeds is None:
             _A    		=  self.conv_norm_out(__lowerCAmelCase     )
        else:
             _A    		=  self.conv_norm_out(__lowerCAmelCase, __lowerCAmelCase     )
        _A    		=  self.conv_act(__lowerCAmelCase     )
        _A    		=  self.conv_out(__lowerCAmelCase     )

        return sample







class lowercase_       (		nn.Module			):







   """simple docstring"""

   def __init__(      self      :			Union[str, Any], UpperCamelCase__      :			str, UpperCamelCase__      :			Optional[int], UpperCamelCase__      :			Optional[Any], UpperCamelCase__      :			int=None, UpperCamelCase__      :			List[str]="random", UpperCamelCase__      :			Optional[Any]=False, UpperCamelCase__      :			int=True     )  ->			Tuple:
        super().__init__()
        _A    		=  n_e
        _A    		=  vq_embed_dim
        _A    		=  beta
        _A    		=  legacy

        _A    		=  nn.Embedding(self.n_e, self.vq_embed_dim     )
        self.embedding.weight.data.uniform_(-1.0 / self.n_e, 1.0 / self.n_e     )

        _A    		=  remap
        if self.remap is not None:
             self.register_buffer('used', torch.tensor(np.load(self.remap     )     )     )
             _A    		=  self.used.shape[0]
             _A    		=  unknown_index  # "random" or "extra" or integer
             if self.unknown_index == "extra":
                  _A    		=  self.re_embed
                  _A    		=  self.re_embed + 1
             print(
                 f'Remapping {self.n_e} indices to {self.re_embed} indices. '
                 f'Using {self.unknown_index} for unknown indices.'     )
        else:
             _A    		=  n_e

        _A    		=  sane_index_shape
   def 	__UpperCAmelCase   (      self      :			List[Any], UpperCamelCase__      :			Optional[int]     )  ->			int:
        _A    		=  inds.shape
        assert len(__lowerCAmelCase     ) > 1
        _A    		=  inds.reshape(ishape[0], -1     )
        _A    		=  self.used.to(__lowerCAmelCase     )
        _A    		=  (inds[:, :, None] == used[None, None, ...]).long()
        _A    		=  match.argmax(-1     )
        _A    		=  match.sum(2     ) < 1
        if self.unknown_index == "random":
             _A    		=  torch.randint(0, self.re_embed, size=new[unknown].shape     ).to(device=new.device     )
        else:
             _A    		=  self.unknown_index
        return new.reshape(__lowerCAmelCase     )
   def 	__UpperCAmelCase   (      self      :			Optional[Any], UpperCamelCase__      :			Optional[int]     )  ->			Dict:
        _A    		=  inds.shape
        assert len(__lowerCAmelCase     ) > 1
        _A    		=  inds.reshape(ishape[0], -1     )
        _A    		=  self.used.to(__lowerCAmelCase     )
        if self.re_embed > self.used.shape[0]:  # extra token
             _A    		=  0  # simply set to zero
        _A    		=  torch.gather(used[None, :][inds.shape[0] * [0], :], 1, __lowerCAmelCase     )
        return back.reshape(__lowerCAmelCase     )
   def 	__UpperCAmelCase   (      self      :			int, UpperCamelCase__      :			str     )  ->			Any:
        # reshape z -> (batch, height, width, channel) and flatten
        _A    		=  z.permute(0, 2, 3, 1     ).contiguous()
        _A    		=  z.view(-1, self.vq_embed_dim     )

        # distances from z to embeddings e_j (z - e)^2 = z^2 + e^2 - 2 e * z
        _A    		=  torch.argmin(torch.cdist(__lowerCAmelCase, self.embedding.weight     ), dim=1     )

        _A    		=  self.embedding(__lowerCAmelCase     ).view(z.shape     )
        _A    		=  None
        _A    		=  None

        # compute loss for embedding
        if not self.legacy:
             _A    		=  self.beta * torch.mean((z_q.detach() - z) ** 2     ) + torch.mean((z_q - z.detach()) ** 2     )
        else:
             _A    		=  torch.mean((z_q.detach() - z) ** 2     ) + self.beta * torch.mean((z_q - z.detach()) ** 2     )

        # preserve gradients
        _A    		=  z + (z_q - z).detach()

        # reshape back to match original input shape
        _A    		=  z_q.permute(0, 3, 1, 2     ).contiguous()

        if self.remap is not None:
             _A    		=  min_encoding_indices.reshape(z.shape[0], -1     )  # add batch axis
             _A    		=  self.remap_to_used(__lowerCAmelCase     )
             _A    		=  min_encoding_indices.reshape(-1, 1     )  # flatten

        if self.sane_index_shape:
             _A    		=  min_encoding_indices.reshape(z_q.shape[0], z_q.shape[2], z_q.shape[3]     )

        return z_q, loss, (perplexity, min_encodings, min_encoding_indices)

   def 	__UpperCAmelCase   (      self      :			int, UpperCamelCase__      :			Tuple, UpperCamelCase__      :			List[str]     )  ->			Any:
        # shape specifying (batch, height, width, channel)
        if self.remap is not None:
             _A    		=  indices.reshape(shape[0], -1     )  # add batch axis
             _A    		=  self.unmap_to_all(__lowerCAmelCase     )
             _A    		=  indices.reshape(-1     )  # flatten again

        # get quantized latent vectors
        _A    		=  self.embedding(__lowerCAmelCase     )

        if shape is not None:
             _A    		=  z_q.view(__lowerCAmelCase     )
             # reshape back to match original input shape
             _A    		=  z_q.permute(0, 3, 1, 2     ).contiguous()

        return z_q







class lowercase_       (		SCREAMING_SNAKE_CASE__			):







   """simple docstring"""

   def __init__(      self      :			List[str], UpperCamelCase__      :			str, UpperCamelCase__      :			Union[str, Any]=False     )  ->			Optional[int]:
        _A    		=  parameters
        _A    		=  torch.chunk(__lowerCAmelCase, 2, dim=1     )
        _A    		=  torch.clamp(self.logvar, -30.0, 20.0     )
        _A    		=  deterministic
        _A    		=  torch.exp(0.5 * self.logvar     )
        _A    		=  torch.exp(self.logvar     )
        if self.deterministic:
             _A    		=  torch.zeros_like(
                 self.mean, device=self.parameters.device, dtype=self.parameters.dtype     )
   def 	__UpperCAmelCase   (      self      :			str, UpperCamelCase__      :			Optional[Any] = None     )  ->			Optional[int]:
        # make sure sample is on the same device as the parameters and has same dtype
        _A    		=  randn_tensor(
            self.mean.shape, generator=__lowerCAmelCase, device=self.parameters.device, dtype=self.parameters.dtype     )
        _A    		=  self.mean + self.std * sample
        return x
   def 	__UpperCAmelCase   (      self      :			List[str], UpperCamelCase__      :			Optional[int]=None     )  ->			Union[str, Any]:
        if self.deterministic:
             return torch.Tensor([0.0]     )
        else:
             if other is None:
                  return 0.5 * torch.sum(torch.pow(self.mean, 2     ) + self.var - 1.0 - self.logvar, dim=[1, 2, 3]     )
             else:
                  return 0.5 * torch.sum(
                      torch.pow(self.mean - other.mean, 2     ) / other.var
                      + self.var / other.var
                      - 1.0
                      - self.logvar
                      + other.logvar, dim=[1, 2, 3], )
   def 	__UpperCAmelCase   (      self      :			List[str], UpperCamelCase__      :			List[Any], UpperCamelCase__      :			Optional[Any]=[1, 2, 3]     )  ->			str:
        if self.deterministic:
             return torch.Tensor([0.0]     )
        _A    		=  np.log(2.0 * np.pi     )
        return 0.5 * torch.sum(logtwopi + self.logvar + torch.pow(sample - self.mean, 2     ) / self.var, dim=__lowerCAmelCase     )

   def 	__UpperCAmelCase   (      self      :			List[str]     )  ->			int:
        return self.mean











'''simple docstring'''

from transformers import DistilBertTokenizer, DistilBertTokenizerFast
from transformers.testing_utils import require_tokenizers, slow

from ..bert.test_tokenization_bert import BertTokenizationTest




@require_tokenizers
class      A     (   SCREAMING_SNAKE_CASE__    ):






 """simple docstring"""





 __a      :    Optional[int]			  =    DistilBertTokenizer
 __a      :    Union[str, Any]			  =    DistilBertTokenizerFast
 __a      :    Any			  =    True
 @slow
 def 	_UpperCAmelCase							(				self			):
       UpperCamelCase_					: List[Any]            =				DistilBertTokenizer.from_pretrained("""distilbert-base-uncased"""			)

       UpperCamelCase_					: Dict            =				tokenizer.encode("""sequence builders"""      ,  add_special_tokens=__lowerCAmelCase			)
       UpperCamelCase_					: int            =				tokenizer.encode("""multi-sequence build"""      ,  add_special_tokens=__lowerCAmelCase			)

       UpperCamelCase_					: Union[str, Any]            =				tokenizer.build_inputs_with_special_tokens(__lowerCAmelCase			)
       UpperCamelCase_					: Dict            =				tokenizer.build_inputs_with_special_tokens(__lowerCAmelCase      ,  __lowerCAmelCase			)

       assert encoded_sentence == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id]
       assert encoded_pair == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id] + text_a + [
           tokenizer.sep_token_id
       ]






