






'''simple docstring'''



from typing import List, Union

import numpy as np

from ..tokenization_utils import TruncationStrategy
from ..utils import add_end_docstrings, logging
from .base import PIPELINE_INIT_ARGS, ArgumentHandler, ChunkPipeline


SCREAMING_SNAKE_CASE						=	logging.get_logger(__name__)
class UpperCAmelCase_					(    __A				):




      """simple docstring"""




      def 				A__      ( self			:		Tuple     ,      UpperCAmelCase			:		Dict		)  ->  Optional[int]:


       '''simple docstring'''

       if isinstance(UpperCAmelCase     ,      UpperCAmelCase		):
        lowercase					:   List[Any]				  =[label.strip() for label in labels.split(''','''		) if label.strip()]
       return labels






      def __call__( self			:		Optional[Any]     ,      UpperCAmelCase			:		Any     ,      UpperCAmelCase			:		Optional[Any]     ,      UpperCAmelCase			:		Optional[Any]		)  ->  Dict:


       '''simple docstring'''

       if len(UpperCAmelCase		) == 0 or len(UpperCAmelCase		) == 0:
        raise ValueError('''You must include at least one label and at least one sequence.'''		)
       if hypothesis_template.format(labels[0]		) == hypothesis_template:
        raise ValueError(
            (
                '''The provided hypothesis_template "{}" was not able to be formatted with the target labels. '''
                '''Make sure the passed template includes formatting syntax such as {{}} where the label should go.'''
            ).format(UpperCAmelCase		)		)

       if isinstance(UpperCAmelCase     ,      UpperCAmelCase		):
        lowercase					:   int				  =[sequences]

       lowercase					:   Tuple				  =[]
       for sequence in sequences:
        sequence_pairs.extend([[sequence, hypothesis_template.format(UpperCAmelCase		)] for label in labels]		)

       return sequence_pairs, sequences





@add_end_docstrings(__A				)
class UpperCAmelCase_					(    __A				):




      """simple docstring"""




      def __init__( self			:		Any     ,      UpperCAmelCase			:		Optional[int]=ZeroShotClassificationArgumentHandler()     ,      *UpperCAmelCase			:		List[str]     ,      **UpperCAmelCase			:		List[str]		)  ->  str:


       '''simple docstring'''

       lowercase					:   Union[str, Any]				  =args_parser
       super().__init__(*UpperCAmelCase     ,      **UpperCAmelCase		)
       if self.entailment_id == -1:
        logger.warning(
            '''Failed to determine \'entailment\' label id from the label2id mapping in the model config. Setting to '''
            '''-1. Define a descriptive label2id mapping in the model config to ensure correct outputs.'''		)






      @property
      def 				A__      ( self			:		List[str]		)  ->  Union[str, Any]:


       '''simple docstring'''

       for label, ind in self.model.config.labelaid.items():
        if label.lower().startswith('''entail'''		):
         return ind
       return -1






      def 				A__      ( self			:		Optional[int]     ,      UpperCAmelCase			:		int     ,      UpperCAmelCase			:		str=True     ,      UpperCAmelCase			:		Optional[Any]=True     ,      UpperCAmelCase			:		Optional[int]=TruncationStrategy.ONLY_FIRST     ,      **UpperCAmelCase			:		str		)  ->  int:


       '''simple docstring'''

       lowercase					:   int				  =self.framework
       if self.tokenizer.pad_token is None:
        # Override for tokenizers not supporting padding
        logger.error(
            '''Tokenizer was not supporting padding necessary for zero-shot, attempting to use '''
            ''' `pad_token=eos_token`'''		)
        lowercase					:   Optional[int]				  =self.tokenizer.eos_token
       try:
        lowercase					:   int				  =self.tokenizer(
            UpperCAmelCase     ,      add_special_tokens=UpperCAmelCase     ,      return_tensors=UpperCAmelCase     ,      padding=UpperCAmelCase     ,      truncation=UpperCAmelCase     ,      )
       except Exception as e:
        if "too short" in str(UpperCAmelCase		):
         # tokenizers might yell that we want to truncate
         # to a value that is not even reached by the input.
         # In that case we don't want to truncate.
         # It seems there's not a really better way to catch that
         # exception.

         lowercase					:   List[str]				  =self.tokenizer(
             UpperCAmelCase     ,      add_special_tokens=UpperCAmelCase     ,      return_tensors=UpperCAmelCase     ,      padding=UpperCAmelCase     ,      truncation=TruncationStrategy.DO_NOT_TRUNCATE     ,      )
        else:
         raise e

       return inputs






      def 				A__      ( self			:		Union[str, Any]     ,      **UpperCAmelCase			:		Union[str, Any]		)  ->  List[str]:


       '''simple docstring'''

       if kwargs.get('''multi_class'''     ,      UpperCAmelCase		) is not None:
        lowercase					:   Dict				  =kwargs['''multi_class''']
        logger.warning(
            '''The `multi_class` argument has been deprecated and renamed to `multi_label`. '''
            '''`multi_class` will be removed in a future version of Transformers.'''		)
       lowercase					:   str				  ={}
       if "candidate_labels" in kwargs:
        lowercase					:   List[Any]				  =self._args_parser._parse_labels(kwargs['''candidate_labels''']		)
       if "hypothesis_template" in kwargs:
        lowercase					:   str				  =kwargs['''hypothesis_template''']

       lowercase					:   Tuple				  ={}
       if "multi_label" in kwargs:
        lowercase					:   Any				  =kwargs['''multi_label''']
       return preprocess_params, {}, postprocess_params






      def __call__( self			:		Optional[int]     ,      UpperCAmelCase			:		Union[str, List[str]]     ,      *UpperCAmelCase			:		Dict     ,      **UpperCAmelCase			:		Tuple     ,      )  ->  Optional[int]:


       '''simple docstring'''

       if len(UpperCAmelCase		) == 0:
        pass
       elif len(UpperCAmelCase		) == 1 and "candidate_labels" not in kwargs:
        lowercase					:   Optional[Any]				  =args[0]
       else:
        raise ValueError(f'Unable to understand extra arguments {args}'		)

       return super().__call__(UpperCAmelCase     ,      **UpperCAmelCase		)






      def 				A__      ( self			:		List[str]     ,      UpperCAmelCase			:		str     ,      UpperCAmelCase			:		int=None     ,      UpperCAmelCase			:		Union[str, Any]="This example is {}."		)  ->  Optional[int]:


       '''simple docstring'''

       lowercase  ,		lowercase					:   Optional[int]				  =self._args_parser(UpperCAmelCase     ,      UpperCAmelCase     ,      UpperCAmelCase		)

       for i, (candidate_label, sequence_pair) in enumerate(zip(UpperCAmelCase     ,      UpperCAmelCase		)		):
        lowercase					:   Tuple				  =self._parse_and_tokenize([sequence_pair]		)

        yield {
            "candidate_label": candidate_label,
            "sequence": sequences[0],
            "is_last": i == len(UpperCAmelCase		) - 1,
            **model_input,
        }






      def 				A__      ( self			:		int     ,      UpperCAmelCase			:		List[Any]		)  ->  Dict:


       '''simple docstring'''

       lowercase					:   Optional[int]				  =inputs['''candidate_label''']
       lowercase					:   Union[str, Any]				  =inputs['''sequence''']
       lowercase					:   Union[str, Any]				  ={k: inputs[k] for k in self.tokenizer.model_input_names}
       lowercase					:   List[str]				  =self.model(**UpperCAmelCase		)

       lowercase					:   List[str]				  ={
           '''candidate_label''': candidate_label,
           '''sequence''': sequence,
           '''is_last''': inputs['''is_last'''],
           **outputs,
       }
       return model_outputs






      def 				A__      ( self			:		Tuple     ,      UpperCAmelCase			:		Union[str, Any]     ,      UpperCAmelCase			:		str=False		)  ->  Union[str, Any]:


       '''simple docstring'''

       lowercase					:   int				  =[outputs['''candidate_label'''] for outputs in model_outputs]
       lowercase					:   int				  =[outputs['''sequence'''] for outputs in model_outputs]
       lowercase					:   Tuple				  =np.concatenate([output['''logits'''].numpy() for output in model_outputs]		)
       lowercase					:   Union[str, Any]				  =logits.shape[0]
       lowercase					:   Tuple				  =len(UpperCAmelCase		)
       lowercase					:   Optional[Any]				  =N // n
       lowercase					:   int				  =logits.reshape((num_sequences, n, -1)		)

       if multi_label or len(UpperCAmelCase		) == 1:
        # softmax over the entailment vs. contradiction dim for each label independently
        lowercase					:   Union[str, Any]				  =self.entailment_id
        lowercase					:   Tuple				  =-1 if entailment_id == 0 else 0
        lowercase					:   Optional[int]				  =reshaped_outputs[..., [contradiction_id, entailment_id]]
        lowercase					:   int				  =np.exp(UpperCAmelCase		) / np.exp(UpperCAmelCase		).sum(-1     ,      keepdims=UpperCAmelCase		)
        lowercase					:   Union[str, Any]				  =scores[..., 1]
       else:
        # softmax the "entailment" logits over all candidate labels
        lowercase					:   Union[str, Any]				  =reshaped_outputs[..., self.entailment_id]
        lowercase					:   List[str]				  =np.exp(UpperCAmelCase		) / np.exp(UpperCAmelCase		).sum(-1     ,      keepdims=UpperCAmelCase		)

       lowercase					:   List[Any]				  =list(reversed(scores[0].argsort()		)		)
       return {
           "sequence": sequences[0],
           "labels": [candidate_labels[i] for i in top_inds],
           "scores": scores[0, top_inds].tolist(),
       }











'''simple docstring'''



from typing import Dict, Iterable, Optional, Union

import numpy as np

from ...image_processing_utils import BaseImageProcessor, BatchFeature, get_size_dict
from ...image_transforms import normalize, rescale, resize, to_channel_dimension_format, to_pil_image
from ...image_utils import (
    IMAGENET_STANDARD_MEAN,
    IMAGENET_STANDARD_STD,
    ChannelDimension,
    ImageInput,
    PILImageResampling,
    make_list_of_images,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, is_pytesseract_available, is_vision_available, logging, requires_backends


if is_vision_available():
      import PIL

# soft dependency
if is_pytesseract_available():
      import pytesseract

SCREAMING_SNAKE_CASE						=	logging.get_logger(__name__)


def 							lowercase_				(    __A :       List[Any]					,      __A :       int					,      __A :       int			)       ->      Optional[int]:



 """simple docstring"""




 return [
     int(1_0_0_0 * (box[0] / width)			),
     int(1_0_0_0 * (box[1] / height)			),
     int(1_0_0_0 * (box[2] / width)			),
     int(1_0_0_0 * (box[3] / height)			),
 ]


def 							lowercase_				(    __A :       np.ndarray					,      __A :       Optional[str]					,      __A :       Optional[str]			)       ->      Optional[Any]:



 """simple docstring"""




 lowercase					:   int				  =to_pil_image(__A			)
 lowercase  ,		lowercase					:   Tuple				  =pil_image.size
 lowercase					:   Optional[Any]				  =pytesseract.image_to_data(__A					,      lang=__A					,      output_type='''dict'''					,      config=__A			)
 lowercase  ,		lowercase  ,		lowercase  ,		lowercase  ,		lowercase					:   Optional[Any]				  =data['''text'''], data['''left'''], data['''top'''], data['''width'''], data['''height''']

 # filter empty words and corresponding coordinates
 lowercase					:   Dict				  =[idx for idx, word in enumerate(__A			) if not word.strip()]
 lowercase					:   str				  =[word for idx, word in enumerate(__A			) if idx not in irrelevant_indices]
 lowercase					:   Optional[int]				  =[coord for idx, coord in enumerate(__A			) if idx not in irrelevant_indices]
 lowercase					:   List[Any]				  =[coord for idx, coord in enumerate(__A			) if idx not in irrelevant_indices]
 lowercase					:   str				  =[coord for idx, coord in enumerate(__A			) if idx not in irrelevant_indices]
 lowercase					:   int				  =[coord for idx, coord in enumerate(__A			) if idx not in irrelevant_indices]

 # turn coordinates into (left, top, left+width, top+height) format
 lowercase					:   Tuple				  =[]
 for x, y, w, h in zip(__A					,      __A					,      __A					,      __A			):
  lowercase					:   str				  =[x, y, x + w, y + h]
  actual_boxes.append(__A			)

 # finally, normalize the bounding boxes
 lowercase					:   List[str]				  =[]
 for box in actual_boxes:
  normalized_boxes.append(normalize_box(__A					,      __A					,      __A			)			)

 assert len(__A			) == len(__A			), "Not as many words as there are bounding boxes"

 return words, normalized_boxes





class UpperCAmelCase_					(    __A				):




      """simple docstring"""




      UpperCamelCase_								=			['''pixel_values''']






      def __init__( self			:		List[Any]     ,      UpperCAmelCase			:		bool = True     ,      UpperCAmelCase			:		Dict[str, int] = None     ,      UpperCAmelCase			:		PILImageResampling = PILImageResampling.BILINEAR     ,      UpperCAmelCase			:		bool = True     ,      UpperCAmelCase			:		float = 1 / 255     ,      UpperCAmelCase			:		bool = True     ,      UpperCAmelCase			:		Union[float, Iterable[float]] = None     ,      UpperCAmelCase			:		Union[float, Iterable[float]] = None     ,      UpperCAmelCase			:		bool = True     ,      UpperCAmelCase			:		Optional[str] = None     ,      UpperCAmelCase			:		Optional[str] = ""     ,      **UpperCAmelCase			:		Tuple     ,      )  ->  None:


       '''simple docstring'''

       super().__init__(**UpperCAmelCase		)
       lowercase					:   Tuple				  =size if size is not None else {'''height''': 224, '''width''': 224}
       lowercase					:   Optional[Any]				  =get_size_dict(UpperCAmelCase		)

       lowercase					:   Optional[Any]				  =do_resize
       lowercase					:   List[Any]				  =size
       lowercase					:   List[str]				  =resample
       lowercase					:   Dict				  =do_rescale
       lowercase					:   str				  =rescale_value
       lowercase					:   Optional[int]				  =do_normalize
       lowercase					:   Any				  =image_mean if image_mean is not None else IMAGENET_STANDARD_MEAN
       lowercase					:   Union[str, Any]				  =image_std if image_std is not None else IMAGENET_STANDARD_STD
       lowercase					:   List[Any]				  =apply_ocr
       lowercase					:   Union[str, Any]				  =ocr_lang
       lowercase					:   str				  =tesseract_config






      def 				A__      ( self			:		Dict     ,      UpperCAmelCase			:		np.ndarray     ,      UpperCAmelCase			:		Dict[str, int]     ,      UpperCAmelCase			:		PILImageResampling = PILImageResampling.BILINEAR     ,      UpperCAmelCase			:		Optional[Union[str, ChannelDimension]] = None     ,      **UpperCAmelCase			:		Optional[Any]     ,      )  ->  np.ndarray:


       '''simple docstring'''

       lowercase					:   Tuple				  =get_size_dict(UpperCAmelCase		)
       if "height" not in size or "width" not in size:
        raise ValueError(f'The size dictionary must contain the keys \'height\' and \'width\'. Got {size.keys()}'		)
       lowercase					:   Optional[Any]				  =(size['''height'''], size['''width'''])
       return resize(UpperCAmelCase     ,      size=UpperCAmelCase     ,      resample=UpperCAmelCase     ,      data_format=UpperCAmelCase     ,      **UpperCAmelCase		)






      def 				A__      ( self			:		Union[str, Any]     ,      UpperCAmelCase			:		np.ndarray     ,      UpperCAmelCase			:		Union[int, float]     ,      UpperCAmelCase			:		Optional[Union[str, ChannelDimension]] = None     ,      **UpperCAmelCase			:		Optional[Any]     ,      )  ->  np.ndarray:


       '''simple docstring'''

       return rescale(UpperCAmelCase     ,      scale=UpperCAmelCase     ,      data_format=UpperCAmelCase     ,      **UpperCAmelCase		)






      def 				A__      ( self			:		Union[str, Any]     ,      UpperCAmelCase			:		np.ndarray     ,      UpperCAmelCase			:		Union[float, Iterable[float]]     ,      UpperCAmelCase			:		Union[float, Iterable[float]]     ,      UpperCAmelCase			:		Optional[Union[str, ChannelDimension]] = None     ,      **UpperCAmelCase			:		Optional[int]     ,      )  ->  np.ndarray:


       '''simple docstring'''

       return normalize(UpperCAmelCase     ,      mean=UpperCAmelCase     ,      std=UpperCAmelCase     ,      data_format=UpperCAmelCase     ,      **UpperCAmelCase		)






      def 				A__      ( self			:		Any     ,      UpperCAmelCase			:		ImageInput     ,      UpperCAmelCase			:		bool = None     ,      UpperCAmelCase			:		Dict[str, int] = None     ,      UpperCAmelCase			:		Union[str, Any]=None     ,      UpperCAmelCase			:		bool = None     ,      UpperCAmelCase			:		float = None     ,      UpperCAmelCase			:		bool = None     ,      UpperCAmelCase			:		Union[float, Iterable[float]] = None     ,      UpperCAmelCase			:		Union[float, Iterable[float]] = None     ,      UpperCAmelCase			:		bool = None     ,      UpperCAmelCase			:		Optional[str] = None     ,      UpperCAmelCase			:		Optional[str] = None     ,      UpperCAmelCase			:		Optional[Union[str, TensorType]] = None     ,      UpperCAmelCase			:		ChannelDimension = ChannelDimension.FIRST     ,      **UpperCAmelCase			:		List[str]     ,      )  ->  PIL.Image.Image:


       '''simple docstring'''

       lowercase					:   Optional[int]				  =do_resize if do_resize is not None else self.do_resize
       lowercase					:   Tuple				  =size if size is not None else self.size
       lowercase					:   Optional[int]				  =get_size_dict(UpperCAmelCase		)
       lowercase					:   List[str]				  =resample if resample is not None else self.resample
       lowercase					:   List[Any]				  =do_rescale if do_rescale is not None else self.do_rescale
       lowercase					:   List[Any]				  =rescale_factor if rescale_factor is not None else self.rescale_factor
       lowercase					:   Optional[int]				  =do_normalize if do_normalize is not None else self.do_normalize
       lowercase					:   List[Any]				  =image_mean if image_mean is not None else self.image_mean
       lowercase					:   Optional[int]				  =image_std if image_std is not None else self.image_std
       lowercase					:   Any				  =apply_ocr if apply_ocr is not None else self.apply_ocr
       lowercase					:   Any				  =ocr_lang if ocr_lang is not None else self.ocr_lang
       lowercase					:   Dict				  =tesseract_config if tesseract_config is not None else self.tesseract_config

       lowercase					:   str				  =make_list_of_images(UpperCAmelCase		)

       if not valid_images(UpperCAmelCase		):
        raise ValueError(
            '''Invalid image type. Must be of type PIL.Image.Image, numpy.ndarray, '''
            '''torch.Tensor, tf.Tensor or jax.ndarray.'''		)

       if do_resize and size is None:
        raise ValueError('''Size must be specified if do_resize is True.'''		)

       if do_rescale and rescale_factor is None:
        raise ValueError('''Rescale factor must be specified if do_rescale is True.'''		)

       if do_normalize and (image_mean is None or image_std is None):
        raise ValueError('''If do_normalize is True, image_mean and image_std must be specified.'''		)

       # All transformations expect numpy arrays.
       lowercase					:   Tuple				  =[to_numpy_array(UpperCAmelCase		) for image in images]

       # Tesseract OCR to get words + normalized bounding boxes
       if apply_ocr:
        requires_backends(self     ,      '''pytesseract'''		)
        lowercase					:   int				  =[]
        lowercase					:   Tuple				  =[]
        for image in images:
         lowercase  ,		lowercase					:   Dict				  =apply_tesseract(UpperCAmelCase     ,      UpperCAmelCase     ,      UpperCAmelCase		)
         words_batch.append(UpperCAmelCase		)
         boxes_batch.append(UpperCAmelCase		)

       if do_resize:
        lowercase					:   int				  =[self.resize(image=UpperCAmelCase     ,      size=UpperCAmelCase     ,      resample=UpperCAmelCase		) for image in images]

       if do_rescale:
        lowercase					:   Tuple				  =[self.rescale(image=UpperCAmelCase     ,      scale=UpperCAmelCase		) for image in images]

       if do_normalize:
        lowercase					:   str				  =[self.normalize(image=UpperCAmelCase     ,      mean=UpperCAmelCase     ,      std=UpperCAmelCase		) for image in images]

       lowercase					:   Optional[Any]				  =[to_channel_dimension_format(UpperCAmelCase     ,      UpperCAmelCase		) for image in images]

       lowercase					:   Dict				  =BatchFeature(data={'''pixel_values''': images}     ,      tensor_type=UpperCAmelCase		)

       if apply_ocr:
        lowercase					:   int				  =words_batch
        lowercase					:   List[str]				  =boxes_batch
       return data



