import sys
import tempfile
import unittest
import unittest.mock as mock
from pathlib import Path

from huggingface_hub import HfFolder, delete_repo
from requests.exceptions import HTTPError

from transformers import AutoFeatureExtractor, WavaVecaFeatureExtractor
from transformers.testing_utils import TOKEN, USER, get_tests_dir, is_staging_test


sys.path.append(str(Path(__file__).parent.parent / "utils"))

from test_module.custom_feature_extraction import CustomFeatureExtractor  # noqa E402


A   :     Tuple       =				get_tests_dir("fixtures")


class      lowerCamelCase    (unittest.TestCase    ):
  """simple docstring"""







  def       __A   (							self       :				Union[str, Any]      )     ->		Union[str, Any]:
        # A mock response for an HTTP head request to emulate server down
        SCREAMING_SNAKE_CASE_      =     mock.Mock()
        SCREAMING_SNAKE_CASE_      =     500
        SCREAMING_SNAKE_CASE_      =     {}
        SCREAMING_SNAKE_CASE_      =     HTTPError
        SCREAMING_SNAKE_CASE_      =     {}

        # Download this model to make sure it's in the cache.
        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained("hf-internal-testing/tiny-random-wav2vec2"      )
        # Under the mock environment we get a 500 error when trying to reach the model.
        with mock.patch("requests.Session.request"     ,   return_value=__magic_name__      ) as mock_head:
              SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained("hf-internal-testing/tiny-random-wav2vec2"      )
              # This check we did call the fake head request
              mock_head.assert_called()







  def       __A   (							self       :				Optional[int]      )     ->		Tuple:
        # This test is for deprecated behavior and can be removed in v5
        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained(
            "https://huggingface.co/hf-internal-testing/tiny-random-wav2vec2/resolve/main/preprocessor_config.json"      )



@is_staging_test
class      lowerCamelCase    (unittest.TestCase    ):
  """simple docstring"""







  @classmethod
  def       __A   (							cls       :				Any      )     ->		Union[str, Any]:
        SCREAMING_SNAKE_CASE_      =     TOKEN
        HfFolder.save_token(__magic_name__      )







  @classmethod
  def       __A   (							cls       :				int      )     ->		Optional[Any]:
        try:
              delete_repo(token=cls._token     ,   repo_id="test-feature-extractor"      )
        except HTTPError:
              pass

        try:
              delete_repo(token=cls._token     ,   repo_id="valid_org/test-feature-extractor-org"      )
        except HTTPError:
              pass

        try:
              delete_repo(token=cls._token     ,   repo_id="test-dynamic-feature-extractor"      )
        except HTTPError:
              pass







  def       __A   (							self       :				str      )     ->		List[Any]:
        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained(__magic_name__      )
        feature_extractor.push_to_hub("test-feature-extractor"     ,   use_auth_token=self._token      )

        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained(F'''{USER}/test-feature-extractor'''      )
        for k, v in feature_extractor.__dict__.items():
              self.assertEqual(__magic_name__     ,   getattr(__magic_name__     ,   __magic_name__      )      )

        # Reset repo
        delete_repo(token=self._token     ,   repo_id="test-feature-extractor"      )

        # Push to hub via save_pretrained
        with tempfile.TemporaryDirectory() as tmp_dir:
              feature_extractor.save_pretrained(
                  __magic_name__     ,   repo_id="test-feature-extractor"     ,   push_to_hub=__magic_name__     ,   use_auth_token=self._token      )

        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained(F'''{USER}/test-feature-extractor'''      )
        for k, v in feature_extractor.__dict__.items():
              self.assertEqual(__magic_name__     ,   getattr(__magic_name__     ,   __magic_name__      )      )







  def       __A   (							self       :				Dict      )     ->		str:
        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained(__magic_name__      )
        feature_extractor.push_to_hub("valid_org/test-feature-extractor"     ,   use_auth_token=self._token      )

        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained("valid_org/test-feature-extractor"      )
        for k, v in feature_extractor.__dict__.items():
              self.assertEqual(__magic_name__     ,   getattr(__magic_name__     ,   __magic_name__      )      )

        # Reset repo
        delete_repo(token=self._token     ,   repo_id="valid_org/test-feature-extractor"      )

        # Push to hub via save_pretrained
        with tempfile.TemporaryDirectory() as tmp_dir:
              feature_extractor.save_pretrained(
                  __magic_name__     ,   repo_id="valid_org/test-feature-extractor-org"     ,   push_to_hub=__magic_name__     ,   use_auth_token=self._token      )

        SCREAMING_SNAKE_CASE_      =     WavaVecaFeatureExtractor.from_pretrained("valid_org/test-feature-extractor-org"      )
        for k, v in feature_extractor.__dict__.items():
              self.assertEqual(__magic_name__     ,   getattr(__magic_name__     ,   __magic_name__      )      )







  def       __A   (							self       :				List[Any]      )     ->		Dict:
        CustomFeatureExtractor.register_for_auto_class()
        SCREAMING_SNAKE_CASE_      =     CustomFeatureExtractor.from_pretrained(__magic_name__      )

        feature_extractor.push_to_hub("test-dynamic-feature-extractor"     ,   use_auth_token=self._token      )

        # This has added the proper auto_map field to the config
        self.assertDictEqual(
            feature_extractor.auto_map     ,   {"AutoFeatureExtractor": "custom_feature_extraction.CustomFeatureExtractor"}     ,   )

        SCREAMING_SNAKE_CASE_      =     AutoFeatureExtractor.from_pretrained(
            F'''{USER}/test-dynamic-feature-extractor'''     ,   trust_remote_code=__magic_name__      )
        # Can't make an isinstance check because the new_feature_extractor is from the CustomFeatureExtractor class of a dynamic module
        self.assertEqual(new_feature_extractor.__class__.__name__     ,   "CustomFeatureExtractor"      )



import warnings

from transformers import AutoTokenizer
from transformers.utils import is_torch_available
from transformers.utils.generic import ExplicitEnum

from ...processing_utils import ProcessorMixin


if is_torch_available():
      import torch


class      lowerCamelCase    (SCREAMING_SNAKE_CASE__    ):
  """simple docstring"""







  lowerCamelCase__   =  '''char'''
  lowerCamelCase__   =  '''bpe'''
  lowerCamelCase__   =  '''wp'''



A   :     Tuple       =				(DecodeType.CHARACTER, DecodeType.BPE, DecodeType.WORDPIECE)


class      lowerCamelCase    (SCREAMING_SNAKE_CASE__    ):
  """simple docstring"""







  lowerCamelCase__   =  ['''image_processor''', '''char_tokenizer''']
  lowerCamelCase__   =  '''ViTImageProcessor'''
  lowerCamelCase__   =  '''MgpstrTokenizer'''







  def __init__(							self       :				Optional[Any]     ,   __magic_name__       :				Tuple=None     ,   __magic_name__       :				int=None     ,   **__magic_name__       :				Optional[Any]      )     ->		str:
        SCREAMING_SNAKE_CASE_      =     None
        if "feature_extractor" in kwargs:
              warnings.warn(
                  "The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`"
                  " instead."     ,   __magic_name__     ,   )
              SCREAMING_SNAKE_CASE_      =     kwargs.pop("feature_extractor"      )

        SCREAMING_SNAKE_CASE_      =     image_processor if image_processor is not None else feature_extractor
        if image_processor is None:
              raise ValueError("You need to specify an `image_processor`."      )
        if tokenizer is None:
              raise ValueError("You need to specify a `tokenizer`."      )

        SCREAMING_SNAKE_CASE_      =     tokenizer
        SCREAMING_SNAKE_CASE_      =     AutoTokenizer.from_pretrained("gpt2"      )
        SCREAMING_SNAKE_CASE_      =     AutoTokenizer.from_pretrained("bert-base-uncased"      )

        super().__init__(__magic_name__     ,   __magic_name__      )







  def __call__(							self       :				Dict     ,   __magic_name__       :				Union[str, Any]=None     ,   __magic_name__       :				Union[str, Any]=None     ,   __magic_name__       :				Dict=None     ,   **__magic_name__       :				Tuple      )     ->		int:
        if images is None and text is None:
              raise ValueError("You need to specify either an `images` or `text` input to process."      )

        if images is not None:
              SCREAMING_SNAKE_CASE_      =     self.image_processor(__magic_name__     ,   return_tensors=__magic_name__     ,   **__magic_name__      )
        if text is not None:
              SCREAMING_SNAKE_CASE_      =     self.char_tokenizer(__magic_name__     ,   return_tensors=__magic_name__     ,   **__magic_name__      )

        if text is None:
              return inputs
        elif images is None:
              return encodings
        else:
              SCREAMING_SNAKE_CASE_      =     encodings["input_ids"]
              return inputs







  def       __A   (							self       :				Tuple     ,   __magic_name__       :				int      )     ->		Any:
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     sequences
        SCREAMING_SNAKE_CASE_      =     char_preds.size(0      )

        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "char"      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "bpe"      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "wp"      )

        SCREAMING_SNAKE_CASE_      =     []
        SCREAMING_SNAKE_CASE_      =     []
        for i in range(__magic_name__      ):
              SCREAMING_SNAKE_CASE_      =     [char_scores[i], bpe_scores[i], wp_scores[i]]
              SCREAMING_SNAKE_CASE_      =     [char_strs[i], bpe_strs[i], wp_strs[i]]
              SCREAMING_SNAKE_CASE_      =     scores.index(max(__magic_name__      )      )
              final_strs.append(strs[max_score_index]      )
              final_scores.append(scores[max_score_index]      )

        SCREAMING_SNAKE_CASE_      =     {}
        SCREAMING_SNAKE_CASE_      =     final_strs
        SCREAMING_SNAKE_CASE_      =     final_scores
        SCREAMING_SNAKE_CASE_      =     char_strs
        SCREAMING_SNAKE_CASE_      =     bpe_strs
        SCREAMING_SNAKE_CASE_      =     wp_strs
        return out







  def       __A   (							self       :				int     ,   __magic_name__       :				List[Any]     ,   __magic_name__       :				str      )     ->		Any:
        if format == DecodeType.CHARACTER:
              SCREAMING_SNAKE_CASE_      =     self.char_decode
              SCREAMING_SNAKE_CASE_      =     1
              SCREAMING_SNAKE_CASE_      =     "[s]"
        elif format == DecodeType.BPE:
              SCREAMING_SNAKE_CASE_      =     self.bpe_decode
              SCREAMING_SNAKE_CASE_      =     2
              SCREAMING_SNAKE_CASE_      =     "#"
        elif format == DecodeType.WORDPIECE:
              SCREAMING_SNAKE_CASE_      =     self.wp_decode
              SCREAMING_SNAKE_CASE_      =     102
              SCREAMING_SNAKE_CASE_      =     "[SEP]"
        else:
              raise ValueError(F'''Format {format} is not supported.'''      )

        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     [], []
        SCREAMING_SNAKE_CASE_      =     pred_logits.size(0      )
        SCREAMING_SNAKE_CASE_      =     pred_logits.size(1      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     pred_logits.topk(1     ,   dim=-1     ,   largest=__magic_name__     ,   sorted=__magic_name__      )
        SCREAMING_SNAKE_CASE_      =     preds_index.view(-1     ,   __magic_name__      )[:, 1:]
        SCREAMING_SNAKE_CASE_      =     decoder(__magic_name__      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     torch.nn.functional.softmax(__magic_name__     ,   dim=2      ).max(dim=2      )
        SCREAMING_SNAKE_CASE_      =     preds_max_prob[:, 1:]

        for index in range(__magic_name__      ):
              SCREAMING_SNAKE_CASE_      =     preds_str[index].find(__magic_name__      )
              SCREAMING_SNAKE_CASE_      =     preds_str[index][:pred_eos]
              SCREAMING_SNAKE_CASE_      =     preds_index[index].cpu().tolist()
              SCREAMING_SNAKE_CASE_      =     pred_index.index(__magic_name__      ) if eos_token in pred_index else -1
              SCREAMING_SNAKE_CASE_      =     preds_max_prob[index][: pred_eos_index + 1]
              SCREAMING_SNAKE_CASE_      =     pred_max_prob.cumprod(dim=0      )[-1] if pred_max_prob.nelement() != 0 else 0.0
              dec_strs.append(__magic_name__      )
              conf_scores.append(__magic_name__      )

        return dec_strs, conf_scores







  def       __A   (							self       :				Any     ,   __magic_name__       :				Dict      )     ->		List[str]:
        SCREAMING_SNAKE_CASE_      =     [seq.replace(" "     ,   ""      ) for seq in self.char_tokenizer.batch_decode(__magic_name__      )]
        return decode_strs







  def       __A   (							self       :				Any     ,   __magic_name__       :				Union[str, Any]      )     ->		Tuple:
        return self.bpe_tokenizer.batch_decode(__magic_name__      )







  def       __A   (							self       :				str     ,   __magic_name__       :				Dict      )     ->		List[Any]:
        SCREAMING_SNAKE_CASE_      =     [seq.replace(" "     ,   ""      ) for seq in self.wp_tokenizer.batch_decode(__magic_name__      )]
        return decode_strs


