

from typing import TYPE_CHECKING

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


_a:    Optional[Any] 							=			{
    """configuration_distilbert""": [
        """DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP""",
        """DistilBertConfig""",
        """DistilBertOnnxConfig""",
    ],
    """tokenization_distilbert""": ["""DistilBertTokenizer"""],
}

try:
				if not is_tokenizers_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_a:    Union[str, Any] 							=			["""DistilBertTokenizerFast"""]

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_a:    int 							=			[
				    """DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST""",
				    """DistilBertForMaskedLM""",
				    """DistilBertForMultipleChoice""",
				    """DistilBertForQuestionAnswering""",
				    """DistilBertForSequenceClassification""",
				    """DistilBertForTokenClassification""",
				    """DistilBertModel""",
				    """DistilBertPreTrainedModel""",
				]

try:
				if not is_tf_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_a:    Optional[Any] 							=			[
				    """TF_DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST""",
				    """TFDistilBertForMaskedLM""",
				    """TFDistilBertForMultipleChoice""",
				    """TFDistilBertForQuestionAnswering""",
				    """TFDistilBertForSequenceClassification""",
				    """TFDistilBertForTokenClassification""",
				    """TFDistilBertMainLayer""",
				    """TFDistilBertModel""",
				    """TFDistilBertPreTrainedModel""",
				]

try:
				if not is_flax_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_a:    Optional[int] 							=			[
				    """FlaxDistilBertForMaskedLM""",
				    """FlaxDistilBertForMultipleChoice""",
				    """FlaxDistilBertForQuestionAnswering""",
				    """FlaxDistilBertForSequenceClassification""",
				    """FlaxDistilBertForTokenClassification""",
				    """FlaxDistilBertModel""",
				    """FlaxDistilBertPreTrainedModel""",
				]


if TYPE_CHECKING:
				from .configuration_distilbert import (
				    DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP,
				    DistilBertConfig,
				    DistilBertOnnxConfig,
				)
				from .tokenization_distilbert import DistilBertTokenizer

				try:
								if not is_tokenizers_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .tokenization_distilbert_fast import DistilBertTokenizerFast

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_distilbert import (
								    DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST,
								    DistilBertForMaskedLM,
								    DistilBertForMultipleChoice,
								    DistilBertForQuestionAnswering,
								    DistilBertForSequenceClassification,
								    DistilBertForTokenClassification,
								    DistilBertModel,
								    DistilBertPreTrainedModel,
								)

				try:
								if not is_tf_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_tf_distilbert import (
								    TF_DISTILBERT_PRETRAINED_MODEL_ARCHIVE_LIST,
								    TFDistilBertForMaskedLM,
								    TFDistilBertForMultipleChoice,
								    TFDistilBertForQuestionAnswering,
								    TFDistilBertForSequenceClassification,
								    TFDistilBertForTokenClassification,
								    TFDistilBertMainLayer,
								    TFDistilBertModel,
								    TFDistilBertPreTrainedModel,
								)

				try:
								if not is_flax_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_flax_distilbert import (
								    FlaxDistilBertForMaskedLM,
								    FlaxDistilBertForMultipleChoice,
								    FlaxDistilBertForQuestionAnswering,
								    FlaxDistilBertForSequenceClassification,
								    FlaxDistilBertForTokenClassification,
								    FlaxDistilBertModel,
								    FlaxDistilBertPreTrainedModel,
								)

else:
				import sys

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


import torch

from diffusers import KDPMaDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest

class 						__UpperCamelCase    (					lowercase						):
	SCREAMING_SNAKE_CASE__    				=     (KDPMaDiscreteScheduler,)
	SCREAMING_SNAKE_CASE__    				=     10




	def       __A					(		self	:						Union[str, Any]		,	**lowerCAmelCase	:						Optional[Any]							):


		'''simple docstring'''







		UpperCAmelCase_       				=			{
		    "num_train_timesteps": 1_100,
		    "beta_start": 0.0_001,
		    "beta_end": 0.02,
		    "beta_schedule": "linear",
		}

		config.update(**lowerCAmelCase							)
		return config




	def       __A					(		self	:						List[Any]							):


		'''simple docstring'''







		for timesteps in [10, 50, 100, 1_000]:
			self.check_over_configs(num_train_timesteps=lowerCAmelCase							)




	def       __A					(		self	:						Optional[Any]							):


		'''simple docstring'''







		for beta_start, beta_end in zip([0.00_001, 0.0_001, 0.001]		,	[0.0_002, 0.002, 0.02]							):
			self.check_over_configs(beta_start=lowerCAmelCase		,	beta_end=lowerCAmelCase							)




	def       __A					(		self	:						List[str]							):


		'''simple docstring'''







		for schedule in ["linear", "scaled_linear"]:
			self.check_over_configs(beta_schedule=lowerCAmelCase							)




	def       __A					(		self	:						List[str]							):


		'''simple docstring'''







		for prediction_type in ["epsilon", "v_prediction"]:
			self.check_over_configs(prediction_type=lowerCAmelCase							)




	def       __A					(		self	:						List[Any]							):


		'''simple docstring'''







		UpperCAmelCase_       				=			self.scheduler_classes[0]
		UpperCAmelCase_       				=			self.get_scheduler_config(prediction_type="v_prediction"							)
		UpperCAmelCase_       				=			scheduler_class(**lowerCAmelCase							)

		scheduler.set_timesteps(self.num_inference_steps							)

		UpperCAmelCase_       				=			self.dummy_model()
		UpperCAmelCase_       				=			self.dummy_sample_deter * scheduler.init_noise_sigma
		UpperCAmelCase_       				=			sample.to(lowerCAmelCase							)

		for i, t in enumerate(scheduler.timesteps							):
			UpperCAmelCase_       				=			scheduler.scale_model_input(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			model(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			scheduler.step(lowerCAmelCase		,	lowerCAmelCase		,	lowerCAmelCase							)
			UpperCAmelCase_       				=			output.prev_sample

		UpperCAmelCase_       				=			torch.sum(torch.abs(lowerCAmelCase							)							)
		UpperCAmelCase_       				=			torch.mean(torch.abs(lowerCAmelCase							)							)

		if torch_device in ["cpu", "mps"]:
			assert abs(result_sum.item() - 4.6_934e-07							) < 1e-2
			assert abs(result_mean.item() - 6.1_112e-10							) < 1e-3
		else:
			# CUDA
			assert abs(result_sum.item() - 4.693_428_650_170_972e-07							) < 1e-2
			assert abs(result_mean.item() - 0.0_002							) < 1e-3




	def       __A					(		self	:						int							):


		'''simple docstring'''







		if torch_device == "mps":
			return
		UpperCAmelCase_       				=			self.scheduler_classes[0]
		UpperCAmelCase_       				=			self.get_scheduler_config()
		UpperCAmelCase_       				=			scheduler_class(**lowerCAmelCase							)

		scheduler.set_timesteps(self.num_inference_steps							)

		UpperCAmelCase_       				=			self.dummy_model()
		UpperCAmelCase_       				=			self.dummy_sample_deter * scheduler.init_noise_sigma
		UpperCAmelCase_       				=			sample.to(lowerCAmelCase							)

		for i, t in enumerate(scheduler.timesteps							):
			UpperCAmelCase_       				=			scheduler.scale_model_input(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			model(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			scheduler.step(lowerCAmelCase		,	lowerCAmelCase		,	lowerCAmelCase							)
			UpperCAmelCase_       				=			output.prev_sample

		UpperCAmelCase_       				=			torch.sum(torch.abs(lowerCAmelCase							)							)
		UpperCAmelCase_       				=			torch.mean(torch.abs(lowerCAmelCase							)							)

		if torch_device in ["cpu", "mps"]:
			assert abs(result_sum.item() - 20.4_125							) < 1e-2
			assert abs(result_mean.item() - 0.0_266							) < 1e-3
		else:
			# CUDA
			assert abs(result_sum.item() - 20.4_125							) < 1e-2
			assert abs(result_mean.item() - 0.0_266							) < 1e-3




	def       __A					(		self	:						Dict							):


		'''simple docstring'''







		if torch_device == "mps":
			return
		UpperCAmelCase_       				=			self.scheduler_classes[0]
		UpperCAmelCase_       				=			self.get_scheduler_config()
		UpperCAmelCase_       				=			scheduler_class(**lowerCAmelCase							)

		scheduler.set_timesteps(self.num_inference_steps		,	device=lowerCAmelCase							)

		UpperCAmelCase_       				=			self.dummy_model()
		UpperCAmelCase_       				=			self.dummy_sample_deter.to(lowerCAmelCase							) * scheduler.init_noise_sigma

		for t in scheduler.timesteps:
			UpperCAmelCase_       				=			scheduler.scale_model_input(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			model(lowerCAmelCase		,	lowerCAmelCase							)

			UpperCAmelCase_       				=			scheduler.step(lowerCAmelCase		,	lowerCAmelCase		,	lowerCAmelCase							)
			UpperCAmelCase_       				=			output.prev_sample

		UpperCAmelCase_       				=			torch.sum(torch.abs(lowerCAmelCase							)							)
		UpperCAmelCase_       				=			torch.mean(torch.abs(lowerCAmelCase							)							)

		if str(lowerCAmelCase							).startswith("cpu"							):
			# The following sum varies between 148 and 156 on mps. Why?
			assert abs(result_sum.item() - 20.4_125							) < 1e-2
			assert abs(result_mean.item() - 0.0_266							) < 1e-3
		else:
			# CUDA
			assert abs(result_sum.item() - 20.4_125							) < 1e-2
			assert abs(result_mean.item() - 0.0_266							) < 1e-3