
"""simple docstring"""




import argparse
from pathlib import Path

import requests
import torch
from PIL import Image

from transformers import (
    RobertaTokenizer,
    TrOCRConfig,
    TrOCRForCausalLM,
    TrOCRProcessor,
    VisionEncoderDecoderModel,
    ViTConfig,
    ViTImageProcessor,
    ViTModel,
)
from transformers.utils import logging


logging.set_verbosity_info()
a		:       List[Any]     						=       logging.get_logger(__name__)



def     __magic_name__		(					UpperCamelCase     :		List[str]							,		UpperCamelCase     :		str     )     ->						Dict:
    a__		=			[]
    for i in range(encoder_config.num_hidden_layers     ):
        # encoder layers: output projection, 2 feedforward neural networks and 2 layernorms
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.norm1.weight', f'encoder.encoder.layer.{i}.layernorm_before.weight')     )
        rename_keys.append((f'encoder.deit.blocks.{i}.norm1.bias', f'encoder.encoder.layer.{i}.layernorm_before.bias')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.attn.proj.weight', f'encoder.encoder.layer.{i}.attention.output.dense.weight')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.attn.proj.bias', f'encoder.encoder.layer.{i}.attention.output.dense.bias')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.norm2.weight', f'encoder.encoder.layer.{i}.layernorm_after.weight')     )
        rename_keys.append((f'encoder.deit.blocks.{i}.norm2.bias', f'encoder.encoder.layer.{i}.layernorm_after.bias')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.mlp.fc1.weight', f'encoder.encoder.layer.{i}.intermediate.dense.weight')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.mlp.fc1.bias', f'encoder.encoder.layer.{i}.intermediate.dense.bias')     )
        rename_keys.append(
            (f'encoder.deit.blocks.{i}.mlp.fc2.weight', f'encoder.encoder.layer.{i}.output.dense.weight')     )
        rename_keys.append((f'encoder.deit.blocks.{i}.mlp.fc2.bias', f'encoder.encoder.layer.{i}.output.dense.bias')     )

    # cls token, position embeddings and patch embeddings of encoder
    rename_keys.extend(
        [
            ('encoder.deit.cls_token', 'encoder.embeddings.cls_token'),
            ('encoder.deit.pos_embed', 'encoder.embeddings.position_embeddings'),
            ('encoder.deit.patch_embed.proj.weight', 'encoder.embeddings.patch_embeddings.projection.weight'),
            ('encoder.deit.patch_embed.proj.bias', 'encoder.embeddings.patch_embeddings.projection.bias'),
            ('encoder.deit.norm.weight', 'encoder.layernorm.weight'),
            ('encoder.deit.norm.bias', 'encoder.layernorm.bias'),
        ]     )

    return rename_keys



def     __magic_name__		(					UpperCamelCase     :		str							,		UpperCamelCase     :		Union[str, Any]     )     ->						Optional[Any]:
    for i in range(encoder_config.num_hidden_layers     ):
        # queries, keys and values (only weights, no biases)
        a__		=			state_dict.pop(f'encoder.deit.blocks.{i}.attn.qkv.weight'     )

        a__		=			in_proj_weight[
            : encoder_config.hidden_size, :
        ]
        a__		=			in_proj_weight[
            encoder_config.hidden_size : encoder_config.hidden_size * 2, :
        ]
        a__		=			in_proj_weight[
            -encoder_config.hidden_size :, :
        ]



def     __magic_name__		(					UpperCamelCase     :		Dict							,		UpperCamelCase     :		Optional[Any]							,		UpperCamelCase     :		int     )     ->						List[str]:
    a__		=			dct.pop(UpperCamelCase     )
    a__		=			val



def     __magic_name__		(					UpperCamelCase     :		Dict     )     ->						Dict:
    if "handwritten" in checkpoint_url:
        a__		=			'https://fki.tic.heia-fr.ch/static/img/a01-122-02-00.jpg'  # industry
        # url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02-12.jpg" # have
        # url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02-10.jpg" # let
        # url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02.jpg"  #
        # url = "https://fki.tic.heia-fr.ch/static/img/a01-122.jpg"
    elif "printed" in checkpoint_url or "stage1" in checkpoint_url:
        a__		=			'https://www.researchgate.net/profile/Dinh-Sang/publication/338099565/figure/fig8/AS:840413229350922@1577381536857/An-receipt-example-in-the-SROIE-2019-dataset_Q640.jpg'
    a__		=			Image.open(requests.get(UpperCamelCase							,		stream=UpperCamelCase     ).raw     ).convert('RGB'     )
    return im



@torch.no_grad()
def     __magic_name__		(					UpperCamelCase     :		List[Any]							,		UpperCamelCase     :		Dict     )     ->						Tuple:
    a__		=			ViTConfig(image_size=384							,		qkv_bias=UpperCamelCase     )
    a__		=			TrOCRConfig()

    # size of the architecture
    if "base" in checkpoint_url:
        a__		=			768
    elif "large" in checkpoint_url:
        # use ViT-large encoder
        a__		=			1024
        a__		=			4096
        a__		=			24
        a__		=			16
        a__		=			1024
    else:
        raise ValueError('Should either find \'base\' or \'large\' in checkpoint URL'     )

    # the large-printed + stage1 checkpoints uses sinusoidal position embeddings, no layernorm afterwards
    if "large-printed" in checkpoint_url or "stage1" in checkpoint_url:
        a__		=			False
        a__		=			'relu'
        a__		=			1024
        a__		=			True
        a__		=			False
        a__		=			False

    # load HuggingFace model
    a__		=			ViTModel(UpperCamelCase							,		add_pooling_layer=UpperCamelCase     )
    a__		=			TrOCRForCausalLM(UpperCamelCase     )
    a__		=			VisionEncoderDecoderModel(encoder=UpperCamelCase							,		decoder=UpperCamelCase     )
    model.eval()

    # load state_dict of original model, rename some keys
    a__		=			torch.hub.load_state_dict_from_url(UpperCamelCase							,		map_location='cpu'							,		check_hash=UpperCamelCase     )['model']

    a__		=			create_rename_keys(UpperCamelCase							,		UpperCamelCase     )
    for src, dest in rename_keys:
        rename_key(UpperCamelCase							,		UpperCamelCase							,		UpperCamelCase     )
    read_in_q_k_v(UpperCamelCase							,		UpperCamelCase     )

    # remove parameters we don't need
    del state_dict["encoder.deit.head.weight"]
    del state_dict["encoder.deit.head.bias"]
    del state_dict["decoder.version"]

    # add prefix to decoder keys
    for key, val in state_dict.copy().items():
        a__		=			state_dict.pop(UpperCamelCase     )
        if key.startswith('decoder'     ) and "output_projection" not in key:
            a__		=			val
        else:
            a__		=			val

    # load state dict
    model.load_state_dict(UpperCamelCase     )

    # Check outputs on an image
    a__		=			ViTImageProcessor(size=encoder_config.image_size     )
    a__		=			RobertaTokenizer.from_pretrained('roberta-large'     )
    a__		=			TrOCRProcessor(UpperCamelCase							,		UpperCamelCase     )

    a__		=			processor(images=prepare_img(UpperCamelCase     )							,		return_tensors='pt'     ).pixel_values

    # verify logits
    a__		=			torch.tensor([[model.config.decoder.decoder_start_token_id]]     )
    a__		=			model(pixel_values=UpperCamelCase							,		decoder_input_ids=UpperCamelCase     )
    a__		=			outputs.logits

    a__		=			torch.Size([1, 1, 50265]     )
    if "trocr-base-handwritten" in checkpoint_url:
        a__		=			torch.tensor(
            [-1.4502, -4.6683, -0.5347, -2.9291, 9.1435, -3.0571, 8.9764, 1.7560, 8.7358, -1.5311]     )
    elif "trocr-large-handwritten" in checkpoint_url:
        a__		=			torch.tensor(
            [-2.6437, -1.3129, -2.2596, -5.3455, 6.3539, 1.7604, 5.4991, 1.4702, 5.6113, 2.0170]     )
    elif "trocr-base-printed" in checkpoint_url:
        a__		=			torch.tensor(
            [-5.6816, -5.8388, 1.1398, -6.9034, 6.8505, -2.4393, 1.2284, -1.0232, -1.9661, -3.9210]     )
    elif "trocr-large-printed" in checkpoint_url:
        a__		=			torch.tensor(
            [-6.0162, -7.0959, 4.4155, -5.1063, 7.0468, -3.1631, 2.6466, -0.3081, -0.8106, -1.7535]     )

    if "stage1" not in checkpoint_url:
        assert logits.shape == expected_shape, "Shape of logits not as expected"
        assert torch.allclose(logits[0, 0, :10]							,		UpperCamelCase							,		atol=1E-3     ), "First elements of logits not as expected"

    Path(UpperCamelCase     ).mkdir(exist_ok=UpperCamelCase     )
    print(f'Saving model to {pytorch_dump_folder_path}'     )
    model.save_pretrained(UpperCamelCase     )
    print(f'Saving processor to {pytorch_dump_folder_path}'     )
    processor.save_pretrained(UpperCamelCase     )


if __name__ == "__main__":
    a		:       Tuple     						=       argparse.ArgumentParser()

    parser.add_argument(
        '--checkpoint_url',
        default='https://layoutlm.blob.core.windows.net/trocr/model_zoo/fairseq/trocr-base-handwritten.pt',
        type=str,
        help='URL to the original PyTorch checkpoint (.pth file).',
    )
    parser.add_argument(
        '--pytorch_dump_folder_path', default=None, type=str, help='Path to the folder to output PyTorch model.'
    )
    a		:       Dict     						=       parser.parse_args()
    convert_tr_ocr_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)




"""simple docstring"""




from itertools import product



def     __magic_name__		(					UpperCamelCase     :		int							,		UpperCamelCase     :		int     )     ->						list[int]:
    a__		=			sides_number
    a__		=			max_face_number * dice_number
    a__		=			[0] * (max_total + 1)

    a__		=			1
    a__		=			range(UpperCamelCase							,		max_face_number + 1     )
    for dice_numbers in product(UpperCamelCase							,		repeat=UpperCamelCase     ):
        a__		=			sum(UpperCamelCase     )
        totals_frequencies[total] += 1

    return totals_frequencies



def     __magic_name__		(					)     ->						float:
    a__		=			total_frequency_distribution(
        sides_number=4							,		dice_number=9     )
    a__		=			total_frequency_distribution(
        sides_number=6							,		dice_number=6     )

    a__		=			0
    a__		=			9
    a__		=			4 * 9
    a__		=			6
    for peter_total in range(UpperCamelCase							,		max_peter_total + 1     ):
        peter_wins_count += peter_totals_frequencies[peter_total] * sum(
            colin_totals_frequencies[min_colin_total:peter_total]     )

    a__		=			(4**9) * (6**6)
    a__		=			peter_wins_count / total_games_number

    a__		=			round(UpperCamelCase							,		ndigits=7     )

    return rounded_peter_win_probability


if __name__ == "__main__":
    print(F'''{solution() = }''')


