


'''simple docstring'''

import dataclasses
import enum
import functools
import math
import re

# The following script is adapted from the script of TaPas.
# Original: https://github.com/google-research/tapas/master/wikisql_utils.py
from typing import Any, List, Text


lowerCamelCase							:     Any								=			'none'
lowerCamelCase							:     List[str]								=			'none'

def _SCREAMING_SNAKE_CASE   (A						,				A ) -> Optional[Any]:






       """simple docstring"""







       lowercase__       =				value.split(A )
       return len(A ) > 1 and any((len(A ) == 3 for x in split) )

def _SCREAMING_SNAKE_CASE   (A ) -> Dict:






       """simple docstring"""







       if isinstance(A						,				A ):
              return value
       if isinstance(A						,				A ):
              return float(A )
       if not isinstance(A						,				A ):
              raise ValueError('''Argument value is not a string. Can\'t parse it as float''' )
       lowercase__       =				value

       try:
              # Example: 1,000.7
              if "." in sanitized and "," in sanitized:
                     return float(sanitized.replace(''','''						,				'''''' ) )
              # 1,000
              if "," in sanitized and _split_thousands(''','''						,				A ):
                     return float(sanitized.replace(''','''						,				'''''' ) )
              # 5,5556
              if "," in sanitized and sanitized.count(''',''' ) == 1 and not _split_thousands(''','''						,				A ):
                     return float(sanitized.replace(''','''						,				'''.''' ) )
              # 0.0.0.1
              if sanitized.count('''.''' ) > 1:
                     return float(sanitized.replace('''.'''						,				'''''' ) )
              # 0,0,0,1
              if sanitized.count(''',''' ) > 1:
                     return float(sanitized.replace(''','''						,				'''''' ) )
              return float(A )
       except ValueError:
              # Avoid adding the sanitized value in the error message.
              raise ValueError('''Unable to convert value to float''' )

def _SCREAMING_SNAKE_CASE   (A ) -> Union[str, Any]:






       """simple docstring"""







       if answer is None:
              return None
       try:
              lowercase__       =				convert_to_float(A )
              if isinstance(A						,				A ) and math.isnan(A ):
                     return None
              return value
       except ValueError:
              return answer.lower()


lowerCamelCase							:     List[Any]								=			{
    'text': lambda x: x,
    'real': convert_to_float,
}
class 						__lowerCAmelCase		(enum.Enum  ):





      '''simple docstring'''






      lowerCAmelCase__      :  int						      =							0
      lowerCAmelCase__      :  Dict						      =							1
      lowerCAmelCase__      :  Dict						      =							2
      lowerCAmelCase__      :  str						      =							3
      lowerCAmelCase__      :  Optional[Any]						      =							4
      lowerCAmelCase__      :  List[str]						      =							5






class 						__lowerCAmelCase		(enum.Enum  ):





      '''simple docstring'''






      lowerCAmelCase__      :  Dict						      =							0
      lowerCAmelCase__      :  Union[str, Any]						      =							1
      lowerCAmelCase__      :  Tuple						      =							2






@dataclasses.dataclass
class 						__lowerCAmelCase		:





      '''simple docstring'''






      lowerCAmelCase__      :  Text
      lowerCAmelCase__      :  _Operator
      lowerCAmelCase__      :  Any






lowerCamelCase							:     Union[str, Any]								=			re.compile(R'\w+|[^\w\s]+', re.UNICODE | re.MULTILINE | re.DOTALL)

def _SCREAMING_SNAKE_CASE   (A ) -> List[str]:






       """simple docstring"""







       return list(_TOKENIZER.findall(x.lower() ) )

def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> Tuple:






       """simple docstring"""







       if operator == _Operator.EQUALS:
              return src == tgt
       elif operator == _Operator.GREATER:
              return src > tgt
       elif operator == _Operator.LESSER:
              return src < tgt
       raise ValueError(f"Unknown operator: {operator}" )

def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> Dict:






       """simple docstring"""







       lowercase__       =				table['''types''']
       return _TYPE_CONVERTER[types[column]](A )

def _SCREAMING_SNAKE_CASE   (A ) -> List[str]:






       """simple docstring"""







       return isinstance(A						,				A )

def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> Any:






       """simple docstring"""







       for cond in conditions:
              lowercase__       =				row[cond.column]

              lowercase__       =				_parse_value(A						,				cond.column						,				cond.cmp_value )

              if _is_string(A ) and _is_string(A ):
                     lowercase__       =				_normalize_for_match(A )
                     lowercase__       =				_normalize_for_match(A )

              if not isinstance(A						,				type(A ) ):
                     raise ValueError('''Type difference {} != {}'''.format(type(A )						,				type(A ) ) )

              if not _compare(cond.operator						,				A						,				A ):
                     return False
       return True

def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> Tuple:






       """simple docstring"""







       if not answer_coordinates:
              if aggregation_op == _Aggregation.COUNT:
                     return 0.0
              else:
                     return EMPTY_ANSWER_AGG

    # Count can support non numeric answers.
       if aggregation_op == _Aggregation.COUNT:
              return float(len(A ) )

       # If we have just one answer, if float returns it or try a conversion.
       lowercase__       =				[table['''rows'''][i][j] for (i, j) in answer_coordinates]
       if len(A ) == 1:
              try:
                     return convert_to_float(values[0] )
              except ValueError as e:
                     if aggregation_op != _Aggregation.NONE:
                            raise e

       if aggregation_op == _Aggregation.NONE:
              return None

       # Other aggregation only support numeric values. Bail out if we have strings.
       if not all((isinstance(A						,				(int, float) ) for v in values) ):
              return None

       if aggregation_op == _Aggregation.SUM:
              return float(sum(A ) )
       elif aggregation_op == _Aggregation.AVERAGE:
              return sum(A ) / len(A )
       else:
              raise ValueError(f"Unknown aggregation: {aggregation_op}" )

def _SCREAMING_SNAKE_CASE   (A						,				A ) -> List[str]:






       """simple docstring"""







       lowercase__       =				sql_query['''agg''']
       if aggregation_op_index >= 3:
              lowercase__       =				_Aggregation(A )
       else:
              lowercase__       =				_Aggregation.NONE

       lowercase__       =				sql_query['''sel''']
       lowercase__       =				[
           _Condition(A						,				_Operator(A )						,				A )
           for column, operator, cmp_value in zip(
               sql_query['''conds''']['''column_index''']						,				sql_query['''conds''']['''operator_index''']						,				sql_query['''conds''']['''condition'''] )
       ]

       lowercase__       =				[]
       for row in range(len(table['''rows'''] ) ):
              if _respect_conditions(A						,				table['''rows'''][row]						,				A ):
                     indices.append((row, target_column) )

       if not indices:
              return [], aggregation_op

       if len(A ) == 1:
              return indices, aggregation_op

       # Parsing of MIN/MAX.
       if aggregation_op_index in (1, 2):
              lowercase__       =				{2: min, 1: max}
              lowercase__       =				[(table['''rows'''][i][j], index) for index, (i, j) in enumerate(A )]
              lowercase__       =				functools.reduce(operators[sql_query['''agg''']]						,				A )

              lowercase__       =				[indices[reduced[1]]]
              return ret, _Aggregation.NONE

       return indices, aggregation_op

def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> List[str]:






       """simple docstring"""







       if float_answer is not None:
              return [str(A )]
       return [str(table['''real_rows'''][r][c] ) for r, c in answer_coordinates]

def _SCREAMING_SNAKE_CASE   (A						,				A ) -> List:






       """simple docstring"""







       lowercase__    ,lowercase__       =				_get_answer_coordinates(A						,				A )
       lowercase__       =				_get_float_answer(A						,				A						,				A )
       lowercase__       =				_get_answer_text(A						,				A						,				A )
       # keep the original data the same with TaPas
       if len(A ) == 0:
              lowercase__       =				[EMPTY_ANSWER]
       return answer_text








'''simple docstring'''

import argparse
import collections
from pathlib import Path

import torch
from torch.serialization import default_restore_location

from transformers import BertConfig, DPRConfig, DPRContextEncoder, DPRQuestionEncoder, DPRReader


lowerCamelCase							:     List[str]								=			collections.namedtuple(
    'CheckpointState', ['model_dict', 'optimizer_dict', 'scheduler_dict', 'offset', 'epoch', 'encoder_params']
)

def _SCREAMING_SNAKE_CASE   (A ) -> CheckpointState:






       """simple docstring"""







       print(f"Reading saved model from {model_file}" )
       lowercase__       =				torch.load(A						,				map_location=lambda A						,				A : default_restore_location(A						,				'''cpu''' ) )
       return CheckpointState(**A )
class 						__lowerCAmelCase		:





      '''simple docstring'''






      def __init__(self					:					Any     ,		UpperCamelCase					:					Path				):

             '''simple docstring'''







             lowercase__       =				src_file



      def    UpperCamelCase__	(self					:					List[str]				):

             '''simple docstring'''







             raise NotImplementedError






      @staticmethod
      def    UpperCamelCase__	(UpperCamelCase					:					str     ,		*UpperCamelCase					:					Dict     ,		**UpperCamelCase					:					int				):

             '''simple docstring'''







             if comp_type.startswith('''c'''				):
                    return DPRContextEncoderState(*UpperCamelCase     ,		**UpperCamelCase				)
             if comp_type.startswith('''q'''				):
                    return DPRQuestionEncoderState(*UpperCamelCase     ,		**UpperCamelCase				)
             if comp_type.startswith('''r'''				):
                    return DPRReaderState(*UpperCamelCase     ,		**UpperCamelCase				)
             else:
                    raise ValueError('''Component type must be either \'ctx_encoder\', \'question_encoder\' or \'reader\'.'''				)






class 						__lowerCAmelCase		(lowercase_  ):





      '''simple docstring'''






      def    UpperCamelCase__	(self					:					Any				):

             '''simple docstring'''







             lowercase__       =				DPRContextEncoder(DPRConfig(**BertConfig.get_config_dict('''bert-base-uncased'''				)[0]				)				)
             print(f"Loading DPR biencoder from {self.src_file}"				)
             lowercase__       =				load_states_from_checkpoint(self.src_file				)
             lowercase__    ,lowercase__       =				model.ctx_encoder, '''ctx_model.'''
             # Fix changes from https://github.com/huggingface/transformers/commit/614fef1691edb806de976756d4948ecbcd0c0ca3
             lowercase__       =				{'''bert_model.embeddings.position_ids''': model.ctx_encoder.bert_model.embeddings.position_ids}
             for key, value in saved_state.model_dict.items():
                    if key.startswith(UpperCamelCase				):
                           lowercase__       =				key[len(UpperCamelCase				) :]
                           if not key.startswith('''encode_proj.'''				):
                                  lowercase__       =				'''bert_model.''' + key
                           lowercase__       =				value
             encoder.load_state_dict(UpperCamelCase				)
             return model






class 						__lowerCAmelCase		(lowercase_  ):





      '''simple docstring'''






      def    UpperCamelCase__	(self					:					Union[str, Any]				):

             '''simple docstring'''







             lowercase__       =				DPRQuestionEncoder(DPRConfig(**BertConfig.get_config_dict('''bert-base-uncased'''				)[0]				)				)
             print(f"Loading DPR biencoder from {self.src_file}"				)
             lowercase__       =				load_states_from_checkpoint(self.src_file				)
             lowercase__    ,lowercase__       =				model.question_encoder, '''question_model.'''
             # Fix changes from https://github.com/huggingface/transformers/commit/614fef1691edb806de976756d4948ecbcd0c0ca3
             lowercase__       =				{'''bert_model.embeddings.position_ids''': model.question_encoder.bert_model.embeddings.position_ids}
             for key, value in saved_state.model_dict.items():
                    if key.startswith(UpperCamelCase				):
                           lowercase__       =				key[len(UpperCamelCase				) :]
                           if not key.startswith('''encode_proj.'''				):
                                  lowercase__       =				'''bert_model.''' + key
                           lowercase__       =				value
             encoder.load_state_dict(UpperCamelCase				)
             return model






class 						__lowerCAmelCase		(lowercase_  ):





      '''simple docstring'''






      def    UpperCamelCase__	(self					:					Optional[Any]				):

             '''simple docstring'''







             lowercase__       =				DPRReader(DPRConfig(**BertConfig.get_config_dict('''bert-base-uncased'''				)[0]				)				)
             print(f"Loading DPR reader from {self.src_file}"				)
             lowercase__       =				load_states_from_checkpoint(self.src_file				)
             # Fix changes from https://github.com/huggingface/transformers/commit/614fef1691edb806de976756d4948ecbcd0c0ca3
             lowercase__       =				{
                 '''encoder.bert_model.embeddings.position_ids''': model.span_predictor.encoder.bert_model.embeddings.position_ids
             }
             for key, value in saved_state.model_dict.items():
                    if key.startswith('''encoder.'''				) and not key.startswith('''encoder.encode_proj'''				):
                           lowercase__       =				'''encoder.bert_model.''' + key[len('''encoder.'''				) :]
                    lowercase__       =				value
             model.span_predictor.load_state_dict(UpperCamelCase				)
             return model






def _SCREAMING_SNAKE_CASE   (A						,				A						,				A ) -> Optional[Any]:






       """simple docstring"""







       lowercase__       =				Path(A )
       dest_dir.mkdir(exist_ok=A )

       lowercase__       =				DPRState.from_type(A						,				src_file=A )
       lowercase__       =				dpr_state.load_dpr_model()
       model.save_pretrained(A )
       model.from_pretrained(A )  # sanity check


if __name__ == "__main__":
 lowerCamelCase							:     List[Any]								=			argparse.ArgumentParser()
 # Required parameters
 parser.add_argument(
     '--type', type=str, help='Type of the component to convert: \'ctx_encoder\', \'question_encoder\' or \'reader\'.'
 )
 parser.add_argument(
     '--src',
     type=str,
     help=(
         'Path to the dpr checkpoint file. They can be downloaded from the official DPR repo'
         ' https://github.com/facebookresearch/DPR. Note that in the official repo, both encoders are stored in the'
         ' \'retriever\' checkpoints.'
     ),
 )
 parser.add_argument('--dest', type=str, default=None, help='Path to the output PyTorch model directory.')
 lowerCamelCase							:     Optional[int]								=			parser.parse_args()

 lowerCamelCase							:     List[str]								=			Path(args.src)
 lowerCamelCase							:     List[Any]								=			f"""converted-{src_file.name}""" if args.dest is None else args.dest
 lowerCamelCase							:     Optional[int]								=			Path(dest_dir)
 assert src_file.exists()
 assert (
     args.type is not None
 ), "Please specify the component type of the DPR model to convert: 'ctx_encoder', 'question_encoder' or 'reader'."
 convert(args.type, src_file, dest_dir)




