

import re
import string

import numpy as np

import datasets


_lowerCAmelCase			:						Optional[Any]  					=     '\nReturns the rate at which the input predicted strings exactly match their references, ignoring any strings input as part of the regexes_to_ignore list.\n'

_lowerCAmelCase			:						Tuple  					=     '\nArgs:\n    predictions: List of predicted texts.\n    references: List of reference texts.\n    regexes_to_ignore: List, defaults to None. Regex expressions of characters to\n        ignore when calculating the exact matches. Note: these regexes are removed\n        from the input data before the changes based on the options below (e.g. ignore_case,\n        ignore_punctuation, ignore_numbers) are applied.\n    ignore_case: Boolean, defaults to False. If true, turns everything\n        to lowercase so that capitalization differences are ignored.\n    ignore_punctuation: Boolean, defaults to False. If true, removes all punctuation before\n        comparing predictions and references.\n    ignore_numbers: Boolean, defaults to False. If true, removes all punctuation before\n        comparing predictions and references.\nReturns:\n    exact_match: Dictionary containing exact_match rate. Possible values are between 0.0 and 100.0, inclusive.\nExamples:\n    >>> exact_match = datasets.load_metric("exact_match")\n    >>> refs = ["the cat", "theater", "YELLING", "agent007"]\n    >>> preds = ["cat?", "theater", "yelling", "agent"]\n    >>> results = exact_match.compute(references=refs, predictions=preds)\n    >>> print(round(results["exact_match"], 1))\n    25.0\n\n    >>> exact_match = datasets.load_metric("exact_match")\n    >>> refs = ["the cat", "theater", "YELLING", "agent007"]\n    >>> preds = ["cat?", "theater", "yelling", "agent"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=["the ", "yell"], ignore_case=True, ignore_punctuation=True)\n    >>> print(round(results["exact_match"], 1))\n    50.0\n\n\n    >>> exact_match = datasets.load_metric("exact_match")\n    >>> refs = ["the cat", "theater", "YELLING", "agent007"]\n    >>> preds = ["cat?", "theater", "yelling", "agent"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=["the ", "yell", "YELL"], ignore_case=True, ignore_punctuation=True)\n    >>> print(round(results["exact_match"], 1))\n    75.0\n\n    >>> exact_match = datasets.load_metric("exact_match")\n    >>> refs = ["the cat", "theater", "YELLING", "agent007"]\n    >>> preds = ["cat?", "theater", "yelling", "agent"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=["the ", "yell", "YELL"], ignore_case=True, ignore_punctuation=True, ignore_numbers=True)\n    >>> print(round(results["exact_match"], 1))\n    100.0\n\n    >>> exact_match = datasets.load_metric("exact_match")\n    >>> refs = ["The cat sat on the mat.", "Theaters are great.", "It\'s like comparing oranges and apples."]\n    >>> preds = ["The cat sat on the mat?", "Theaters are great.", "It\'s like comparing apples and oranges."]\n    >>> results = exact_match.compute(references=refs, predictions=preds)\n    >>> print(round(results["exact_match"], 1))\n    33.3\n\n'

_lowerCAmelCase			:						Union[str, Any]  					=     '\n'


@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION ,					_KWARGS_DESCRIPTION					)
class      lowerCAmelCase					(     datasets.Metric					):


       '''simple docstring'''







       def 	lowerCamelCase__    (						self       :	Any  ) ->			List[str]:







        '''simple docstring'''

        return datasets.MetricInfo(
            description=_DESCRIPTION    ,						citation=_CITATION    ,						inputs_description=_KWARGS_DESCRIPTION    ,						features=datasets.Features(
                {
                    'predictions': datasets.Value('string'    ,						id='sequence'  ),
                    'references': datasets.Value('string'    ,						id='sequence'  ),
                }  )    ,						reference_urls=[]    ,						)





       def 	lowerCamelCase__    (						self       :	Any    ,						__snake_case       :	Dict    ,						__snake_case       :	List[str]    ,						__snake_case       :	Dict=None    ,						__snake_case       :	Union[str, Any]=False    ,						__snake_case       :	Optional[Any]=False    ,						__snake_case       :	Optional[Any]=False    ,						) ->			Dict:







        '''simple docstring'''

        if regexes_to_ignore is not None:
         for s in regexes_to_ignore:
          lowerCamelCase       =     np.array([re.sub(__UpperCamelCase    ,						''    ,						__UpperCamelCase  ) for x in predictions]  )
          lowerCamelCase       =     np.array([re.sub(__UpperCamelCase    ,						''    ,						__UpperCamelCase  ) for x in references]  )
        else:
         lowerCamelCase       =     np.asarray(__UpperCamelCase  )
         lowerCamelCase       =     np.asarray(__UpperCamelCase  )

        if ignore_case:
         lowerCamelCase       =     np.char.lower(__UpperCamelCase  )
         lowerCamelCase       =     np.char.lower(__UpperCamelCase  )

        if ignore_punctuation:
         lowerCamelCase       =     string.punctuation.maketrans(''    ,						''    ,						string.punctuation  )
         lowerCamelCase       =     np.char.translate(__UpperCamelCase    ,						table=__UpperCamelCase  )
         lowerCamelCase       =     np.char.translate(__UpperCamelCase    ,						table=__UpperCamelCase  )

        if ignore_numbers:
         lowerCamelCase       =     string.digits.maketrans(''    ,						''    ,						string.digits  )
         lowerCamelCase       =     np.char.translate(__UpperCamelCase    ,						table=__UpperCamelCase  )
         lowerCamelCase       =     np.char.translate(__UpperCamelCase    ,						table=__UpperCamelCase  )

        lowerCamelCase       =     predictions == references

        return {"exact_match": np.mean(__UpperCamelCase  ) * 100}






import torch

from diffusers import KDPMaDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest





class    __A(					UpperCAmelCase							):
					SCREAMING_SNAKE_CASE           =     (KDPMaDiscreteScheduler,)
					SCREAMING_SNAKE_CASE           =     1_0

					def  lowercase__   (						self       :  str ,       **__UpperCamelCase       :  Optional[int] ):
												lowerCamelCase_					=       {
												    """num_train_timesteps""": 1_1_0_0,
												    """beta_start""": 0.0001,
												    """beta_end""": 0.02,
												    """beta_schedule""": """linear""",
												}

												config.update(**__UpperCamelCase )
												return config

					def  lowercase__   (						self       :  Optional[Any] ):
												for timesteps in [1_0, 5_0, 1_0_0, 1_0_0_0]:
																			self.check_over_configs(num_train_timesteps=__UpperCamelCase )

					def  lowercase__   (						self       :  Dict ):
												for beta_start, beta_end in zip([0.00001, 0.0001, 0.001] ,       [0.0002, 0.002, 0.02] ):
																			self.check_over_configs(beta_start=__UpperCamelCase ,       beta_end=__UpperCamelCase )

					def  lowercase__   (						self       :  Union[str, Any] ):
												for schedule in ["linear", "scaled_linear"]:
																			self.check_over_configs(beta_schedule=__UpperCamelCase )

					def  lowercase__   (						self       :  List[str] ):
												for prediction_type in ["epsilon", "v_prediction"]:
																			self.check_over_configs(prediction_type=__UpperCamelCase )

					def  lowercase__   (						self       :  Optional[int] ):
												lowerCamelCase_					=       self.scheduler_classes[0]
												lowerCamelCase_					=       self.get_scheduler_config(prediction_type="""v_prediction""" )
												lowerCamelCase_					=       scheduler_class(**__UpperCamelCase )

												scheduler.set_timesteps(self.num_inference_steps )

												lowerCamelCase_					=       self.dummy_model()
												lowerCamelCase_					=       self.dummy_sample_deter * scheduler.init_noise_sigma
												lowerCamelCase_					=       sample.to(__UpperCamelCase )

												for i, t in enumerate(scheduler.timesteps ):
																			lowerCamelCase_					=       scheduler.scale_model_input(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       model(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       scheduler.step(__UpperCamelCase ,       __UpperCamelCase ,       __UpperCamelCase )
																			lowerCamelCase_					=       output.prev_sample

												lowerCamelCase_					=       torch.sum(torch.abs(__UpperCamelCase ) )
												lowerCamelCase_					=       torch.mean(torch.abs(__UpperCamelCase ) )

												if torch_device in ["cpu", "mps"]:
																			assert abs(result_sum.item() - 4.6934E-07 ) < 1E-2
																			assert abs(result_mean.item() - 6.1112E-10 ) < 1E-3
												else:
																			# CUDA
																			assert abs(result_sum.item() - 4.693_4286_5017_0972E-07 ) < 1E-2
																			assert abs(result_mean.item() - 0.0002 ) < 1E-3

					def  lowercase__   (						self       :  List[Any] ):
												if torch_device == "mps":
																			return
												lowerCamelCase_					=       self.scheduler_classes[0]
												lowerCamelCase_					=       self.get_scheduler_config()
												lowerCamelCase_					=       scheduler_class(**__UpperCamelCase )

												scheduler.set_timesteps(self.num_inference_steps )

												lowerCamelCase_					=       self.dummy_model()
												lowerCamelCase_					=       self.dummy_sample_deter * scheduler.init_noise_sigma
												lowerCamelCase_					=       sample.to(__UpperCamelCase )

												for i, t in enumerate(scheduler.timesteps ):
																			lowerCamelCase_					=       scheduler.scale_model_input(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       model(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       scheduler.step(__UpperCamelCase ,       __UpperCamelCase ,       __UpperCamelCase )
																			lowerCamelCase_					=       output.prev_sample

												lowerCamelCase_					=       torch.sum(torch.abs(__UpperCamelCase ) )
												lowerCamelCase_					=       torch.mean(torch.abs(__UpperCamelCase ) )

												if torch_device in ["cpu", "mps"]:
																			assert abs(result_sum.item() - 20.4125 ) < 1E-2
																			assert abs(result_mean.item() - 0.0266 ) < 1E-3
												else:
																			# CUDA
																			assert abs(result_sum.item() - 20.4125 ) < 1E-2
																			assert abs(result_mean.item() - 0.0266 ) < 1E-3



					def  lowercase__   (						self       :  Optional[int] ):
												if torch_device == "mps":
																			return
												lowerCamelCase_					=       self.scheduler_classes[0]
												lowerCamelCase_					=       self.get_scheduler_config()
												lowerCamelCase_					=       scheduler_class(**__UpperCamelCase )

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

												lowerCamelCase_					=       self.dummy_model()
												lowerCamelCase_					=       self.dummy_sample_deter.to(__UpperCamelCase ) * scheduler.init_noise_sigma

												for t in scheduler.timesteps:
																			lowerCamelCase_					=       scheduler.scale_model_input(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       model(__UpperCamelCase ,       __UpperCamelCase )

																			lowerCamelCase_					=       scheduler.step(__UpperCamelCase ,       __UpperCamelCase ,       __UpperCamelCase )
																			lowerCamelCase_					=       output.prev_sample

												lowerCamelCase_					=       torch.sum(torch.abs(__UpperCamelCase ) )
												lowerCamelCase_					=       torch.mean(torch.abs(__UpperCamelCase ) )

												if str(__UpperCamelCase ).startswith("""cpu""" ):
																			# The following sum varies between 148 and 156 on mps. Why?
																			assert abs(result_sum.item() - 20.4125 ) < 1E-2
																			assert abs(result_mean.item() - 0.0266 ) < 1E-3
												else:
																			# CUDA
																			assert abs(result_sum.item() - 20.4125 ) < 1E-2
																			assert abs(result_mean.item() - 0.0266 ) < 1E-3





