




'''simple docstring'''



from jiwer import compute_measures

import datasets


UpperCamelCase_    	=				"\\n@inproceedings{inproceedings,\n    author = {Morris, Andrew and Maier, Viktoria and Green, Phil},\n    year = {2004},\n    month = {01},\n    pages = {},\n    title = {From WER and RIL to MER and WIL: improved evaluation measures for connected speech recognition.}\n}\n"

UpperCamelCase_    	=				"\\nWord error rate (WER) is a common metric of the performance of an automatic speech recognition system.\n\nThe general difficulty of measuring performance lies in the fact that the recognized word sequence can have a different length from the reference word sequence (supposedly the correct one). The WER is derived from the Levenshtein distance, working at the word level instead of the phoneme level. The WER is a valuable tool for comparing different systems as well as for evaluating improvements within one system. This kind of measurement, however, provides no details on the nature of translation errors and further work is therefore required to identify the main source(s) of error and to focus any research effort.\n\nThis problem is solved by first aligning the recognized word sequence with the reference (spoken) word sequence using dynamic string alignment. Examination of this issue is seen through a theory called the power law that states the correlation between perplexity and word error rate.\n\nWord error rate can then be computed as:\n\nWER = (S + D + I) / N = (S + D + I) / (S + D + C)\n\nwhere\n\nS is the number of substitutions,\nD is the number of deletions,\nI is the number of insertions,\nC is the number of correct words,\nN is the number of words in the reference (N=S+D+C).\n\nThis value indicates the average number of errors per reference word. The lower the value, the better the\nperformance of the ASR system with a WER of 0 being a perfect score.\n"

UpperCamelCase_    	=				"\nCompute WER score of transcribed segments against references.\n\nArgs:\n    references: List of references for each speech input.\n    predictions: List of transcriptions to score.\n    concatenate_texts (bool, default=False): Whether to concatenate all input texts or compute WER iteratively.\n\nReturns:\n    (float): the word error rate\n\nExamples:\n\n    >>> predictions = [\"this is the prediction\", \"there is an other sample\"]\n    >>> references = [\"this is the reference\", \"there is another one\"]\n    >>> wer = datasets.load_metric(\"wer\")\n    >>> wer_score = wer.compute(predictions=predictions, references=references)\n    >>> print(wer_score)\n    0.5\n"






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





       '''simple docstring'''






       def        UpperCamelCase_							(      self  ):







             '''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'  ),
                     }  ),							codebase_urls=['https://github.com/jitsi/jiwer/'],							reference_urls=[
                     'https://en.wikipedia.org/wiki/Word_error_rate',
                 ],							)







       def        UpperCamelCase_							(      self,							A=None,							A=None,							A=False  ):







             '''simple docstring'''







             if concatenate_texts:
                   return compute_measures(A,							A  )["wer"]
             else:
                   SCREAMING_SNAKE_CASE   :      Dict    					=						0
                   SCREAMING_SNAKE_CASE   :      List[Any]    					=						0
                   for prediction, reference in zip(A,							A  ):
                         SCREAMING_SNAKE_CASE   :      Any    					=						compute_measures(A,							A  )
                         incorrect += measures["substitutions"] + measures["deletions"] + measures["insertions"]
                         total += measures["substitutions"] + measures["deletions"] + measures["hits"]
                   return incorrect / total







"""simple docstring"""







import inspect
import unittest

from transformers import ViTMSNConfig
from transformers.testing_utils import require_torch, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
	import torch
	from torch import nn

	from transformers import ViTMSNForImageClassification, ViTMSNModel
	from transformers.models.vit_msn.modeling_vit_msn import VIT_MSN_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
	from PIL import Image

	from transformers import ViTImageProcessor







class 					A_:







			"""simple docstring"""



			def __init__(	self				,   A				,   A=13				,   A=30				,   A=2				,   A=3				,   A=True				,   A=True				,   A=32				,   A=5				,   A=4				,   A=37				,   A="gelu"				,   A=0.1				,   A=0.1				,   A=10				,   A=0.0_2				,   A=None				,   ):
						_lowerCamelCase					:					Dict	       =    parent
						_lowerCamelCase					:					List[Any]	       =    batch_size
						_lowerCamelCase					:					int	       =    image_size
						_lowerCamelCase					:					List[Any]	       =    patch_size
						_lowerCamelCase					:					Optional[int]	       =    num_channels
						_lowerCamelCase					:					Union[str, Any]	       =    is_training
						_lowerCamelCase					:					Optional[Any]	       =    use_labels
						_lowerCamelCase					:					Dict	       =    hidden_size
						_lowerCamelCase					:					Tuple	       =    num_hidden_layers
						_lowerCamelCase					:					List[Any]	       =    num_attention_heads
						_lowerCamelCase					:					str	       =    intermediate_size
						_lowerCamelCase					:					str	       =    hidden_act
						_lowerCamelCase					:					str	       =    hidden_dropout_prob
						_lowerCamelCase					:					int	       =    attention_probs_dropout_prob
						_lowerCamelCase					:					Any	       =    type_sequence_label_size
						_lowerCamelCase					:					int	       =    initializer_range
						_lowerCamelCase					:					Union[str, Any]	       =    scope

						# in ViT MSN, the seq length equals the number of patches + 1 (we add 1 for the [CLS] token)
						_lowerCamelCase					:					Dict	       =    (image_size // patch_size) ** 2
						_lowerCamelCase					:					Any	       =    num_patches + 1
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase					:					Any	       =    floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]							)

						_lowerCamelCase					:					Union[str, Any]	       =    None
						if self.use_labels:
									_lowerCamelCase					:					List[str]	       =    ids_tensor([self.batch_size]				,   self.type_sequence_label_size							)

						_lowerCamelCase					:					Dict	       =    self.get_config()

						return config, pixel_values, labels
			def    _lowerCAmelCase		(	self							):
						return ViTMSNConfig(
						    image_size=self.image_size				,   patch_size=self.patch_size				,   num_channels=self.num_channels				,   hidden_size=self.hidden_size				,   num_hidden_layers=self.num_hidden_layers				,   num_attention_heads=self.num_attention_heads				,   intermediate_size=self.intermediate_size				,   hidden_act=self.hidden_act				,   hidden_dropout_prob=self.hidden_dropout_prob				,   attention_probs_dropout_prob=self.attention_probs_dropout_prob				,   initializer_range=self.initializer_range				,   )
			def    _lowerCAmelCase		(	self				,   A				,   A				,   A							):
						_lowerCamelCase					:					int	       =    ViTMSNModel(config=A							)
						model.to(A							)
						model.eval()
						_lowerCamelCase					:					List[Any]	       =    model(A							)
						self.parent.assertEqual(result.last_hidden_state.shape				,   (self.batch_size, self.seq_length, self.hidden_size)							)
			def    _lowerCAmelCase		(	self				,   A				,   A				,   A							):
						_lowerCamelCase					:					List[Any]	       =    self.type_sequence_label_size
						_lowerCamelCase					:					List[str]	       =    ViTMSNForImageClassification(A							)
						model.to(A							)
						model.eval()
						_lowerCamelCase					:					Optional[Any]	       =    model(A				,   labels=A							)
						print('Pixel and labels shape: {pixel_values.shape}, {labels.shape}'							)
						print('Labels: {labels}'							)
						self.parent.assertEqual(result.logits.shape				,   (self.batch_size, self.type_sequence_label_size)							)

						# test greyscale images
						_lowerCamelCase					:					Optional[Any]	       =    1
						_lowerCamelCase					:					List[Any]	       =    ViTMSNForImageClassification(A							)
						model.to(A							)
						model.eval()

						_lowerCamelCase					:					Any	       =    floats_tensor([self.batch_size, 1, self.image_size, self.image_size]							)
						_lowerCamelCase					:					Union[str, Any]	       =    model(A							)
						self.parent.assertEqual(result.logits.shape				,   (self.batch_size, self.type_sequence_label_size)							)

			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase					:					int	       =    self.prepare_config_and_inputs()
						_lowerCamelCase       ,							_lowerCamelCase       ,							_lowerCamelCase					:					Tuple	       =    config_and_inputs
						_lowerCamelCase					:					List[str]	       =    {'pixel_values': pixel_values}
						return config, inputs_dict







@require_torch
class 					A_(SCREAMING_SNAKE_CASE_   ,   SCREAMING_SNAKE_CASE_   ,   unittest.TestCase      ):







			"""simple docstring"""



			a_       :			Union[str, Any]												=			(ViTMSNModel, ViTMSNForImageClassification) if is_torch_available() else ()
			a_       :			Union[str, Any]												=			(
			    {"""feature-extraction""": ViTMSNModel, """image-classification""": ViTMSNForImageClassification}
			    if is_torch_available()
			    else {}
			)

			a_       :			Tuple												=			False
			a_       :			Union[str, Any]												=			False
			a_       :			Tuple												=			False
			a_       :			List[str]												=			False
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase					:					List[str]	       =    ViTMSNModelTester(self							)
						_lowerCamelCase					:					List[str]	       =    ConfigTester(self				,   config_class=A				,   has_text_modality=A				,   hidden_size=37							)
			def    _lowerCAmelCase		(	self							):
						self.config_tester.run_common_tests()
			@unittest.skip(reason='ViTMSN does not use inputs_embeds'							)
			def    _lowerCAmelCase		(	self							):
						pass
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase       ,							_lowerCamelCase					:					Optional[Any]	       =    self.model_tester.prepare_config_and_inputs_for_common()

						for model_class in self.all_model_classes:
									_lowerCamelCase					:					List[str]	       =    model_class(A							)
									self.assertIsInstance(model.get_input_embeddings()				,   (nn.Module)							)
									_lowerCamelCase					:					Dict	       =    model.get_output_embeddings()
									self.assertTrue(x is None or isinstance(A				,   nn.Linear							)							)
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase       ,							_lowerCamelCase					:					List[str]	       =    self.model_tester.prepare_config_and_inputs_for_common()

						for model_class in self.all_model_classes:
									_lowerCamelCase					:					int	       =    model_class(A							)
									_lowerCamelCase					:					Tuple	       =    inspect.signature(model.forward							)
									# signature.parameters is an OrderedDict => so arg_names order is deterministic
									_lowerCamelCase					:					Optional[int]	       =    [*signature.parameters.keys()]

									_lowerCamelCase					:					Union[str, Any]	       =    ['pixel_values']
									self.assertListEqual(arg_names[:1]				,   A							)
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase					:					List[Any]	       =    self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_model(*A							)
			def    _lowerCAmelCase		(	self							):
						_lowerCamelCase					:					List[Any]	       =    self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_for_image_classification(*A							)

			@slow
			def    _lowerCAmelCase		(	self							):
						for model_name in VIT_MSN_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
									_lowerCamelCase					:					Any	       =    ViTMSNModel.from_pretrained(A							)
									self.assertIsNotNone(A							)






def     UpperCAmelCase_					(				):




			'''simple docstring'''



			_lowerCamelCase					:					Optional[Any]	       =    Image.open('./tests/fixtures/tests_samples/COCO/000000039769.png'						)
			return image







@require_torch
@require_vision
class 					A_(unittest.TestCase      ):







			"""simple docstring"""



			@cached_property
			def    _lowerCAmelCase		(	self							):
						return ViTImageProcessor.from_pretrained('facebook/vit-msn-small'							) if is_vision_available() else None

			@slow
			def    _lowerCAmelCase		(	self							):
						torch.manual_seed(2							)
						_lowerCamelCase					:					Tuple	       =    ViTMSNForImageClassification.from_pretrained('facebook/vit-msn-small'							).to(A							)

						_lowerCamelCase					:					int	       =    self.default_image_processor
						_lowerCamelCase					:					Optional[int]	       =    prepare_img()
						_lowerCamelCase					:					int	       =    image_processor(images=A				,   return_tensors='pt'							).to(A							)

						# forward pass
						with torch.no_grad():
									_lowerCamelCase					:					str	       =    model(**A							)

						# verify the logits
						_lowerCamelCase					:					Optional[Any]	       =    torch.Size((1, 1000)							)
						self.assertEqual(outputs.logits.shape				,   A							)

						_lowerCamelCase					:					Any	       =    torch.tensor([-0.0_8_0_3, -0.4_4_5_4, -0.2_3_7_5]							).to(A							)

						self.assertTrue(torch.allclose(outputs.logits[0, :3]				,   A				,   atol=1E-4							)							)





