






import unittest

from transformers import (
    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    TextClassificationPipeline,
    pipeline,
)
from transformers.testing_utils import is_pipeline_test, nested_simplify, require_tf, require_torch, slow

from .test_pipelines_common import ANY


# These 2 model types require different inputs than those of the usual text models.
_a    :   Dict        =			{"""LayoutLMv2Config""", """LayoutLMv3Config"""}







@is_pipeline_test
class 	_UpperCAmelCase  (  unittest.TestCase		):




      """simple docstring"""



      A          =    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING
      A          =    TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING

      if model_mapping is not None:
            A          =    {config: model for config, model in model_mapping.items() if config.__name__ not in _TO_SKIP}
      if tf_model_mapping is not None:
            A          =    {
                config: model for config, model in tf_model_mapping.items() if config.__name__ not in _TO_SKIP
            }
      @require_torch
      def 			snake_case_      (   self		):



          '''simple docstring'''
          lowerCAmelCase__   :Dict      							=				pipeline(
              task="text-classification"    ,	model="hf-internal-testing/tiny-random-distilbert"    ,	framework="pt"		)

          lowerCAmelCase__   :List[Any]      							=				text_classifier("This is great !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}]		)

          lowerCAmelCase__   :List[str]      							=				text_classifier("This is great !"    ,	top_k=2		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}]		)

          lowerCAmelCase__   :int      							=				text_classifier(["This is great !", "This is bad"]    ,	top_k=2		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[
                  [{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}],
                  [{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}],
              ]    ,	)

          lowerCAmelCase__   :List[Any]      							=				text_classifier("This is great !"    ,	top_k=1		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}]		)

          # Legacy behavior
          lowerCAmelCase__   :List[str]      							=				text_classifier("This is great !"    ,	return_all_scores=_lowerCAmelCase		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}]		)

          lowerCAmelCase__   :Any      							=				text_classifier("This is great !"    ,	return_all_scores=_lowerCAmelCase		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[[{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}]]		)

          lowerCAmelCase__   :List[Any]      							=				text_classifier(["This is great !", "Something else"]    ,	return_all_scores=_lowerCAmelCase		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[
                  [{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}],
                  [{"label": "LABEL_0", "score": 0.504}, {"label": "LABEL_1", "score": 0.496}],
              ]    ,	)

          lowerCAmelCase__   :Dict      							=				text_classifier(["This is great !", "Something else"]    ,	return_all_scores=_lowerCAmelCase		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[
                  {"label": "LABEL_0", "score": 0.504},
                  {"label": "LABEL_0", "score": 0.504},
              ]    ,	)
      @require_torch
      def 			snake_case_      (   self		):



          '''simple docstring'''
          import torch

          lowerCAmelCase__   :str      							=				pipeline(
              task="text-classification"    ,	model="hf-internal-testing/tiny-random-distilbert"    ,	framework="pt"    ,	device=torch.device("cpu"		)    ,	)

          lowerCAmelCase__   :List[str]      							=				text_classifier("This is great !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}]		)
      @require_tf
      def 			snake_case_      (   self		):



          '''simple docstring'''
          lowerCAmelCase__   :int      							=				pipeline(
              task="text-classification"    ,	model="hf-internal-testing/tiny-random-distilbert"    ,	framework="tf"		)

          lowerCAmelCase__   :List[Any]      							=				text_classifier("This is great !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "LABEL_0", "score": 0.504}]		)
      @slow
      @require_torch
      def 			snake_case_      (   self		):



          '''simple docstring'''
          lowerCAmelCase__   :Tuple      							=				pipeline("text-classification"		)

          lowerCAmelCase__   :Any      							=				text_classifier("This is great !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "POSITIVE", "score": 1.0}]		)
          lowerCAmelCase__   :Any      							=				text_classifier("This is bad !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "NEGATIVE", "score": 1.0}]		)
          lowerCAmelCase__   :Tuple      							=				text_classifier("Birds are a type of animal"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "POSITIVE", "score": 0.988}]		)
      @slow
      @require_tf
      def 			snake_case_      (   self		):



          '''simple docstring'''
          lowerCAmelCase__   :List[Any]      							=				pipeline("text-classification"    ,	framework="tf"		)

          lowerCAmelCase__   :Tuple      							=				text_classifier("This is great !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "POSITIVE", "score": 1.0}]		)
          lowerCAmelCase__   :str      							=				text_classifier("This is bad !"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "NEGATIVE", "score": 1.0}]		)
          lowerCAmelCase__   :Optional[int]      							=				text_classifier("Birds are a type of animal"		)
          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": "POSITIVE", "score": 0.988}]		)
      def 			snake_case_      (   self    ,	_lowerCAmelCase    ,	_lowerCAmelCase    ,	_lowerCAmelCase		):



          '''simple docstring'''
          lowerCAmelCase__   :Optional[Any]      							=				TextClassificationPipeline(model=_lowerCAmelCase    ,	tokenizer=_lowerCAmelCase		)
          return text_classifier, ["HuggingFace is in", "This is another test"]



      def 			snake_case_      (   self    ,	_lowerCAmelCase    ,	_lowerCAmelCase		):



          '''simple docstring'''
          lowerCAmelCase__   :Dict      							=				text_classifier.model
          # Small inputs because BartTokenizer tiny has maximum position embeddings = 22
          lowerCAmelCase__   :str      							=				"HuggingFace is in"
          lowerCAmelCase__   :Union[str, Any]      							=				text_classifier(_lowerCAmelCase		)

          self.assertEqual(nested_simplify(_lowerCAmelCase		)    ,	[{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}]		)
          self.assertTrue(outputs[0]["label"] in model.config.idalabel.values()		)

          lowerCAmelCase__   :Any      							=				["HuggingFace is in ", "Paris is in France"]
          lowerCAmelCase__   :List[str]      							=				text_classifier(_lowerCAmelCase		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}, {"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}]    ,	)
          self.assertTrue(outputs[0]["label"] in model.config.idalabel.values()		)
          self.assertTrue(outputs[1]["label"] in model.config.idalabel.values()		)

          # Forcing to get all results with `top_k=None`
          # This is NOT the legacy format
          lowerCAmelCase__   :Union[str, Any]      							=				text_classifier(_lowerCAmelCase    ,	top_k=_lowerCAmelCase		)
          lowerCAmelCase__   :Dict      							=				len(model.config.idalabel.values()		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[[{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}] * N, [{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}] * N]    ,	)

          lowerCAmelCase__   :str      							=				{"text": "HuggingFace is in ", "text_pair": "Paris is in France"}
          lowerCAmelCase__   :List[str]      							=				text_classifier(_lowerCAmelCase		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}    ,	)
          self.assertTrue(outputs["label"] in model.config.idalabel.values()		)

          # This might be used a text pair, but tokenizer + pipe interaction
          # makes it hard to understand that it's not using the pair properly
          # https://github.com/huggingface/transformers/issues/17305
          # We disabled this usage instead as it was outputting wrong outputs.
          lowerCAmelCase__   :str      							=				[["HuggingFace is in ", "Paris is in France"]]
          with self.assertRaises(_lowerCAmelCase		):
              text_classifier(_lowerCAmelCase		)

          # This used to be valid for doing text pairs
          # We're keeping it working because of backward compatibility
          lowerCAmelCase__   :str      							=				text_classifier([[["HuggingFace is in ", "Paris is in France"]]]		)
          self.assertEqual(
              nested_simplify(_lowerCAmelCase		)    ,	[{"label": ANY(_lowerCAmelCase		), "score": ANY(_lowerCAmelCase		)}]    ,	)
          self.assertTrue(outputs[0]["label"] in model.config.idalabel.values()		)











def 				snake_case__							(							UpperCAmelCase							:  float    ,			UpperCAmelCase							:  list[float]       ):
    if discount_rate < 0:
        raise ValueError("Discount rate cannot be negative"       )
    if not cash_flows:
        raise ValueError("Cash flows list cannot be empty"       )
    lowerCAmelCase__   :List[Any]      							=				sum(
        cash_flow / ((1 + discount_rate) ** i) for i, cash_flow in enumerate(UpperCAmelCase       )       )
    return round(UpperCAmelCase    ,			ndigits=2       )


if __name__ == "__main__":
 import doctest

 doctest.testmod()



