






import re
import tempfile
from pathlib import Path

import pytest
import yaml

from datasets.utils.readme import ReadMe


# @pytest.fixture
# def example_yaml_structure():

__snake_case    :    Dict         =     yaml.safe_load(
    """\\nname: \"\"\nallow_empty: false\nallow_empty_text: true\nsubsections:\n  - name: \"Dataset Card for X\" # First-level markdown heading\n    allow_empty: false\n    allow_empty_text: true\n    subsections:\n      - name: \"Table of Contents\"\n        allow_empty: false\n        allow_empty_text: false\n        subsections: null\n      - name: \"Dataset Description\"\n        allow_empty: false\n        allow_empty_text: false\n        subsections:\n          - name: \"Dataset Summary\"\n            allow_empty: false\n            allow_empty_text: false\n            subsections: null\n          - name: \"Supported Tasks and Leaderboards\"\n            allow_empty: true\n            allow_empty_text: true\n            subsections: null\n          - name: Languages\n            allow_empty: false\n            allow_empty_text: true\n            subsections: null\n"""
)


__snake_case    :    Optional[int]         =     {
    "name": "root",
    "text": "",
    "is_empty_text": True,
    "subsections": [
        {
            "name": "Dataset Card for My Dataset",
            "text": "",
            "is_empty_text": True,
            "subsections": [
                {"name": "Table of Contents", "text": "Some text here.", "is_empty_text": False, "subsections": []},
                {
                    "name": "Dataset Description",
                    "text": "Some text here.",
                    "is_empty_text": False,
                    "subsections": [
                        {
                            "name": "Dataset Summary",
                            "text": "Some text here.",
                            "is_empty_text": False,
                            "subsections": [],
                        },
                        {
                            "name": "Supported Tasks and Leaderboards",
                            "text": "",
                            "is_empty_text": True,
                            "subsections": [],
                        },
                        {"name": "Languages", "text": "Language Text", "is_empty_text": False, "subsections": []},
                    ],
                },
            ],
        }
    ],
}


__snake_case    :    Optional[Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"


__snake_case    :    Optional[Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n#### Extra Ignored Subsection\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    Dict         =     {
    "name": "root",
    "text": "",
    "is_empty_text": True,
    "subsections": [
        {
            "name": "Dataset Card for My Dataset",
            "text": "",
            "is_empty_text": True,
            "subsections": [
                {"name": "Table of Contents", "text": "Some text here.", "is_empty_text": False, "subsections": []},
                {
                    "name": "Dataset Description",
                    "text": "Some text here.",
                    "is_empty_text": False,
                    "subsections": [
                        {
                            "name": "Dataset Summary",
                            "text": "Some text here.",
                            "is_empty_text": False,
                            "subsections": [
                                {
                                    "name": "Extra Ignored Subsection",
                                    "text": "",
                                    "is_empty_text": True,
                                    "subsections": [],
                                }
                            ],
                        },
                        {
                            "name": "Supported Tasks and Leaderboards",
                            "text": "",
                            "is_empty_text": True,
                            "subsections": [],
                        },
                        {"name": "Languages", "text": "Language Text", "is_empty_text": False, "subsections": []},
                    ],
                },
            ],
        }
    ],
}

__snake_case    :    str         =     "\\n---\n---\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    Tuple         =     (
    "The following issues were found for the README at `{path}`:\n-\tEmpty YAML markers are present in the README."
)

__snake_case    :    Optional[Any]         =     "\\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    List[Any]         =     (
    "The following issues were found for the README at `{path}`:\n-\tNo YAML markers are present in the README."
)

__snake_case    :    List[str]         =     "\\n---\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    List[str]         =     "The following issues were found for the README at `{path}`:\n-\tOnly the start of YAML tags present in the README."

__snake_case    :    Optional[int]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"
__snake_case    :    Optional[Any]         =     "The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Dataset Summary` but it is empty.\n-\tExpected some text in section `Dataset Summary` but it is empty (text in subsections are ignored)."


__snake_case    :    Optional[Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n"
__snake_case    :    Union[str, Any]         =     "The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Dataset Card for My Dataset` but it is empty.\n-\tSection `Dataset Card for My Dataset` expected the following subsections: `Table of Contents`, `Dataset Description`. Found 'None'."

__snake_case    :    Union[str, Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Languages\nLanguage Text\n"

__snake_case    :    Any         =     "The following issues were found for the README at `{path}`:\n-\tSection `Dataset Description` is missing subsection: `Supported Tasks and Leaderboards`."


__snake_case    :    int         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\n"

__snake_case    :    List[str]         =     "The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Languages` but it is empty."

__snake_case    :    Optional[Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"
__snake_case    :    int         =     "The following issues were found for the README at `{path}`:\n-\tThe README has no first-level headings. One heading is expected. Skipping further validation for this README."

__snake_case    :    List[Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n# Dataset Card My Dataset\n"

__snake_case    :    Optional[int]         =     "The following issues were found for the README at `{path}`:\n-\tThe README has several first-level headings: `Dataset Card for My Dataset`, `Dataset Card My Dataset`. Only one heading is expected. Skipping further validation for this README."

__snake_case    :    int         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    Optional[int]         =     "The following issues were found for the README at `{path}`:\n-\tNo first-level heading starting with `Dataset Card for` found in README. Skipping further validation for this README."

__snake_case    :    List[str]         =     ""

__snake_case    :    str         =     "The following issues were found for the README at `{path}`:\n-\tThe README has no first-level headings. One heading is expected. Skipping further validation for this README.\n-\tNo YAML markers are present in the README."

__snake_case    :    Union[str, Any]         =     "\\n---\nlanguage:\n- zh\n- en\n---\n\n# Dataset Card for My Dataset\n# Dataset Card for My Dataset\n## Table of Contents\nSome text here.\n## Dataset Description\nSome text here.\n### Dataset Summary\nSome text here.\n### Supported Tasks and Leaderboards\n### Languages\nLanguage Text\n"

__snake_case    :    str         =     "The following issues were found while parsing the README at `{path}`:\n-\tMultiple sections with the same heading `Dataset Card for My Dataset` have been found. Please keep only one of these sections."







@pytest.mark.parametrize(
    'readme_md, expected_dict'    ,       [
        (README_CORRECT, CORRECT_DICT),
        (README_CORRECT_FOUR_LEVEL, CORRECT_DICT_FOUR_LEVEL),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					List[Any]    ,       UpperCamelCase_       :					Dict		)  ->   Tuple:

						"""simple docstring"""



						assert ReadMe.from_string(__snake_case    ,       __snake_case		).to_dict() == expected_dict







@pytest.mark.parametrize(
    'readme_md, expected_error'    ,       [
        (README_NO_YAML, EXPECTED_ERROR_README_NO_YAML),
        (README_EMPTY_YAML, EXPECTED_ERROR_README_EMPTY_YAML),
        (README_INCORRECT_YAML, EXPECTED_ERROR_README_INCORRECT_YAML),
        (README_EMPTY, EXPECTED_ERROR_README_EMPTY),
        (README_NONE_SUBSECTION, EXPECTED_ERROR_README_NONE_SUBSECTION),
        (README_MISSING_FIRST_LEVEL, EXPECTED_ERROR_README_MISSING_FIRST_LEVEL),
        (README_MISSING_SUBSECTION, EXPECTED_ERROR_README_MISSING_SUBSECTION),
        (README_MISSING_TEXT, EXPECTED_ERROR_README_MISSING_TEXT),
        (README_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_WRONG_FIRST_LEVEL),
        (README_MULTIPLE_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_MULTIPLE_WRONG_FIRST_LEVEL),
        (README_MISSING_CONTENT, EXPECTED_ERROR_README_MISSING_CONTENT),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					Any    ,       UpperCamelCase_       :					Any		)  ->   Union[str, Any]:

						"""simple docstring"""



						with pytest.raises(__snake_case    ,       match=re.escape(expected_error.format(path='root'		)		)		):
												lowerCAmelCase__    						=						ReadMe.from_string(__snake_case    ,       __snake_case		)
												readme.validate()







@pytest.mark.parametrize(
    'readme_md, expected_error'    ,       [
        (README_MULTIPLE_SAME_HEADING_1, EXPECTED_ERROR_README_MULTIPLE_SAME_HEADING_1),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					List[str]    ,       UpperCamelCase_       :					Optional[Any]		)  ->   Any:

						"""simple docstring"""



						with pytest.raises(__snake_case    ,       match=re.escape(expected_error.format(path='root'		)		)		):
												ReadMe.from_string(__snake_case    ,       __snake_case		)







@pytest.mark.parametrize(
    'readme_md,'    ,       [
        (README_MULTIPLE_SAME_HEADING_1),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					Optional[Any]		)  ->   Dict:

						"""simple docstring"""



						ReadMe.from_string(__snake_case    ,       __snake_case    ,       suppress_parsing_errors=__snake_case		)







@pytest.mark.parametrize(
    'readme_md, expected_dict'    ,       [
        (README_CORRECT, CORRECT_DICT),
        (README_CORRECT_FOUR_LEVEL, CORRECT_DICT_FOUR_LEVEL),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					Any    ,       UpperCamelCase_       :					int		)  ->   str:

						"""simple docstring"""



						with tempfile.TemporaryDirectory() as tmp_dir:
												lowerCAmelCase__    						=						Path(__snake_case		) / "README.md"
												with open(__snake_case    ,       'w+'		) as readme_file:
																		readme_file.write(__snake_case		)
												lowerCAmelCase__    						=						ReadMe.from_readme(__snake_case    ,       __snake_case		).to_dict()
												assert out["name"] == path
												assert out["text"] == ""
												assert out["is_empty_text"]
												assert out["subsections"] == expected_dict["subsections"]







@pytest.mark.parametrize(
    'readme_md, expected_error'    ,       [
        (README_NO_YAML, EXPECTED_ERROR_README_NO_YAML),
        (README_EMPTY_YAML, EXPECTED_ERROR_README_EMPTY_YAML),
        (README_INCORRECT_YAML, EXPECTED_ERROR_README_INCORRECT_YAML),
        (README_EMPTY, EXPECTED_ERROR_README_EMPTY),
        (README_NONE_SUBSECTION, EXPECTED_ERROR_README_NONE_SUBSECTION),
        (README_MISSING_FIRST_LEVEL, EXPECTED_ERROR_README_MISSING_FIRST_LEVEL),
        (README_MISSING_SUBSECTION, EXPECTED_ERROR_README_MISSING_SUBSECTION),
        (README_MISSING_TEXT, EXPECTED_ERROR_README_MISSING_TEXT),
        (README_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_WRONG_FIRST_LEVEL),
        (README_MULTIPLE_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_MULTIPLE_WRONG_FIRST_LEVEL),
        (README_MISSING_CONTENT, EXPECTED_ERROR_README_MISSING_CONTENT),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					List[Any]    ,       UpperCamelCase_       :					Optional[Any]		)  ->   Dict:

						"""simple docstring"""



						with tempfile.TemporaryDirectory() as tmp_dir:
												lowerCAmelCase__    						=						Path(__snake_case		) / "README.md"
												with open(__snake_case    ,       'w+'		) as readme_file:
																		readme_file.write(__snake_case		)
												lowerCAmelCase__    						=						expected_error.format(path=__snake_case		)
												with pytest.raises(__snake_case    ,       match=re.escape(__snake_case		)		):
																		lowerCAmelCase__    						=						ReadMe.from_readme(__snake_case    ,       __snake_case		)
																		readme.validate()







@pytest.mark.parametrize(
    'readme_md, expected_error'    ,       [
        (README_MULTIPLE_SAME_HEADING_1, EXPECTED_ERROR_README_MULTIPLE_SAME_HEADING_1),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					Any    ,       UpperCamelCase_       :					Optional[Any]		)  ->   Any:

						"""simple docstring"""



						with tempfile.TemporaryDirectory() as tmp_dir:
												lowerCAmelCase__    						=						Path(__snake_case		) / "README.md"
												with open(__snake_case    ,       'w+'		) as readme_file:
																		readme_file.write(__snake_case		)
												lowerCAmelCase__    						=						expected_error.format(path=__snake_case		)
												with pytest.raises(__snake_case    ,       match=re.escape(__snake_case		)		):
																		ReadMe.from_readme(__snake_case    ,       __snake_case		)







@pytest.mark.parametrize(
    'readme_md,'    ,       [
        (README_MULTIPLE_SAME_HEADING_1),
    ]    ,       )
def 	_UpperCamelCase   (    UpperCamelCase_       :					Any		)  ->   Any:

						"""simple docstring"""



						with tempfile.TemporaryDirectory() as tmp_dir:
												lowerCAmelCase__    						=						Path(__snake_case		) / "README.md"
												with open(__snake_case    ,       'w+'		) as readme_file:
																		readme_file.write(__snake_case		)
												ReadMe.from_readme(__snake_case    ,       __snake_case    ,       suppress_parsing_errors=__snake_case		)










import logging
import os
import sys
from dataclasses import dataclass, field
from importlib import import_module
from typing import Dict, List, Optional, Tuple

import numpy as np
from seqeval.metrics import accuracy_score, fa_score, precision_score, recall_score
from torch import nn
from utils_ner import Split, TokenClassificationDataset, TokenClassificationTask

import transformers
from transformers import (
    AutoConfig,
    AutoModelForTokenClassification,
    AutoTokenizer,
    DataCollatorWithPadding,
    EvalPrediction,
    HfArgumentParser,
    Trainer,
    TrainingArguments,
    set_seed,
)
from transformers.trainer_utils import is_main_process


__snake_case    :    List[Any]         =     logging.getLogger(__name__)


@dataclass
class     __SCREAMING_SNAKE_CASE					:
						_SCREAMING_SNAKE_CASE	:       str   =					field(
						    metadata={'''help''': '''Path to pretrained model or model identifier from huggingface.co/models'''})
						_SCREAMING_SNAKE_CASE	:       Optional[str]   =					field(
						    default=__lowercase		,					metadata={'''help''': '''Pretrained config name or path if not the same as model_name'''})
						_SCREAMING_SNAKE_CASE	:       Optional[str]   =					field(
						    default='''NER'''		,					metadata={'''help''': '''Task type to fine tune in training (e.g. NER, POS, etc)'''})
						_SCREAMING_SNAKE_CASE	:       Optional[str]   =					field(
						    default=__lowercase		,					metadata={'''help''': '''Pretrained tokenizer name or path if not the same as model_name'''})
						_SCREAMING_SNAKE_CASE	:       bool   =					field(default=__lowercase		,					metadata={'''help''': '''Set this flag to use fast tokenization.'''})
						# If you want to tweak more attributes on your tokenizer, you should do it in a distinct script,
						# or just modify its tokenizer_config.json.
						_SCREAMING_SNAKE_CASE	:       Optional[str]   =					field(
						    default=__lowercase		,					metadata={'''help''': '''Where do you want to store the pretrained models downloaded from huggingface.co'''}		,					)




@dataclass
class     __SCREAMING_SNAKE_CASE					:
						_SCREAMING_SNAKE_CASE	:       str   =					field(
						    metadata={'''help''': '''The input data dir. Should contain the .txt files for a CoNLL-2003-formatted task.'''})
						_SCREAMING_SNAKE_CASE	:       Optional[str]   =					field(
						    default=__lowercase		,					metadata={'''help''': '''Path to a file containing all labels. If not specified, CoNLL-2003 labels are used.'''}		,					)
						_SCREAMING_SNAKE_CASE	:       int   =					field(
						    default=128		,					metadata={
						        '''help''': (
						            '''The maximum total input sequence length after tokenization. Sequences longer '''
						            '''than this will be truncated, sequences shorter will be padded.'''
						        )
						    }		,					)
						_SCREAMING_SNAKE_CASE	:       bool   =					field(
						    default=__lowercase		,					metadata={'''help''': '''Overwrite the cached training and evaluation sets'''})







def 	_UpperCamelCase   (    )  ->   List[str]:

						"""simple docstring"""



						lowerCAmelCase__    						=						HfArgumentParser((ModelArguments, DataTrainingArguments, TrainingArguments)		)
						if len(sys.argv		) == 2 and sys.argv[1].endswith('.json'		):
												# If we pass only one argument to the script and it's the path to a json file,
												# let's parse it to get our arguments.
												lowerCAmelCase__						,       lowerCAmelCase__						,       lowerCAmelCase__    						=						parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]		)		)
						else:
												lowerCAmelCase__						,       lowerCAmelCase__						,       lowerCAmelCase__    						=						parser.parse_args_into_dataclasses()

						if (
						    os.path.exists(training_args.output_dir		)
						    and os.listdir(training_args.output_dir		)
						    and training_args.do_train
						    and not training_args.overwrite_output_dir
						):
												raise ValueError(
												    F"Output directory ({training_args.output_dir}) already exists and is not empty. Use"
												    ' --overwrite_output_dir to overcome.'		)

						lowerCAmelCase__    						=						import_module('tasks'		)
						try:
												lowerCAmelCase__    						=						getattr(UpperCamelCase_    ,       model_args.task_type		)
												lowerCAmelCase__    						=						token_classification_task_clazz()
						except AttributeError:
												raise ValueError(
												    F"Task {model_args.task_type} needs to be defined as a TokenClassificationTask subclass in {module}. "
												    F"Available tasks classes are: {TokenClassificationTask.__subclasses__()}"		)

						# Setup logging
						logging.basicConfig(
						    format='%(asctime)s - %(levelname)s - %(name)s - %(message)s'    ,       datefmt='%m/%d/%Y %H:%M:%S'    ,       level=logging.INFO if training_args.local_rank in [-1, 0] else logging.WARN    ,       )
						logger.warning(
						    'Process rank: %s, device: %s, n_gpu: %s, distributed training: %s, 16-bits training: %s'    ,       training_args.local_rank    ,       training_args.device    ,       training_args.n_gpu    ,       bool(training_args.local_rank != -1		)    ,       training_args.fpaa    ,       )
						# Set the verbosity to info of the Transformers logger (on main process only):
						if is_main_process(training_args.local_rank		):
												transformers.utils.logging.set_verbosity_info()
												transformers.utils.logging.enable_default_handler()
												transformers.utils.logging.enable_explicit_format()
						logger.info('Training/evaluation parameters %s'    ,       UpperCamelCase_		)

						# Set seed
						set_seed(training_args.seed		)

						# Prepare CONLL-2003 task
						lowerCAmelCase__    						=						token_classification_task.get_labels(data_args.labels		)
						lowerCAmelCase__    						=						dict(enumerate(UpperCamelCase_		)		)
						lowerCAmelCase__    						=						len(UpperCamelCase_		)

						# Load pretrained model and tokenizer
						#
						# Distributed training:
						# The .from_pretrained methods guarantee that only one local process can concurrently
						# download model & vocab.

						lowerCAmelCase__    						=						AutoConfig.from_pretrained(
						    model_args.config_name if model_args.config_name else model_args.model_name_or_path    ,       num_labels=UpperCamelCase_    ,       idalabel=UpperCamelCase_    ,       labelaid={label: i for i, label in enumerate(UpperCamelCase_		)}    ,       cache_dir=model_args.cache_dir    ,       )
						lowerCAmelCase__    						=						AutoTokenizer.from_pretrained(
						    model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path    ,       cache_dir=model_args.cache_dir    ,       use_fast=model_args.use_fast    ,       )
						lowerCAmelCase__    						=						AutoModelForTokenClassification.from_pretrained(
						    model_args.model_name_or_path    ,       from_tf=bool('.ckpt' in model_args.model_name_or_path		)    ,       config=UpperCamelCase_    ,       cache_dir=model_args.cache_dir    ,       )

						# Get datasets
						lowerCAmelCase__    						=						(
						    TokenClassificationDataset(
						        token_classification_task=UpperCamelCase_    ,       data_dir=data_args.data_dir    ,       tokenizer=UpperCamelCase_    ,       labels=UpperCamelCase_    ,       model_type=config.model_type    ,       max_seq_length=data_args.max_seq_length    ,       overwrite_cache=data_args.overwrite_cache    ,       mode=Split.train    ,       )
						    if training_args.do_train
						    else None
						)
						lowerCAmelCase__    						=						(
						    TokenClassificationDataset(
						        token_classification_task=UpperCamelCase_    ,       data_dir=data_args.data_dir    ,       tokenizer=UpperCamelCase_    ,       labels=UpperCamelCase_    ,       model_type=config.model_type    ,       max_seq_length=data_args.max_seq_length    ,       overwrite_cache=data_args.overwrite_cache    ,       mode=Split.dev    ,       )
						    if training_args.do_eval
						    else None
						)

						def align_predictions(UpperCamelCase_       :					np.ndarray    ,       UpperCamelCase_       :					np.ndarray		) -> Tuple[List[int], List[int]]:
												lowerCAmelCase__    						=						np.argmax(UpperCamelCase_    ,       axis=2		)

												lowerCAmelCase__						,       lowerCAmelCase__    						=						preds.shape

												lowerCAmelCase__    						=						[[] for _ in range(UpperCamelCase_		)]
												lowerCAmelCase__    						=						[[] for _ in range(UpperCamelCase_		)]

												for i in range(UpperCamelCase_		):
																		for j in range(UpperCamelCase_		):
																								if label_ids[i, j] != nn.CrossEntropyLoss().ignore_index:
																														out_label_list[i].append(label_map[label_ids[i][j]]		)
																														preds_list[i].append(label_map[preds[i][j]]		)

												return preds_list, out_label_list

						def compute_metrics(UpperCamelCase_       :					EvalPrediction		) -> Dict:
												lowerCAmelCase__						,       lowerCAmelCase__    						=						align_predictions(p.predictions    ,       p.label_ids		)
												return {
												    "accuracy_score": accuracy_score(UpperCamelCase_    ,       UpperCamelCase_		),
												    "precision": precision_score(UpperCamelCase_    ,       UpperCamelCase_		),
												    "recall": recall_score(UpperCamelCase_    ,       UpperCamelCase_		),
												    "f1": fa_score(UpperCamelCase_    ,       UpperCamelCase_		),
												}

						# Data collator
						lowerCAmelCase__    						=						DataCollatorWithPadding(UpperCamelCase_    ,       pad_to_multiple_of=8		) if training_args.fpaa else None

						# Initialize our Trainer
						lowerCAmelCase__    						=						Trainer(
						    model=UpperCamelCase_    ,       args=UpperCamelCase_    ,       train_dataset=UpperCamelCase_    ,       eval_dataset=UpperCamelCase_    ,       compute_metrics=UpperCamelCase_    ,       data_collator=UpperCamelCase_    ,       )

						# Training
						if training_args.do_train:
												trainer.train(
												    model_path=model_args.model_name_or_path if os.path.isdir(model_args.model_name_or_path		) else None		)
												trainer.save_model()
												# For convenience, we also re-save the tokenizer to the same directory,
												# so that you can share your model easily on huggingface.co/models =)
												if trainer.is_world_process_zero():
																		tokenizer.save_pretrained(training_args.output_dir		)

    # Evaluation
						lowerCAmelCase__    						=						{}
						if training_args.do_eval:
												logger.info('*** Evaluate ***'		)

												lowerCAmelCase__    						=						trainer.evaluate()

												lowerCAmelCase__    						=						os.path.join(training_args.output_dir    ,       'eval_results.txt'		)
												if trainer.is_world_process_zero():
																		with open(UpperCamelCase_    ,       'w'		) as writer:
																								logger.info('***** Eval results *****'		)
																								for key, value in result.items():
																														logger.info('  %s = %s'    ,       UpperCamelCase_    ,       UpperCamelCase_		)
																														writer.write('%s = %s\n' % (key, value)		)

																		results.update(UpperCamelCase_		)

    # Predict
						if training_args.do_predict:
												lowerCAmelCase__    						=						TokenClassificationDataset(
												    token_classification_task=UpperCamelCase_    ,       data_dir=data_args.data_dir    ,       tokenizer=UpperCamelCase_    ,       labels=UpperCamelCase_    ,       model_type=config.model_type    ,       max_seq_length=data_args.max_seq_length    ,       overwrite_cache=data_args.overwrite_cache    ,       mode=Split.test    ,       )

												lowerCAmelCase__						,       lowerCAmelCase__						,       lowerCAmelCase__    						=						trainer.predict(UpperCamelCase_		)
												lowerCAmelCase__						,       lowerCAmelCase__    						=						align_predictions(UpperCamelCase_    ,       UpperCamelCase_		)

												lowerCAmelCase__    						=						os.path.join(training_args.output_dir    ,       'test_results.txt'		)
												if trainer.is_world_process_zero():
																		with open(UpperCamelCase_    ,       'w'		) as writer:
																								for key, value in metrics.items():
																														logger.info('  %s = %s'    ,       UpperCamelCase_    ,       UpperCamelCase_		)
																														writer.write('%s = %s\n' % (key, value)		)

        # Save predictions
												lowerCAmelCase__    						=						os.path.join(training_args.output_dir    ,       'test_predictions.txt'		)
												if trainer.is_world_process_zero():
																		with open(UpperCamelCase_    ,       'w'		) as writer:
																								with open(os.path.join(data_args.data_dir    ,       'test.txt'		)    ,       'r'		) as f:
																														token_classification_task.write_predictions_to_file(UpperCamelCase_    ,       UpperCamelCase_    ,       UpperCamelCase_		)

						return results







def 	_UpperCamelCase   (    UpperCamelCase_       :					Dict		)  ->   Union[str, Any]:

						"""simple docstring"""



						main()


if __name__ == "__main__":
					main()





