From 62381cb6535ba12b1ca964bccc920f6afa36bc37 Mon Sep 17 00:00:00 2001 From: VsevolodX <79542055+VsevolodX@users.noreply.github.com> Date: Mon, 23 Dec 2024 12:27:28 -0800 Subject: [PATCH 1/3] feat: add fraft implementation --- .../text_on_nanoribbon.ipynb | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 other/materials_designer/text_on_nanoribbon.ipynb diff --git a/other/materials_designer/text_on_nanoribbon.ipynb b/other/materials_designer/text_on_nanoribbon.ipynb new file mode 100644 index 00000000..0041a50b --- /dev/null +++ b/other/materials_designer/text_on_nanoribbon.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "code", + "outputs": [], + "source": [ + "\n", + "from mat3ra.made.material import Material\n", + "from mat3ra.standata.materials import Materials\n", + "from mat3ra.made.tools.build.nanoribbon import create_nanoribbon, NanoribbonConfiguration\n", + "combined_length = 80\n", + "material = Material(Material.default_config)\n", + "graphene = Material(Materials.get_by_name_first_match(\"Graphene\"))\n", + "config = NanoribbonConfiguration(material=graphene, width = 4 * 10, length = combined_length , edge_type = \"zigzag\")\n", + "nanoribbon = create_nanoribbon(config)" + ], + "metadata": { + "collapsed": false + }, + "id": "624bdfcebc989400", + "execution_count": null + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "from mat3ra.made.tools.modify import rotate\n", + "from IPython.display import display\n", + "\n", + "import numpy as np\n", + "from matplotlib import font_manager\n", + "def create_text_grid(digit, grid_size=10):\n", + " \"\"\"\n", + " Create a grid representation of a single digit.\n", + " Parameters:\n", + " digit (str): A single digit as a string (e.g., '2', '0', etc.).\n", + " grid_size (int): The size of the grid for each digit (default: 10).\n", + " Returns:\n", + " np.ndarray: A binary grid with 1s representing the digit.\n", + " \"\"\"\n", + " from PIL import Image, ImageDraw, ImageFont\n", + "\n", + " # Create a blank image with white background\n", + " image = Image.new(\"1\", (grid_size, grid_size), color=1) # \"1\" mode for binary image\n", + " draw = ImageDraw.Draw(image)\n", + " \n", + " #Find the path for a specific fon\n", + " \n", + " # Use a bitmap font to disable antialiasing\n", + " try:\n", + " font = ImageFont.load_default()\n", + " except IOError:\n", + " raise RuntimeError(\"Failed to load bitmap font. Make sure PIL's default font is available.\")\n", + "\n", + " # Load a basic font and draw the digit\n", + " draw.text((0, 0), digit, fill=0, font=font)\n", + "\n", + " # Convert to a binary grid\n", + " grid = np.array(image)\n", + " \n", + " scale_factor = 10\n", + " # Scale the image for better visualization\n", + " scaled_size = (grid_size * scale_factor, grid_size * scale_factor)\n", + " scaled_image = image.resize(scaled_size, resample=Image.NEAREST)\n", + "\n", + " # Display the scaled image in the notebook\n", + " print(f\"Digit: {digit}\")\n", + " display(scaled_image)\n", + "\n", + " return grid\n", + "\n", + "def create_text_structure(digits, spacing=10, grid_size=10, lattice_param=2.0, x_shift=0):\n", + " \"\"\"\n", + " Create the atomic coordinates to represent a series of digits.\n", + " Parameters:\n", + " digits (str): The digits to represent (e.g., '2025').\n", + " spacing (int): Spacing between the digits.\n", + " grid_size (int): The size of the grid for each digit.\n", + " lattice_param (float): Lattice parameter for the atomic structure.\n", + " Returns:\n", + " np.ndarray: Array of atomic coordinates for the digits.\n", + " \"\"\"\n", + " all_coords = []\n", + " x_offset = 0\n", + "\n", + " for digit in digits:\n", + " # Get the grid for the current digit\n", + " grid = create_text_grid(digit, grid_size)\n", + " \n", + " # Convert grid positions to coordinates\n", + " x_offset += grid_size * lattice_param + spacing * lattice_param + x_shift\n", + " for y in range(grid.shape[0]):\n", + " for x in range(grid.shape[1]):\n", + " if not grid[y, x]:\n", + " # Map grid points to 3D coordinates\n", + " all_coords.append([\n", + " x * lattice_param + x_offset,\n", + " y * lattice_param,\n", + " 0.0\n", + " ])\n", + " # Add spacing between digits\n", + "\n", + " return np.array(all_coords)\n", + "\n", + "\n", + "\n", + "# Parameters\n", + "digits = \"2025\"\n", + "lattice_param = 2.46 # Distance between atoms\n", + "grid_size = 10 # Resolution of the digit\n", + "spacing = 0 # Spacing between digits\n", + "x_shift = -5\n", + "\n", + "# Generate the coordinates for the digits\n", + "coords = create_text_structure(digits, spacing=spacing, grid_size=grid_size, lattice_param=lattice_param, x_shift=x_shift)\n", + "# print(coords)\n", + "\n", + "# material = Material(Material.default_config)\n", + "# graphene = Material(Materials.get_by_name_first_match(\"Graphene\"))\n", + "# config = NanoribbonConfiguration(material=graphene, width = len(digits) * grid_size, length = len(digits) * grid_size * 2 , edge_type = \"zigzag\")\n", + "# material = create_nanoribbon(config)\n", + "material = nanoribbon.clone()\n", + "# size = lattice_param * grid_size * len(digits) + spacing * lattice_param * (len(digits) - 1)\n", + "# material.set_new_lattice_vectors([size, 0, 0], [0, size, 0], [0, 0, 20])\n", + "\n", + "\n", + "for coord in coords:\n", + " coord_copy = coord\n", + " coord[0] = coord[0] - lattice_param*6\n", + " coord[1] = coord[1] + lattice_param*3\n", + " coord[2] = coord[2] - lattice_param\n", + " material.add_atom(\"Au\", coord, use_cartesian_coordinates=True)\n", + " mirror_coord = coord\n", + " mirror_coord[0] = -coord[0]\n", + " mirror_coord[2] = coord_copy[2] + 2.5*lattice_param\n", + " material.add_atom(\"Cs\", mirror_coord, use_cartesian_coordinates=True)\n", + " \n", + "\n" + ], + "metadata": { + "collapsed": false + }, + "id": "77ef96120b42e981", + "execution_count": null + }, + { + "cell_type": "code", + "outputs": [], + "source": [ + "from utils.jupyterlite import set_materials\n", + "from utils.visualize import visualize_materials\n", + "from mat3ra.made.tools.modify import add_vacuum, translate_to_z_level\n", + "\n", + "material_copy = material.clone()\n", + "\n", + "material_copy = add_vacuum(material_copy, 20, to_bottom=True)\n", + "material_copy = translate_to_z_level(material_copy, \"center\")\n", + "material_copy = rotate(material_copy, [1,0,0], -90, rotate_cell=False)\n", + "\n", + "visualize_materials([material_copy], rotation=\"-180x\")\n", + "visualize_materials([material_copy], rotation=\"-90x\")\n", + "\n", + "material_copy.name = \"2025\"\n", + "set_materials([material_copy])\n", + "\n" + ], + "metadata": { + "collapsed": false + }, + "id": "9d490352a66e5f20", + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From ca9d2de7686259c9dfdaf82ed672fc10cb1a1f8e Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Fri, 19 Dec 2025 23:10:31 -0800 Subject: [PATCH 2/3] chore: adjust values --- .../text_on_nanoribbon.ipynb | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/other/materials_designer/text_on_nanoribbon.ipynb b/other/materials_designer/text_on_nanoribbon.ipynb index 0041a50b..389acd44 100644 --- a/other/materials_designer/text_on_nanoribbon.ipynb +++ b/other/materials_designer/text_on_nanoribbon.ipynb @@ -2,13 +2,12 @@ "cells": [ { "cell_type": "code", - "outputs": [], "source": [ "\n", "from mat3ra.made.material import Material\n", "from mat3ra.standata.materials import Materials\n", "from mat3ra.made.tools.build.nanoribbon import create_nanoribbon, NanoribbonConfiguration\n", - "combined_length = 80\n", + "combined_length = 32\n", "material = Material(Material.default_config)\n", "graphene = Material(Materials.get_by_name_first_match(\"Graphene\"))\n", "config = NanoribbonConfiguration(material=graphene, width = 4 * 10, length = combined_length , edge_type = \"zigzag\")\n", @@ -18,11 +17,11 @@ "collapsed": false }, "id": "624bdfcebc989400", + "outputs": [], "execution_count": null }, { "cell_type": "code", - "outputs": [], "source": [ "from mat3ra.made.tools.modify import rotate\n", "from IPython.display import display\n", @@ -105,7 +104,7 @@ "\n", "\n", "# Parameters\n", - "digits = \"2025\"\n", + "digits = \"2026\"\n", "lattice_param = 2.46 # Distance between atoms\n", "grid_size = 10 # Resolution of the digit\n", "spacing = 0 # Spacing between digits\n", @@ -126,13 +125,13 @@ "\n", "for coord in coords:\n", " coord_copy = coord\n", - " coord[0] = coord[0] - lattice_param*6\n", - " coord[1] = coord[1] + lattice_param*3\n", - " coord[2] = coord[2] - lattice_param\n", + " coord[0] = coord[0] - lattice_param*7\n", + " coord[1] = coord[1] + lattice_param*2 + 90\n", + " coord[2] = coord[2] + 2*lattice_param\n", " material.add_atom(\"Au\", coord, use_cartesian_coordinates=True)\n", " mirror_coord = coord\n", " mirror_coord[0] = -coord[0]\n", - " mirror_coord[2] = coord_copy[2] + 2.5*lattice_param\n", + " mirror_coord[2] = coord_copy[2] + 5*lattice_param\n", " material.add_atom(\"Cs\", mirror_coord, use_cartesian_coordinates=True)\n", " \n", "\n" @@ -141,11 +140,11 @@ "collapsed": false }, "id": "77ef96120b42e981", + "outputs": [], "execution_count": null }, { "cell_type": "code", - "outputs": [], "source": [ "from utils.jupyterlite import set_materials\n", "from utils.visualize import visualize_materials\n", @@ -160,7 +159,7 @@ "visualize_materials([material_copy], rotation=\"-180x\")\n", "visualize_materials([material_copy], rotation=\"-90x\")\n", "\n", - "material_copy.name = \"2025\"\n", + "material_copy.name = \"2026\"\n", "set_materials([material_copy])\n", "\n" ], @@ -168,6 +167,23 @@ "collapsed": false }, "id": "9d490352a66e5f20", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "", + "id": "a1eeb21267b40606", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "", + "id": "cfb846e053e5b355", + "outputs": [], "execution_count": null } ], From 219161a223270ec128181104f3fc8bf8058210aa Mon Sep 17 00:00:00 2001 From: VsevolodX Date: Sat, 20 Dec 2025 00:14:52 -0800 Subject: [PATCH 3/3] update: generalize + man adj --- .../text_on_nanoribbon.ipynb | 280 ++++++++++-------- 1 file changed, 161 insertions(+), 119 deletions(-) diff --git a/other/materials_designer/text_on_nanoribbon.ipynb b/other/materials_designer/text_on_nanoribbon.ipynb index 389acd44..5eff1223 100644 --- a/other/materials_designer/text_on_nanoribbon.ipynb +++ b/other/materials_designer/text_on_nanoribbon.ipynb @@ -1,188 +1,230 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "d8a8021cf80ad95c", + "metadata": {}, + "source": [ + "# Create a nanoribbon material with the digits (or letters) on a nanoribbon." + ] + }, { "cell_type": "code", + "id": "b1158553", + "metadata": {}, "source": [ - "\n", "from mat3ra.made.material import Material\n", - "from mat3ra.standata.materials import Materials\n", "from mat3ra.made.tools.build.nanoribbon import create_nanoribbon, NanoribbonConfiguration\n", + "from mat3ra.standata.materials import Materials\n", + "from mat3ra.made.tools.modify import rotate\n", + "from IPython.display import display\n", + "import numpy as np\n", + "\n", + "\n", + "DIGITS_STRING = \"2026\"\n", + "grid_size = 10\n", + "\n", + "SHOW_DIGITS = False\n", + "\n", "combined_length = 32\n", "material = Material(Material.default_config)\n", "graphene = Material(Materials.get_by_name_first_match(\"Graphene\"))\n", - "config = NanoribbonConfiguration(material=graphene, width = 4 * 10, length = combined_length , edge_type = \"zigzag\")\n", - "nanoribbon = create_nanoribbon(config)" + "config = NanoribbonConfiguration(material=graphene, width=4 * 10, length=combined_length, edge_type=\"zigzag\")\n", + "nanoribbon = create_nanoribbon(config)\n" ], - "metadata": { - "collapsed": false - }, - "id": "624bdfcebc989400", "outputs": [], "execution_count": null }, { "cell_type": "code", + "id": "f6ba0797", + "metadata": {}, "source": [ - "from mat3ra.made.tools.modify import rotate\n", - "from IPython.display import display\n", - "\n", - "import numpy as np\n", - "from matplotlib import font_manager\n", - "def create_text_grid(digit, grid_size=10):\n", + "def generate_digit_grid(digit, grid_size=10):\n", " \"\"\"\n", - " Create a grid representation of a single digit.\n", - " Parameters:\n", - " digit (str): A single digit as a string (e.g., '2', '0', etc.).\n", - " grid_size (int): The size of the grid for each digit (default: 10).\n", - " Returns:\n", - " np.ndarray: A binary grid with 1s representing the digit.\n", + " Generate a binary grid for a digit and return ON pixel coordinates.\n", " \"\"\"\n", " from PIL import Image, ImageDraw, ImageFont\n", - "\n", - " # Create a blank image with white background\n", - " image = Image.new(\"1\", (grid_size, grid_size), color=1) # \"1\" mode for binary image\n", - " draw = ImageDraw.Draw(image)\n", " \n", - " #Find the path for a specific fon\n", + " image = Image.new(\"1\", (grid_size, grid_size), color=1)\n", + " draw = ImageDraw.Draw(image)\n", " \n", - " # Use a bitmap font to disable antialiasing\n", " try:\n", " font = ImageFont.load_default()\n", " except IOError:\n", - " raise RuntimeError(\"Failed to load bitmap font. Make sure PIL's default font is available.\")\n", - "\n", - " # Load a basic font and draw the digit\n", + " raise RuntimeError(\"Failed to load bitmap font.\")\n", + " \n", " draw.text((0, 0), digit, fill=0, font=font)\n", - "\n", - " # Convert to a binary grid\n", " grid = np.array(image)\n", " \n", - " scale_factor = 10\n", - " # Scale the image for better visualization\n", - " scaled_size = (grid_size * scale_factor, grid_size * scale_factor)\n", - " scaled_image = image.resize(scaled_size, resample=Image.NEAREST)\n", + " on_pixels = [(x, y) for y in range(grid.shape[0]) for x in range(grid.shape[1]) if not grid[y, x]]\n", + " return on_pixels\n", "\n", - " # Display the scaled image in the notebook\n", - " print(f\"Digit: {digit}\")\n", + "def visualize_digit_coords(coords, grid_size=10):\n", + " \"\"\"\n", + " Visualize digit coordinates as a grid and image.\n", + " \"\"\"\n", + " from PIL import Image\n", + " \n", + " grid = np.ones((grid_size, grid_size), dtype=int)\n", + " for x, y in coords:\n", + " if 0 <= y < grid_size and 0 <= x < grid_size:\n", + " grid[y, x] = 0\n", + " \n", + " print(\" \", end=\"\")\n", + " for x in range(grid_size):\n", + " print(f\"{x:2}\", end=\" \")\n", + " print()\n", + " \n", + " for y in range(grid_size):\n", + " print(f\"{y:2} \", end=\"\")\n", + " for x in range(grid_size):\n", + " print(f\"{grid[y, x]:2}\", end=\" \")\n", + " print()\n", + " \n", + " image = Image.fromarray((grid * 255).astype(np.uint8), mode='L')\n", + " scale_factor = 10\n", + " scaled_image = image.resize((grid_size * scale_factor, grid_size * scale_factor), resample=Image.NEAREST)\n", " display(scaled_image)\n", + " \n", + " print(f\"\\nON pixels: {coords}\")\n", "\n", - " return grid\n", - "\n", - "def create_text_structure(digits, spacing=10, grid_size=10, lattice_param=2.0, x_shift=0):\n", + "def toggle_pixels(coords, toggles):\n", " \"\"\"\n", - " Create the atomic coordinates to represent a series of digits.\n", - " Parameters:\n", - " digits (str): The digits to represent (e.g., '2025').\n", - " spacing (int): Spacing between the digits.\n", - " grid_size (int): The size of the grid for each digit.\n", - " lattice_param (float): Lattice parameter for the atomic structure.\n", - " Returns:\n", - " np.ndarray: Array of atomic coordinates for the digits.\n", + " Toggle pixels in the coordinate list.\n", + " If a coordinate is in the list, remove it. If not, add it.\n", " \"\"\"\n", - " all_coords = []\n", - " x_offset = 0\n", - "\n", - " for digit in digits:\n", - " # Get the grid for the current digit\n", - " grid = create_text_grid(digit, grid_size)\n", - " \n", - " # Convert grid positions to coordinates\n", - " x_offset += grid_size * lattice_param + spacing * lattice_param + x_shift\n", - " for y in range(grid.shape[0]):\n", - " for x in range(grid.shape[1]):\n", - " if not grid[y, x]:\n", - " # Map grid points to 3D coordinates\n", - " all_coords.append([\n", - " x * lattice_param + x_offset,\n", - " y * lattice_param,\n", - " 0.0\n", - " ])\n", - " # Add spacing between digits\n", - "\n", - " return np.array(all_coords)\n", + " coords_set = set(coords)\n", + " for toggle in toggles:\n", + " if toggle in coords_set:\n", + " coords_set.remove(toggle)\n", + " else:\n", + " coords_set.add(toggle)\n", + " return list(coords_set)\n" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "id": "c625e22c", + "metadata": {}, + "source": [ "\n", + "digits_coords = []\n", + "for i, digit in enumerate(DIGITS_STRING):\n", + " coords = generate_digit_grid(digit, grid_size)\n", + " digits_coords.append(coords)\n", + " if SHOW_DIGITS:\n", + " print(f\"Digit {i} ('{digit}'):\")\n", + " visualize_digit_coords(coords, grid_size)\n", + " print()\n" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "id": "187f99ff", + "metadata": {}, + "source": [ + "adjustments = {\n", + " # 3: [(5, 4)],\n", + "}\n", "\n", "\n", - "# Parameters\n", - "digits = \"2026\"\n", - "lattice_param = 2.46 # Distance between atoms\n", - "grid_size = 10 # Resolution of the digit\n", - "spacing = 0 # Spacing between digits\n", + "for digit_index, toggles in adjustments.items():\n", + " digits_coords[digit_index] = toggle_pixels(digits_coords[digit_index], toggles)\n", + " print(f\"Adjusted Digit {digit_index} ('{DIGITS_STRING[digit_index]}'):\")\n", + " visualize_digit_coords(digits_coords[digit_index], grid_size)\n", + " print()\n" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "id": "03ef6570", + "metadata": {}, + "source": [ + "def create_material_from_digit_coords(digit_coords_list, nanoribbon, grid_size, lattice_param=2.46, spacing=0, x_shift=-5):\n", + " \"\"\"\n", + " Create material with atoms positioned based on digit coordinates.\n", + " \"\"\"\n", + " material = nanoribbon.clone()\n", + " x_offset = 0\n", + " \n", + " for digit_coords in digit_coords_list:\n", + " x_offset += grid_size * lattice_param + spacing * lattice_param + x_shift\n", + " \n", + " for x, y in digit_coords:\n", + " coord = np.array([\n", + " x * lattice_param + x_offset - lattice_param * 7,\n", + " y * lattice_param + lattice_param * 2 + 90,\n", + " 2 * lattice_param\n", + " ])\n", + " material.add_atom(\"Au\", coord, use_cartesian_coordinates=True)\n", + " \n", + " mirror_coord = np.array([\n", + " -coord[0],\n", + " coord[1],\n", + " 5 * lattice_param\n", + " ])\n", + " material.add_atom(\"Cs\", mirror_coord, use_cartesian_coordinates=True)\n", + " \n", + " return material\n" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "id": "0e554c39", + "metadata": {}, + "source": [ + "lattice_param = 2.46\n", + "spacing = 0\n", "x_shift = -5\n", "\n", - "# Generate the coordinates for the digits\n", - "coords = create_text_structure(digits, spacing=spacing, grid_size=grid_size, lattice_param=lattice_param, x_shift=x_shift)\n", - "# print(coords)\n", - "\n", - "# material = Material(Material.default_config)\n", - "# graphene = Material(Materials.get_by_name_first_match(\"Graphene\"))\n", - "# config = NanoribbonConfiguration(material=graphene, width = len(digits) * grid_size, length = len(digits) * grid_size * 2 , edge_type = \"zigzag\")\n", - "# material = create_nanoribbon(config)\n", - "material = nanoribbon.clone()\n", - "# size = lattice_param * grid_size * len(digits) + spacing * lattice_param * (len(digits) - 1)\n", - "# material.set_new_lattice_vectors([size, 0, 0], [0, size, 0], [0, 0, 20])\n", - "\n", - "\n", - "for coord in coords:\n", - " coord_copy = coord\n", - " coord[0] = coord[0] - lattice_param*7\n", - " coord[1] = coord[1] + lattice_param*2 + 90\n", - " coord[2] = coord[2] + 2*lattice_param\n", - " material.add_atom(\"Au\", coord, use_cartesian_coordinates=True)\n", - " mirror_coord = coord\n", - " mirror_coord[0] = -coord[0]\n", - " mirror_coord[2] = coord_copy[2] + 5*lattice_param\n", - " material.add_atom(\"Cs\", mirror_coord, use_cartesian_coordinates=True)\n", - " \n", - "\n" + "material = create_material_from_digit_coords(digits_coords, nanoribbon, grid_size, lattice_param, spacing, x_shift)\n" ], - "metadata": { - "collapsed": false - }, - "id": "77ef96120b42e981", "outputs": [], "execution_count": null }, { "cell_type": "code", + "id": "bca66033", + "metadata": {}, "source": [ "from utils.jupyterlite import set_materials\n", "from utils.visualize import visualize_materials\n", "from mat3ra.made.tools.modify import add_vacuum, translate_to_z_level\n", "\n", "material_copy = material.clone()\n", - "\n", "material_copy = add_vacuum(material_copy, 20, to_bottom=True)\n", "material_copy = translate_to_z_level(material_copy, \"center\")\n", - "material_copy = rotate(material_copy, [1,0,0], -90, rotate_cell=False)\n", + "material_copy = rotate(material_copy, [1, 0, 0], -90, rotate_cell=False)\n", "\n", "visualize_materials([material_copy], rotation=\"-180x\")\n", "visualize_materials([material_copy], rotation=\"-90x\")\n", "\n", - "material_copy.name = \"2026\"\n", - "set_materials([material_copy])\n", - "\n" + "material_copy.name = DIGITS_STRING\n", + "set_materials([material_copy])\n" ], - "metadata": { - "collapsed": false - }, - "id": "9d490352a66e5f20", "outputs": [], "execution_count": null }, { + "cell_type": "markdown", + "id": "71c7e7b7", "metadata": {}, - "cell_type": "code", - "source": "", - "id": "a1eeb21267b40606", - "outputs": [], - "execution_count": null + "source": [] }, { - "metadata": {}, "cell_type": "code", - "source": "", "id": "cfb846e053e5b355", + "metadata": {}, + "source": [], "outputs": [], "execution_count": null }