{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "VTr3R3SqAkE7", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "collapsed": true, "id": "VTr3R3SqAkE7", "outputId": "0350da8e-0f3a-4c3e-bb5e-b5a5fa8516c6" }, "outputs": [], "source": [ "! pip install https://github.com/state-spaces/mamba/releases/download/v2.3.1/mamba_ssm-2.3.1+cu12torch2.10cxx11abiTRUE-cp312-cp312-linux_x86_64.whl\n", "! pip install https://github.com/Dao-AILab/causal-conv1d/releases/download/v1.6.1.post4/causal_conv1d-1.6.1+cu12torch2.10cxx11abiTRUE-cp312-cp312-linux_x86_64.whl\n", "! pip install --force transformers==4.57.6" ] }, { "cell_type": "code", "execution_count": 1, "id": "e088c6c2", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "e088c6c2", "outputId": "3fb57574-d805-4233-a9ef-65e4f5112789" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mon Mar 30 00:36:06 2026 \n", "+-----------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 580.82.07 Driver Version: 580.82.07 CUDA Version: 13.0 |\n", "+-----------------------------------------+------------------------+----------------------+\n", "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|=========================================+========================+======================|\n", "| 0 NVIDIA A100-SXM4-40GB Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 35C P0 47W / 400W | 0MiB / 40960MiB | 0% Default |\n", "| | | Disabled |\n", "+-----------------------------------------+------------------------+----------------------+\n", "\n", "+-----------------------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=========================================================================================|\n", "| No running processes found |\n", "+-----------------------------------------------------------------------------------------+\n" ] } ], "source": [ "! nvidia-smi" ] }, { "cell_type": "code", "execution_count": 16, "id": "d6c970d4", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 893, "referenced_widgets": [ "718155cd08ad4645a6ab5ed9c40560a1", "cb9eccd3e1a845e68f6d19b08b584be5", "69e05d36c79f412e8e44b069b5b0d599", "2fb8a5922cd249c8a701897774d70013", "31bde5565e65472a8518bedd3e9902bf", "404f8191114f4ff2a6a43262916a61c4", "b735180998ee42c981708cef0ffb2e13", "846b7fee95ed4e92bd68d4d321b10ec0", "081ce52558254ddfb5fb6699e37627bf", "74a631a2775e440dabcb6308b37c44bb", "904d7de378aa4836b140b2541d1eb70e" ] }, "id": "d6c970d4", "outputId": "ef1f0276-18fc-4b0c-9bf8-e0737a52b3a2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using device: cuda\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "718155cd08ad4645a6ab5ed9c40560a1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Resolving data files: 0%| | 0/23 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import json\n", "import os\n", "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", "import torch.nn as nn\n", "from datasets import load_dataset\n", "from safetensors.torch import load_file\n", "from tqdm import tqdm\n", "from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer\n", "\n", "DEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "torch.set_default_dtype(torch.float32)\n", "print(f\"Using device: {DEVICE}\")\n", "\n", "DATASET_ID = \"emozilla/pg19\"\n", "DATA_SPLIT = \"test\"\n", "TOKENIZER_ID = \"google/byt5-small\"\n", "\n", "PMNET_MODEL_ID = \"phasorkinetics/pmnet\"\n", "PMNET_CONFIG_PATH = \"config_pmnet.json\"\n", "PMNET_CKPT = \"model_pmnet.safetensors\"\n", "PMNET_LOSS_DIR = \"data/pmnet_losses\"\n", "\n", "PMNET_NO_MEM_CONFIG_PATH = \"config_pmnet_no_mem.json\"\n", "PMNET_NO_MEM_CKPT = \"model_pmnet_no_mem.safetensors\"\n", "PMNET_NO_MEM_LOSS_DIR = \"data/pmnet_no_mem_losses\"\n", "\n", "PMNET_NO_REC_LOSS_DIR = \"data/pmnet_no_rec_losses\"\n", "PMNET_NO_MEM_REC_LOSS_DIR = \"data/pmnet_no_mem_rec_losses\"\n", "\n", "MAMBA_MODEL_ID = \"state-spaces/mamba-130m-hf\"\n", "MAMBA_CONFIG_PATH = \"config_mamba.json\"\n", "MAMBA_CKPT = \"model_mamba.safetensors\"\n", "MAMBA_LOSS_DIR = \"data/mamba_losses\"\n", "\n", "SMOLLM_MODEL_ID = \"HuggingFaceTB/SmolLM-135M\"\n", "SMOLLM_CONFIG_PATH = \"config_smollm.json\"\n", "SMOLLM_CKPT = \"model_smollm.safetensors\"\n", "SMOLLM_LOSS_DIR = \"data/smollm_losses\"\n", "\n", "DATA_PROCESS_BATCH_SIZE = 1000\n", "NUM_PROC = 16\n", "NUM_EVAL_SAMPLES = 100\n", "SEQ_LENGTH_PMNET = 16 * 1024\n", "PLOT_SMOOTHING_WINDOW = 1000\n", "PLOT_SAVE_PATH = \"pmnet_long_context_bpb_comparison.pdf\"\n", "\n", "\n", "def loss_over_positions(model, input_ids):\n", "\tmodel.eval()\n", "\tdevice_local = next(model.parameters()).device\n", "\tcriterion = nn.CrossEntropyLoss(reduction=\"none\")\n", "\n", "\tinput_tensor = torch.tensor(\n", "\t\tinput_ids,\n", "\t\tdtype=torch.long,\n", "\t\tdevice=device_local,\n", "\t).unsqueeze(0)\n", "\n", "\twith torch.inference_mode():\n", "\t\toutputs = model(input_ids=input_tensor)\n", "\t\tshift_logits = outputs.logits[:, :-1, :].contiguous()\n", "\t\tshift_labels = input_tensor[:, 1:].contiguous()\n", "\t\tloss = criterion(\n", "\t\t\tshift_logits.view(-1, shift_logits.size(-1)),\n", "\t\t\tshift_labels.view(-1),\n", "\t\t)\n", "\n", "\tif torch.cuda.is_available():\n", "\t\ttorch.cuda.empty_cache()\n", "\n", "\treturn loss.float().cpu().numpy() / np.log(2)\n", "\n", "\n", "def prepare_dataset():\n", "\ttokenizer = AutoTokenizer.from_pretrained(TOKENIZER_ID, trust_remote_code=True)\n", "\ttest_dataset = load_dataset(DATASET_ID, split=DATA_SPLIT)\n", "\n", "\tdef process_batch(examples):\n", "\t\ttokenized = tokenizer(examples[\"text\"])\n", "\t\tinput_ids = tokenized[\"input_ids\"]\n", "\t\tinput_ids = [ids[:SEQ_LENGTH_PMNET] for ids in input_ids if len(ids) >= SEQ_LENGTH_PMNET]\n", "\t\treturn {\"input_ids\": input_ids}\n", "\n", "\ttest_dataset = test_dataset.map(\n", "\t\tprocess_batch,\n", "\t\tbatched=True,\n", "\t\tbatch_size=DATA_PROCESS_BATCH_SIZE,\n", "\t\tremove_columns=test_dataset.column_names,\n", "\t\tnum_proc=NUM_PROC,\n", "\t\tdesc=\"Tokenizing\",\n", "\t)\n", "\n", "\tprint(f\"Number of tokenized test samples: {len(test_dataset)}\")\n", "\tif NUM_EVAL_SAMPLES:\n", "\t\ttest_dataset = test_dataset.select(range(min(NUM_EVAL_SAMPLES, len(test_dataset))))\n", "\t\tprint(f\"Using {len(test_dataset)} samples for evaluation\")\n", "\n", "\treturn test_dataset\n", "\n", "\n", "def load_model_config(model_id: str, config_path=None):\n", "\tmodel_config = AutoConfig.from_pretrained(model_id, trust_remote_code=True)\n", "\n", "\tif config_path is not None:\n", "\t\tif not os.path.exists(config_path):\n", "\t\t\traise FileNotFoundError(f\"Config file not found: {config_path}\")\n", "\t\twith open(config_path, \"r\", encoding=\"utf-8\") as f:\n", "\t\t\tmodel_config.update(json.load(f))\n", "\n", "\t# Force float32 for numerically stable validation comparisons.\n", "\tmodel_config.torch_dtype = torch.float32\n", "\n", "\treturn model_config\n", "\n", "\n", "def load_model_from_safetensors(model_id: str, ckpt: str, config_path=None):\n", "\tmodel_config = load_model_config(model_id, config_path=config_path)\n", "\tmodel = AutoModelForCausalLM.from_config(model_config, trust_remote_code=True)\n", "\tstate_dict = load_file(ckpt)\n", "\tincompatible_keys = model.load_state_dict(state_dict, strict=False)\n", "\n", "\t# if incompatible_keys.missing_keys or incompatible_keys.unexpected_keys:\n", "\t# \traise RuntimeError(\n", "\t# \t\t\"Checkpoint load mismatch\\n\"\n", "\t# \t\tf\"missing_keys={incompatible_keys.missing_keys}\\n\"\n", "\t# \t\tf\"unexpected_keys={incompatible_keys.unexpected_keys}\"\n", "\t# \t)\n", "\n", "\tmodel.to(device=DEVICE, dtype=torch.float32)\n", "\tmodel.float()\n", "\tmodel.eval()\n", "\tif next(model.parameters()).dtype != torch.float32:\n", "\t\traise RuntimeError(f\"Model is not float32: {next(model.parameters()).dtype}\")\n", "\treturn model\n", "\n", "\n", "def evaluate(model_id: str, ckpt: str, dataset, losses_dir: str, config_path=None):\n", "\tPath(losses_dir).mkdir(parents=True, exist_ok=True)\n", "\tmodel = load_model_from_safetensors(model_id, ckpt, config_path=config_path)\n", "\tlosses_list = []\n", "\n", "\tfor i, sample in enumerate(tqdm(dataset, desc=\"Evaluating Samples\", total=len(dataset))):\n", "\t\tlosses_path = f\"{losses_dir}/sample_{i}_losses.npy\"\n", "\t\tif os.path.exists(losses_path):\n", "\t\t\tlosses = np.load(losses_path)\n", "\t\t\tlosses_list.append(losses)\n", "\t\t\tcontinue\n", "\n", "\t\tlosses = loss_over_positions(model, sample[\"input_ids\"])\n", "\t\tnp.save(losses_path, losses)\n", "\t\tlosses_list.append(losses)\n", "\n", "\treturn np.array(losses_list).mean(axis=0)\n", "\n", "\n", "def moving_average(a, n=PLOT_SMOOTHING_WINDOW):\n", "\tn = max(1, min(n, len(a)))\n", "\tret = np.cumsum(a, dtype=float)\n", "\tret[n:] = ret[n:] - ret[:-n]\n", "\treturn ret[n - 1 :] / n\n", "\n", "\n", "def smooth_curve(losses, window=PLOT_SMOOTHING_WINDOW):\n", "\twindow = max(1, min(window, len(losses)))\n", "\tsmoothed = moving_average(losses, window)\n", "\tx = np.arange(window - 1, window - 1 + len(smoothed))\n", "\treturn x, smoothed\n", "\n", "\n", "def main():\n", "\ttest_dataset = prepare_dataset()\n", "\n", "\tmamba_losses = evaluate(\n", "\t\tMAMBA_MODEL_ID,\n", "\t\tMAMBA_CKPT,\n", "\t\ttest_dataset,\n", "\t\tMAMBA_LOSS_DIR,\n", "\t\tconfig_path=MAMBA_CONFIG_PATH,\n", "\t)\n", "\tsmol_losses = evaluate(\n", "\t\tSMOLLM_MODEL_ID,\n", "\t\tSMOLLM_CKPT,\n", "\t\ttest_dataset,\n", "\t\tSMOLLM_LOSS_DIR,\n", "\t\tconfig_path=SMOLLM_CONFIG_PATH,\n", "\t)\n", "\tpmnet_losses = evaluate(\n", "\t\tPMNET_MODEL_ID,\n", "\t\tPMNET_CKPT,\n", "\t\ttest_dataset,\n", "\t\tPMNET_LOSS_DIR,\n", "\t\tconfig_path=PMNET_CONFIG_PATH,\n", "\t)\n", "\tpmnet_no_mem_losses = evaluate(\n", "\t\tPMNET_MODEL_ID,\n", "\t\tPMNET_NO_MEM_CKPT,\n", "\t\ttest_dataset,\n", "\t\tPMNET_NO_MEM_LOSS_DIR,\n", "\t\tconfig_path=PMNET_NO_MEM_CONFIG_PATH,\n", "\t)\n", "\tpmnet_no_rec_losses = evaluate(\n", "\t\t\tPMNET_MODEL_ID,\n", "\t\t\tPMNET_CKPT,\n", "\t\t\ttest_dataset,\n", "\t\t\tPMNET_NO_REC_LOSS_DIR,\n", "\t\t\tconfig_path=PMNET_NO_MEM_CONFIG_PATH,\n", "\t)\n", "\tpmnet_no_mem_rec_losses = evaluate(\n", "\t\t\tPMNET_MODEL_ID,\n", "\t\t\tPMNET_NO_MEM_CKPT,\n", "\t\t\ttest_dataset,\n", "\t\t\tPMNET_NO_MEM_REC_LOSS_DIR,\n", "\t\t\tconfig_path=PMNET_CONFIG_PATH,\n", "\t)\n", "\n", "\tmamba_x, mamba_smooth = smooth_curve(mamba_losses)\n", "\tsmol_x, smol_smooth = smooth_curve(smol_losses)\n", "\tx_pmnet, smooth_on = smooth_curve(pmnet_losses)\n", "\t_, smooth_off = smooth_curve(pmnet_no_mem_losses)\n", "\t_, smooth_no_rec = smooth_curve(pmnet_no_rec_losses)\n", "\t_, smooth_no_mem_rec = smooth_curve(pmnet_no_mem_rec_losses)\n", "\n", "\t# smol_config = load_model_config(SMOLLM_MODEL_ID, SMOLLM_CONFIG_PATH)\n", "\t# smol_ctx = smol_config.max_position_embeddings\n", "\n", "\tplt.figure(figsize=(12, 6))\n", "\tplt.plot(\n", "\t\tx_pmnet,\n", "\t\tsmooth_on,\n", "\t\tlabel=\"PMNet\",\n", "\t\tcolor=\"green\",\n", "\t\talpha=1,\n", "\t)\n", "\tplt.plot(mamba_x, mamba_smooth, label=\"Mamba\", color=\"blue\", alpha=0.6)\n", "\tplt.plot(smol_x, smol_smooth, label=\"SmolLM\", color=\"grey\", alpha=0.6)\n", "\tplt.plot(\n", "\t\tx_pmnet,\n", "\t\tsmooth_no_rec,\n", "\t\tlabel=\"PMNet No Recurrence\",\n", "\t\tcolor=\"orange\",\n", "\t\talpha=1,\n", "\t\tlinestyle=\"--\",\n", "\t)\n", "\tplt.plot(\n", "\t\tx_pmnet,\n", "\t\tsmooth_off,\n", "\t\tlabel=\"PMNet No Mememory / No Recurrence\",\n", "\t\tcolor=\"red\",\n", "\t\talpha=1,\n", "\t\tlinestyle=\"--\",\n", "\t)\n", "\tplt.plot(\n", "\t\tx_pmnet,\n", "\t\tsmooth_no_mem_rec,\n", "\t\tlabel=\"PMNet No Mememory / Recurrence\",\n", "\t\tcolor=\"purple\",\n", "\t\talpha=1,\n", "\t\tlinestyle=\"--\",\n", "\t)\n", "\n", "\t# approx_byte_limit = smol_ctx * 4\n", "\t# plt.axvline(\n", "\t# \tx=approx_byte_limit,\n", "\t# \tcolor=\"gray\",\n", "\t# \tlinestyle=\"--\",\n", "\t# \tlabel=f\"SmolLM\",\n", "\t# )\n", "\n", "\tplt.title(\"Long Context BPB Comparison\\nData: PG19 Test\", fontsize=20, fontweight=\"bold\")\n", "\tplt.xlabel(\"Position in Bytes\", fontsize=18)\n", "\tplt.ylabel(\"Bits Per Byte\", fontsize=18)\n", "\tplt.yscale(\"log\")\n", "\tplt.xticks(fontsize=16)\n", "\tplt.yticks(fontsize=16)\n", "\n", "\t# handles, labels = plt.gca().get_legend_handles_labels()\n", "\t# order = [\n", "\t# ]\n", "\t# index = [labels.index(label) for label in order]\n", "\t# plt.legend([handles[i] for i in index], [labels[i] for i in index], fontsize=16)\n", "\tplt.ylim(top=5.5)\n", "\tplt.legend()\n", "\tplt.grid(True, alpha=0.3)\n", "\t# plt.ylim(top=4.0)\n", "\tplt.tight_layout()\n", "\tplt.savefig(PLOT_SAVE_PATH)\n", "\tprint(f\"Graph saved to {PLOT_SAVE_PATH}\")\n", "\n", "\n", "main()\n" ] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "A100", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.13" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "081ce52558254ddfb5fb6699e37627bf": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "2fb8a5922cd249c8a701897774d70013": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_74a631a2775e440dabcb6308b37c44bb", "placeholder": "​", "style": "IPY_MODEL_904d7de378aa4836b140b2541d1eb70e", "value": " 23/23 [00:00<00:00, 2988.51it/s]" } }, "31bde5565e65472a8518bedd3e9902bf": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "404f8191114f4ff2a6a43262916a61c4": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "69e05d36c79f412e8e44b069b5b0d599": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_846b7fee95ed4e92bd68d4d321b10ec0", "max": 23, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_081ce52558254ddfb5fb6699e37627bf", "value": 23 } }, "718155cd08ad4645a6ab5ed9c40560a1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_cb9eccd3e1a845e68f6d19b08b584be5", "IPY_MODEL_69e05d36c79f412e8e44b069b5b0d599", "IPY_MODEL_2fb8a5922cd249c8a701897774d70013" ], "layout": "IPY_MODEL_31bde5565e65472a8518bedd3e9902bf" } }, "74a631a2775e440dabcb6308b37c44bb": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "846b7fee95ed4e92bd68d4d321b10ec0": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "904d7de378aa4836b140b2541d1eb70e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "b735180998ee42c981708cef0ffb2e13": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "cb9eccd3e1a845e68f6d19b08b584be5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_404f8191114f4ff2a6a43262916a61c4", "placeholder": "​", "style": "IPY_MODEL_b735180998ee42c981708cef0ffb2e13", "value": "Resolving data files: 100%" } } } } }, "nbformat": 4, "nbformat_minor": 5 }