


'''simple docstring'''






from collections import UserDict
from typing import List, Union

from ..utils import (
    add_end_docstrings,
    is_tf_available,
    is_torch_available,
    is_vision_available,
    logging,
    requires_backends,
)
from .base import PIPELINE_INIT_ARGS, Pipeline


if is_vision_available():
 from PIL import Image

 from ..image_utils import load_image

if is_torch_available():
 from ..models.auto.modeling_auto import MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING

if is_tf_available():
 from ..models.auto.modeling_tf_auto import TF_MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING
 from ..tf_utils import stable_softmax

lowercase							=logging.get_logger(__name__)






@add_end_docstrings(lowerCAmelCase    )
class  __magic_name__							(		lowerCAmelCase    ):






       def __init__(      self  ,							**snake_case)						->  Optional[int]:




          '''simple docstring'''
          super().__init__(**snake_case)

          requires_backends(self  ,							'vision')
          self.check_model_type(
              TF_MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING
              if self.framework == 'tf'
              else MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING)






       def __call__(      self  ,							snake_case  ,							**snake_case)						->  str:




          '''simple docstring'''
          return super().__call__(snake_case  ,							**snake_case)






       def       lowerCAmelCase		(      self  ,							**snake_case)						->  int:




          '''simple docstring'''
          _UpperCAmelCase       :       str							   ={}
          if "candidate_labels" in kwargs:
             _UpperCAmelCase       :       Union[str, Any]							   =kwargs['candidate_labels']
          if "hypothesis_template" in kwargs:
             _UpperCAmelCase       :       List[Any]							   =kwargs['hypothesis_template']

          return preprocess_params, {}, {}






       def       lowerCAmelCase		(      self  ,							snake_case  ,							snake_case=None  ,							snake_case="This is a photo of {}.")						->  Any:




          '''simple docstring'''
          _UpperCAmelCase       :       Optional[Any]							   =load_image(snake_case)
          _UpperCAmelCase       :       Union[str, Any]							   =self.image_processor(images=[image]  ,							return_tensors=self.framework)
          _UpperCAmelCase       :       Union[str, Any]							   =candidate_labels
          _UpperCAmelCase       :       List[Any]							   =[hypothesis_template.format(snake_case) for x in candidate_labels]
          _UpperCAmelCase       :       str							   =self.tokenizer(snake_case  ,							return_tensors=self.framework  ,							padding=snake_case)
          _UpperCAmelCase       :       Any							   =[text_inputs]
          return inputs






       def       lowerCAmelCase		(      self  ,							snake_case)						->  str:




          '''simple docstring'''
          _UpperCAmelCase       :       List[str]							   =model_inputs.pop('candidate_labels')
          _UpperCAmelCase       :       Tuple							   =model_inputs.pop('text_inputs')
          if isinstance(text_inputs[0]  ,							snake_case):
             _UpperCAmelCase       :       Any							   =text_inputs[0]
          else:
             # Batching case.
             _UpperCAmelCase       :       str							   =text_inputs[0][0]

          _UpperCAmelCase       :       Any							   =self.model(**snake_case  ,							**snake_case)

          _UpperCAmelCase       :       List[str]							   ={
              'candidate_labels': candidate_labels,
              'logits': outputs.logits_per_image,
          }
          return model_outputs






       def       lowerCAmelCase		(      self  ,							snake_case)						->  Optional[int]:




          '''simple docstring'''
          _UpperCAmelCase       :       str							   =model_outputs.pop('candidate_labels')
          _UpperCAmelCase       :       Union[str, Any]							   =model_outputs['logits'][0]
          if self.framework == "pt":
             _UpperCAmelCase       :       Dict							   =logits.softmax(dim=-1).squeeze(-1)
             _UpperCAmelCase       :       Union[str, Any]							   =probs.tolist()
             if not isinstance(snake_case  ,							snake_case):
                _UpperCAmelCase       :       Union[str, Any]							   =[scores]
          elif self.framework == "tf":
             _UpperCAmelCase       :       Dict							   =stable_softmax(snake_case  ,							axis=-1)
             _UpperCAmelCase       :       str							   =probs.numpy().tolist()
          else:
             raise ValueError(f"Unsupported framework: {self.framework}")

          _UpperCAmelCase       :       List[str]							   =[
              {'score': score, 'label': candidate_label}
              for score, candidate_label in sorted(zip(snake_case  ,							snake_case)  ,							key=lambda snake_case: -x[0])
          ]
          return result





'''simple docstring'''






from typing import Any





def lowerCamelCase__      (						__lowerCamelCase	:							list	,   __lowerCamelCase	:							list	,   __lowerCamelCase	:							dict	,   __lowerCamelCase	:							dict	,   __lowerCamelCase	:							dict	,   ):







   '''simple docstring'''




   _validation(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   )
   # Creates data structures and fill initial step
   _UpperCAmelCase       :       dict							   ={}
   _UpperCAmelCase       :       dict							   ={}
   for state in states_space:
      _UpperCAmelCase       :       int							   =observations_space[0]
      _UpperCAmelCase       :       int							   =(
          initial_probabilities[state] * emission_probabilities[state][observation]
      )
      _UpperCAmelCase       :       int							   =None

   # Fills the data structure with the probabilities of
   # different transitions and pointers to previous states
   for o in range(1	,   len(__lowerCamelCase							)							):
      _UpperCAmelCase       :       List[Any]							   =observations_space[o]
      _UpperCAmelCase       :       Optional[int]							   =observations_space[o - 1]
      for state in states_space:
         # Calculates the argmax for probability function
         _UpperCAmelCase       :       List[str]							   =''
         _UpperCAmelCase       :       Dict							   =-1
         for k_state in states_space:
            _UpperCAmelCase       :       List[str]							   =(
                probabilities[(k_state, prior_observation)]
                * transition_probabilities[k_state][state]
                * emission_probabilities[state][observation]
            )
            if probability > max_probability:
               _UpperCAmelCase       :       int							   =probability
               _UpperCAmelCase       :       List[Any]							   =k_state

            # Update probabilities and pointers dicts
         _UpperCAmelCase       :       str							   =(
             probabilities[(arg_max, prior_observation)]
             * transition_probabilities[arg_max][state]
             * emission_probabilities[state][observation]
         )

         _UpperCAmelCase       :       List[Any]							   =arg_max

    # The final observation
   _UpperCAmelCase       :       int							   =observations_space[len(__lowerCamelCase							) - 1]

   # argmax for given final observation
   _UpperCAmelCase       :       Any							   =''
   _UpperCAmelCase       :       Union[str, Any]							   =-1
   for k_state in states_space:
      _UpperCAmelCase       :       Optional[int]							   =probabilities[(k_state, final_observation)]
      if probability > max_probability:
         _UpperCAmelCase       :       Union[str, Any]							   =probability
         _UpperCAmelCase       :       int							   =k_state
   _UpperCAmelCase       :       int							   =arg_max

   # Process pointers backwards
   _UpperCAmelCase       :       List[str]							   =last_state
   _UpperCAmelCase       :       Optional[int]							   =[]
   for o in range(len(__lowerCamelCase							) - 1	,   -1	,   -1							):
      result.append(__lowerCamelCase							)
      _UpperCAmelCase       :       Optional[Any]							   =pointers[previous, observations_space[o]]
   result.reverse()

   return result





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   _validate_not_empty(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   )
   _validate_lists(__lowerCamelCase	,   __lowerCamelCase							)
   _validate_dicts(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   if not all(
       [
           observations_space,
           states_space,
           initial_probabilities,
           transition_probabilities,
           emission_probabilities,
       ]							):
      raise ValueError('There\'s an empty parameter'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any							):







   '''simple docstring'''




   _validate_list(__lowerCamelCase	,   'observations_space'							)
   _validate_list(__lowerCamelCase	,   'states_space'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str							):







   '''simple docstring'''




   if not isinstance(_object	,   __lowerCamelCase							):
      _UpperCAmelCase       :       Any							   =f"{var_name} must be a list"
      raise ValueError(__lowerCamelCase							)
   else:
      for x in _object:
         if not isinstance(__lowerCamelCase	,   __lowerCamelCase							):
            _UpperCAmelCase       :       Optional[int]							   =f"{var_name} must be a list of strings"
            raise ValueError(__lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   _validate_dict(__lowerCamelCase	,   'initial_probabilities'	,   __lowerCamelCase							)
   _validate_nested_dict(__lowerCamelCase	,   'transition_probabilities'							)
   _validate_nested_dict(__lowerCamelCase	,   'emission_probabilities'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str							):







   '''simple docstring'''




   _validate_dict(_object	,   __lowerCamelCase	,   __lowerCamelCase							)
   for x in _object.values():
      _validate_dict(__lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str	,   __lowerCamelCase	:							type	,   __lowerCamelCase	:							bool = False							):







   '''simple docstring'''




   if not isinstance(_object	,   __lowerCamelCase							):
      _UpperCAmelCase       :       List[str]							   =f"{var_name} must be a dict"
      raise ValueError(__lowerCamelCase							)
   if not all(isinstance(__lowerCamelCase	,   __lowerCamelCase							) for x in _object							):
      _UpperCAmelCase       :       str							   =f"{var_name} all keys must be strings"
      raise ValueError(__lowerCamelCase							)
   if not all(isinstance(__lowerCamelCase	,   __lowerCamelCase							) for x in _object.values()							):
      _UpperCAmelCase       :       int							   ='nested dictionary ' if nested else ''
      _UpperCAmelCase       :       Optional[int]							   =f"{var_name} {nested_text}all values must be {value_type.__name__}"
      raise ValueError(__lowerCamelCase							)


if __name__ == "__main__":
 from doctest import testmod

 testmod()

