




from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_tf_available, is_torch_available


UpperCamelCase__ :   Union[str, Any]						=							{
    '''configuration_xlm''': ['''XLM_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''XLMConfig''', '''XLMOnnxConfig'''],
    '''tokenization_xlm''': ['''XLMTokenizer'''],
}

try:
						if not is_torch_available():
												raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
						pass
else:
						UpperCamelCase__ :   Tuple						=							[
						    '''XLM_PRETRAINED_MODEL_ARCHIVE_LIST''',
						    '''XLMForMultipleChoice''',
						    '''XLMForQuestionAnswering''',
						    '''XLMForQuestionAnsweringSimple''',
						    '''XLMForSequenceClassification''',
						    '''XLMForTokenClassification''',
						    '''XLMModel''',
						    '''XLMPreTrainedModel''',
						    '''XLMWithLMHeadModel''',
						]

try:
						if not is_tf_available():
												raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
						pass
else:
						UpperCamelCase__ :   Any						=							[
						    '''TF_XLM_PRETRAINED_MODEL_ARCHIVE_LIST''',
						    '''TFXLMForMultipleChoice''',
						    '''TFXLMForQuestionAnsweringSimple''',
						    '''TFXLMForSequenceClassification''',
						    '''TFXLMForTokenClassification''',
						    '''TFXLMMainLayer''',
						    '''TFXLMModel''',
						    '''TFXLMPreTrainedModel''',
						    '''TFXLMWithLMHeadModel''',
						]


if TYPE_CHECKING:
						from .configuration_xlm import XLM_PRETRAINED_CONFIG_ARCHIVE_MAP, XLMConfig, XLMOnnxConfig
						from .tokenization_xlm import XLMTokenizer

						try:
												if not is_torch_available():
																		raise OptionalDependencyNotAvailable()
						except OptionalDependencyNotAvailable:
												pass
						else:
												from .modeling_xlm import (
												    XLM_PRETRAINED_MODEL_ARCHIVE_LIST,
												    XLMForMultipleChoice,
												    XLMForQuestionAnswering,
												    XLMForQuestionAnsweringSimple,
												    XLMForSequenceClassification,
												    XLMForTokenClassification,
												    XLMModel,
												    XLMPreTrainedModel,
												    XLMWithLMHeadModel,
												)

						try:
												if not is_tf_available():
																		raise OptionalDependencyNotAvailable()
						except OptionalDependencyNotAvailable:
												pass
						else:
												from .modeling_tf_xlm import (
												    TF_XLM_PRETRAINED_MODEL_ARCHIVE_LIST,
												    TFXLMForMultipleChoice,
												    TFXLMForQuestionAnsweringSimple,
												    TFXLMForSequenceClassification,
												    TFXLMForTokenClassification,
												    TFXLMMainLayer,
												    TFXLMModel,
												    TFXLMPreTrainedModel,
												    TFXLMWithLMHeadModel,
												)

else:
						import sys

						UpperCamelCase__ :   List[str]						=							_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)









from typing import Union

from ..utils import add_end_docstrings, is_torch_available, is_vision_available, logging
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_VISUAL_QUESTION_ANSWERING_MAPPING

UpperCamelCase__ :   List[str]						=							logging.get_logger(__name__)







@add_end_docstrings(lowerCamelCase_							)
class 				lowerCAmelCase_       (					lowerCamelCase_							):






				def __init__(			self      ,*snake_case__      ,**snake_case__ ):
							super().__init__(*snake_case__      ,**snake_case__ )
							self.check_model_type(snake_case__ )






				def 		snake_case	(			self      ,snake_case__=None      ,snake_case__=None      ,snake_case__=None      ,**snake_case__ ):
							SCREAMING_SNAKE_CASE_  ,    SCREAMING_SNAKE_CASE_   : Union[str, Any]					  =      {}, {}
							if padding is not None:
										SCREAMING_SNAKE_CASE_   : Any					  =      padding
							if truncation is not None:
										SCREAMING_SNAKE_CASE_   : Tuple					  =      truncation
							if top_k is not None:
										SCREAMING_SNAKE_CASE_   : int					  =      top_k
							return preprocess_params, {}, postprocess_params






				def __call__(			self      ,snake_case__      ,snake_case__ = None      ,**snake_case__ ):
							if isinstance(snake_case__      ,(Image.Image, str) ) and isinstance(snake_case__      ,snake_case__ ):
										SCREAMING_SNAKE_CASE_   : Optional[Any]					  =      {'image': image, 'question': question}
							else:
										SCREAMING_SNAKE_CASE_   : Optional[int]					  =      image
							SCREAMING_SNAKE_CASE_   : List[Any]					  =      super().__call__(snake_case__      ,**snake_case__ )
							return results






				def 		snake_case	(			self      ,snake_case__      ,snake_case__=False      ,snake_case__=False ):
							SCREAMING_SNAKE_CASE_   : List[str]					  =      load_image(inputs['image'] )
							SCREAMING_SNAKE_CASE_   : Dict					  =      self.tokenizer(
							    inputs['question']      ,return_tensors=self.framework      ,padding=snake_case__      ,truncation=snake_case__ )
							SCREAMING_SNAKE_CASE_   : Any					  =      self.image_processor(images=snake_case__      ,return_tensors=self.framework )
							model_inputs.update(snake_case__ )
							return model_inputs






				def 		snake_case	(			self      ,snake_case__ ):
							SCREAMING_SNAKE_CASE_   : Optional[int]					  =      self.model(**snake_case__ )
							return model_outputs






				def 		snake_case	(			self      ,snake_case__      ,snake_case__=5 ):
							if top_k > self.model.config.num_labels:
										SCREAMING_SNAKE_CASE_   : Union[str, Any]					  =      self.model.config.num_labels

							if self.framework == "pt":
										SCREAMING_SNAKE_CASE_   : Any					  =      model_outputs.logits.sigmoid()[0]
										SCREAMING_SNAKE_CASE_  ,    SCREAMING_SNAKE_CASE_   : Dict					  =      probs.topk(snake_case__ )
							else:
										raise ValueError(F'Unsupported framework: {self.framework}' )

							SCREAMING_SNAKE_CASE_   : Optional[int]					  =      scores.tolist()
							SCREAMING_SNAKE_CASE_   : Union[str, Any]					  =      ids.tolist()
							return [{"score": score, "answer": self.model.config.idalabel[_id]} for score, _id in zip(snake_case__      ,snake_case__ )]



