


"""simple docstring"""
import unittest

from transformers import LiltConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

from ...generation.test_utils import GenerationTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
			import torch

			from transformers import (
			    LiltForQuestionAnswering,
			    LiltForSequenceClassification,
			    LiltForTokenClassification,
			    LiltModel,
			)
			from transformers.models.lilt.modeling_lilt import LILT_PRETRAINED_MODEL_ARCHIVE_LIST



class 			_UpperCAmelCase :






		'''simple docstring'''

		def __init__(self				,       a_				,       a_=13				,       a_=7				,       a_=True				,       a_=True				,       a_=True				,       a_=True				,       a_=99				,       a_=24				,       a_=2				,       a_=6				,       a_=37				,       a_="gelu"				,       a_=0.1				,       a_=0.1				,       a_=5_12				,       a_=16				,       a_=2				,       a_=0.02				,       a_=3				,       a_=None				,       a_=10_00				,       ):





			'''simple docstring'''

			__snake_case	:						Optional[Any]						=				parent
			__snake_case	:						Dict						=				batch_size
			__snake_case	:						int						=				seq_length
			__snake_case	:						List[str]						=				is_training
			__snake_case	:						Optional[Any]						=				use_input_mask
			__snake_case	:						int						=				use_token_type_ids
			__snake_case	:						Union[str, Any]						=				use_labels
			__snake_case	:						Any						=				vocab_size
			__snake_case	:						Union[str, Any]						=				hidden_size
			__snake_case	:						Optional[int]						=				num_hidden_layers
			__snake_case	:						Optional[Any]						=				num_attention_heads
			__snake_case	:						Union[str, Any]						=				intermediate_size
			__snake_case	:						str						=				hidden_act
			__snake_case	:						Any						=				hidden_dropout_prob
			__snake_case	:						Dict						=				attention_probs_dropout_prob
			__snake_case	:						Dict						=				max_position_embeddings
			__snake_case	:						Union[str, Any]						=				type_vocab_size
			__snake_case	:						str						=				type_sequence_label_size
			__snake_case	:						Union[str, Any]						=				initializer_range
			__snake_case	:						Any						=				num_labels
			__snake_case	:						str						=				scope
			__snake_case	:						Optional[int]						=				range_bbox



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				ids_tensor([self.batch_size, self.seq_length]				,       self.vocab_size					)

			__snake_case	:						Optional[int]						=				ids_tensor([self.batch_size, self.seq_length, 4]				,       self.range_bbox					)
			# Ensure that bbox is legal
			for i in range(bbox.shape[0]					):
				for j in range(bbox.shape[1]					):
					if bbox[i, j, 3] < bbox[i, j, 1]:
						__snake_case	:						List[Any]						=				bbox[i, j, 3]
						__snake_case	:						Optional[int]						=				bbox[i, j, 1]
						__snake_case	:						List[str]						=				t
					if bbox[i, j, 2] < bbox[i, j, 0]:
						__snake_case	:						Optional[Any]						=				bbox[i, j, 2]
						__snake_case	:						List[Any]						=				bbox[i, j, 0]
						__snake_case	:						List[Any]						=				t

			__snake_case	:						Optional[Any]						=				None
			if self.use_input_mask:
				__snake_case	:						Dict						=				ids_tensor([self.batch_size, self.seq_length]				,       vocab_size=2					)

			__snake_case	:						str						=				None
			if self.use_token_type_ids:
				__snake_case	:						List[Any]						=				ids_tensor([self.batch_size, self.seq_length]				,       self.type_vocab_size					)

			__snake_case	:						Any						=				None
			__snake_case	:						Dict						=				None
			if self.use_labels:
				__snake_case	:						List[Any]						=				ids_tensor([self.batch_size]				,       self.type_sequence_label_size					)
				__snake_case	:						Union[str, Any]						=				ids_tensor([self.batch_size, self.seq_length]				,       self.num_labels					)

			__snake_case	:						List[str]						=				self.get_config()

			return config, input_ids, bbox, token_type_ids, input_mask, sequence_labels, token_labels



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return LiltConfig(
			    vocab_size=self.vocab_size				,       hidden_size=self.hidden_size				,       num_hidden_layers=self.num_hidden_layers				,       num_attention_heads=self.num_attention_heads				,       intermediate_size=self.intermediate_size				,       hidden_act=self.hidden_act				,       hidden_dropout_prob=self.hidden_dropout_prob				,       attention_probs_dropout_prob=self.attention_probs_dropout_prob				,       max_position_embeddings=self.max_position_embeddings				,       type_vocab_size=self.type_vocab_size				,       initializer_range=self.initializer_range				,       )



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       ):





			'''simple docstring'''

			__snake_case	:						int						=				LiltModel(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						List[Any]						=				model(a_				,       bbox=a_				,       attention_mask=a_				,       token_type_ids=a_					)
			__snake_case	:						List[str]						=				model(a_				,       bbox=a_				,       token_type_ids=a_					)
			__snake_case	:						str						=				model(a_				,       bbox=a_					)

			self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.hidden_size)					)
			self.parent.assertEqual(result.pooler_output.shape				,       (self.batch_size, self.hidden_size)					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       ):





			'''simple docstring'''

			__snake_case	:						Optional[int]						=				self.num_labels
			__snake_case	:						Tuple						=				LiltForTokenClassification(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						Any						=				model(
			    a_				,       bbox=a_				,       attention_mask=a_				,       token_type_ids=a_				,       labels=a_					)
			self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.seq_length, self.num_labels)					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       a_				,       ):





			'''simple docstring'''

			__snake_case	:						str						=				LiltForQuestionAnswering(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						str						=				model(
			    a_				,       bbox=a_				,       attention_mask=a_				,       token_type_ids=a_				,       start_positions=a_				,       end_positions=a_				,       )
			self.parent.assertEqual(result.start_logits.shape				,       (self.batch_size, self.seq_length)					)
			self.parent.assertEqual(result.end_logits.shape				,       (self.batch_size, self.seq_length)					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						str						=				self.prepare_config_and_inputs()
			(
			    (
			    __snake_case
			)	,							(
			    __snake_case
			)	,							(
			    __snake_case
			)	,							(
			    __snake_case
			)	,							(
			    __snake_case
			)	,							(
			    __snake_case
			)	,							(
			    __snake_case
			)	,							
			)	:						Tuple						=				config_and_inputs
			__snake_case	:						Optional[int]						=				{
			    '''input_ids''': input_ids,
			    '''bbox''': bbox,
			    '''token_type_ids''': token_type_ids,
			    '''attention_mask''': input_mask,
			}
			return config, inputs_dict



@require_torch
class 			_UpperCAmelCase (							__snake_case,				__snake_case,				__snake_case,				unittest.TestCase				):






		'''simple docstring'''

		lowerCamelCase__				=(
		    (
		        LiltModel,
		        LiltForSequenceClassification,
		        LiltForTokenClassification,
		        LiltForQuestionAnswering,
		    )
		    if is_torch_available()
		    else ()
		)
		lowerCamelCase__				=(
		    {
		        'feature-extraction': LiltModel,
		        'question-answering': LiltForQuestionAnswering,
		        'text-classification': LiltForSequenceClassification,
		        'token-classification': LiltForTokenClassification,
		        'zero-shot': LiltForSequenceClassification,
		    }
		    if is_torch_available()
		    else {}
		)
		lowerCamelCase__				=False
		lowerCamelCase__				=False



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			return True



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				LiltModelTester(self					)
			__snake_case	:						Any						=				ConfigTester(self				,       config_class=a_				,       hidden_size=37					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			self.config_tester.run_common_tests()



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Dict						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_model(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[str]						=				self.model_tester.prepare_config_and_inputs()
			for type in ["absolute", "relative_key", "relative_key_query"]:
				__snake_case	:						Tuple						=				type
				self.model_tester.create_and_check_model(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						int						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_for_token_classification(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_for_question_answering(*a_					)



		@slow
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			for model_name in LILT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
				__snake_case	:						int						=				LiltModel.from_pretrained(a_					)
				self.assertIsNotNone(a_					)



@require_torch
@slow
class 			_UpperCAmelCase (							unittest.TestCase				):






		'''simple docstring'''

		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Optional[Any]						=				LiltModel.from_pretrained('''SCUT-DLVCLab/lilt-roberta-en-base'''					).to(a_					)

			__snake_case	:						Tuple						=				torch.tensor([[1, 2]]				,       device=a_					)
			__snake_case	:						List[str]						=				torch.tensor([[[1, 2, 3, 4], [5, 6, 7, 8]]]				,       device=a_					)

			# forward pass
			with torch.no_grad():
				__snake_case	:						List[Any]						=				model(input_ids=a_				,       bbox=a_					)

			__snake_case	:						Dict						=				torch.Size([1, 2, 7_68]					)
			__snake_case	:						Optional[int]						=				torch.tensor(
			    [[-0.0653, 0.0950, -0.0061], [-0.0545, 0.0926, -0.0324]]				,       device=a_				,       )

			self.assertTrue(outputs.last_hidden_state.shape				,       a_					)
			self.assertTrue(torch.allclose(outputs.last_hidden_state[0, :, :3]				,       a_				,       atol=1E-3					)					)









"""simple docstring"""
def 		lowercase							(     _snake_case						:      int     ,   _snake_case						:      int     )     ->str:
	"""simple docstring"""





	if a < 0 or b < 0:
		raise ValueError('''the value of both inputs must be positive'''     )
	__snake_case	:						Tuple						=				str(bin(_snake_case     )     )[2:]  # remove the leading "0b"
	__snake_case	:						List[Any]						=				str(bin(_snake_case     )     )[2:]
	__snake_case	:						Any						=				max(len(_snake_case     )     ,   len(_snake_case     )     )
	return "0b" + "".join(
	    str(int('''1''' in (char_a, char_b)     )     )
	    for char_a, char_b in zip(a_binary.zfill(_snake_case     )     ,   b_binary.zfill(_snake_case     )     )     )


if __name__ == "__main__":
			import doctest

			doctest.testmod()





