




import unittest

from transformers import (
    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    Pipeline,
    ZeroShotClassificationPipeline,
    pipeline,
)
from transformers.testing_utils import is_pipeline_test, nested_simplify, require_tf, require_torch, slow

from .test_pipelines_common import ANY


# These 2 model types require different inputs than those of the usual text models.
a         =      {'''LayoutLMv2Config''', '''LayoutLMv3Config'''}





@is_pipeline_test
class     lowercase_	(					unittest.TestCase							):



 '''simple docstring'''
 UpperCAmelCase   :					Tuple				  =     MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING
 UpperCAmelCase   :					Optional[int]				  =     TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING

 if model_mapping is not None:
  UpperCAmelCase   :					str				  =     {config: model for config, model in model_mapping.items() if config.__name__ not in _TO_SKIP}
 if tf_model_mapping is not None:
  UpperCAmelCase   :					Any				  =     {
      config: model for config, model in tf_model_mapping.items() if config.__name__ not in _TO_SKIP
  }

 def       lowerCAmelCase_							(			self	:	List[Any]   ,							_UpperCAmelCase	:	int   ,							_UpperCAmelCase	:	Dict   ,							_UpperCAmelCase	:	str		):
       _A        =       ZeroShotClassificationPipeline(
           model=_UpperCAmelCase   ,							tokenizer=_UpperCAmelCase   ,							candidate_labels=['polics', 'health']		)
       return classifier, ["Who are you voting for in 2020?", "My stomach hurts."]

 def       lowerCAmelCase_							(			self	:	Dict   ,							_UpperCAmelCase	:	Any   ,							_UpperCAmelCase	:	Optional[int]		):
       _A        =       classifier('Who are you voting for in 2020?'   ,							candidate_labels='politics'		)
       self.assertEqual(_UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		)]}		)

       # No kwarg
       _A        =       classifier('Who are you voting for in 2020?'   ,							['politics']		)
       self.assertEqual(_UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		)]}		)

       _A        =       classifier('Who are you voting for in 2020?'   ,							candidate_labels=['politics']		)
       self.assertEqual(_UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		)]}		)

       _A        =       classifier('Who are you voting for in 2020?'   ,							candidate_labels='politics, public health'		)
       self.assertEqual(
           _UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)]}		)
       self.assertAlmostEqual(sum(nested_simplify(outputs['scores']		)		)   ,							1.0		)

       _A        =       classifier('Who are you voting for in 2020?'   ,							candidate_labels=['politics', 'public health']		)
       self.assertEqual(
           _UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)]}		)
       self.assertAlmostEqual(sum(nested_simplify(outputs['scores']		)		)   ,							1.0		)

       _A        =       classifier(
           'Who are you voting for in 2020?'   ,							candidate_labels='politics'   ,							hypothesis_template='This text is about {}'		)
       self.assertEqual(_UpperCAmelCase   ,							{'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		)]}		)

       # https://github.com/huggingface/transformers/issues/13846
       _A        =       classifier(['I am happy']   ,							['positive', 'negative']		)
       self.assertEqual(
           _UpperCAmelCase   ,							[
               {'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)]}
               for i in range(1		)
           ]   ,							)
       _A        =       classifier(['I am happy', 'I am sad']   ,							['positive', 'negative']		)
       self.assertEqual(
           _UpperCAmelCase   ,							[
               {'sequence': ANY(_UpperCAmelCase		), 'labels': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)], 'scores': [ANY(_UpperCAmelCase		), ANY(_UpperCAmelCase		)]}
               for i in range(2		)
           ]   ,							)

       with self.assertRaises(_UpperCAmelCase		):
             classifier(''   ,							candidate_labels='politics'		)

       with self.assertRaises(_UpperCAmelCase		):
             classifier(_UpperCAmelCase   ,							candidate_labels='politics'		)

       with self.assertRaises(_UpperCAmelCase		):
             classifier('Who are you voting for in 2020?'   ,							candidate_labels=''		)

       with self.assertRaises(_UpperCAmelCase		):
             classifier('Who are you voting for in 2020?'   ,							candidate_labels=_UpperCAmelCase		)

       with self.assertRaises(_UpperCAmelCase		):
             classifier(
                 'Who are you voting for in 2020?'   ,							candidate_labels='politics'   ,							hypothesis_template='Not formatting template'   ,							)

       with self.assertRaises(_UpperCAmelCase		):
             classifier(
                 'Who are you voting for in 2020?'   ,							candidate_labels='politics'   ,							hypothesis_template=_UpperCAmelCase   ,							)

       self.run_entailment_id(_UpperCAmelCase		)

 def       lowerCAmelCase_							(			self	:	Optional[Any]   ,							_UpperCAmelCase	:	Pipeline		):
       _A        =       zero_shot_classifier.model.config
       _A        =       config.labelaid
       _A        =       zero_shot_classifier.entailment_id

       _A        =       {'LABEL_0': 0, 'LABEL_1': 1, 'LABEL_2': 2}
       self.assertEqual(zero_shot_classifier.entailment_id   ,							-1		)

       _A        =       {'entailment': 0, 'neutral': 1, 'contradiction': 2}
       self.assertEqual(zero_shot_classifier.entailment_id   ,							0		)

       _A        =       {'ENTAIL': 0, 'NON-ENTAIL': 1}
       self.assertEqual(zero_shot_classifier.entailment_id   ,							0		)

       _A        =       {'ENTAIL': 2, 'NEUTRAL': 1, 'CONTR': 0}
       self.assertEqual(zero_shot_classifier.entailment_id   ,							2		)

       _A        =       original_labelaid
       self.assertEqual(_UpperCAmelCase   ,							zero_shot_classifier.entailment_id		)

 @require_torch
 def       lowerCAmelCase_							(			self	:	Optional[Any]		):
       _A        =       pipeline(
           'zero-shot-classification'   ,							model='sshleifer/tiny-distilbert-base-cased-distilled-squad'   ,							framework='pt'   ,							)
       # There was a regression in 4.10 for this
       # Adding a test so we don't make the mistake again.
       # https://github.com/huggingface/transformers/issues/13381#issuecomment-912343499
       zero_shot_classifier(
           'Who are you voting for in 2020?' * 100   ,							candidate_labels=['politics', 'public health', 'science']		)

 @require_torch
 def       lowerCAmelCase_							(			self	:	Any		):
       _A        =       pipeline(
           'zero-shot-classification'   ,							model='sshleifer/tiny-distilbert-base-cased-distilled-squad'   ,							framework='pt'   ,							)
       _A        =       zero_shot_classifier(
           'Who are you voting for in 2020?'   ,							candidate_labels=['politics', 'public health', 'science']		)

       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': 'Who are you voting for in 2020?',
               'labels': ['science', 'public health', 'politics'],
               'scores': [0.333, 0.333, 0.333],
           }   ,							)

 @require_tf
 def       lowerCAmelCase_							(			self	:	Dict		):
       _A        =       pipeline(
           'zero-shot-classification'   ,							model='sshleifer/tiny-distilbert-base-cased-distilled-squad'   ,							framework='tf'   ,							)
       _A        =       zero_shot_classifier(
           'Who are you voting for in 2020?'   ,							candidate_labels=['politics', 'public health', 'science']		)

       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': 'Who are you voting for in 2020?',
               'labels': ['science', 'public health', 'politics'],
               'scores': [0.333, 0.333, 0.333],
           }   ,							)

 @slow
 @require_torch
 def       lowerCAmelCase_							(			self	:	List[str]		):
       _A        =       pipeline('zero-shot-classification'   ,							model='roberta-large-mnli'   ,							framework='pt'		)
       _A        =       zero_shot_classifier(
           'Who are you voting for in 2020?'   ,							candidate_labels=['politics', 'public health', 'science']		)

       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': 'Who are you voting for in 2020?',
               'labels': ['politics', 'public health', 'science'],
               'scores': [0.976, 0.015, 0.009],
           }   ,							)
       _A        =       zero_shot_classifier(
           'The dominant sequence transduction models are based on complex recurrent or convolutional neural networks'
           ' in an encoder-decoder configuration. The best performing models also connect the encoder and decoder'
           ' through an attention mechanism. We propose a new simple network architecture, the Transformer, based'
           ' solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two'
           ' machine translation tasks show these models to be superior in quality while being more parallelizable'
           ' and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014'
           ' English-to-German translation task, improving over the existing best results, including ensembles by'
           ' over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new'
           ' single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small'
           ' fraction of the training costs of the best models from the literature. We show that the Transformer'
           ' generalizes well to other tasks by applying it successfully to English constituency parsing both with'
           ' large and limited training data.'   ,							candidate_labels=['machine learning', 'statistics', 'translation', 'vision']   ,							multi_label=_UpperCAmelCase   ,							)
       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': (
                   'The dominant sequence transduction models are based on complex recurrent or convolutional neural'
                   ' networks in an encoder-decoder configuration. The best performing models also connect the'
                   ' encoder and decoder through an attention mechanism. We propose a new simple network'
                   ' architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence'
                   ' and convolutions entirely. Experiments on two machine translation tasks show these models to be'
                   ' superior in quality while being more parallelizable and requiring significantly less time to'
                   ' train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task,'
                   ' improving over the existing best results, including ensembles by over 2 BLEU. On the WMT 2014'
                   ' English-to-French translation task, our model establishes a new single-model state-of-the-art'
                   ' BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training'
                   ' costs of the best models from the literature. We show that the Transformer generalizes well to'
                   ' other tasks by applying it successfully to English constituency parsing both with large and'
                   ' limited training data.'
               ),
               'labels': ['translation', 'machine learning', 'vision', 'statistics'],
               'scores': [0.817, 0.713, 0.018, 0.018],
           }   ,							)



 @slow
 @require_tf
 def       lowerCAmelCase_							(			self	:	List[Any]		):
       _A        =       pipeline('zero-shot-classification'   ,							model='roberta-large-mnli'   ,							framework='tf'		)
       _A        =       zero_shot_classifier(
           'Who are you voting for in 2020?'   ,							candidate_labels=['politics', 'public health', 'science']		)

       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': 'Who are you voting for in 2020?',
               'labels': ['politics', 'public health', 'science'],
               'scores': [0.976, 0.015, 0.009],
           }   ,							)
       _A        =       zero_shot_classifier(
           'The dominant sequence transduction models are based on complex recurrent or convolutional neural networks'
           ' in an encoder-decoder configuration. The best performing models also connect the encoder and decoder'
           ' through an attention mechanism. We propose a new simple network architecture, the Transformer, based'
           ' solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two'
           ' machine translation tasks show these models to be superior in quality while being more parallelizable'
           ' and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014'
           ' English-to-German translation task, improving over the existing best results, including ensembles by'
           ' over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new'
           ' single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small'
           ' fraction of the training costs of the best models from the literature. We show that the Transformer'
           ' generalizes well to other tasks by applying it successfully to English constituency parsing both with'
           ' large and limited training data.'   ,							candidate_labels=['machine learning', 'statistics', 'translation', 'vision']   ,							multi_label=_UpperCAmelCase   ,							)
       self.assertEqual(
           nested_simplify(_UpperCAmelCase		)   ,							{
               'sequence': (
                   'The dominant sequence transduction models are based on complex recurrent or convolutional neural'
                   ' networks in an encoder-decoder configuration. The best performing models also connect the'
                   ' encoder and decoder through an attention mechanism. We propose a new simple network'
                   ' architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence'
                   ' and convolutions entirely. Experiments on two machine translation tasks show these models to be'
                   ' superior in quality while being more parallelizable and requiring significantly less time to'
                   ' train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task,'
                   ' improving over the existing best results, including ensembles by over 2 BLEU. On the WMT 2014'
                   ' English-to-French translation task, our model establishes a new single-model state-of-the-art'
                   ' BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training'
                   ' costs of the best models from the literature. We show that the Transformer generalizes well to'
                   ' other tasks by applying it successfully to English constituency parsing both with large and'
                   ' limited training data.'
               ),
               'labels': ['translation', 'machine learning', 'vision', 'statistics'],
               'scores': [0.817, 0.713, 0.018, 0.018],
           }   ,							)







"""simple docstring"""

from dataclasses import dataclass
from typing import Dict, 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 .attention_processor import AttentionProcessor, AttnProcessor
from .modeling_utils import ModelMixin
from .vae import Decoder, DecoderOutput, DiagonalGaussianDistribution, Encoder





@dataclass
class     lowercase_	(					__lowerCAmelCase							):



 '''simple docstring'''
 UpperCAmelCase   :					"DiagonalGaussianDistribution"





class     lowercase_	(					__lowerCAmelCase      ,     __lowerCAmelCase							):



 '''simple docstring'''
 UpperCAmelCase   :					List[Any]				  =     True

 @register_to_config
 def __init__(			self	:	List[str]   ,							_UpperCAmelCase	:	int = 3   ,							_UpperCAmelCase	:	int = 3   ,							_UpperCAmelCase	:	Tuple[str] = ("DownEncoderBlock2D",)   ,							_UpperCAmelCase	:	Tuple[str] = ("UpDecoderBlock2D",)   ,							_UpperCAmelCase	:	Tuple[int] = (64,)   ,							_UpperCAmelCase	:	int = 1   ,							_UpperCAmelCase	:	str = "silu"   ,							_UpperCAmelCase	:	int = 4   ,							_UpperCAmelCase	:	int = 32   ,							_UpperCAmelCase	:	int = 32   ,							_UpperCAmelCase	:	float = 0.1_8215   ,							):
       super().__init__()

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

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

       _A        =       nn.Convad(2 * latent_channels   ,							2 * latent_channels   ,							1		)
       _A        =       nn.Convad(_UpperCAmelCase   ,							_UpperCAmelCase   ,							1		)

       _A        =       False
       _A        =       False

       # only relevant if vae tiling is enabled
       _A        =       self.config.sample_size
       _A        =       (
           self.config.sample_size[0]
           if isinstance(self.config.sample_size   ,							(list, tuple)		)
           else self.config.sample_size
       )
       _A        =       int(sample_size / (2 ** (len(self.config.block_out_channels		) - 1))		)
       _A        =       0.25

 def       lowerCAmelCase_							(			self	:	Union[str, Any]   ,							_UpperCAmelCase	:	int   ,							_UpperCAmelCase	:	Tuple=False		):
       if isinstance(_UpperCAmelCase   ,							(Encoder, Decoder)		):
             _A        =       value

 def       lowerCAmelCase_							(			self	:	List[str]   ,							_UpperCAmelCase	:	bool = True		):
       _A        =       use_tiling

 def       lowerCAmelCase_							(			self	:	Union[str, Any]		):
       self.enable_tiling(_UpperCAmelCase		)

 def       lowerCAmelCase_							(			self	:	Dict		):
       _A        =       True

 def       lowerCAmelCase_							(			self	:	str		):
       _A        =       False

 @property
 # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
 def       lowerCAmelCase_							(			self	:	str		):
       _A        =       {}

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

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

             return processors

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

       return processors

 def       lowerCAmelCase_							(			self	:	str   ,							_UpperCAmelCase	:	Union[AttentionProcessor, Dict[str, AttentionProcessor]]		):
       _A        =       len(self.attn_processors.keys()		)

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

       def fn_recursive_attn_processor(_UpperCAmelCase	:	str   ,							_UpperCAmelCase	:	torch.nn.Module   ,							_UpperCAmelCase	:	int		):
             if hasattr(_UpperCAmelCase   ,							'set_processor'		):
                   if not isinstance(_UpperCAmelCase   ,							_UpperCAmelCase		):
                         module.set_processor(_UpperCAmelCase		)
                   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}'''   ,							_UpperCAmelCase   ,							_UpperCAmelCase		)

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

 def       lowerCAmelCase_							(			self	:	List[str]		):
       self.set_attn_processor(AttnProcessor()		)

 @apply_forward_hook
 def       lowerCAmelCase_							(			self	:	int   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = True		):
       if self.use_tiling and (x.shape[-1] > self.tile_sample_min_size or x.shape[-2] > self.tile_sample_min_size):
             return self.tiled_encode(_UpperCAmelCase   ,							return_dict=_UpperCAmelCase		)

       if self.use_slicing and x.shape[0] > 1:
             _A        =       [self.encoder(_UpperCAmelCase		) for x_slice in x.split(1		)]
             _A        =       torch.cat(_UpperCAmelCase		)
       else:
             _A        =       self.encoder(_UpperCAmelCase		)

       _A        =       self.quant_conv(_UpperCAmelCase		)
       _A        =       DiagonalGaussianDistribution(_UpperCAmelCase		)

       if not return_dict:
             return (posterior,)

       return AutoencoderKLOutput(latent_dist=_UpperCAmelCase		)

 def       lowerCAmelCase_							(			self	:	Any   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = True		):
       if self.use_tiling and (z.shape[-1] > self.tile_latent_min_size or z.shape[-2] > self.tile_latent_min_size):
             return self.tiled_decode(_UpperCAmelCase   ,							return_dict=_UpperCAmelCase		)

       _A        =       self.post_quant_conv(_UpperCAmelCase		)
       _A        =       self.decoder(_UpperCAmelCase		)

       if not return_dict:
             return (dec,)

       return DecoderOutput(sample=_UpperCAmelCase		)

 @apply_forward_hook
 def       lowerCAmelCase_							(			self	:	str   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = True		):
       if self.use_slicing and z.shape[0] > 1:
             _A        =       [self._decode(_UpperCAmelCase		).sample for z_slice in z.split(1		)]
             _A        =       torch.cat(_UpperCAmelCase		)
       else:
             _A        =       self._decode(_UpperCAmelCase		).sample

       if not return_dict:
             return (decoded,)

       return DecoderOutput(sample=_UpperCAmelCase		)

 def       lowerCAmelCase_							(			self	:	str   ,							_UpperCAmelCase	:	int   ,							_UpperCAmelCase	:	Dict   ,							_UpperCAmelCase	:	Any		):
       _A        =       min(a.shape[2]   ,							b.shape[2]   ,							_UpperCAmelCase		)
       for y in range(_UpperCAmelCase		):
             _A        =       a[:, :, -blend_extent + y, :] * (1 - y / blend_extent) + b[:, :, y, :] * (y / blend_extent)
       return b

 def       lowerCAmelCase_							(			self	:	Optional[Any]   ,							_UpperCAmelCase	:	List[str]   ,							_UpperCAmelCase	:	List[Any]   ,							_UpperCAmelCase	:	List[Any]		):
       _A        =       min(a.shape[3]   ,							b.shape[3]   ,							_UpperCAmelCase		)
       for x in range(_UpperCAmelCase		):
             _A        =       a[:, :, :, -blend_extent + x] * (1 - x / blend_extent) + b[:, :, :, x] * (x / blend_extent)
       return b

 def       lowerCAmelCase_							(			self	:	str   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = True		):
       _A        =       int(self.tile_sample_min_size * (1 - self.tile_overlap_factor)		)
       _A        =       int(self.tile_latent_min_size * self.tile_overlap_factor		)
       _A        =       self.tile_latent_min_size - blend_extent

       # Split the image into 512x512 tiles and encode them separately.
       _A        =       []
       for i in range(0   ,							x.shape[2]   ,							_UpperCAmelCase		):
             _A        =       []
             for j in range(0   ,							x.shape[3]   ,							_UpperCAmelCase		):
                   _A        =       x[:, :, i : i + self.tile_sample_min_size, j : j + self.tile_sample_min_size]
                   _A        =       self.encoder(_UpperCAmelCase		)
                   _A        =       self.quant_conv(_UpperCAmelCase		)
                   row.append(_UpperCAmelCase		)
             rows.append(_UpperCAmelCase		)
       _A        =       []
       for i, row in enumerate(_UpperCAmelCase		):
             _A        =       []
             for j, tile in enumerate(_UpperCAmelCase		):
                   # blend the above tile and the left tile
                   # to the current tile and add the current tile to the result row
                   if i > 0:
                         _A        =       self.blend_v(rows[i - 1][j]   ,							_UpperCAmelCase   ,							_UpperCAmelCase		)
                   if j > 0:
                         _A        =       self.blend_h(row[j - 1]   ,							_UpperCAmelCase   ,							_UpperCAmelCase		)
                   result_row.append(tile[:, :, :row_limit, :row_limit]		)
             result_rows.append(torch.cat(_UpperCAmelCase   ,							dim=3		)		)

       _A        =       torch.cat(_UpperCAmelCase   ,							dim=2		)
       _A        =       DiagonalGaussianDistribution(_UpperCAmelCase		)

       if not return_dict:
             return (posterior,)

       return AutoencoderKLOutput(latent_dist=_UpperCAmelCase		)

 def       lowerCAmelCase_							(			self	:	Tuple   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = True		):
       _A        =       int(self.tile_latent_min_size * (1 - self.tile_overlap_factor)		)
       _A        =       int(self.tile_sample_min_size * self.tile_overlap_factor		)
       _A        =       self.tile_sample_min_size - blend_extent

       # Split z into overlapping 64x64 tiles and decode them separately.
       # The tiles have an overlap to avoid seams between tiles.
       _A        =       []
       for i in range(0   ,							z.shape[2]   ,							_UpperCAmelCase		):
             _A        =       []
             for j in range(0   ,							z.shape[3]   ,							_UpperCAmelCase		):
                   _A        =       z[:, :, i : i + self.tile_latent_min_size, j : j + self.tile_latent_min_size]
                   _A        =       self.post_quant_conv(_UpperCAmelCase		)
                   _A        =       self.decoder(_UpperCAmelCase		)
                   row.append(_UpperCAmelCase		)
             rows.append(_UpperCAmelCase		)
       _A        =       []
       for i, row in enumerate(_UpperCAmelCase		):
             _A        =       []
             for j, tile in enumerate(_UpperCAmelCase		):
                   # blend the above tile and the left tile
                   # to the current tile and add the current tile to the result row
                   if i > 0:
                         _A        =       self.blend_v(rows[i - 1][j]   ,							_UpperCAmelCase   ,							_UpperCAmelCase		)
                   if j > 0:
                         _A        =       self.blend_h(row[j - 1]   ,							_UpperCAmelCase   ,							_UpperCAmelCase		)
                   result_row.append(tile[:, :, :row_limit, :row_limit]		)
             result_rows.append(torch.cat(_UpperCAmelCase   ,							dim=3		)		)

       _A        =       torch.cat(_UpperCAmelCase   ,							dim=2		)
       if not return_dict:
             return (dec,)

       return DecoderOutput(sample=_UpperCAmelCase		)



 def       lowerCAmelCase_							(			self	:	List[str]   ,							_UpperCAmelCase	:	torch.FloatTensor   ,							_UpperCAmelCase	:	bool = False   ,							_UpperCAmelCase	:	bool = True   ,							_UpperCAmelCase	:	Optional[torch.Generator] = None   ,							):
       _A        =       sample
       _A        =       self.encode(_UpperCAmelCase		).latent_dist
       if sample_posterior:
             _A        =       posterior.sample(generator=_UpperCAmelCase		)
       else:
             _A        =       posterior.mode()
       _A        =       self.decode(_UpperCAmelCase		).sample

       if not return_dict:
             return (dec,)

       return DecoderOutput(sample=_UpperCAmelCase		)

