




"""simple docstring"""







from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig
from ...utils import logging


if TYPE_CHECKING:
						from ... import FeatureExtractionMixin, TensorType

__A   :  Any					=      logging.get_logger(__name__)

__A   :  Any					=      {
    'openai/imagegpt-small': '',
    'openai/imagegpt-medium': '',
    'openai/imagegpt-large': '',
}




class       lowerCAmelCase__       (			lowerCAmelCase_    ):


				"""simple docstring"""





				__UpperCAmelCase :     Tuple       =      "imagegpt"
				__UpperCAmelCase :     str       =      ["past_key_values"]
				__UpperCAmelCase :     Optional[Any]       =      {
				    "hidden_size": "n_embd",
				    "max_position_embeddings": "n_positions",
				    "num_attention_heads": "n_head",
				    "num_hidden_layers": "n_layer",
				}



				def __init__(     self					:	List[str]    ,   lowercase__					:	Dict=5_1_2 + 1    ,   lowercase__					:	List[Any]=3_2 * 3_2    ,   lowercase__					:	Tuple=5_1_2    ,   lowercase__					:	Optional[int]=2_4    ,   lowercase__					:	List[Any]=8    ,   lowercase__					:	Tuple=None    ,   lowercase__					:	Any="quick_gelu"    ,   lowercase__					:	Any=0.1    ,   lowercase__					:	str=0.1    ,   lowercase__					:	Any=0.1    ,   lowercase__					:	Any=1e-5    ,   lowercase__					:	Any=0.0_2    ,   lowercase__					:	Tuple=True    ,   lowercase__					:	Optional[int]=True    ,   lowercase__					:	Tuple=False    ,   lowercase__					:	Optional[int]=False    ,   lowercase__					:	List[Any]=False    ,   **lowercase__					:	Union[str, Any]    ,   ):
						__lowercase				:		Any												=				vocab_size
						__lowercase				:		int												=				n_positions
						__lowercase				:		Tuple												=				n_embd
						__lowercase				:		Any												=				n_layer
						__lowercase				:		Dict												=				n_head
						__lowercase				:		Dict												=				n_inner
						__lowercase				:		Dict												=				activation_function
						__lowercase				:		str												=				resid_pdrop
						__lowercase				:		List[str]												=				embd_pdrop
						__lowercase				:		str												=				attn_pdrop
						__lowercase				:		Optional[Any]												=				layer_norm_epsilon
						__lowercase				:		Tuple												=				initializer_range
						__lowercase				:		Dict												=				scale_attn_weights
						__lowercase				:		int												=				use_cache
						__lowercase				:		Any												=				scale_attn_by_inverse_layer_idx
						__lowercase				:		Any												=				reorder_and_upcast_attn
						__lowercase				:		List[Any]												=				tie_word_embeddings

						super().__init__(tie_word_embeddings=lowercase__    ,   **lowercase__						)





class       lowerCAmelCase__       (			lowerCAmelCase_    ):


				"""simple docstring"""





				@property
				def       snake_case    (     self					:	Tuple						):
						return OrderedDict(
						    [
						        ("input_ids", {0: "batch", 1: "sequence"}),
						    ]						)



				def       snake_case    (     self					:	List[str]    ,   lowercase__					:	"FeatureExtractionMixin"    ,   lowercase__					:	int = 1    ,   lowercase__					:	int = -1    ,   lowercase__					:	bool = False    ,   lowercase__					:	Optional["TensorType"] = None    ,   lowercase__					:	int = 3    ,   lowercase__					:	int = 3_2    ,   lowercase__					:	int = 3_2    ,   ):
						__lowercase				:		Dict												=				self._generate_dummy_images(lowercase__    ,   lowercase__    ,   lowercase__    ,   lowercase__						)
						__lowercase				:		Union[str, Any]												=				dict(preprocessor(images=lowercase__    ,   return_tensors=lowercase__						)						)

						return inputs








"""simple docstring"""







import os
import re
import sys
import traceback
import warnings
from pathlib import Path
from typing import Dict, Optional, Union
from uuid import uuida

from huggingface_hub import HfFolder, ModelCard, ModelCardData, hf_hub_download, whoami
from huggingface_hub.file_download import REGEX_COMMIT_HASH
from huggingface_hub.utils import (
    EntryNotFoundError,
    RepositoryNotFoundError,
    RevisionNotFoundError,
    is_jinja_available,
)
from packaging import version
from requests import HTTPError

from .. import __version__
from .constants import (
    DEPRECATED_REVISION_ARGS,
    DIFFUSERS_CACHE,
    HUGGINGFACE_CO_RESOLVE_ENDPOINT,
    SAFETENSORS_WEIGHTS_NAME,
    WEIGHTS_NAME,
)
from .import_utils import (
    ENV_VARS_TRUE_VALUES,
    _flax_version,
    _jax_version,
    _onnxruntime_version,
    _torch_version,
    is_flax_available,
    is_onnx_available,
    is_torch_available,
)
from .logging import get_logger


__A   :  List[Any]					=      get_logger(__name__)


__A   :  Tuple					=      Path(__file__).parent / 'model_card_template.md'
__A   :  Any					=      uuida().hex
__A   :  Optional[int]					=      os.getenv('HF_HUB_OFFLINE', '').upper() in ENV_VARS_TRUE_VALUES
__A   :  Tuple					=      os.getenv('DISABLE_TELEMETRY', '').upper() in ENV_VARS_TRUE_VALUES
__A   :  List[Any]					=      HUGGINGFACE_CO_RESOLVE_ENDPOINT + '/api/telemetry/'

def 						snake_case__       (					_lowerCamelCase = None				)			->str:






		"""simple docstring"""


		__lowercase				:		Optional[Any]												=				F'diffusers/{__version__}; python/{sys.version.split()[0]}; session_id/{SESSION_ID}'
		if DISABLE_TELEMETRY or HF_HUB_OFFLINE:
				return ua + "; telemetry/off"
		if is_torch_available():
				ua += F'; torch/{_torch_version}'
		if is_flax_available():
				ua += F'; jax/{_jax_version}'
				ua += F'; flax/{_flax_version}'
		if is_onnx_available():
				ua += F'; onnxruntime/{_onnxruntime_version}'
		# CI will set this value to True
		if os.environ.get("DIFFUSERS_IS_CI",  ""				).upper() in ENV_VARS_TRUE_VALUES:
				ua += "; is_ci/true"
		if isinstance(_lowerCamelCase,  _lowerCamelCase				):
				ua += "; " + "; ".join(F'{k}/{v}' for k, v in user_agent.items()				)
		elif isinstance(_lowerCamelCase,  _lowerCamelCase				):
				ua += "; " + user_agent
		return ua

def 						snake_case__       (					_lowerCamelCase,  _lowerCamelCase = None,  _lowerCamelCase = None				)			->List[Any]:






		"""simple docstring"""


		if token is None:
				__lowercase				:		Any												=				HfFolder.get_token()
		if organization is None:
				__lowercase				:		int												=				whoami(_lowerCamelCase				)["name"]
				return F'{username}/{model_id}'
		else:
				return F'{organization}/{model_id}'

def 						snake_case__       (					_lowerCamelCase,  _lowerCamelCase				)			->Dict:






		"""simple docstring"""


		if not is_jinja_available():
				raise ValueError(
				    "Modelcard rendering is based on Jinja templates."
				    " Please make sure to have `jinja` installed before using `create_model_card`."
				    " To install it, please run `pip install Jinja2`."				)

		if hasattr(_lowerCamelCase,  "local_rank"				) and args.local_rank not in [-1, 0]:
				return

		__lowercase				:		Tuple												=				args.hub_token if hasattr(_lowerCamelCase,  "hub_token"				) else None
		__lowercase				:		int												=				get_full_repo_name(_lowerCamelCase,  token=_lowerCamelCase				)

		__lowercase				:		Optional[Any]												=				ModelCard.from_template(
		    card_data=ModelCardData(  # Card metadata object that will be converted to YAML block
		        language="en",  license="apache-2.0",  library_name="diffusers",  tags=[],  datasets=args.dataset_name,  metrics=[],  ),  template_path=_lowerCamelCase,  model_name=_lowerCamelCase,  repo_name=_lowerCamelCase,  dataset_name=args.dataset_name if hasattr(_lowerCamelCase,  "dataset_name"				) else None,  learning_rate=args.learning_rate,  train_batch_size=args.train_batch_size,  eval_batch_size=args.eval_batch_size,  gradient_accumulation_steps=(
		        args.gradient_accumulation_steps if hasattr(_lowerCamelCase,  "gradient_accumulation_steps"				) else None
		    ),  adam_betaa=args.adam_betaa if hasattr(_lowerCamelCase,  "adam_beta1"				) else None,  adam_betaa=args.adam_betaa if hasattr(_lowerCamelCase,  "adam_beta2"				) else None,  adam_weight_decay=args.adam_weight_decay if hasattr(_lowerCamelCase,  "adam_weight_decay"				) else None,  adam_epsilon=args.adam_epsilon if hasattr(_lowerCamelCase,  "adam_epsilon"				) else None,  lr_scheduler=args.lr_scheduler if hasattr(_lowerCamelCase,  "lr_scheduler"				) else None,  lr_warmup_steps=args.lr_warmup_steps if hasattr(_lowerCamelCase,  "lr_warmup_steps"				) else None,  ema_inv_gamma=args.ema_inv_gamma if hasattr(_lowerCamelCase,  "ema_inv_gamma"				) else None,  ema_power=args.ema_power if hasattr(_lowerCamelCase,  "ema_power"				) else None,  ema_max_decay=args.ema_max_decay if hasattr(_lowerCamelCase,  "ema_max_decay"				) else None,  mixed_precision=args.mixed_precision,  )

		__lowercase				:		Dict												=				os.path.join(args.output_dir,  "README.md"				)
		model_card.save(_lowerCamelCase				)

def 						snake_case__       (					_lowerCamelCase,  _lowerCamelCase = None				)			->Tuple:






		"""simple docstring"""


		if resolved_file is None or commit_hash is not None:
				return commit_hash
		__lowercase				:		Union[str, Any]												=				str(Path(_lowerCamelCase				).as_posix()				)
		__lowercase				:		int												=				re.search(R"snapshots/([^/]+)/",  _lowerCamelCase				)
		if search is None:
				return None
		__lowercase				:		Union[str, Any]												=				search.groups()[0]
		return commit_hash if REGEX_COMMIT_HASH.match(_lowerCamelCase				) else None


# Old default cache path, potentially to be migrated.
# This logic was more or less taken from `transformers`, with the following differences:
# - Diffusers doesn't use custom environment variables to specify the cache path.
# - There is no need to migrate the cache format, just move the files to the new location.
__A   :  Union[str, Any]					=      os.path.expanduser(
    os.getenv('HF_HOME', os.path.join(os.getenv('XDG_CACHE_HOME', '~/.cache'), 'huggingface'))
)
__A   :  List[str]					=      os.path.join(hf_cache_home, 'diffusers')

def 						snake_case__       (					_lowerCamelCase = None,  _lowerCamelCase = None				)			->None:






		"""simple docstring"""


		if new_cache_dir is None:
				__lowercase				:		int												=				DIFFUSERS_CACHE
		if old_cache_dir is None:
				__lowercase				:		Tuple												=				old_diffusers_cache

		__lowercase				:		str												=				Path(_lowerCamelCase				).expanduser()
		__lowercase				:		Optional[int]												=				Path(_lowerCamelCase				).expanduser()
		for old_blob_path in old_cache_dir.glob("**/blobs/*"				):
				if old_blob_path.is_file() and not old_blob_path.is_symlink():
						__lowercase				:		str												=				new_cache_dir / old_blob_path.relative_to(_lowerCamelCase				)
						new_blob_path.parent.mkdir(parents=_lowerCamelCase,  exist_ok=_lowerCamelCase				)
						os.replace(_lowerCamelCase,  _lowerCamelCase				)
						try:
								os.symlink(_lowerCamelCase,  _lowerCamelCase				)
						except OSError:
								logger.warning(
								    "Could not create symlink between old cache and new cache. If you use an older version of diffusers again, files will be re-downloaded."				)
		# At this point, old_cache_dir contains symlinks to the new cache (it can still be used).


__A   :  int					=      os.path.join(DIFFUSERS_CACHE, 'version_diffusers_cache.txt')
if not os.path.isfile(cache_version_file):
						__A   :  Optional[Any]					=      0
else:
						with open(cache_version_file) as f:
												try:
																		__A   :  Optional[int]					=      int(f.read())
												except ValueError:
																		__A   :  Optional[Any]					=      0

if cache_version < 1:
						__A   :  Optional[Any]					=      os.path.isdir(old_diffusers_cache) and len(os.listdir(old_diffusers_cache)) > 0
						if old_cache_is_not_empty:
												logger.warning(
												    'The cache for model files in Diffusers v0.14.0 has moved to a new location. Moving your '
												    'existing cached models. This is a one-time operation, you can interrupt it or run it '
												    'later by calling `diffusers.utils.hub_utils.move_cache()`.'
												)
												try:
																		move_cache()
												except Exception as e:
																		__A   :  Union[str, Any]					=      '\n'.join(traceback.format_tb(e.__traceback__))
																		logger.error(
																		    F"""There was a problem when trying to move your cache:\n\n{trace}\n{e.__class__.__name__}: {e}\n\nPlease """
																		    'file an issue at https://github.com/huggingface/diffusers/issues/new/choose, copy paste this whole '
																		    'message and we will do our best to help.'
																		)

if cache_version < 1:
						try:
												os.makedirs(DIFFUSERS_CACHE, exist_ok=True)
												with open(cache_version_file, 'w') as f:
																		f.write('1')
						except Exception:
												logger.warning(
												    F"""There was a problem when trying to write in your cache folder ({DIFFUSERS_CACHE}). Please, ensure """
												    'the directory exists and can be written to.'
												)

def 						snake_case__       (					_lowerCamelCase,  _lowerCamelCase = None				)			->str:






		"""simple docstring"""


		if variant is not None:
				__lowercase				:		str												=				weights_name.split("."				)
				__lowercase				:		str												=				splits[:-1] + [variant] + splits[-1:]
				__lowercase				:		Dict												=				".".join(_lowerCamelCase				)

		return weights_name





def 						snake_case__       (					_lowerCamelCase,  *,
    _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase=None,  )			->str:






		"""simple docstring"""


		__lowercase				:		Dict												=				str(_lowerCamelCase				)
		if os.path.isfile(_lowerCamelCase				):
				return pretrained_model_name_or_path
		elif os.path.isdir(_lowerCamelCase				):
				if os.path.isfile(os.path.join(_lowerCamelCase,  _lowerCamelCase				)				):
						# Load from a PyTorch checkpoint
						__lowercase				:		str												=				os.path.join(_lowerCamelCase,  _lowerCamelCase				)
						return model_file
				elif subfolder is not None and os.path.isfile(
				    os.path.join(_lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase				)				):
						__lowercase				:		Dict												=				os.path.join(_lowerCamelCase,  _lowerCamelCase,  _lowerCamelCase				)
						return model_file
				else:
						raise EnvironmentError(
						    F'Error no file named {weights_name} found in directory {pretrained_model_name_or_path}.'				)
		else:
				# 1. First check if deprecated way of loading from branches is used
				if (
				    revision in DEPRECATED_REVISION_ARGS
				    and (weights_name == WEIGHTS_NAME or weights_name == SAFETENSORS_WEIGHTS_NAME)
				    and version.parse(version.parse(_lowerCamelCase				).base_version				) >= version.parse("0.20.0"				)
				):
						try:
								__lowercase				:		Any												=				hf_hub_download(
								    _lowerCamelCase,  filename=_add_variant(_lowerCamelCase,  _lowerCamelCase				),  cache_dir=_lowerCamelCase,  force_download=_lowerCamelCase,  proxies=_lowerCamelCase,  resume_download=_lowerCamelCase,  local_files_only=_lowerCamelCase,  use_auth_token=_lowerCamelCase,  user_agent=_lowerCamelCase,  subfolder=_lowerCamelCase,  revision=revision or commit_hash,  )
								warnings.warn(
								    F'Loading the variant {revision} from {pretrained_model_name_or_path} via `revision=\'{revision}\'` is deprecated. Loading instead from `revision=\'main\'` with `variant={revision}`. Loading model variants via `revision=\'{revision}\'` will be removed in diffusers v1. Please use `variant=\'{revision}\'` instead.',  _lowerCamelCase,  )
								return model_file
						except:  # noqa: E722
								warnings.warn(
								    F'You are loading the variant {revision} from {pretrained_model_name_or_path} via `revision=\'{revision}\'`. This behavior is deprecated and will be removed in diffusers v1. One should use `variant=\'{revision}\'` instead. However, it appears that {pretrained_model_name_or_path} currently does not have a {_add_variant(_lowerCamelCase,  _lowerCamelCase				)} file in the \'main\' branch of {pretrained_model_name_or_path}. \n The Diffusers team and community would be very grateful if you could open an issue: https://github.com/huggingface/diffusers/issues/new with the title \'{pretrained_model_name_or_path} is missing {_add_variant(_lowerCamelCase,  _lowerCamelCase				)}\' so that the correct variant file can be added.',  _lowerCamelCase,  )
				try:
						# 2. Load model file as usual
						__lowercase				:		str												=				hf_hub_download(
						    _lowerCamelCase,  filename=_lowerCamelCase,  cache_dir=_lowerCamelCase,  force_download=_lowerCamelCase,  proxies=_lowerCamelCase,  resume_download=_lowerCamelCase,  local_files_only=_lowerCamelCase,  use_auth_token=_lowerCamelCase,  user_agent=_lowerCamelCase,  subfolder=_lowerCamelCase,  revision=revision or commit_hash,  )
						return model_file

				except RepositoryNotFoundError:
						raise EnvironmentError(
						    F'{pretrained_model_name_or_path} is not a local folder and is not a valid model identifier '
						    "listed on 'https://huggingface.co/models'\nIf this is a private repository, make sure to pass a "
						    "token having permission to this repo with `use_auth_token` or log in with `huggingface-cli "
						    "login`."				)
				except RevisionNotFoundError:
						raise EnvironmentError(
						    F'{revision} is not a valid git identifier (branch name, tag name or commit id) that exists for '
						    "this model name. Check the model page at "
						    F'\'https://huggingface.co/{pretrained_model_name_or_path}\' for available revisions.'				)
				except EntryNotFoundError:
						raise EnvironmentError(
						    F'{pretrained_model_name_or_path} does not appear to have a file named {weights_name}.'				)
				except HTTPError as err:
						raise EnvironmentError(
						    F'There was a specific connection error when trying to load {pretrained_model_name_or_path}:\n{err}'				)
				except ValueError:
						raise EnvironmentError(
						    F'We couldn\'t connect to \'{HUGGINGFACE_CO_RESOLVE_ENDPOINT}\' to load this model, couldn\'t find it'
						    F' in the cached files and it looks like {pretrained_model_name_or_path} is not the path to a'
						    F' directory containing a file named {weights_name} or'
						    " \nCheckout your internet connection or see how to run the library in"
						    " offline mode at 'https://huggingface.co/docs/diffusers/installation#offline-mode'."				)
				except EnvironmentError:
						raise EnvironmentError(
						    F'Can\'t load the model for \'{pretrained_model_name_or_path}\'. If you were trying to load it from '
						    "'https://huggingface.co/models', make sure you don't have a local directory with the same name. "
						    F'Otherwise, make sure \'{pretrained_model_name_or_path}\' is the correct path to a directory '
						    F'containing a file named {weights_name}'				)
