{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":121150,"databundleVersionId":15061024,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":14376272,"sourceType":"datasetVersion","datasetId":9181082},{"sourceId":256551,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":205979,"modelId":225262}],"dockerImageVersionId":31260,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.listdir(\"/kaggle/input/byt5-base-big-data2\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:10:48.317926Z","iopub.execute_input":"2026-01-20T07:10:48.318311Z","iopub.status.idle":"2026-01-20T07:10:48.330553Z","shell.execute_reply.started":"2026-01-20T07:10:48.318284Z","shell.execute_reply":"2026-01-20T07:10:48.329754Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Imports\n# ===============================\nimport os\nimport pandas as pd\nimport torch\n\nfrom torch.utils.data import Dataset, DataLoader\nfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM\n\nprint(\"Torch:\", torch.__version__)\nprint(\"CUDA available:\", torch.cuda.is_available())\nprint(\"Device:\", \"cuda\" if torch.cuda.is_available() else \"cpu\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:10:52.311650Z","iopub.execute_input":"2026-01-20T07:10:52.311951Z","iopub.status.idle":"2026-01-20T07:11:00.360885Z","shell.execute_reply.started":"2026-01-20T07:10:52.311924Z","shell.execute_reply":"2026-01-20T07:11:00.360037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# CONFIG\n# ===============================\n\nDATA_PATH = \"/kaggle/input/deep-past-initiative-machine-translation\"\nMODEL_DIR = \"/kaggle/input/byt5-base-big-data2\"\n\nPREFIX = \"translate Akkadian to English: \"\n\nBATCH_SIZE = 8\nMAX_SOURCE_LEN = 512\nMAX_NEW_TOKENS = 256\nNUM_BEAMS = 4\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\n# Check files exist\nprint(\"Model files:\", os.listdir(MODEL_DIR))\nprint(\"Data files:\", os.listdir(DATA_PATH))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:11:10.655154Z","iopub.execute_input":"2026-01-20T07:11:10.655474Z","iopub.status.idle":"2026-01-20T07:11:10.661897Z","shell.execute_reply.started":"2026-01-20T07:11:10.655448Z","shell.execute_reply":"2026-01-20T07:11:10.661182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Load tokenizer & model\n# ===============================\n\ntokenizer = AutoTokenizer.from_pretrained(\n    MODEL_DIR,\n    local_files_only=True\n)\n\nmodel = AutoModelForSeq2SeqLM.from_pretrained(\n    MODEL_DIR,\n    local_files_only=True\n).to(device)\n\nmodel.eval()\n\nprint(\"✅ Model and tokenizer loaded\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:11:15.547124Z","iopub.execute_input":"2026-01-20T07:11:15.547796Z","iopub.status.idle":"2026-01-20T07:11:51.085777Z","shell.execute_reply.started":"2026-01-20T07:11:15.547756Z","shell.execute_reply":"2026-01-20T07:11:51.085026Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Load test + sample submission\n# ===============================\n\ntest_df = pd.read_csv(f\"{DATA_PATH}/test.csv\")\nsample_sub = pd.read_csv(f\"{DATA_PATH}/sample_submission.csv\")\n\nprint(\"Test shape:\", test_df.shape)\nprint(\"Sample submission shape:\", sample_sub.shape)\n\ntest_df.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:12:48.399716Z","iopub.execute_input":"2026-01-20T07:12:48.400802Z","iopub.status.idle":"2026-01-20T07:12:48.445691Z","shell.execute_reply.started":"2026-01-20T07:12:48.400763Z","shell.execute_reply":"2026-01-20T07:12:48.444947Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Dataset for inference\n# ===============================\n\nclass InferenceDataset(Dataset):\n    def __init__(self, df):\n        self.ids = df[\"id\"].tolist()\n        self.texts = [\n            PREFIX + str(t) for t in df[\"transliteration\"].astype(str).tolist()\n        ]\n\n    def __len__(self):\n        return len(self.texts)\n\n    def __getitem__(self, idx):\n        return self.ids[idx], self.texts[idx]\n\n\ndef collate_fn(batch):\n    ids, texts = zip(*batch)\n    enc = tokenizer(\n        list(texts),\n        padding=True,\n        truncation=True,\n        max_length=MAX_SOURCE_LEN,\n        return_tensors=\"pt\",\n    )\n    return list(ids), enc[\"input_ids\"], enc[\"attention_mask\"]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:12:52.432074Z","iopub.execute_input":"2026-01-20T07:12:52.432658Z","iopub.status.idle":"2026-01-20T07:12:52.438612Z","shell.execute_reply.started":"2026-01-20T07:12:52.432626Z","shell.execute_reply":"2026-01-20T07:12:52.437660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Run inference\n# ===============================\n\nloader = DataLoader(\n    InferenceDataset(test_df),\n    batch_size=BATCH_SIZE,\n    shuffle=False,\n    collate_fn=collate_fn,\n)\n\nall_ids = []\nall_preds = []\n\nprint(\"🚀 Running inference...\")\n\nwith torch.inference_mode():\n    for ids, input_ids, attention_mask in loader:\n        input_ids = input_ids.to(device)\n        attention_mask = attention_mask.to(device)\n\n        outputs = model.generate(\n            input_ids=input_ids,\n            attention_mask=attention_mask,\n            num_beams=NUM_BEAMS,\n            max_new_tokens=MAX_NEW_TOKENS,\n            early_stopping=True,\n            no_repeat_ngram_size=3,\n            repetition_penalty=1.1,\n        )\n\n        decoded = tokenizer.batch_decode(outputs, skip_special_tokens=True)\n\n        all_ids.extend(ids)\n        all_preds.extend([d.strip() for d in decoded])\n\nprint(\"✅ Inference complete\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:12:59.389961Z","iopub.execute_input":"2026-01-20T07:12:59.390559Z","iopub.status.idle":"2026-01-20T07:13:04.615607Z","shell.execute_reply.started":"2026-01-20T07:12:59.390528Z","shell.execute_reply":"2026-01-20T07:13:04.614736Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Create submission\n# ===============================\n\nsubmission = pd.DataFrame({\n    \"id\": all_ids,\n    \"translation\": all_preds\n})\n\n# Ensure correct order\nsubmission = sample_sub[[\"id\"]].merge(submission, on=\"id\", how=\"left\")\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(\"✅ submission.csv saved\")\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:13:08.052028Z","iopub.execute_input":"2026-01-20T07:13:08.052699Z","iopub.status.idle":"2026-01-20T07:13:08.078231Z","shell.execute_reply.started":"2026-01-20T07:13:08.052670Z","shell.execute_reply":"2026-01-20T07:13:08.077064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ===============================\n# Validation checks\n# ===============================\n\nassert submission.shape == sample_sub.shape\nassert submission[\"id\"].tolist() == sample_sub[\"id\"].tolist()\nassert submission[\"translation\"].isna().sum() == 0\n\nprint(\"✅ Submission format is valid\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:13:15.827576Z","iopub.execute_input":"2026-01-20T07:13:15.828220Z","iopub.status.idle":"2026-01-20T07:13:15.833873Z","shell.execute_reply.started":"2026-01-20T07:13:15.828187Z","shell.execute_reply":"2026-01-20T07:13:15.833076Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ndf = pd.read_csv(\"/kaggle/input/deep-past-initiative-machine-translation/train.csv\")\n\ntrain_df, val_df = train_test_split(\n    df,\n    test_size=0.15,\n    random_state=42\n)\n\nprint(\"Train size:\", len(train_df))\nprint(\"Validation size:\", len(val_df))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:13:19.738240Z","iopub.execute_input":"2026-01-20T07:13:19.738946Z","iopub.status.idle":"2026-01-20T07:13:19.809895Z","shell.execute_reply.started":"2026-01-20T07:13:19.738897Z","shell.execute_reply":"2026-01-20T07:13:19.809053Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"PREFIX = \"translate Akkadian to English: \"\nMAX_LEN = 512\n\npreds = []\nrefs = []\n\nmodel.eval()\n\nwith torch.inference_mode():\n    for _, row in val_df.iterrows():\n        src = PREFIX + str(row[\"transliteration\"])\n        tgt = str(row[\"translation\"])\n\n        inputs = tokenizer(\n            src,\n            return_tensors=\"pt\",\n            truncation=True,\n            max_length=MAX_LEN\n        ).to(device)\n\n        outputs = model.generate(\n            **inputs,\n            max_new_tokens=256,\n            num_beams=4,\n            no_repeat_ngram_size=3,\n            repetition_penalty=1.1,\n            early_stopping=True\n        )\n\n        pred = tokenizer.decode(outputs[0], skip_special_tokens=True)\n\n        preds.append(pred)\n        refs.append(tgt)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:13:23.453532Z","iopub.execute_input":"2026-01-20T07:13:23.454334Z","iopub.status.idle":"2026-01-20T07:13:39.783632Z","shell.execute_reply.started":"2026-01-20T07:13:23.454303Z","shell.execute_reply":"2026-01-20T07:13:39.782402Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q sacrebleu","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-19T12:10:49.030606Z","iopub.execute_input":"2026-01-19T12:10:49.031459Z","iopub.status.idle":"2026-01-19T12:10:52.075823Z","shell.execute_reply.started":"2026-01-19T12:10:49.031419Z","shell.execute_reply":"2026-01-19T12:10:52.075003Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nfrom sacrebleu.metrics import BLEU, CHRF\n\n# sacrebleu expects refs as list of lists\nrefs_sacre = [refs]\n\nbleu_metric = BLEU()\nchrfpp_metric = CHRF(word_order=2)  # chrF++\n\nbleu = bleu_metric.corpus_score(preds, refs_sacre).score\nchrfpp = chrfpp_metric.corpus_score(preds, refs_sacre).score\ngeom = float(np.sqrt(bleu * chrfpp))\n\nprint(\"==================================================\")\nprint(f\"Validation size        : {len(refs)}\")\nprint(f\"Corpus BLEU            : {bleu:.2f}\")\nprint(f\"Corpus chrF++          : {chrfpp:.2f}\")\nprint(f\"Geometric Mean (BLEU×chrF++) : {geom:.2f}\")\nprint(\"==================================================\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-19T12:10:57.462515Z","iopub.execute_input":"2026-01-19T12:10:57.462817Z","iopub.status.idle":"2026-01-19T12:10:57.836268Z","shell.execute_reply.started":"2026-01-19T12:10:57.462785Z","shell.execute_reply":"2026-01-19T12:10:57.835559Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm import tqdm\nimport torch\n\nmodel.eval()\n\nbyt5_preds = []\nrefs = []\n\nfor i in tqdm(range(len(val_df))):\n    src = val_df.iloc[i][\"transliteration\"]\n    tgt = val_df.iloc[i][\"translation\"]\n\n    inputs = tokenizer(\n        \"translate Akkadian to English: \" + src,\n        return_tensors=\"pt\",\n        truncation=True,\n        max_length=512\n    ).to(device)\n\n    with torch.no_grad():\n        outputs = model.generate(\n            **inputs,\n            max_length=256,\n            num_beams=4\n        )\n\n    pred = tokenizer.decode(outputs[0], skip_special_tokens=True)\n\n    byt5_preds.append(pred)\n    refs.append([tgt])   # sacrebleu format\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T07:13:52.397411Z","iopub.execute_input":"2026-01-20T07:13:52.397753Z","iopub.status.idle":"2026-01-20T07:25:24.352166Z","shell.execute_reply.started":"2026-01-20T07:13:52.397707Z","shell.execute_reply":"2026-01-20T07:25:24.351433Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install sacrebleu \nfrom sacrebleu.metrics import BLEU, CHRF\n\nbleu = BLEU()\nchrf = CHRF(word_order=2)  # chrF++\n\nbleu_score = bleu.corpus_score(byt5_preds, refs).score\nchrf_score = chrf.corpus_score(byt5_preds, refs).score\n\nprint(\"===== BASELINE (ByT5 only) =====\")\nprint(f\"BLEU     : {bleu_score:.2f}\")\nprint(f\"chrF++   : {chrf_score:.2f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:25.541772Z","iopub.execute_input":"2026-01-20T08:10:25.542131Z","iopub.status.idle":"2026-01-20T08:10:29.349669Z","shell.execute_reply.started":"2026-01-20T08:10:25.542103Z","shell.execute_reply":"2026-01-20T08:10:29.348834Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_deepseek_prompt(draft_english: str) -> str:\n    return f\"\"\"\nYou are an expert editor of translations from Akkadian to English.\nYour task is NOT to translate Akkadian.\nYour task is to polish English translations generated by a machine.\n\nRules:\n- Do NOT add new information\n- Do NOT remove information\n- Fix grammar, word order, articles, and clarity\n- Keep meaning exactly the same\n- Output ONE sentence only\n\nExample 1:\nDraft English: To Šalim-Aššur speak: thus says I.\nCorrect English: Speak to Šalim-Aššur, thus says I.\n\nExample 2:\nDraft English: He gave silver 10 minas.\nCorrect English: He gave 10 minas of silver.\n\nExample 3:\nDraft English: If he not pay, interest he will add.\nCorrect English: If he does not pay, he will add interest.\n\nNow polish the following Draft English.\n\nDraft English:\n{draft_english}\n\nCorrect English:\n\"\"\".strip()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:32.748178Z","iopub.execute_input":"2026-01-20T08:10:32.748934Z","iopub.status.idle":"2026-01-20T08:10:32.753320Z","shell.execute_reply.started":"2026-01-20T08:10:32.748900Z","shell.execute_reply":"2026-01-20T08:10:32.752466Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import re\n\ndef deepseek_style_normalize(pred: str) -> str:\n    \"\"\"\n    Simulates DeepSeek R1 prompt-based normalization\n    WITHOUT using external APIs (Kaggle-safe)\n    \"\"\"\n    if not pred or not isinstance(pred, str):\n        return \"\"\n\n    text = pred.strip()\n\n    # ---- Example-based normalization rules ----\n    replacements = {\n        \"silver silver\": \"silver\",\n        \"the the\": \"the\",\n        \"Thus says\": \"Thus says\",\n        \"thus says\": \"Thus says\",\n        \"I wrote to you saying\": \"I wrote to you:\",\n        \"he has given\": \"he gave\",\n    }\n\n    for k, v in replacements.items():\n        text = text.replace(k, v)\n\n    # ---- Punctuation cleanup ----\n    text = re.sub(r\"\\s+([.,;:])\", r\"\\1\", text)\n    text = re.sub(r\"\\s+\", \" \", text)\n\n    # ---- Sentence capitalization ----\n    if text and text[0].islower():\n        text = text[0].upper() + text[1:]\n\n    return text\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:37.139038Z","iopub.execute_input":"2026-01-20T08:10:37.139391Z","iopub.status.idle":"2026-01-20T08:10:37.145617Z","shell.execute_reply.started":"2026-01-20T08:10:37.139364Z","shell.execute_reply":"2026-01-20T08:10:37.144797Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"deepseek_preds = [deepseek_style_normalize(p) for p in byt5_preds]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:42.406158Z","iopub.execute_input":"2026-01-20T08:10:42.406663Z","iopub.status.idle":"2026-01-20T08:10:42.417062Z","shell.execute_reply.started":"2026-01-20T08:10:42.406634Z","shell.execute_reply":"2026-01-20T08:10:42.416168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(3):\n    print(\"=\"*60)\n    print(\"AKKADIAN:\")\n    print(val_df.iloc[i][\"transliteration\"][:200])\n    print(\"\\nRAW ByT5:\")\n    print(byt5_preds[i])\n    print(\"\\nAfter DeepSeek-style normalization:\")\n    print(deepseek_preds[i])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:45.861141Z","iopub.execute_input":"2026-01-20T08:10:45.861437Z","iopub.status.idle":"2026-01-20T08:10:45.867519Z","shell.execute_reply.started":"2026-01-20T08:10:45.861412Z","shell.execute_reply":"2026-01-20T08:10:45.866831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import re\ndef normalize_gaps_english(text: str) -> str:\n    if not text:\n        return \"\"\n\n    # Normalize ellipsis and brackets\n    text = re.sub(r\"\\[\\s*\\.\\.\\.\\s*\\]\", \"[broken text]\", text)\n    text = re.sub(r\"\\.\\.\\.|…\", \"[broken text]\", text)\n\n    # Normalize x gaps\n    text = re.sub(r\"\\b(x\\s*){3,}\\b\", \"[large gap]\", text, flags=re.IGNORECASE)\n    text = re.sub(r\"\\bxxxx+\\b\", \"[large gap]\", text, flags=re.IGNORECASE)\n    text = re.sub(r\"\\bx\\b\", \"[gap]\", text, flags=re.IGNORECASE)\n\n    return text\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:51.502294Z","iopub.execute_input":"2026-01-20T08:10:51.502603Z","iopub.status.idle":"2026-01-20T08:10:51.507739Z","shell.execute_reply.started":"2026-01-20T08:10:51.502574Z","shell.execute_reply":"2026-01-20T08:10:51.507064Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def normalize_grammar(text: str) -> str:\n    # Remove duplicated words\n    text = re.sub(r\"\\b(\\w+)( \\1\\b)+\", r\"\\1\", text, flags=re.IGNORECASE)\n\n    # Fix spacing before punctuation\n    text = re.sub(r\"\\s+([.,;:!?])\", r\"\\1\", text)\n\n    # Remove dangling conjunctions\n    text = re.sub(r\"\\b(and|or|but)\\s*$\", \"\", text, flags=re.IGNORECASE)\n\n    # Capitalize first letter\n    text = text.strip()\n    if text and text[0].islower():\n        text = text[0].upper() + text[1:]\n\n    return text\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:54.701519Z","iopub.execute_input":"2026-01-20T08:10:54.701832Z","iopub.status.idle":"2026-01-20T08:10:54.706768Z","shell.execute_reply.started":"2026-01-20T08:10:54.701804Z","shell.execute_reply":"2026-01-20T08:10:54.706091Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def deepseek_normalize(byt5_output: str) -> str:\n    \"\"\"\n    Simulates DeepSeek-style post-editing for Akkadian translations.\n    \"\"\"\n    text = byt5_output\n\n    # Step 1: normalize gaps & broken text\n    text = normalize_gaps_english(text)\n\n    # Step 2: grammar cleanup\n    text = normalize_grammar(text)\n\n    return text\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:10:57.638421Z","iopub.execute_input":"2026-01-20T08:10:57.638753Z","iopub.status.idle":"2026-01-20T08:10:57.643155Z","shell.execute_reply.started":"2026-01-20T08:10:57.638701Z","shell.execute_reply":"2026-01-20T08:10:57.642205Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"normalized_preds = []\n\nfor pred in preds:   # preds = ByT5 predictions\n    normalized_preds.append(deepseek_normalize(pred))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:11:01.159199Z","iopub.execute_input":"2026-01-20T08:11:01.159540Z","iopub.status.idle":"2026-01-20T08:11:01.163981Z","shell.execute_reply.started":"2026-01-20T08:11:01.159511Z","shell.execute_reply":"2026-01-20T08:11:01.163312Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(3):\n    print(\"=\"*80)\n    print(\"RAW ByT5:\")\n    print(preds[i])\n    print(\"\\nAfter DeepSeek-style normalization:\")\n    print(normalized_preds[i])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-20T08:11:05.180649Z","iopub.execute_input":"2026-01-20T08:11:05.180948Z","iopub.status.idle":"2026-01-20T08:11:05.185921Z","shell.execute_reply.started":"2026-01-20T08:11:05.180922Z","shell.execute_reply":"2026-01-20T08:11:05.185185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}