{ "cells": [ { "cell_type": "markdown", "id": "e43797e5-ea8b-434d-ad89-1a827b1b6861", "metadata": {}, "source": [ "# Crystal Generation\n", "\n", "The very first step of ASSYST is the generation of random, periodic crystal structures." ] }, { "cell_type": "markdown", "id": "e9e47cab-f580-4d47-bf6f-bc3874a019f1", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 2, "id": "816b2d63-418b-474c-8d34-f98700460f69", "metadata": { "tags": [] }, "outputs": [], "source": [ "from assyst.crystals import Formulas, sample_space_groups\n", "from assyst.plot import concentration_histogram, distance_histogram" ] }, { "cell_type": "markdown", "id": "359570fe-12d4-4a41-af5e-d230674b447d", "metadata": {}, "source": [ "## Formulas\n", "\n", "The basic unit for structure generation in _ASSYST_ is a formula unit of a given material, such as:\n", "\n", "- Mg$_2$Ca\n", "- Mg$_4$Ca$_2$\n", "- and so on\n", "\n", "This specifies the number of atoms in a target structure and _ASSYST_ tries to generate as many different space groups of each of these as possible." ] }, { "cell_type": "markdown", "id": "4f35f397-4fe4-49a3-8189-ff87b2230b3d", "metadata": {}, "source": [ "### Creation\n", "\n", "They can by manually constructed" ] }, { "cell_type": "code", "execution_count": 14, "id": "d5e20370-502a-4e24-854d-9d25314e488d", "metadata": { "tags": [] }, "outputs": [], "source": [ "mg = Formulas(\n", " ({'Mg': 1}, {'Mg': 2}, {'Mg': 3}, {'Mg': 4})\n", ")" ] }, { "cell_type": "code", "execution_count": 15, "id": "6854b2cb-9c81-4901-884c-d39ce4f33c75", "metadata": { "tags": [] }, "outputs": [], "source": [ "mgca = Formulas( \n", " ({'Mg': 2, 'Ca': 1}, {'Mg': 4, 'Ca': 2})\n", ")" ] }, { "cell_type": "markdown", "id": "8d93c153-e983-412b-a367-f7a8289106d3", "metadata": {}, "source": [ "or with some helper methods" ] }, { "cell_type": "code", "execution_count": 16, "id": "6d9570c8-016e-4444-b6b0-7e7bd9d9d74b", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "Formulas(atoms=({'Mg': 1}, {'Mg': 2}, {'Mg': 3}, {'Mg': 4}))" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Formulas.range('Mg', 1, 5)" ] }, { "cell_type": "markdown", "id": "2c430357-c722-47e6-9524-1800ba50d2f1", "metadata": {}, "source": [ "### Operations" ] }, { "cell_type": "code", "execution_count": 17, "id": "0e32f31e-15fd-4331-94d1-6a5b7cf87f5c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "Formulas(atoms=({'Mg': 1, 'Ca': 1}, {'Mg': 2, 'Ca': 2}))" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Formulas.range('Mg', 1, 5) | Formulas.range('Ca', 1, 3)" ] }, { "cell_type": "code", "execution_count": 11, "id": "d6340492-5d64-4db4-bc6c-baf01a5bfa50", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "Formulas(atoms=({'Mg': 1, 'Ca': 1}, {'Mg': 1, 'Ca': 2}, {'Mg': 2, 'Ca': 1}, {'Mg': 2, 'Ca': 2}, {'Mg': 3, 'Ca': 1}, {'Mg': 3, 'Ca': 2}, {'Mg': 4, 'Ca': 1}, {'Mg': 4, 'Ca': 2}))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Formulas.range('Mg', 1, 5) * Formulas.range('Ca', 1, 3)" ] }, { "cell_type": "code", "execution_count": 13, "id": "9babd7fd-3879-48f1-83ba-8b12ad038747", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "Formulas(atoms=({'Mg': 1}, {'Mg': 2}, {'Mg': 3}, {'Mg': 4}, {'Ca': 1}, {'Ca': 2}))" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Formulas.range('Mg', 1, 5) + Formulas.range('Ca', 1, 3)" ] }, { "cell_type": "markdown", "id": "0f06ba47-5177-4454-affe-9f9549a8e555", "metadata": {}, "source": [ "## Sampling\n", "\n", "Once the formulas are defined the structures can be generated." ] }, { "cell_type": "code", "execution_count": 19, "id": "37a7e086-eb10-4c14-8988-182e3208562b", "metadata": { "tags": [] }, "outputs": [], "source": [ "atoms = sample_space_groups(\n", " formulas = mgca,\n", ")" ] }, { "cell_type": "markdown", "id": "0599caca-3240-420c-8bb0-39e3eb7d8d6e", "metadata": {}, "source": [ "The sampler returns a generator, the actual structures can be obtained by collecting it in a list." ] }, { "cell_type": "code", "execution_count": 21, "id": "70de1689-8bf4-4473-85ee-ef687e7fa871", "metadata": { "tags": [] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c23475693f5b4690bc941f56bc776244", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/2 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "distance_histogram(atoms, rmax=10, reduce=lambda x: x);" ] }, { "cell_type": "code", "execution_count": 24, "id": "62f034ff-4e9f-4e9a-99df-0c424a5bfd75", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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2JkxY4YWLlyoRYsWKTAw0NHeo0cP7d69263FAQAA1JXLYScvL0+33377Be02m00lJSXuqAkAAMBtXA470dHRTt96fN5HH32kZs2auaUoAAAAd3E57IwcOVJ/+ctftH37dlksFn3zzTdasWKFJkyY4NKjIgAAAK4El289nzRpkqqrq9WnTx+dOXNGt99+u6xWqyZMmKCxY8d6okYAAIBacznsWCwWPfHEE5o4caIOHz6ssrIytW3bVo0aNfJEfQAAAHXi0sdYlZWV6tOnjw4dOqSgoCC1bdtW3bt3J+gAAACf5VLYCQwM1GeffeapWgAAANzO5QuU77//fr3++uueqAUAAMDtXL5m59y5c1q8eLHef/99denSRQ0bNnTqnzNnjtuKAwAAqCuXw87nn3+uzp07S5IOHjzo1GexWNxTFQAAgJu4HHY++OADT9QBAADgEbV66jkAAEB94fKZnenTp1+2f8qUKbUuBgAAwN1cDjtr1qxxWq+srFR+fr4CAgLUvHlzwg4AAPApLoedTz755II2u92uBx98UPfee69bigIAAHAXt1yzExYWpmnTpmny5MnuGA4AAMBt3HaBcmlpqUpLS901HAAAgFu4/DHWvHnznNYNw9CJEye0fPly9e/f322FAQAAuIPLYeeFF15wWvfz89O1116r9PR0ZWZmuq0wAAAAd3A57GzatElxcXHy83P+BMwwDBUUFCg0NNRtxQEAANSVy9fsNGvWTN99990F7SdPnlRiYqJbigIAAHAXl8OOYRgXbS8rK1NwcHCdCwIAAHCnGn+MlZGRIemnh31OmTJFDRo0cPRVVVVp+/bt6tixo9sLBAAAqIsah53zXyZoGIb27t2roKAgR19QUJA6dOigCRMmuL9CAACAOqhx2Dn/tPPhw4frxRdfVFhYmMeKAgAAcBeX78ZasmSJJ+oAAADwCJcvUM7KytLixYsvaF+8eLFmzZrllqIAAADcxeWw88orr6h169YXtLdr104LFy50S1EAAADu4nLYKSwsVExMzAXt1157rU6cOOGWogAAANzF5bATFxenrVu3XtC+detWxcbGuqWo86qqqjR58mQlJiYqJCREzZs319NPP+30XT+GYWjKlCmKiYlRSEiIUlJSdOjQIbfWAQAA6i+XL1AeOXKkxo0bp8rKSt1xxx2SpJycHD322GMaP368W4ubNWuWXn75ZS1btkzt2rXTxx9/rOHDh8tms+mRRx6RJD333HOaN2+eli1bpsTERE2ePFl9+/bV/v37+ZJDAADgetiZOHGivv/+ez388MM6e/asJCk4OFiPP/642x8E+p///Eepqam66667JEkJCQn629/+ph07dkj66azO3Llz9eSTTyo1NVWS9MYbbygqKkpr167VsGHD3FoPAACof1z+GMtisWjWrFn69ttvtW3bNn366ac6efKkpkyZ4vbibrnlFuXk5OjgwYOSpE8//VQfffSR+vfvL0nKz89XYWGhUlJSHK+x2WxKSkpSbm7uJcetqKiQ3W53WgAAgDm5fGbnvEaNGqlbt27urOUCkyZNkt1uV+vWreXv76+qqio988wzSktLk/TTxdKSFBUV5fS6qKgoR9/FZGVladq0aZ4rHAAA+AyXw8706dMv2+/OMzx///vftWLFCq1cuVLt2rXTnj17NG7cOMXGxio9Pb3W42ZmZjqe9SVJdrtdcXFx7igZAAD4GJfDzpo1a5zWKysrlZ+fr4CAADVv3tytYWfixImaNGmS49qb9u3b69ixY8rKylJ6erqio6MlSUVFRU63wxcVFV32oaRWq1VWq9VtdQIAAN/lctg5/0DQn7Pb7XrwwQd17733uqWo886cOSM/P+fLivz9/VVdXS1JSkxMVHR0tHJychzhxm63a/v27XrooYfcWgsAAKifan3Nzs+FhYVp2rRpGjhwoB544AF3DClJGjhwoJ555hnFx8erXbt2+uSTTzRnzhz98Y9/lPTTxdLjxo3TjBkz1KJFC8et57GxsRo0aJDb6gAAAPWXW8KOJJWWlqq0tNRdw0mS5s+fr8mTJ+vhhx9WcXGxYmNj9ac//cnpo7LHHntMp0+f1qhRo1RSUqJbb71V2dnZfMcOAACQJFmMn38dcQ3MmzfPad0wDJ04cULLly9Xz549tXLlSrcWeCXY7XbZbDaVlpYqLCzMvYM/ZXPveABcllBe//5dAszk6My7PDJuTX9/u3xm54UXXnBa9/Pz07XXXqv09HS3f6kgAABAXbkUdiorK5WYmKiFCxeqZcuWnqoJAADAbVz6BuXAwEDt3bv3gjukAAAAfJXLqeX+++/Xa6+95olaAAAA3M7la3bOnTunxYsX6/3331eXLl3UsGFDp/45c+a4rTgAAIC6cjnsfP755+rcubMkOR7QeZ7FYnFPVQAAAG7ictj54IMPPFEHAACAR7h8zc7x48d1qa/mOX78eJ0LAgAAcCeXw05iYqK+/fbbC9q///57JSYmuqUoAAAAd3E57BiGcdFrc8rKynhEAwAA8Dk1vmYnIyND0k8XIU+ePFkNGjRw9FVVVWn79u2OJ48DAAD4ihqHnU8++UTST2d29u7dq6CgIEdfUFCQOnTooAkTJri/QgAAgDqocdg5fxfW8OHD9eKLL7r/gZkAAAAe4PKt50uWLPFEHQAAAB5R4wuUc3NztX79eqe2N954Q4mJiYqMjNSoUaNUUVHh9gIBAADqosZhZ/r06dq3b59jfe/evRoxYoRSUlI0adIkvfPOO8rKyvJIkQAAALVV47CzZ88e9enTx7G+atUqJSUladGiRcrIyNC8efP097//3SNFAgAA1FaNw84PP/ygqKgox/rmzZvVv39/x3q3bt1UUFDg3uoAAADqqMZhJyoqSvn5+ZKks2fPavfu3br55psd/adOnVJgYKD7KwQAAKiDGoedAQMGaNKkSfrwww+VmZmpBg0a6LbbbnP0f/bZZ2revLlHigQAAKitGt96/vTTT2vw4MHq2bOnGjVqpGXLljl9seDixYt15513eqRIAACA2qpx2GnSpIm2bNmi0tJSNWrUSP7+/k79b731lho1auT2AgEAAOrC5S8VtNlsF22PiIioczEAAADu5vJTzwEAAOqTWoWdMWPG6OTJk+6uBQAAwO1qHHa++uorx59XrlypsrIySVL79u35fh0AAOCzanzNTuvWrdW4cWP16NFD5eXlKigoUHx8vI4eParKykpP1ggAAFBrNT6zU1JSorfeektdunRRdXW1BgwYoJYtW6qiokLvvvuuioqKPFknAABArdQ47FRWVqp79+4aP368QkJC9Mknn2jJkiXy9/fX4sWLlZiYqFatWnmyVgAAAJfV+GOs8PBwdezYUT169NDZs2f1448/qkePHgoICNCbb76p6667Tjt37vRkrQAAAC6r8Zmdr7/+Wk8++aSsVqvOnTunLl266LbbbnM8J8tisejWW2/1ZK0AAAAuq3HYadKkiQYOHKisrCw1aNBAO3fu1NixY2WxWDRhwgTZbDb17NnTk7UCAAC4rNZfKmiz2XTfffcpMDBQGzduVH5+vh5++GF31gYAAFBnLj8uQvrpCefXXXedJKlp06YK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9+7djvdLSEiQJN17772yWCyO9V9+jFVdXa3p06fr+uuvl9VqVceOHZWdne3oP3r0qCwWi1avXq3evXurQYMG6tChg3Jzc+v2FwdAEmEHwK84efKksrOzNXr0aDVs2PCC/vDwcFVXVys1NVUnT57U5s2btWHDBn355ZcaOnSo07ZHjhzR2rVrtX79eq1fv16bN2/WzJkzHf2ZmZmaOXOmJk+erP3792vlypWKioqSJFVWVqpv374KDQ3Vhx9+qK1bt6pRo0bq16+fzp496xjjgw8+0JEjR/TBBx9o2bJlWrp0qZYuXSpJWr16ta6//npNnz5dJ06c0IkTJxyvO3PmjGbNmqXXXntN+/btU2RkpE6dOqX09HR99NFH2rZtm1q0aKEBAwY4AtrOnTslSUuWLNGJEycc67/04osv6vnnn9fs2bP12WefqW/fvrrnnnt06NAhp+2eeOIJTZgwQXv27FHLli31+9//XufOnavpXxWAS/H2k0gB+Lbt27cbkozVq1dfcpv33nvP8Pf3N44fP+5o27dvnyHJ2LFjh2EYhjF16lSjQYMGht1ud2wzceJEIykpyTAMw7Db7YbVajUWLVp00fdYvny50apVK6O6utrRVlFRYYSEhBjvvvuuYRg/PeG9adOmTk9q/t3vfmcMHTrUsd60aVPjhRdecBp7yZIlhiRjz549l52LqqoqIzQ01HjnnXccbZKMNWvWOG03depUo0OHDo712NhY45lnnnHaplu3bsbDDz9sGIZh5OfnG5KM1157zdF/fv4OHDhw2ZoA/DrO7AC4LMMwfnWbAwcOKC4uTnFxcY62tm3bKjw8XAcOHHC0JSQkKDQ01LEeExOj4uJixxgVFRXq06fPRd/j008/1eHDhxUaGuq4JiYiIkLl5eU6cuSIY7t27drJ39//ou9xOUFBQbrpppuc2oqKijRy5Ei1aNFCNptNYWFhKisr0/Hjx391vPPsdru++eYb9ejRw6m9R48eTnMjyen9Y2JiJKlGtQO4PC5QBnBZLVq0kMVicctFyIGBgU7rFotF1dXVkqSQkJDLvrasrExdunTRihUrLui79tpra/QelxMSEuK4hue89PR0ff/993rxxRfVtGlTWa1WJScnO31s5k4/r/18LTWpHcDlcWYHwGVFRESob9++WrBggU6fPn1Bf0lJidq0aaOCggIVFBQ42vfv36+SkhK1bdu2Ru/TokULhYSEXPKW7c6dO+vQoUOKjIzUDTfc4LTYbLYa709QUJCqqqpqtO3WrVv1yCOPaMCAAWrXrp2sVqu+++47p20CAwMvO15YWJhiY2O1devWC8au6dwAqBvCDoBftWDBAlVVVal79+765z//qUOHDunAgQOaN2+ekpOTlZKSovbt2ystLU27d+/Wjh079Ic//EE9e/ZU165da/QewcHBevzxx/XYY4/pjTfe0JEjR7Rt2za9/vrrkqS0tDQ1adJEqamp+vDDD5Wfn69NmzbpkUce0VdffVXjfUlISNCWLVv09ddfXxBcfqlFixZavny5Dhw4oO3btystLe2CM1AJCQnKyclRYWGhfvjhh4uOM3HiRM2aNUtvvvmm8vLyNGnSJO3Zs0d/+ctfalw3gNoj7AD4Vc2aNdPu3bvVu3dvjR8/XjfeeKN+85vfKCcnRy+//LIsFovefvttXXPNNbr99tuVkpKiZs2a6c0333TpfSZPnqzx48drypQpatOmjYYOHeq4ZqVBgwbasmWL4uPjNXjwYLVp00YjRoxQeXm5wsLCavwe06dP19GjR9W8eXOnj78u5vXXX9cPP/ygzp0764EHHtAjjzyiyMhIp22ef/55bdiwQXFxcerUqdNFx3nkkUeUkZGh8ePHq3379srOzta6devUokWLGtcNoPYsRk2uPgQAAKinOLMDAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABM7f8BqJ9w3aOZvIUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "concentration_histogram(atoms)" ] }, { "cell_type": "markdown", "id": "ec3980a0-b497-4425-b21d-3235eea5c647", "metadata": {}, "source": [ "### Advanced Sampling" ] }, { "cell_type": "markdown", "id": "dec40662-ce7d-411e-9448-18fdd2679c1a", "metadata": {}, "source": [ "The sampling function supports a few more options for advanced sampling." ] }, { "cell_type": "code", "execution_count": 18, "id": "e87811b3-c7ef-4794-b9fa-fa730908b8a5", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "\u001b[31mSignature:\u001b[39m\n", "sample_space_groups(\n", " formulas: Union[assyst.crystals.Formulas, Iterable[dict[str, int]]],\n", " spacegroups: Union[list[int], tuple[int, ...], Iterable[int], NoneType] = \u001b[38;5;28;01mNone\u001b[39;00m,\n", " min_atoms: int = \u001b[32m1\u001b[39m,\n", " max_atoms: int = \u001b[32m10\u001b[39m,\n", " max_structures: int | \u001b[38;5;28;01mNone\u001b[39;00m = \u001b[38;5;28;01mNone\u001b[39;00m,\n", " dim: Literal[\u001b[32m0\u001b[39m, \u001b[32m1\u001b[39m, \u001b[32m2\u001b[39m, \u001b[32m3\u001b[39m] = \u001b[32m3\u001b[39m,\n", " tolerance: Union[Literal[\u001b[33m'metallic'\u001b[39m, \u001b[33m'atomic'\u001b[39m, \u001b[33m'molecular'\u001b[39m, \u001b[33m'vdW'\u001b[39m], assyst.filters.DistanceFilter, dict] = \u001b[33m'metallic'\u001b[39m,\n", ") -> Iterator[ase.atoms.Atoms]\n", "\u001b[31mDocstring:\u001b[39m\n", "Create symmetric random structures.\n", "\n", "Args:\n", " formulas (Formulas or iterable of dicts from str to int): list of chemical formulas\n", " spacegroups (list of int): which space groups to generate\n", " max_atoms (int): do not generate structures larger than this\n", " max_structures (int): generate at most this many structures\n", " dim (one of 0, 1, 2, or 3): the dimensionality of the structures to generate; if lower than 3 the code generates\n", " samples no longer from space groups, but from the subperiodic layer, rod, or point groups.\n", " tolerance (str, dict of elements to radii):\n", " specifies minimum allowed distances between atoms in generated structures;\n", " if str then it should be one values understood by :class:`pyxtal.tolerace.Tol_matrix`;\n", " if dict each value gives the minimum *radius* allowed for an atom, whether a given distance is allowed then\n", " depends on the sum of the radii of the respective elements\n", "\n", "Yields:\n", " `Atoms`: random symmetric crystal structures\n", "\u001b[31mFile:\u001b[39m ~/science/phd/dev/assyst/assyst/crystals.py\n", "\u001b[31mType:\u001b[39m function" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sample_space_groups?" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "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.12.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "065344242d3344f98191d07fce45de9a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "06e66484cdef48afa4bafbdd719d3637": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_4be67e2775ca4fedb0fe8ffe8c994444", "max": 230, "style": "IPY_MODEL_455a5d0d8f8c4ae5a107400367792663", "value": 230 } }, "2122162ece724b0aa879115594e13922": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "2e2460ee5586475882100cb43aba92ac": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "39879a17639a4a18b4351ac642714cf0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "3c4b34044e5a4b58b56d8dcb7653aa33": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "3dca8b316a3049109469dd8ee92cba1e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_bc87f0b6483c4b3ba09c8f31b99673ac", "IPY_MODEL_607bc49a5f844e98b6551d9aeec40813", "IPY_MODEL_7a27df31ae754f02a91c66ea733690fc" ], "layout": "IPY_MODEL_065344242d3344f98191d07fce45de9a" } }, "455a5d0d8f8c4ae5a107400367792663": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "49183b54104e428f99286706187e1dd8": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "4be67e2775ca4fedb0fe8ffe8c994444": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "4fcfaf661d02432bb56995dae9cb8976": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_2e2460ee5586475882100cb43aba92ac", "style": "IPY_MODEL_3c4b34044e5a4b58b56d8dcb7653aa33", "value": "Spacegroups: 100%" } }, "55f4197db89945ac98b4f0ee9c8243e5": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_c3e6488f815a4133b066116c464c0f1c", "style": "IPY_MODEL_39879a17639a4a18b4351ac642714cf0", "value": " 230/230 [00:01<00:00, 174.21it/s]" } }, "5e7db005181a4e2498704cb7ac32457c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_aa848ae06b03435cad916c2a2f0fc6b4", "max": 2, "style": "IPY_MODEL_49183b54104e428f99286706187e1dd8", "value": 2 } }, "5f3853edc4d74be2aa03cf6164496780": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "607bc49a5f844e98b6551d9aeec40813": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_b3c8d8132192480c8e31005801d9330c", "max": 230, "style": "IPY_MODEL_dd09d546dc3048dda3210349278ced51", "value": 230 } }, "7a27df31ae754f02a91c66ea733690fc": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_942acb34e30647cf8f8531911a2e4a44", "style": "IPY_MODEL_5f3853edc4d74be2aa03cf6164496780", "value": " 230/230 [00:06<00:00, 26.32it/s]" } }, "8eb32d62af1e417da38d29436d3095bd": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "910713da489d4c3e9eb3b1f17d33292d": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "942acb34e30647cf8f8531911a2e4a44": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "a0aaa3471c0d4a5da93ad72778958fb5": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "a8a206210ad4455e8719bae38077305a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_a0aaa3471c0d4a5da93ad72778958fb5", "style": "IPY_MODEL_ae1104c492054630b4b482ad0a4919ae", "value": " 2/2 [00:08<00:00,  4.62s/it]" } }, "aa848ae06b03435cad916c2a2f0fc6b4": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "ae1104c492054630b4b482ad0a4919ae": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "b3c8d8132192480c8e31005801d9330c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "b3e373d2cde94ff48dd72d3a9357fcda": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "bc87f0b6483c4b3ba09c8f31b99673ac": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_8eb32d62af1e417da38d29436d3095bd", "style": "IPY_MODEL_ec491164a79b4c78b112a67e5ebae620", "value": "Spacegroups: 100%" } }, "c23475693f5b4690bc941f56bc776244": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_c74b171069f44beba812bce2c12ee28e", "IPY_MODEL_5e7db005181a4e2498704cb7ac32457c", "IPY_MODEL_a8a206210ad4455e8719bae38077305a" ], "layout": "IPY_MODEL_b3e373d2cde94ff48dd72d3a9357fcda" } }, "c3e6488f815a4133b066116c464c0f1c": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "c74b171069f44beba812bce2c12ee28e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_e9d824ae84a0451a8f9032570de98918", "style": "IPY_MODEL_2122162ece724b0aa879115594e13922", "value": "Mg4Ca2: 100%" } }, "dd09d546dc3048dda3210349278ced51": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "e5e40bbc80114f4fa4a9862261f4b785": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_4fcfaf661d02432bb56995dae9cb8976", "IPY_MODEL_06e66484cdef48afa4bafbdd719d3637", "IPY_MODEL_55f4197db89945ac98b4f0ee9c8243e5" ], "layout": "IPY_MODEL_910713da489d4c3e9eb3b1f17d33292d" } }, "e9d824ae84a0451a8f9032570de98918": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "ec491164a79b4c78b112a67e5ebae620": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }