Skip to content
Snippets Groups Projects
handson.ipynb 329 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "![Logo](figures/GOE_Logo_Quer_IPC_Farbe_RGB.png)\n",
    "# High-Dimensional Neural Network Potentials\n",
    "**[Alexander L. M. Knoll](mailto:aknoll@chemie.uni-goettingen.de), and [Moritz R. Schäfer](mailto:moritzrichard.schaefer@uni-goettingen.de)** \n",
    "\n",
    "Behler Group, Theoretische Chemie, Institut für Physikalische Chemie\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "For this tutorial it is intended to use the RuNNer release version 1.2, available in conda-forge. \n",
    "The most recent version of RuNNer is [hosted on Gitlab](https://gitlab.com/TheochemGoettingen/RuNNer). For access please contact Prof. Dr. Jörg Behler (joerg.behler@uni-goettingen.de)."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/kalm/.pyenv/versions/pyiron/lib/python3.10/site-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated\n",
      "  \"class\": algorithms.Blowfish,\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import ipympl\n",
    "import ipywidgets as widgets\n",
    "\n",
    "from pyiron_atomistics import Project\n",
    "from pyiron_contrib.atomistics.runner.job import RunnerFit\n",
    "from pyiron_contrib.atomistics.runner.utils import container_to_ase\n",
    "\n",
    "from ase.geometry import get_distances\n",
    "\n",
    "from runnerase import generate_symmetryfunctions\n",
    "\n",
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Background\n",
    "### Architecture of an HDNNP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "**RuNNer** is a stand-alone Fortran program for the construction of high-dimensional neural network potentials (HDNNPs), written mainly by Jörg Behler. The central assumption made in constructing a HDNNP is that the total energy of the system $E_{\\mathrm{tot}}$ [can be separated into atomic contributions $E_i$](https://www.doi.org/10.1103/PhysRevLett.98.146401). HDNNP relates the local environment of the atoms to their atomic energies $E_i$, which contribute to the sum of all $N$ atomic energies, resulting in the total energy of the system $E_\\mathrm{tot}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "\\begin{align}\n",
    "E_\\mathrm{tot} = \\sum_{i}^{N}E_i\\notag\n",
    "\\end{align}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Every atomic energy is described by an atomic neural network (NN), which is element-specific. The entirety of all atomic NNs composes a HDNNP, whose general architecture is shown below for a binary system."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<img src=\"figures/2g.png\" class=\"center\" width=\"500\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "As you can see, the atomic contributions in this model are predicted independently from each other. Therefore, the model can easily describe systems with differering numbers of atoms: adding or removing an atom corresponds to adding or removing a row in the figure shown above. This ability is what puts the \"high-dimensional\" into the name \"HDNNP\". \n",
    "\n",
    "Each atomic neural networks receives input information about the local atomic environment up to a certain cutoff radius $R_{\\mathrm{c}}$. This information is encoded based on the Cartesian coordinates in many-body descriptors, so-called [atom-centered symmetry functions (ACSF or just SF)](https://www.doi.org/10.1063/1.3553717). More details about this are shown below. For each atom, the values of multiple SFs compose a SF vector $G$ which is the input layer of the atomic NNs.\n",
    "\n",
    "Atomic NNs look like this:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<img src=\"figures/ann.png\" width=\"500\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Every value in the SF vector $G$ serves as one piece of input information to the atomic NN. We refer to the circles in the figure as _nodes_ (from graph theory) or _neurons_ (from neural science). The information from the input nodes flows through the atomic NN from left to right: the input layer is followed by a configurable number of hidden layers which consist, in turn, of an arbitrary number of _hidden nodes_. At the end, all information is collected in the output layer, which in our case is interpreted as the atomic energy contribution of the atom under consideration. The input nodes and the hidden nodes in the first layer are connected by weights. Moreover, the hidden and output nodes carry a bias value.\n",
    "\n",
    "During training, the weights and biases are optimized using backpropagation to represent best the data in the training data set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "SFs provide the input for the NN and describe the local atomic environment of each atom. In principle, one could also use Cartesian coordinates to capture the atomic positions in a structure. As Cartesian coordinates describe the absolute positions of atoms the numerical input to the atomic NNs would change with translation or rotation of the system. However, these actions do not influence the energy of the system and different numerical inputs belonging to the same NN output lead to large training errors.\n",
    "\n",
    "In contrast, SFs describe the relative positions of the atoms to each other and are hence translationally and rotationally invariant. We differentiate two types of SFs: radial SF depend on the distance between atom pairs and serve as a measure for their bond order. Angular SFs additionally depend on the interatomic angles."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The cutoff function $f_{\\mathrm{c}}$ ensures that only the neighbors within one atomic environment counts towards the symmetry function values. The cutoff radius $R_\\mathrm{c}$ (usually $12\\,\\mathrm{bohr}$) defines how much of the local atomic environment is considered. All SFs and their derivatives will decrease to zero if the pairwise distance is larger than $R_\\mathrm{c}$. There are several cutoff funtions defined in **RuNNer** and we will use here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "    f_{c}(R_{ij}) = \n",
    "    \\begin{cases}\n",
    "    0.5 \\cdot [\\cos(\\pi x) + 1]& ~ \\text{for $R_{ij} \\leq R_\\mathrm{c}$},\\\\\n",
    "    0& ~ \\text{for $R_{ij} > R_\\mathrm{c}$}\n",
    "    \\end{cases}\n",
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "with the atomic distance $R_{ij}$, the cutoff radius $R_\\mathrm{c}$, and $x = \\frac{R_{ij}}{R_{\\mathrm{c}}}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Take a look at the figure below for a graphical representation of the cutoff radius in a periodic system: the red atom is the central atom for which the SF values will be calculated. All yellow atoms lie within in the cutoff radius and will therefore contribute to the SF values."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<img src=\"figures/Rc.png\" width=\"500\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "To define the parameters for the radial SFs, it is important to know the shortest bond distance for each element combination in your data set. Usually, 5-6 radial SF are used for any element pair, with different $\\eta$ values to increase the resolution for structure description. It is possible to shift the maximum of the radial SF $G^2$ by $R_{s}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "    G_{i}^{2} = \\sum_{j}^{}e^{-\\eta (R_{ij} - R_{s})^2} \\cdot f_{c}(R_{ij}).\n",
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "In most applications, the Gaussian exponents $\\eta$ for the radial SFs are chosen such that the SF turning points are equally distributed between the cutoff radius and specific minimum pairwise distance in the training dataset (small eta $\\eta$ = max. contraction). In RuNNer, you can either define element pair specific SF or define global SF which are used for every element combination. It is also possible to define different cutoff radii for the SF, even though this is rarely helpful and therefore not recommended.\n",
    "\n",
    "Below, you can see a graphical representation of the radial symmetry functions including the cutoff function for a cutoff radius of 12 Bohr."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"figures/radials.png\" width=\"800\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The same rules apply to the angular SFs. Here, however, three atomic positions are included in the calculation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "    G_{i}^{3} = 2^{\\zeta - 1}\\sum_{j}^{} \\sum_{k}^{} \\left[( 1 + \\lambda \\cdot cos \\theta_{ijk})^{\\zeta} \\cdot e^{-\\eta (R_{ij}^2 + R_{ik}^2 + R_{jk}^2)} \\cdot f_{\\mathrm{c}}(R_{ij}) \\cdot f_{\\mathrm{c}}(R_{ik}) \\cdot f_{\\mathrm{c}}(R_{jk}) \\right]\n",
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The angle $\\theta_{ijk} = \\frac{\\mathbf{R}_{ij} \\cdot \\mathbf{R}_{ik}}{R_{ij} \\cdot R_{ik}}$ is centered at atom $i$. For most system, we use permutations of $\\zeta = \\{1, 2, 4, 16\\}$, $\\eta = 0$, and $\\lambda$ = $\\{+1, -1\\}$. If many atoms of each element are present, angular SFs are usually not critical and a default set of SFs can be used."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"figures/angulars.png\" width=\"800\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Due to time limitations, we will only focus on the model described above which is known as the second generation of HDNNPs (see [here](https://www.doi.org/10.1103/PhysRevLett.98.146401), and [here](https://www.doi.org/10.1002/anie.201703114), and [here](https://www.doi.org/10.1002/qua.24890)). However, in recent years third- and fourth-generation HDNNPs were developed by the Behler group."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"figures/2g.png\" width=\"500\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "In second-generation HDNNPs only atomic interactions inside the cutoff sphere are taken into account. The resulting short-ranged potentials are well-suited to describe local bonding even for complex atomic environments. However, it can be expected that for many systems long-range interactions, primarily electrostatics, will be important.\n",
    "\n",
    "To overcome those limitations, third-generation NNs (see [here](https://www.doi.org/10.1103/PhysRevB.83.153101), and [here](https://www.doi.org/10.1063/1.3682557)) define a second set of atomic neural networks to construct environment-dependent atomic charges. They can then be used to calculate the long-range electrostatic energy without truncation. The total energy of the system is then given by the sum of the short-range and the electrostatic energies."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<img src=\"figures/3g.png\" width=\"800\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "While the use of environment-dependent charges is a clear step forward, they are not sufficient if long-range charge transfer is present.\n",
    "\n",
    "When dealing with systems where long-range charge transer is present, the usage of fourth-generation NNs (see [here](https://www.doi.org/10.1038/s41467-020-20427-2), and [here](https://www.doi.org/10.1021/acs.accounts.0c00689)) is recommended. Here, environment-dependent electronegativities $\\chi$ are computed first. They will then be used in a charge equilibration scheme to determine the atomic charges $Q$. Again, we can compute the electrostatic energy from this. Moreover, the atomic charges serve as an additional input neuron to train the short-range energy and forces. As it was the case for the third-generation NNs the total energy is then given by the sum of the short-range and the electrostatic energies."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "<img src=\"figures/4g.png\" width=\"800\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Using RuNNer via the pyiron Interface "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, training a HDNNP with **RuNNer** can be separated into three different stages - so-called modes - in which different types of calculation are performed."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "- **Mode 1:** calculation of the SF values and separation of the dataset into a training and testing set.\n",
    "- **Mode 2:** training of the model to construct the HDNNP.\n",
    "- **Mode 3:** prediction of energy and forces (stress and charges can also be predicted)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "All these steps are performed consecutively beginning with mode 1."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The creation of a meaningful neural network potential lives and dies with high quality training data. Therefore, we will begin by inspecting the full training dataset. \n",
    "The dataset has been stored prior to the workshop in form of a `TrainingContainer`. \n",
    "In pyiron, `TrainingContainer`s are jobs which take a set of structures and properties like energies, forces, ... and store them in HDF format.\n",
    "\n",
    "Go ahead and open up the project:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "outputs": [],
   "source": [
    "pr = Project('../../introduction/training')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The project already contains several jobs:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>status</th>\n",
       "      <th>chemicalformula</th>\n",
       "      <th>job</th>\n",
       "      <th>subjob</th>\n",
       "      <th>projectpath</th>\n",
       "      <th>project</th>\n",
       "      <th>timestart</th>\n",
       "      <th>timestop</th>\n",
       "      <th>totalcputime</th>\n",
       "      <th>computer</th>\n",
       "      <th>hamilton</th>\n",
       "      <th>hamversion</th>\n",
       "      <th>parentid</th>\n",
       "      <th>masterid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>212</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>full</td>\n",
       "      <td>/full</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 00:02:34.816533</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>213</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>basic</td>\n",
       "      <td>/basic</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 00:02:47.281055</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>214</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>Al_basic_atomicrex</td>\n",
       "      <td>/Al_basic_atomicrex</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 02:00:15.887059</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>226</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>data_lithium</td>\n",
       "      <td>/data_lithium</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-07-21 08:18:19.193090</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>227</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode1</td>\n",
       "      <td>/fit_mode1</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:18:22.251691</td>\n",
       "      <td>2022-07-21 08:18:28.328624</td>\n",
       "      <td>6.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>228</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode2</td>\n",
       "      <td>/fit_mode2</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:18:30.158483</td>\n",
       "      <td>2022-07-21 08:22:02.862973</td>\n",
       "      <td>212.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>227.0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>229</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode3</td>\n",
       "      <td>/fit_mode3</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:22:04.136475</td>\n",
       "      <td>2022-07-21 08:22:11.189763</td>\n",
       "      <td>7.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>228.0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>230</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_0</td>\n",
       "      <td>/job_a_3_0</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:12.207784</td>\n",
       "      <td>2022-07-21 08:22:15.498472</td>\n",
       "      <td>3.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>231</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_167</td>\n",
       "      <td>/job_a_3_167</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:15.639460</td>\n",
       "      <td>2022-07-21 08:22:15.965042</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>232</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_333</td>\n",
       "      <td>/job_a_3_333</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.102696</td>\n",
       "      <td>2022-07-21 08:22:16.395679</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>233</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_5</td>\n",
       "      <td>/job_a_3_5</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.572264</td>\n",
       "      <td>2022-07-21 08:22:16.831195</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>234</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_667</td>\n",
       "      <td>/job_a_3_667</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.975377</td>\n",
       "      <td>2022-07-21 08:22:17.282200</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>235</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_833</td>\n",
       "      <td>/job_a_3_833</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:17.434798</td>\n",
       "      <td>2022-07-21 08:22:17.694902</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>236</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_4_0</td>\n",
       "      <td>/job_a_4_0</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:17.828141</td>\n",
       "      <td>2022-07-21 08:22:18.089258</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     id    status chemicalformula                 job               subjob  \\\n",
       "0   212  finished            None                full                /full   \n",
       "1   213  finished            None               basic               /basic   \n",
       "2   214  finished            None  Al_basic_atomicrex  /Al_basic_atomicrex   \n",
       "3   226  finished            None        data_lithium        /data_lithium   \n",
       "4   227  finished            None           fit_mode1           /fit_mode1   \n",
       "5   228  finished            None           fit_mode2           /fit_mode2   \n",
       "6   229  finished            None           fit_mode3           /fit_mode3   \n",
       "7   230  finished              Li           job_a_3_0           /job_a_3_0   \n",
       "8   231  finished              Li         job_a_3_167         /job_a_3_167   \n",
       "9   232  finished              Li         job_a_3_333         /job_a_3_333   \n",
       "10  233  finished              Li           job_a_3_5           /job_a_3_5   \n",
       "11  234  finished              Li         job_a_3_667         /job_a_3_667   \n",
       "12  235  finished              Li         job_a_3_833         /job_a_3_833   \n",
       "13  236  finished              Li           job_a_4_0           /job_a_4_0   \n",
       "\n",
       "   projectpath  \\\n",
       "0         None   \n",
       "1         None   \n",
       "2         None   \n",
       "3         None   \n",
       "4         None   \n",
       "5         None   \n",
       "6         None   \n",
       "7         None   \n",
       "8         None   \n",
       "9         None   \n",
       "10        None   \n",
       "11        None   \n",
       "12        None   \n",
       "13        None   \n",
       "\n",
       "                                                                                                                          project  \\\n",
       "0               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "1               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "2               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "3               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "4   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "5   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "6   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "7     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "8     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "9     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "10    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "11    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "12    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "13    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "\n",
       "                    timestart                   timestop  totalcputime  \\\n",
       "0  2022-06-03 00:02:34.816533                        NaT           NaN   \n",
       "1  2022-06-03 00:02:47.281055                        NaT           NaN   \n",
       "2  2022-06-03 02:00:15.887059                        NaT           NaN   \n",
       "3  2022-07-21 08:18:19.193090                        NaT           NaN   \n",
       "4  2022-07-21 08:18:22.251691 2022-07-21 08:18:28.328624           6.0   \n",
       "5  2022-07-21 08:18:30.158483 2022-07-21 08:22:02.862973         212.0   \n",
       "6  2022-07-21 08:22:04.136475 2022-07-21 08:22:11.189763           7.0   \n",
       "7  2022-07-21 08:22:12.207784 2022-07-21 08:22:15.498472           3.0   \n",
       "8  2022-07-21 08:22:15.639460 2022-07-21 08:22:15.965042           0.0   \n",
       "9  2022-07-21 08:22:16.102696 2022-07-21 08:22:16.395679           0.0   \n",
       "10 2022-07-21 08:22:16.572264 2022-07-21 08:22:16.831195           0.0   \n",
       "11 2022-07-21 08:22:16.975377 2022-07-21 08:22:17.282200           0.0   \n",
       "12 2022-07-21 08:22:17.434798 2022-07-21 08:22:17.694902           0.0   \n",
       "13 2022-07-21 08:22:17.828141 2022-07-21 08:22:18.089258           0.0   \n",
       "\n",
       "          computer           hamilton hamversion  parentid masterid  \n",
       "0   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "1   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "2   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "3   pyiron@lap2p#1  TrainingContainer        0.4       NaN     None  \n",
       "4   pyiron@lap2p#1          RunnerFit        0.4       NaN     None  \n",
       "5   pyiron@lap2p#1          RunnerFit        0.4     227.0     None  \n",
       "6   pyiron@lap2p#1          RunnerFit        0.4     228.0     None  \n",
       "7   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "8   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "9   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "10  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "11  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "12  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "13  pyiron@lap2p#1             Lammps        0.1       NaN     None  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pr.job_table()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The training data is stored in the project node `initial`."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "In order to get a feeling for the data, we inspect its energy-volume curve:"
   ]
  },
  {
   "cell_type": "code",
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
    "fig, ax = plt.subplots(figsize=(14, 6))\n",
    "data_full.plot.energy_volume()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "As you can see in this plot, some regions of configuration space are much more densily sampled than others. The dataset consists of approximately 4000 structures, ranging from bulk lithium and aluminum to off-stochiometric liquid phases of LiAl alloy. \n",
    "\n",
    "Training a potential for such a large dataset to high accuracy takes a few hours. Therefore, we are going to focus on a case study: the subset of pure lithium structures in the dataset. \n",
    "\n",
    "We extract a sample from the full dataset using `TrainingContainer`s convenient `sample` function. It creates a new `TrainingContainer` job (here we give it the name `data_lithium`) using a simple filter function. The filter function will remove:\n",
    "* structures that contain Al.\n",
    "* structures with a positive energy.\n",
    "* structures in which atoms do not have any neighbors within a cutoff radius of 12 Bohr."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "def filter_lithium(container, idx):\n",
    "    \"\"\"Filter a given `container` for the most useful lithium structures.\"\"\"\n",
    "    # Get the elements, total energy and atomic positions.\n",
    "    elements = container.get_array('symbols', idx)\n",
    "    energy = container.get_array('energy', idx)\n",
    "    positions = container.get_array('positions', idx)\n",
    "\n",
    "    # Build the distance matrix.\n",
    "    distmatrix = get_distances(positions, positions)[1]\n",
    "\n",
    "    # Check if every atom has at least one neighbor in a 12 Bohr = 6.35 Ang                                                                                                          \n",
    "    # cutoff radius.\n",
    "    no_neighbors = False\n",
    "    for idx, row in enumerate(distmatrix):\n",
    "\n",
    "        # Remove self interaction.                                                                                                                                                        \n",
    "        row_no_selfinteraction = row[row > 0.0]\n",
    "\n",
    "        if all(row_no_selfinteraction > 6.35):\n",
    "            no_neighbors = True\n",
    "    \n",
    "    return 'Al' not in elements and energy < 0.0 and no_neighbors is False"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DataContainer({'save_neighbors': True, 'num_neighbors': 12})\n",
      "The job data_lithium was saved and received the ID: 237\n"
     ]
    }
   ],
   "source": [
    "# Remove the job if it already exists.\n",
    "if 'data_lithium' in pr.list_nodes():\n",
    "    pr.remove_job('data_lithium')\n",
    "\n",
    "data_lithium = data_full.sample('data_lithium', filter_lithium)"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "print(len(list(data_lithium.iter_structures())))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "When inspecting the list of jobs in the project again, you will find that an additional `TrainingContainer` has been created."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>status</th>\n",
       "      <th>chemicalformula</th>\n",
       "      <th>job</th>\n",
       "      <th>subjob</th>\n",
       "      <th>projectpath</th>\n",
       "      <th>project</th>\n",
       "      <th>timestart</th>\n",
       "      <th>timestop</th>\n",
       "      <th>totalcputime</th>\n",
       "      <th>computer</th>\n",
       "      <th>hamilton</th>\n",
       "      <th>hamversion</th>\n",
       "      <th>parentid</th>\n",
       "      <th>masterid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>212</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>full</td>\n",
       "      <td>/full</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 00:02:34.816533</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>213</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>basic</td>\n",
       "      <td>/basic</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 00:02:47.281055</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>214</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>Al_basic_atomicrex</td>\n",
       "      <td>/Al_basic_atomicrex</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-06-03 02:00:15.887059</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>zora@cmti001#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>227</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode1</td>\n",
       "      <td>/fit_mode1</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:18:22.251691</td>\n",
       "      <td>2022-07-21 08:18:28.328624</td>\n",
       "      <td>6.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>228</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode2</td>\n",
       "      <td>/fit_mode2</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:18:30.158483</td>\n",
       "      <td>2022-07-21 08:22:02.862973</td>\n",
       "      <td>212.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>227.0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>229</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>fit_mode3</td>\n",
       "      <td>/fit_mode3</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/</td>\n",
       "      <td>2022-07-21 08:22:04.136475</td>\n",
       "      <td>2022-07-21 08:22:11.189763</td>\n",
       "      <td>7.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>RunnerFit</td>\n",
       "      <td>0.4</td>\n",
       "      <td>228.0</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>230</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_0</td>\n",
       "      <td>/job_a_3_0</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:12.207784</td>\n",
       "      <td>2022-07-21 08:22:15.498472</td>\n",
       "      <td>3.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>231</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_167</td>\n",
       "      <td>/job_a_3_167</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:15.639460</td>\n",
       "      <td>2022-07-21 08:22:15.965042</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>232</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_333</td>\n",
       "      <td>/job_a_3_333</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.102696</td>\n",
       "      <td>2022-07-21 08:22:16.395679</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>233</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_5</td>\n",
       "      <td>/job_a_3_5</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.572264</td>\n",
       "      <td>2022-07-21 08:22:16.831195</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>234</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_667</td>\n",
       "      <td>/job_a_3_667</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:16.975377</td>\n",
       "      <td>2022-07-21 08:22:17.282200</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>235</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_3_833</td>\n",
       "      <td>/job_a_3_833</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:17.434798</td>\n",
       "      <td>2022-07-21 08:22:17.694902</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>236</td>\n",
       "      <td>finished</td>\n",
       "      <td>Li</td>\n",
       "      <td>job_a_4_0</td>\n",
       "      <td>/job_a_4_0</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/</td>\n",
       "      <td>2022-07-21 08:22:17.828141</td>\n",
       "      <td>2022-07-21 08:22:18.089258</td>\n",
       "      <td>0.0</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>Lammps</td>\n",
       "      <td>0.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>237</td>\n",
       "      <td>finished</td>\n",
       "      <td>None</td>\n",
       "      <td>data_lithium</td>\n",
       "      <td>/data_lithium</td>\n",
       "      <td>None</td>\n",
       "      <td>/home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/</td>\n",
       "      <td>2022-07-21 08:24:51.905888</td>\n",
       "      <td>NaT</td>\n",
       "      <td>NaN</td>\n",
       "      <td>pyiron@lap2p#1</td>\n",
       "      <td>TrainingContainer</td>\n",
       "      <td>0.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     id    status chemicalformula                 job               subjob  \\\n",
       "0   212  finished            None                full                /full   \n",
       "1   213  finished            None               basic               /basic   \n",
       "2   214  finished            None  Al_basic_atomicrex  /Al_basic_atomicrex   \n",
       "3   227  finished            None           fit_mode1           /fit_mode1   \n",
       "4   228  finished            None           fit_mode2           /fit_mode2   \n",
       "5   229  finished            None           fit_mode3           /fit_mode3   \n",
       "6   230  finished              Li           job_a_3_0           /job_a_3_0   \n",
       "7   231  finished              Li         job_a_3_167         /job_a_3_167   \n",
       "8   232  finished              Li         job_a_3_333         /job_a_3_333   \n",
       "9   233  finished              Li           job_a_3_5           /job_a_3_5   \n",
       "10  234  finished              Li         job_a_3_667         /job_a_3_667   \n",
       "11  235  finished              Li         job_a_3_833         /job_a_3_833   \n",
       "12  236  finished              Li           job_a_4_0           /job_a_4_0   \n",
       "13  237  finished            None        data_lithium        /data_lithium   \n",
       "\n",
       "   projectpath  \\\n",
       "0         None   \n",
       "1         None   \n",
       "2         None   \n",
       "3         None   \n",
       "4         None   \n",
       "5         None   \n",
       "6         None   \n",
       "7         None   \n",
       "8         None   \n",
       "9         None   \n",
       "10        None   \n",
       "11        None   \n",
       "12        None   \n",
       "13        None   \n",
       "\n",
       "                                                                                                                          project  \\\n",
       "0               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "1               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "2               /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "3   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "4   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "5   /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/fit_lithium/   \n",
       "6     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "7     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "8     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "9     /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "10    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "11    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "12    /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/E_V_curve/   \n",
       "13              /home/kalm/dcmnts/uni/promotion/work/workshop_bochum/handson_notebook/workshop_preparation/introduction/training/   \n",
       "\n",
       "                    timestart                   timestop  totalcputime  \\\n",
       "0  2022-06-03 00:02:34.816533                        NaT           NaN   \n",
       "1  2022-06-03 00:02:47.281055                        NaT           NaN   \n",
       "2  2022-06-03 02:00:15.887059                        NaT           NaN   \n",
       "3  2022-07-21 08:18:22.251691 2022-07-21 08:18:28.328624           6.0   \n",
       "4  2022-07-21 08:18:30.158483 2022-07-21 08:22:02.862973         212.0   \n",
       "5  2022-07-21 08:22:04.136475 2022-07-21 08:22:11.189763           7.0   \n",
       "6  2022-07-21 08:22:12.207784 2022-07-21 08:22:15.498472           3.0   \n",
       "7  2022-07-21 08:22:15.639460 2022-07-21 08:22:15.965042           0.0   \n",
       "8  2022-07-21 08:22:16.102696 2022-07-21 08:22:16.395679           0.0   \n",
       "9  2022-07-21 08:22:16.572264 2022-07-21 08:22:16.831195           0.0   \n",
       "10 2022-07-21 08:22:16.975377 2022-07-21 08:22:17.282200           0.0   \n",
       "11 2022-07-21 08:22:17.434798 2022-07-21 08:22:17.694902           0.0   \n",
       "12 2022-07-21 08:22:17.828141 2022-07-21 08:22:18.089258           0.0   \n",
       "13 2022-07-21 08:24:51.905888                        NaT           NaN   \n",
       "\n",
       "          computer           hamilton hamversion  parentid masterid  \n",
       "0   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "1   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "2   zora@cmti001#1  TrainingContainer        0.4       NaN     None  \n",
       "3   pyiron@lap2p#1          RunnerFit        0.4       NaN     None  \n",
       "4   pyiron@lap2p#1          RunnerFit        0.4     227.0     None  \n",
       "5   pyiron@lap2p#1          RunnerFit        0.4     228.0     None  \n",
       "6   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "7   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "8   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "9   pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "10  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "11  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "12  pyiron@lap2p#1             Lammps        0.1       NaN     None  \n",
       "13  pyiron@lap2p#1  TrainingContainer        0.4       NaN     None  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pr.job_table()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "For comparison, here is the energy-volume curve from before, overlayed with the structures in the reduced dataset."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
    "fig, ax = plt.subplots(figsize=(14, 6))\n",
    "data_full.plot.energy_volume()\n",
    "data_lithium.plot.energy_volume()\n",
    "plt.legend(['Full dataset', 'Lithium'])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "As you can see, we have selected a very small part of the dataset for our demonstration (176 of ~4000 structures). Nevertheless, the following chapters will demonstrate all the relevant RuNNer concepts to create a similar potential with more training data. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "pyiron and the RuNNer Fortran program communicate via a custom job type called `RunnerFit`. Here, we add a new job to the project via `create_job` and give it the name `fit_data_lithium`."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "pr_fit = pr.create_group('fit_lithium')"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "mode1 = pr_fit.create.job.RunnerFit('fit_mode1', delete_existing_job=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Every `RunnerFit` job is initialized with a sensible choice of input parameters for RuNNer (`parameters`) and an empty storage for training structures (`training_data`). This information can easily be accessed through the `input` property.  "
   ]
  },
  {
   "cell_type": "code",
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "application/json": {
       "parameters": {
        "bond_threshold": "0.5",
        "center_symmetry_functions": "True",
        "cutoff_type": "1",
        "elements": "None",
        "epochs": "30",
        "global_activation_short": "[['t', 't', 'l']]",
        "global_hidden_layers_short": "2",
        "global_nodes_short": "[[15, 15]]",
        "kalman_lambda_short": "0.98",
        "kalman_nue_short": "0.9987",
        "mix_all_points": "True",
        "nguyen_widrow_weights_short": "True",
        "nn_type_short": "1",
        "number_of_elements": "0",
        "optmode_charge": "1",
        "optmode_short_energy": "1",
        "optmode_short_force": "1",
        "points_in_memory": "1000",
        "precondition_weights": "True",
        "repeated_energy_update": "True",
        "runner_mode": "1",
        "scale_symmetry_functions": "True",
        "short_energy_error_threshold": "0.1",
        "short_energy_fraction": "1.0",
        "short_force_error_threshold": "1.0",
        "short_force_fraction": "0.1",
        "symfunction_short": "[]",
        "test_fraction": "0.1",
        "use_old_weights_charge": "False",
        "use_old_weights_short": "False",
        "use_short_forces": "True",
        "use_short_nn": "True",
        "write_weights_epoch": "5"
       },
       "training_data": "<pyiron_contrib.atomistics.atomistics.job.trainingcontainer.TrainingStorage object at 0x7ff3c9504460>"
      },
      "text/html": [
       "<pre>DataContainer({\n",
       "  \"parameters\": {\n",
       "    \"runner_mode\": \"1\",\n",
       "    \"symfunction_short\": \"[]\",\n",
       "    \"elements\": \"None\",\n",
       "    \"number_of_elements\": \"0\",\n",
       "    \"bond_threshold\": \"0.5\",\n",
       "    \"nn_type_short\": \"1\",\n",
       "    \"use_short_nn\": \"True\",\n",
       "    \"optmode_charge\": \"1\",\n",
       "    \"optmode_short_energy\": \"1\",\n",
       "    \"optmode_short_force\": \"1\",\n",
       "    \"points_in_memory\": \"1000\",\n",
       "    \"scale_symmetry_functions\": \"True\",\n",
       "    \"cutoff_type\": \"1\",\n",
       "    \"test_fraction\": \"0.1\",\n",
       "    \"use_short_forces\": \"True\",\n",
       "    \"epochs\": \"30\",\n",
       "    \"kalman_lambda_short\": \"0.98\",\n",
       "    \"kalman_nue_short\": \"0.9987\",\n",
       "    \"mix_all_points\": \"True\",\n",
       "    \"nguyen_widrow_weights_short\": \"True\",\n",
       "    \"repeated_energy_update\": \"True\",\n",
       "    \"short_energy_error_threshold\": \"0.1\",\n",
       "    \"short_energy_fraction\": \"1.0\",\n",
       "    \"short_force_error_threshold\": \"1.0\",\n",
       "    \"short_force_fraction\": \"0.1\",\n",
       "    \"use_old_weights_charge\": \"False\",\n",
       "    \"use_old_weights_short\": \"False\",\n",
       "    \"write_weights_epoch\": \"5\",\n",
       "    \"center_symmetry_functions\": \"True\",\n",
       "    \"precondition_weights\": \"True\",\n",
       "    \"global_activation_short\": \"[['t', 't', 'l']]\",\n",
       "    \"global_hidden_layers_short\": \"2\",\n",
       "    \"global_nodes_short\": \"[[15, 15]]\"\n",
       "  },\n",
       "  \"training_data\": \"<pyiron_contrib.atomistics.atomistics.job.trainingcontainer.TrainingStorage object at 0x7ff3c9504460>\"\n",
       "})</pre>"
      ],
      "text/plain": [
       "DataContainer({'parameters': DataContainer({'runner_mode': 1, 'symfunction_short': [], 'elements': None, 'number_of_elements': 0, 'bond_threshold': 0.5, 'nn_type_short': 1, 'use_short_nn': True, 'optmode_charge': 1, 'optmode_short_energy': 1, 'optmode_short_force': 1, 'points_in_memory': 1000, 'scale_symmetry_functions': True, 'cutoff_type': 1, 'test_fraction': 0.1, 'use_short_forces': True, 'epochs': 30, 'kalman_lambda_short': 0.98, 'kalman_nue_short': 0.9987, 'mix_all_points': True, 'nguyen_widrow_weights_short': True, 'repeated_energy_update': True, 'short_energy_error_threshold': 0.1, 'short_energy_fraction': 1.0, 'short_force_error_threshold': 1.0, 'short_force_fraction': 0.1, 'use_old_weights_charge': False, 'use_old_weights_short': False, 'write_weights_epoch': 5, 'center_symmetry_functions': True, 'precondition_weights': True, 'global_activation_short': [['t', 't', 'l']], 'global_hidden_layers_short': 2, 'global_nodes_short': [[15, 15]]}), 'training_data': <pyiron_contrib.atomistics.atomistics.job.trainingcontainer.TrainingStorage object at 0x7ff3c9504460>})"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mode1.input"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Here, we will only explain the global keywords which are relevant for all modes. The remaining keywords will be explained in following chapters. If a keyword is not specified on the pyiron-side, the **RuNNer** Fortran program uses default values, if possible.\n",
    "For a more detailed explanation of all RuNNer keywords, take a look at [the RuNNer documentation](https://theochemgoettingen.gitlab.io/RuNNer)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "| Keyword | Default | Description |\n",
    "|---------|---------|:-------------|\n",
    "|runner_mode | 1| Choose the operating mode of RuNNer.\n",
    "|symfunction_short | empty `SymmetryFunctionSet` |Specification of the symmetry functions for a specific element with a specific neighbor element combination for the short-range NN.\n",
    "|elements | None| The element symbols of all elements in the system in arbitrary order. The number of specified elements must fit to the value of the keyword number_of_elements. Will be automatically set by `pyiron`.\n",
    "|number_of_elements | 0| Specify the number of chemical elements in the system. Will be automatically set by `pyiron`.\n",
    "|bond_threshold | 0.5| Threshold for the shortest bond in the structure in Bohr units. If a shorter bond occurs RuNNer will stop with an error message in runner_mode 2 and 3. In runner_mode 1 the structure will be eliminated from the data set.\n",
    "|nn_type_short | 1| Specify the NN type of the short-range part (atomic or pair-based energy expression).\n",
    "|use_short_nn | True| Use the a short range NN. \n",
    "|points_in_memory | 1000| This keyword controls memory consumption and IO and is therefore important to achieve an optimum performance of RuNNer. Has a different meaning depending on the current runner_mode.\n",
    "|use_short_forces | True| Use forces for fitting the short range NN weights."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "As of yet, this job does not have a training dataset. However, as you already saw for the EAM potential, adding a new training dataset to the job is as simple as calling `add_training_data`:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "176"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The if-conditions prevents you from accidentally adding the same\n",
    "# structures twice to the training dataset.\n",
    "if len(mode1.training_data) == 0:\n",
    "    mode1.add_training_data(data_lithium)\n",
    "\n",
    "len(mode1.training_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "By calling `add_training_data` multiple times, it is very easy to combine several independent training datasets for one fit."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "#### Specification of RuNNer Parameters\n",
    "\n",
    "While many of the default parameters in `RunnerFit` are suited for a wide range of calculations, you still need to carefully check each of them before starting a fit. Special attention must be given to the atom-centered symmetry functions as they have to be tailored to the system under investigation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "`RunnerFit` builds on the RuNNer ASE interface which is publicly available as `runnerase`. For further information check out the [runnerase documentation](https://runner-suite.gitlab.io/runnerase).\n",
    "\n",
    "`runnerase` provides a `generate_symmetryfunction` procedure, which makes it easy to tailor SFs to the corresponding training dataset. You can either generate radial SFs by setting `sftype=2`, or angular SFs with `sftype=3`. The algorithm will then automatically generate one set of SFs for each pair or each triplet of elements in the dataset. The number of SFs per set can be specified with the `amount` argument. Finally, `generate_symmetryfunctions` comes with several different `algorithm`s for choosing the parameters of the SFs:\n",
    "* **Radial SFs:** One can choose from `algorithm=turn` and `algorithm=half`. `turn` will choose the SF coefficients such that the turning points of all SFs are equally spaced between the cutoff radius and the minimum distance between any given element pair. `half` will make sure that the SFs are equally spaced at $f(G) = 0.5$.\n",
    "* **Angular SFs:** One can choose from `algorithm=turn`, `algorithm=half`, or `algorithm=literature`. While the first two algorithms behave similarly to the ones for radial SF, `literature` will return SF coefficients that have proven to be a reliable choice for most systems in previous publications.\n",
    "\n",
    "In most RuNNer-related publications, a combination of `algorithm=turn` for radial SFs and `algorithm=literature` for angular SFs has been used."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "However, `runnerase` does not operate on pyiron objects like the `TrainingContainer`. Therefore, we transform the `TrainingContainer` with our lithium structures into a List of ASE Atoms objects. The `container_to_ase` function is defined in pyiron_contrib. "
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "dataset = container_to_ase(data_lithium)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "In the following, we have prepared two interactive plotting functions for you, so you can try out different parameters for the SFs."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a16558439a0c451d8e6fea4a851c3607",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=6, description='amount', max=12), Dropdown(description='algorithm', opti…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@widgets.interact(amount=(0, 12, 1), algorithm=['turn', 'half'],\n",
    "                  cutoff_function=[True, False], show_legend=[True, False])\n",
    "def update(amount=6, algorithm='turn', cutoff_function=True, show_legend=False):\n",
    "    # Clear the plot.\n",
    "    plt.clf()\n",
    "    ax = plt.gca()\n",
    "    \n",
    "    # Generate the symmetry functions.\n",
    "    radials = generate_symmetryfunctions(dataset, sftype=2, algorithm=algorithm,\n",
    "                                         cutoff=12.0, amount=amount)\n",
    "    radials.plot.radial(cutoff_function=cutoff_function, show_legend=show_legend, axes=ax)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "10565efc82154d67bcdad4d31fc3ac29",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=4, description='amount', max=12), Dropdown(description='algorithm', inde…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@widgets.interact(amount=(0, 12, 1), algorithm=['half', 'turn', 'literature'],\n",
    "                  show_legend=[True, False])\n",
    "def update(amount = 4, algorithm='literature', show_legend=False):\n",
    "    plt.clf()\n",
    "    ax = plt.gca()\n",
    "    angulars = generate_symmetryfunctions(dataset, sftype=3, amount=amount,\n",
    "                                          algorithm=algorithm, cutoff=12.0)\n",
    "    angulars.plot.angular(axes=ax, show_legend=show_legend)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "#### Adding SFs to the Job"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The parameter `mode1.parameters.symfunction_short` is, in fact, a so-called `SymmetryFunctionSet` object. They function similar to a folder: you can either store `SymmetryFunction` objects directly (= a file), or create more `SymmetryFunctionSet`s in them (= another folder).\n",
    "\n",
    "When `generate_symmetryfunctions` is called, it returns a `SymmetryFunctionSet` itself. Two `SymmetryFunctionSet`s can easily be combined using the `+` operator. This way, we can add a collection of radial symmetry functions to our job."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "# Reset the symmetry function container.\n",
    "mode1.parameters.symfunction_short.reset()\n",
    "\n",
    "# Generate radial symmetry functions.\n",
    "radials = generate_symmetryfunctions(dataset, sftype=2, algorithm='half',\n",
    "                                     cutoff=12.0)\n",
    "\n",
    "mode1.parameters.symfunction_short += radials"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "All SFs stored in `radials` can be accessed through its `storage` property. As you can see, `radials` essentially organizes a list of SFs in a convenient storage format."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.0, 0.0]),\n",
       " SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.004675055980246072, 0.0]),\n",
       " SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.010843416275634649, 0.0]),\n",
       " SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.01939424193215976, 0.0]),\n",
       " SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.03192971575337408, 0.0]),\n",
       " SymmetryFunction(sftype=2, cutoff=12.0, elements=['Li', 'Li'], coefficients=[0.05159916711157465, 0.0])]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Similarly, we can generate a set of angular symmetry functions and add them to the job as well."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# Generate angular symmetry functions.                                                                                                                                                                                                                        \n",
    "angulars = generate_symmetryfunctions(dataset, sftype=3, amount=4,\n",
    "                                      algorithm='literature', cutoff=12.0)\n",
    "\n",
    "mode1.parameters.symfunction_short += angulars"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, -1.0, 1]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, -1.0, 2]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, -1.0, 4]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, -1.0, 8]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, 1.0, 1]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, 1.0, 2]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, 1.0, 4]),\n",
       " SymmetryFunction(sftype=3, cutoff=12.0, elements=['Li', 'Li', 'Li'], coefficients=[0.0, 1.0, 8])]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "When we look at the `input` of the job again, you will find that all symmetry functions appear."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "application/json": {
       "parameters": {
        "bond_threshold": "0.5",
        "center_symmetry_functions": "True",
        "cutoff_type": "1",
        "elements": "None",
        "epochs": "30",
        "global_activation_short": "[['t', 't', 'l']]",
        "global_hidden_layers_short": "2",
        "global_nodes_short": "[[15, 15]]",
        "kalman_lambda_short": "0.98",
        "kalman_nue_short": "0.9987",
        "mix_all_points": "True",
        "nguyen_widrow_weights_short": "True",
        "nn_type_short": "1",
        "number_of_elements": "0",
        "optmode_charge": "1",
        "optmode_short_energy": "1",
        "optmode_short_force": "1",
        "points_in_memory": "1000",
        "precondition_weights": "True",
        "repeated_energy_update": "True",
        "runner_mode": "1",
        "scale_symmetry_functions": "True",
        "short_energy_error_threshold": "0.1",
        "short_energy_fraction": "1.0",
        "short_force_error_threshold": "1.0",
        "short_force_fraction": "0.1",
        "symfunction_short": "[('Li', 2, 'Li', 0.0, 0.0, 12.0), ('Li', 2, 'Li', 0.004675055980246072, 0.0, 12.0), ('Li', 2, 'Li', 0.010843416275634649, 0.0, 12.0), ('Li', 2, 'Li', 0.01939424193215976, 0.0, 12.0), ('Li', 2, 'Li', 0.03192971575337408, 0.0, 12.0), ('Li', 2, 'Li', 0.05159916711157465, 0.0, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 1, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 2, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 4, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 8, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 1, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 2, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 4, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 8, 12.0)]",
        "test_fraction": "0.1",
        "use_old_weights_charge": "False",
        "use_old_weights_short": "False",
        "use_short_forces": "True",
        "use_short_nn": "True",
        "write_weights_epoch": "5"
       },
       "training_data": "<pyiron_contrib.atomistics.atomistics.job.trainingcontainer.TrainingStorage object at 0x7ff3c9504460>"
      },
      "text/html": [
       "<pre>DataContainer({\n",
       "  \"parameters\": {\n",
       "    \"runner_mode\": \"1\",\n",
       "    \"symfunction_short\": \"[('Li', 2, 'Li', 0.0, 0.0, 12.0), ('Li', 2, 'Li', 0.004675055980246072, 0.0, 12.0), ('Li', 2, 'Li', 0.010843416275634649, 0.0, 12.0), ('Li', 2, 'Li', 0.01939424193215976, 0.0, 12.0), ('Li', 2, 'Li', 0.03192971575337408, 0.0, 12.0), ('Li', 2, 'Li', 0.05159916711157465, 0.0, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 1, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 2, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 4, 12.0), ('Li', 3, 'Li', 'Li', 0.0, -1.0, 8, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 1, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 2, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 4, 12.0), ('Li', 3, 'Li', 'Li', 0.0, 1.0, 8, 12.0)]\",\n",
       "    \"elements\": \"None\",\n",
       "    \"number_of_elements\": \"0\",\n",
       "    \"bond_threshold\": \"0.5\",\n",
       "    \"nn_type_short\": \"1\",\n",
       "    \"use_short_nn\": \"True\",\n",
       "    \"optmode_charge\": \"1\",\n",
       "    \"optmode_short_energy\": \"1\",\n",
       "    \"optmode_short_force\": \"1\",\n",
       "    \"points_in_memory\": \"1000\",\n",
Loading
Loading full blame...