



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 		UpperCAmelCase						(						snake_case_				):
   SCREAMING_SNAKE_CASE__							=     42






class 		UpperCAmelCase						(						snake_case_       ,snake_case_				):





   @register_to_config
   def __init__(	self       ,     _lowerCAmelCase = 3       ,     _lowerCAmelCase = 3       ,     _lowerCAmelCase = ("DownEncoderBlock2D",)       ,     _lowerCAmelCase = ("UpDecoderBlock2D",)       ,     _lowerCAmelCase = (64,)       ,     _lowerCAmelCase = 1       ,     _lowerCAmelCase = "silu"       ,     _lowerCAmelCase = 3       ,     _lowerCAmelCase = 32       ,     _lowerCAmelCase = 256       ,     _lowerCAmelCase = 32       ,     _lowerCAmelCase = None       ,     _lowerCAmelCase = 0.18_215       ,     _lowerCAmelCase = "group"       ,     ):
         super().__init__()

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

         _lowerCAmelCase 			=  vq_embed_dim if vq_embed_dim is not None else latent_channels

         _lowerCAmelCase 			=  nn.Convad(_lowerCAmelCase       ,     _lowerCAmelCase       ,     1			)
         _lowerCAmelCase 			=  VectorQuantizer(_lowerCAmelCase       ,     _lowerCAmelCase       ,     beta=0.25       ,     remap=_lowerCAmelCase       ,     sane_index_shape=_lowerCAmelCase			)
         _lowerCAmelCase 			=  nn.Convad(_lowerCAmelCase       ,     _lowerCAmelCase       ,     1			)

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





   @apply_forward_hook
   def 	__lowerCAmelCase							(	self       ,     _lowerCAmelCase       ,     _lowerCAmelCase = True			):
         _lowerCAmelCase 			=  self.encoder(_lowerCAmelCase			)
         _lowerCAmelCase 			=  self.quant_conv(_lowerCAmelCase			)

         if not return_dict:
               return (h,)

         return VQEncoderOutput(latents=_lowerCAmelCase			)





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

         if not return_dict:
               return (dec,)

         return DecoderOutput(sample=_lowerCAmelCase			)





   def 	__lowerCAmelCase							(	self       ,     _lowerCAmelCase       ,     _lowerCAmelCase = True			):
         _lowerCAmelCase 			=  sample
         _lowerCAmelCase 			=  self.encode(_lowerCAmelCase			).latents
         _lowerCAmelCase 			=  self.decode(_lowerCAmelCase			).sample

         if not return_dict:
               return (dec,)

         return DecoderOutput(sample=_lowerCAmelCase			)




# Copyright 2021 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import os

from accelerate.utils import ComputeEnvironment

from .cluster import get_cluster_input
from .config_args import cache_dir, default_config_file, default_yaml_config_file, load_config_from_file  # noqa: F401
from .config_utils import _ask_field, _ask_options, _convert_compute_environment  # noqa: F401
from .sagemaker import get_sagemaker_input


UpperCAmelCase_									=							"Launches a series of prompts to create and save a `default_config.yaml` configuration file for your training system. Should always be ran first on your machine"
def 							UpperCAmelCase__		(				)->Any:
      _lowerCAmelCase 			=  _ask_options(
          '''In which compute environment are you running?'''     ,				['''This machine''', '''AWS (Amazon SageMaker)''']     ,				_convert_compute_environment     ,				)
      if compute_environment == ComputeEnvironment.AMAZON_SAGEMAKER:
            _lowerCAmelCase 			=  get_sagemaker_input()
      else:
            _lowerCAmelCase 			=  get_cluster_input()
      return config
def 							UpperCAmelCase__		(				_SCREAMING_SNAKE_CASE   :	int=None				)->str:
      if subparsers is not None:
            _lowerCAmelCase 			=  subparsers.add_parser('''config'''     ,				description=_SCREAMING_SNAKE_CASE				)
      else:
            _lowerCAmelCase 			=  argparse.ArgumentParser('''Accelerate config command'''     ,				description=_SCREAMING_SNAKE_CASE				)

      parser.add_argument(
          '''--config_file'''     ,				default=_SCREAMING_SNAKE_CASE     ,				help=(
              '''The path to use to store the config file. Will default to a file named default_config.yaml in the cache '''
              '''location, which is the content of the environment `HF_HOME` suffixed with \'accelerate\', or if you don\'t have '''
              '''such an environment variable, your cache directory (\'~/.cache\' or the content of `XDG_CACHE_HOME`) suffixed '''
              '''with \'huggingface\'.'''
          )     ,				)

      if subparsers is not None:
            parser.set_defaults(func=_SCREAMING_SNAKE_CASE				)
      return parser
def 							UpperCAmelCase__		(				_SCREAMING_SNAKE_CASE   :	Dict				)->str:
      _lowerCAmelCase 			=  get_user_input()
      if args.config_file is not None:
            _lowerCAmelCase 			=  args.config_file
      else:
            if not os.path.isdir(_SCREAMING_SNAKE_CASE				):
                  os.makedirs(_SCREAMING_SNAKE_CASE				)
            _lowerCAmelCase 			=  default_yaml_config_file

      if config_file.endswith('''.json'''				):
            config.to_json_file(_SCREAMING_SNAKE_CASE				)
      else:
            config.to_yaml_file(_SCREAMING_SNAKE_CASE				)
      print(f'''accelerate configuration saved at {config_file}'''				)
def 							UpperCAmelCase__		(				)->List[Any]:
      _lowerCAmelCase 			=  config_command_parser()
      _lowerCAmelCase 			=  parser.parse_args()
      config_command(_SCREAMING_SNAKE_CASE				)


if __name__ == "__main__":
    main()