


'''simple docstring'''

import unittest

import numpy as np

from transformers.testing_utils import require_torch, require_vision
from transformers.utils import is_torch_available, is_vision_available

from ...test_image_processing_common import ImageProcessingSavingTestMixin


if is_torch_available():
 import torch

if is_vision_available():
 from PIL import Image

 from transformers import SwinaSRImageProcessor
 from transformers.image_transforms import get_image_size
class 						__lowerCAmelCase		(unittest.TestCase  ):





      '''simple docstring'''






      def __init__(self					:					Any     ,		UpperCamelCase					:					List[Any]     ,		UpperCamelCase					:					Optional[Any]=7     ,		UpperCamelCase					:					int=3     ,		UpperCamelCase					:					Dict=18     ,		UpperCamelCase					:					Any=30     ,		UpperCamelCase					:					Any=400     ,		UpperCamelCase					:					Dict=True     ,		UpperCamelCase					:					Dict=1 / 255     ,		UpperCamelCase					:					List[Any]=True     ,		UpperCamelCase					:					Dict=8     ,		):

             '''simple docstring'''







             lowercase__       =				parent
             lowercase__       =				batch_size
             lowercase__       =				num_channels
             lowercase__       =				image_size
             lowercase__       =				min_resolution
             lowercase__       =				max_resolution
             lowercase__       =				do_rescale
             lowercase__       =				rescale_factor
             lowercase__       =				do_pad
             lowercase__       =				pad_size



      def    UpperCamelCase__	(self					:					int				):

             '''simple docstring'''







             return {
                 "do_rescale": self.do_rescale,
                 "rescale_factor": self.rescale_factor,
                 "do_pad": self.do_pad,
                 "pad_size": self.pad_size,
             }






      def    UpperCamelCase__	(self					:					List[str]     ,		UpperCamelCase					:					Union[str, Any]=False     ,		UpperCamelCase					:					Optional[int]=False     ,		UpperCamelCase					:					Any=False				):

             '''simple docstring'''







             assert not (numpify and torchify), "You cannot specify both numpy and PyTorch tensors at the same time"

             if equal_resolution:
                    lowercase__       =				[]
                    for i in range(self.batch_size				):
                           image_inputs.append(
                               np.random.randint(
                                   255     ,		size=(self.num_channels, self.max_resolution, self.max_resolution)     ,		dtype=np.uinta				)				)
             else:
                    lowercase__       =				[]
                    for i in range(self.batch_size				):
                           lowercase__    ,lowercase__       =				np.random.choice(np.arange(self.min_resolution     ,		self.max_resolution				)     ,		2				)
                           image_inputs.append(np.random.randint(255     ,		size=(self.num_channels, width, height)     ,		dtype=np.uinta				)				)

             if not numpify and not torchify:
                    # PIL expects the channel dimension as last dimension
                    lowercase__       =				[Image.fromarray(np.moveaxis(UpperCamelCase     ,		0     ,		-1				)				) for x in image_inputs]

             if torchify:
                    lowercase__       =				[torch.from_numpy(UpperCamelCase				) for x in image_inputs]

             return image_inputs






@require_torch
@require_vision
class 						__lowerCAmelCase		(lowercase_						,  unittest.TestCase  ):





      '''simple docstring'''






      lowerCAmelCase__      :  Optional[Any]						      =							SwinaSRImageProcessor if is_vision_available() else None



      def    UpperCamelCase__	(self					:					Any				):

             '''simple docstring'''







             lowercase__       =				SwinaSRImageProcessingTester(self				)



      @property
      def    UpperCamelCase__	(self					:					List[Any]				):

             '''simple docstring'''







             return self.image_processor_tester.prepare_image_processor_dict()



      def    UpperCamelCase__	(self					:					Optional[int]				):

             '''simple docstring'''







             lowercase__       =				self.image_processing_class(**self.image_processor_dict				)
             self.assertTrue(hasattr(UpperCamelCase     ,		'''do_rescale'''				)				)
             self.assertTrue(hasattr(UpperCamelCase     ,		'''rescale_factor'''				)				)
             self.assertTrue(hasattr(UpperCamelCase     ,		'''do_pad'''				)				)
             self.assertTrue(hasattr(UpperCamelCase     ,		'''pad_size'''				)				)



      def    UpperCamelCase__	(self					:					Optional[Any]				):

             '''simple docstring'''







             pass



      def    UpperCamelCase__	(self					:					Any     ,		UpperCamelCase					:					str				):

             '''simple docstring'''







             lowercase__    ,lowercase__       =				get_image_size(UpperCamelCase				)
             lowercase__       =				self.image_processor_tester.pad_size

             lowercase__       =				(old_height // size + 1) * size - old_height
             lowercase__       =				(old_width // size + 1) * size - old_width
             return old_height + pad_height, old_width + pad_width



      def    UpperCamelCase__	(self					:					str				):

             '''simple docstring'''







             lowercase__       =				self.image_processing_class(**self.image_processor_dict				)
             # create random PIL images
             lowercase__       =				self.image_processor_tester.prepare_inputs(equal_resolution=UpperCamelCase				)
             for image in image_inputs:
                    self.assertIsInstance(UpperCamelCase     ,		Image.Image				)

             # Test not batched input
             lowercase__       =				image_processor(image_inputs[0]     ,		return_tensors='''pt'''				).pixel_values
             lowercase__    ,lowercase__       =				self.calculate_expected_size(np.array(image_inputs[0]				)				)
             self.assertEqual(
                 encoded_images.shape     ,		(
                     1,
                     self.image_processor_tester.num_channels,
                     expected_height,
                     expected_width,
                 )     ,		)



      def    UpperCamelCase__	(self					:					Tuple				):

             '''simple docstring'''







             lowercase__       =				self.image_processing_class(**self.image_processor_dict				)
             # create random numpy tensors
             lowercase__       =				self.image_processor_tester.prepare_inputs(equal_resolution=UpperCamelCase     ,		numpify=UpperCamelCase				)
             for image in image_inputs:
                    self.assertIsInstance(UpperCamelCase     ,		np.ndarray				)

             # Test not batched input
             lowercase__       =				image_processor(image_inputs[0]     ,		return_tensors='''pt'''				).pixel_values
             lowercase__    ,lowercase__       =				self.calculate_expected_size(image_inputs[0]				)
             self.assertEqual(
                 encoded_images.shape     ,		(
                     1,
                     self.image_processor_tester.num_channels,
                     expected_height,
                     expected_width,
                 )     ,		)






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

             '''simple docstring'''







             lowercase__       =				self.image_processing_class(**self.image_processor_dict				)
             # create random PyTorch tensors
             lowercase__       =				self.image_processor_tester.prepare_inputs(equal_resolution=UpperCamelCase     ,		torchify=UpperCamelCase				)
             for image in image_inputs:
                    self.assertIsInstance(UpperCamelCase     ,		torch.Tensor				)

             # Test not batched input
             lowercase__       =				image_processor(image_inputs[0]     ,		return_tensors='''pt'''				).pixel_values
             lowercase__    ,lowercase__       =				self.calculate_expected_size(image_inputs[0]				)
             self.assertEqual(
                 encoded_images.shape     ,		(
                     1,
                     self.image_processor_tester.num_channels,
                     expected_height,
                     expected_width,
                 )     ,		)








'''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)




