

from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


UpperCamelCase__  :      List[Any]			=    {
    "configuration_electra": ["ELECTRA_PRETRAINED_CONFIG_ARCHIVE_MAP", "ElectraConfig", "ElectraOnnxConfig"],
    "tokenization_electra": ["ElectraTokenizer"],
}

try:
       if not is_tokenizers_available():
              raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
       pass
else:
       UpperCamelCase__  :      int			=    ["ElectraTokenizerFast"]

try:
       if not is_torch_available():
              raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
       pass
else:
       UpperCamelCase__  :      Union[str, Any]			=    [
           "ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST",
           "ElectraForCausalLM",
           "ElectraForMaskedLM",
           "ElectraForMultipleChoice",
           "ElectraForPreTraining",
           "ElectraForQuestionAnswering",
           "ElectraForSequenceClassification",
           "ElectraForTokenClassification",
           "ElectraModel",
           "ElectraPreTrainedModel",
           "load_tf_weights_in_electra",
       ]

try:
       if not is_tf_available():
              raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
       pass
else:
       UpperCamelCase__  :      List[Any]			=    [
           "TF_ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST",
           "TFElectraForMaskedLM",
           "TFElectraForMultipleChoice",
           "TFElectraForPreTraining",
           "TFElectraForQuestionAnswering",
           "TFElectraForSequenceClassification",
           "TFElectraForTokenClassification",
           "TFElectraModel",
           "TFElectraPreTrainedModel",
       ]

try:
       if not is_flax_available():
              raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
       pass
else:
       UpperCamelCase__  :      Any			=    [
           "FlaxElectraForCausalLM",
           "FlaxElectraForMaskedLM",
           "FlaxElectraForMultipleChoice",
           "FlaxElectraForPreTraining",
           "FlaxElectraForQuestionAnswering",
           "FlaxElectraForSequenceClassification",
           "FlaxElectraForTokenClassification",
           "FlaxElectraModel",
           "FlaxElectraPreTrainedModel",
       ]


if TYPE_CHECKING:
       from .configuration_electra import ELECTRA_PRETRAINED_CONFIG_ARCHIVE_MAP, ElectraConfig, ElectraOnnxConfig
       from .tokenization_electra import ElectraTokenizer

       try:
              if not is_tokenizers_available():
                     raise OptionalDependencyNotAvailable()
       except OptionalDependencyNotAvailable:
              pass
       else:
              from .tokenization_electra_fast import ElectraTokenizerFast

       try:
              if not is_torch_available():
                     raise OptionalDependencyNotAvailable()
       except OptionalDependencyNotAvailable:
              pass
       else:
              from .modeling_electra import (
                  ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST,
                  ElectraForCausalLM,
                  ElectraForMaskedLM,
                  ElectraForMultipleChoice,
                  ElectraForPreTraining,
                  ElectraForQuestionAnswering,
                  ElectraForSequenceClassification,
                  ElectraForTokenClassification,
                  ElectraModel,
                  ElectraPreTrainedModel,
                  load_tf_weights_in_electra,
              )

       try:
              if not is_tf_available():
                     raise OptionalDependencyNotAvailable()
       except OptionalDependencyNotAvailable:
              pass
       else:
              from .modeling_tf_electra import (
                  TF_ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST,
                  TFElectraForMaskedLM,
                  TFElectraForMultipleChoice,
                  TFElectraForPreTraining,
                  TFElectraForQuestionAnswering,
                  TFElectraForSequenceClassification,
                  TFElectraForTokenClassification,
                  TFElectraModel,
                  TFElectraPreTrainedModel,
              )

       try:
              if not is_flax_available():
                     raise OptionalDependencyNotAvailable()
       except OptionalDependencyNotAvailable:
              pass
       else:
              from .modeling_flax_electra import (
                  FlaxElectraForCausalLM,
                  FlaxElectraForMaskedLM,
                  FlaxElectraForMultipleChoice,
                  FlaxElectraForPreTraining,
                  FlaxElectraForQuestionAnswering,
                  FlaxElectraForSequenceClassification,
                  FlaxElectraForTokenClassification,
                  FlaxElectraModel,
                  FlaxElectraPreTrainedModel,
              )

else:
       import sys

       UpperCamelCase__  :      Optional[int]			=    _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)





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

import torch
import torch.nn as nn

from ..configuration_utils import ConfigMixin, register_to_config
from ..utils import BaseOutput, apply_forward_hook
from .modeling_utils import ModelMixin
from .vae import Decoder, DecoderOutput, Encoder, VectorQuantizer



@dataclass
class       __snake_case  (    lowerCAmelCase__       ):
  __lowerCAmelCase     :	torch.FloatTensor






class       __snake_case  (    lowerCAmelCase__     , lowerCAmelCase__       ):

  @register_to_config
  def __init__(					self						,		_A = 3						,		_A = 3						,		_A = ("DownEncoderBlock2D",)						,		_A = ("UpDecoderBlock2D",)						,		_A = (64,)						,		_A = 1						,		_A = "silu"						,		_A = 3						,		_A = 32						,		_A = 256						,		_A = 32						,		_A = None						,		_A = 0.1_8_2_1_5						,		_A = "group"						,		):
      super().__init__()

      # pass init params to Encoder
      SCREAMING_SNAKE_CASE_									=						Encoder(
          in_channels=_A						,		out_channels=_A						,		down_block_types=_A						,		block_out_channels=_A						,		layers_per_block=_A						,		act_fn=_A						,		norm_num_groups=_A						,		double_z=_A						,		)

      SCREAMING_SNAKE_CASE_									=						vq_embed_dim if vq_embed_dim is not None else latent_channels

      SCREAMING_SNAKE_CASE_									=						nn.Convad(_A						,		_A						,		1)
      SCREAMING_SNAKE_CASE_									=						VectorQuantizer(_A						,		_A						,		beta=0.2_5						,		remap=_A						,		sane_index_shape=_A)
      SCREAMING_SNAKE_CASE_									=						nn.Convad(_A						,		_A						,		1)

      # pass init params to Decoder
      SCREAMING_SNAKE_CASE_									=						Decoder(
          in_channels=_A						,		out_channels=_A						,		up_block_types=_A						,		block_out_channels=_A						,		layers_per_block=_A						,		act_fn=_A						,		norm_num_groups=_A						,		norm_type=_A						,		)

  @apply_forward_hook
  def 						lowerCAmelCase__     (					self						,		_A						,		_A = True):
      SCREAMING_SNAKE_CASE_									=						self.encoder(_A)
      SCREAMING_SNAKE_CASE_									=						self.quant_conv(_A)

      if not return_dict:
          return (h,)

      return VQEncoderOutput(latents=_A)

  @apply_forward_hook
  def 						lowerCAmelCase__     (					self						,		_A						,		_A = False						,		_A = True):
      # also go through quantization layer
      if not force_not_quantize:
          SCREAMING_SNAKE_CASE_							,			SCREAMING_SNAKE_CASE_							,			SCREAMING_SNAKE_CASE_									=						self.quantize(_A)
      else:
          SCREAMING_SNAKE_CASE_									=						h
      SCREAMING_SNAKE_CASE_									=						self.post_quant_conv(_A)
      SCREAMING_SNAKE_CASE_									=						self.decoder(_A						,		quant if self.config.norm_type == 'spatial' else None)

      if not return_dict:
          return (dec,)

      return DecoderOutput(sample=_A)


  def 						lowerCAmelCase__     (					self						,		_A						,		_A = True):
      SCREAMING_SNAKE_CASE_									=						sample
      SCREAMING_SNAKE_CASE_									=						self.encode(_A).latents
      SCREAMING_SNAKE_CASE_									=						self.decode(_A).sample

      if not return_dict:
          return (dec,)

      return DecoderOutput(sample=_A)


