





'''simple docstring'''





import os

from ...utils import logging
from .utils import DataProcessor, InputExample


_A				:							Union[str, Any]							= logging.get_logger(__name__)



class 				__snake_case  (     __SCREAMING_SNAKE_CASE						):


    '''simple docstring'''







    def __init__(					self      ,							A_      ,							A_=None    ):





        '''simple docstring'''

        SCREAMING_SNAKE_CASE__       							= language
        SCREAMING_SNAKE_CASE__       							= train_language



    def    lowercase_				(					self      ,							A_    ):





        '''simple docstring'''

        SCREAMING_SNAKE_CASE__       							= self.language if self.train_language is None else self.train_language
        SCREAMING_SNAKE_CASE__       							= self._read_tsv(os.path.join(A_      ,							f'''XNLI-MT-1.0/multinli/multinli.train.{lg}.tsv'''    )    )
        SCREAMING_SNAKE_CASE__       							= []
        for i, line in enumerate(A_    ):
            if i == 0:
                continue
            SCREAMING_SNAKE_CASE__       							= f'''train-{i}'''
            SCREAMING_SNAKE_CASE__       							= line[0]
            SCREAMING_SNAKE_CASE__       							= line[1]
            SCREAMING_SNAKE_CASE__       							= '''contradiction''' if line[2] == '''contradictory''' else line[2]
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training input {text_a} is not a string'''    )
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training input {text_b} is not a string'''    )
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training label {label} is not a string'''    )
            examples.append(InputExample(guid=A_      ,							text_a=A_      ,							text_b=A_      ,							label=A_    )    )
        return examples



    def    lowercase_				(					self      ,							A_    ):





        '''simple docstring'''

        SCREAMING_SNAKE_CASE__       							= self._read_tsv(os.path.join(A_      ,							'''XNLI-1.0/xnli.test.tsv'''    )    )
        SCREAMING_SNAKE_CASE__       							= []
        for i, line in enumerate(A_    ):
            if i == 0:
                continue
            SCREAMING_SNAKE_CASE__       							= line[0]
            if language != self.language:
                continue
            SCREAMING_SNAKE_CASE__       							= f'''test-{i}'''
            SCREAMING_SNAKE_CASE__       							= line[6]
            SCREAMING_SNAKE_CASE__       							= line[7]
            SCREAMING_SNAKE_CASE__       							= line[1]
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training input {text_a} is not a string'''    )
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training input {text_b} is not a string'''    )
            if not isinstance(A_      ,							A_    ):
                raise ValueError(f'''Training label {label} is not a string'''    )
            examples.append(InputExample(guid=A_      ,							text_a=A_      ,							text_b=A_      ,							label=A_    )    )
        return examples




    def    lowercase_				(					self    ):





        '''simple docstring'''

        return ["contradiction", "entailment", "neutral"]





_A				:							Dict							= {
    """xnli""": XnliProcessor,
}

_A				:							List[str]							= {
    """xnli""": """classification""",
}

_A				:							Union[str, Any]							= {
    """xnli""": 3,
}







import torch

from transformers import AutoTokenizer



class 				__snake_case  (     __SCREAMING_SNAKE_CASE						):


    '''simple docstring'''







    def __init__(					self      ,							A_    ):





        '''simple docstring'''

        SCREAMING_SNAKE_CASE__       							= AutoTokenizer.from_pretrained(A_    )



    def    lowercase_				(					self      ,							A_    ):





        '''simple docstring'''

        if isinstance(A_      ,							A_    ) and all(isinstance(_x      ,							A_    ) for _x in x    ):
            SCREAMING_SNAKE_CASE__       							= None
            for l in x:
                SCREAMING_SNAKE_CASE__       							= self.tokenizer(
                    A_      ,							padding='''max_length'''      ,							max_length=3_84      ,							truncation=A_      ,							return_tensors='''pt'''      ,							)
                SCREAMING_SNAKE_CASE__       							= torch.tensor([len(A_    )]    )
                if d is not None:
                    for k in d.keys():
                        SCREAMING_SNAKE_CASE__       							= torch.cat((d[k], t[k])      ,							0    )
                else:
                    SCREAMING_SNAKE_CASE__       							= t

            SCREAMING_SNAKE_CASE__       							= torch.tensor(self.tokenizer.convert_tokens_to_ids('''[E]'''    )    )
            SCREAMING_SNAKE_CASE__       							= torch.tensor(self.tokenizer.convert_tokens_to_ids('''[/E]'''    )    )

        elif isinstance(A_      ,							A_    ) and all(isinstance(_x      ,							A_    ) for _x in x    ):
            SCREAMING_SNAKE_CASE__       							= self.tokenizer(
                A_      ,							padding='''max_length'''      ,							max_length=3_84      ,							truncation=A_      ,							return_tensors='''pt'''      ,							)

        else:
            raise Exception(
                '''Type of parameter x was not recognized! Only `list of strings` for query or `list of lists of'''
                ''' strings` for supports are supported.'''    )

        return d




    def    lowercase_				(					self      ,							A_      ,							A_      ,							A_      ,							A_      ,							A_=0.70    ):





        '''simple docstring'''

        SCREAMING_SNAKE_CASE__       							= []
        for idx in range(len(W_query['''input_ids''']    )    ):
            SCREAMING_SNAKE_CASE__       							= SCREAMING_SNAKE_CASE__       							= range(p_start.shape[1]    )

            SCREAMING_SNAKE_CASE__       							= []
            for start_id in start_indexes:
                for end_id in end_indexes:
                    if start_id < end_id:
                        output.append(
                            (
                                start_id,
                                end_id,
                                p_start[idx][start_id].item(),
                                p_end[idx][end_id].item(),
                            )    )

            output.sort(key=lambda A_    : (tup[2] * tup[3])      ,							reverse=A_    )
            SCREAMING_SNAKE_CASE__       							= []
            for k in range(len(A_    )    ):
                if output[k][2] * output[k][3] >= thresh:
                    SCREAMING_SNAKE_CASE__							,		SCREAMING_SNAKE_CASE__       							= output[k][0], output[k][1]
                    SCREAMING_SNAKE_CASE__       							= self.tokenizer.decode(W_query['''input_ids'''][idx][c_start_pos:c_end_pos]    )
                    temp.append((decoded, output[k][2] * output[k][3])    )

            final_outputs.append(A_    )

        return final_outputs
