{ "cells": [ { "cell_type": "markdown", "id": "8aa651ab", "metadata": {}, "source": [ "# A Complete Workflow for a Single Element\n", "\n", "This notebook runs the full ASSYST pipeline end-to-end on a unary system\n", "(copper). The four canonical steps are:\n", "\n", "1. **Sampling** — generate symmetric random structures for every space group.\n", "2. **Relaxing** — minimise volume first, then full cell + positions, to find\n", " the relevant pockets of the potential energy surface.\n", "3. **Perturbing** — apply random rattles and stretches around those minima\n", " to populate the surrounding PES.\n", "4. **Combining** — collect everything, filter unphysical configurations,\n", " evaluate the reference and store the resulting training data.\n", "\n", "In a real workflow the relaxations and final evaluations are carried out\n", "with DFT (or any other reference); here we use a Morse potential so the\n", "notebook runs quickly." ] }, { "cell_type": "markdown", "id": "28e70bb9", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "223212d4", "metadata": {}, "outputs": [], "source": [ "import pickle\n", "from pathlib import Path\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from tqdm.auto import tqdm\n", "\n", "from assyst.crystals import Formulas, sample\n", "from assyst.filters import DistanceFilter, AspectFilter, VolumeFilter\n", "from assyst.relaxations import VolumeRelax, FullRelax, relax\n", "from assyst.perturbations import RandomChoice, Rattle, Stretch, perturb" ] }, { "cell_type": "markdown", "id": "17e36b8e", "metadata": {}, "source": [ "## Configuration\n", "\n", "`max_num` is the largest number of atoms per generated structure. `2` keeps\n", "the example fast; `10` is the typical production value and yields ~10k\n", "training structures." ] }, { "cell_type": "code", "execution_count": 2, "id": "55aa5375", "metadata": {}, "outputs": [], "source": [ "max_num = 2\n", "out_dir = Path(f\"Unary/{max_num}\")\n", "out_dir.mkdir(parents=True, exist_ok=True)" ] }, { "cell_type": "markdown", "id": "91de86fe", "metadata": {}, "source": [ "### Reference potential\n", "\n", "Any ASE calculator works. We pick a Morse potential whose parameters were\n", "chosen so that its minimum sits near the experimental Cu-Cu bond length.\n", "\n", "For more interesting reference data the universal `Grace` graph-ACE models\n", "in `assyst.calculators` are a good drop-in replacement (they require the\n", "optional `tensorpotential` dependency)." ] }, { "cell_type": "code", "execution_count": 3, "id": "8c01df7c", "metadata": {}, "outputs": [], "source": [ "from ase.calculators.morse import MorsePotential\n", "\n", "reference = MorsePotential(epsilon=0.3, r0=2.55265548 * 1.10619396, rho0=4)" ] }, { "cell_type": "markdown", "id": "721dfa7c", "metadata": {}, "source": [ "## 1. Sampling random structures\n", "\n", "Build the formulas to sample (`Cu`, `Cu_2`, ..., up to `max_num`) and let\n", "`sample` generate one structure for every compatible space group.\n", "\n", "`AspectFilter(6)` filters out very elongated unit cells that pyxtal\n", "occasionally produces." ] }, { "cell_type": "code", "execution_count": 4, "id": "f80eb4c4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Formulas(atoms=({'Cu': 0}, {'Cu': 1}, {'Cu': 2}))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "formulas = Formulas.range('Cu', max_num + 1)\n", "formulas" ] }, { "cell_type": "code", "execution_count": 5, "id": "432d03ba", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7a2c1d260dd745109d81bb7d278816a7", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/3 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0371edc08ca9436cbae6d98258d02d69", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Spacegroups: 0%| | 0/230 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a3227fdeba72442ca61901ff87dd9f2e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Spacegroups: 0%| | 0/230 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Generated 168 symmetric seeds\n" ] } ], "source": [ "spg = list(filter(\n", " AspectFilter(6),\n", " sample(\n", " formulas,\n", " spacegroups=range(1, 230 + 1),\n", " max_atoms=max_num,\n", " )\n", "))\n", "print(f\"Generated {len(spg)} symmetric seeds\")" ] }, { "cell_type": "markdown", "id": "2411351a-76bf-4f93-aaa3-0689e56d07d6", "metadata": {}, "source": [ "Just to create a small check point, dump generated structures into a pickle file.\n", "This is _not_ required for assyst." ] }, { "cell_type": "code", "execution_count": 6, "id": "c5322b41", "metadata": {}, "outputs": [], "source": [ "with open(out_dir / 'spg.pckl', 'wb') as f:\n", " pickle.dump(spg, f)" ] }, { "cell_type": "markdown", "id": "5cad474f", "metadata": {}, "source": [ "## 2. Relaxation\n", "\n", "ASSYST applies a *two-step* relaxation:\n", "\n", "1. `VolumeRelax` — relax the volume only, keeping shape and internal positions\n", " frozen. Quickly puts each seed near a sensible energy scale.\n", "2. `FullRelax` — relax cell shape, volume and atomic positions together,\n", " landing in a (local) minimum of the PES.\n", "\n", "In production both would be carried out with DFT; here the Morse potential\n", "makes the cost negligible. For experimentation, `assyst.relaxations` also\n", "provides `CellRelax` and `SymmetryRelax`." ] }, { "cell_type": "code", "execution_count": 7, "id": "b77f2cff", "metadata": {}, "outputs": [], "source": [ "volset = VolumeRelax(max_steps=100, force_tolerance=1e-3)\n", "allset = FullRelax(max_steps=100, force_tolerance=1e-3)" ] }, { "cell_type": "code", "execution_count": 8, "id": "6fb32976", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6d991e81a4ec4c24a85b3d1e3b9d037b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "volume: 0%| | 0/168 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 2min 24s, sys: 139 ms, total: 2min 25s\n", "Wall time: 48.7 s\n" ] } ], "source": [ "%%time\n", "volmin = list(relax(tqdm(spg, desc='volume'), volset, reference))" ] }, { "cell_type": "code", "execution_count": 9, "id": "d0114ccb", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "45e80cb6dfba4144bb4c7e08a1ea52a9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "full: 0%| | 0/168 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.432556521112339e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.432556521112339e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 3.7157276183604643e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 3.7157276183604643e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 5.516864777792211e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 5.516864777792211e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 8.15181096918948e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 8.15181096918948e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.3749153830356407e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.3749153830356407e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.4866777525490544e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.4866777525490544e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.421109299871798e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.421109299871798e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.452048037342556e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.452048037342556e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.9627799244203634e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.9627799244203634e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.2935924938929445e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.2935924938929445e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.4872886565241954e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.4872886565241954e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 3.021149907848636e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 3.021149907848636e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.37529756320406e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.37529756320406e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.9385885786932446e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.9385885786932446e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 3.6379884134723173e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 3.6379884134723173e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.989922080203508e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.989922080203508e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.3682633429615987e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.3682633429615987e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.89860856904846e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.89860856904846e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 3.8198492634984746e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 2.535116799634508e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 2.535116799634508e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 3.7910927379480105e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 3.7910927379480105e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:624: RuntimeWarning: logm result may be inaccurate, approximate err = 5.716936716033083e-13\n", " cur_deform_grad_log = self.logm(cur_deform_grad)\n", "/home/ponder/micromamba/envs/assyst/lib/python3.12/site-packages/ase/filters.py:606: RuntimeWarning: logm result may be inaccurate, approximate err = 5.716936716033083e-13\n", " pos[natoms:] = self.logm(pos[natoms:]) * self.exp_cell_factor\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 9min 35s, sys: 234 ms, total: 9min 35s\n", "Wall time: 3min 13s\n" ] } ], "source": [ "%%time\n", "allmin = list(relax(tqdm(volmin, desc='full'), allset, reference))" ] }, { "cell_type": "code", "execution_count": 10, "id": "154db5e7", "metadata": {}, "outputs": [], "source": [ "with open(out_dir / 'volmin.pckl', 'wb') as f:\n", " pickle.dump(volmin, f)\n", "with open(out_dir / 'allmin.pckl', 'wb') as f:\n", " pickle.dump(allmin, f)" ] }, { "cell_type": "markdown", "id": "a987e6da", "metadata": {}, "source": [ "## 3. Random perturbations\n", "\n", "Around each minimum we sample the surrounding PES with three families of\n", "random perturbations described in the ASSYST paper:\n", "\n", "1. mostly **positional noise** with a small cell change (`rattle`),\n", "2. mostly **hydrostatic** cell change,\n", "3. mostly **shear** cell change.\n", "\n", "The hydrostatic and shear strains are combined with `RandomChoice` so that\n", "hydrostatic changes are drawn slightly more often. The final `mods`\n", "sequence is applied to every fully-minimised structure. `DistanceFilter`\n", "discards perturbations that placed atoms unphysically close." ] }, { "cell_type": "code", "execution_count": 11, "id": "e460ee18", "metadata": {}, "outputs": [], "source": [ "rattle = Rattle(0.25) + Stretch(hydro=0.05, shear=0.005)\n", "hydro = Stretch(hydro=0.80, shear=0.05)\n", "shear = Stretch(hydro=0.05, shear=0.20)\n", "stretch = RandomChoice(hydro, shear, 0.7)\n", "\n", "# four rattles + four stretches per minimum reproduces the published settings\n", "mods = 4 * [rattle] + 4 * [stretch]" ] }, { "cell_type": "code", "execution_count": 12, "id": "a88dd83e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Produced 1196 perturbed structures\n", "CPU times: user 1.13 s, sys: 4.92 ms, total: 1.13 s\n", "Wall time: 1.08 s\n" ] } ], "source": [ "%%time\n", "random = list(perturb(allmin, mods, filters=[DistanceFilter({'Cu': 1})]))\n", "print(f\"Produced {len(random)} perturbed structures\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "23b2345f", "metadata": {}, "outputs": [], "source": [ "with open(out_dir / 'random.pckl', 'wb') as f:\n", " pickle.dump(random, f)" ] }, { "cell_type": "markdown", "id": "496553ff", "metadata": {}, "source": [ "## 4. Combine and evaluate\n", "\n", "Concatenate the sampled, relaxed and perturbed structures, run the\n", "distance and volume filters once more to reject any leftover pathological\n", "configurations, and finally evaluate the reference to obtain a training\n", "dataset of energies and forces." ] }, { "cell_type": "code", "execution_count": 14, "id": "d2cc39ef", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Final training set: 1573 structures\n" ] } ], "source": [ "everything = list(filter(\n", " VolumeFilter(300),\n", " filter(DistanceFilter({'Cu': 1}), spg + volmin + allmin + random),\n", "))\n", "print(f\"Final training set: {len(everything)} structures\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "e8eb50bb", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8b18e0ef80da476c8c1096d09dc649f2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "evaluating: 0%| | 0/1573 [00:00, ?it/s]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
| \n", " | ase_atoms | \n", "energy | \n", "forces | \n", "number_of_atoms | \n", "
|---|---|---|---|---|
| 0 | \n", "(Atom('Cu', [-1.3265240321355765, -7.353189190... | \n", "-1.802887 | \n", "[[6.071532165918825e-18, -7.979727989493313e-1... | \n", "1 | \n", "
| 1 | \n", "(Atom('Cu', [0.0, 0.0, 0.24375080364530244], i... | \n", "-2.192044 | \n", "[[7.556889142223966e-17, 2.886146183156413e-16... | \n", "1 | \n", "
| 2 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0)) | \n", "-1.702372 | \n", "[[4.5102810375396984e-17, 1.708702623837155e-1... | \n", "1 | \n", "
| 3 | \n", "(Atom('Cu', [-1.1459510315187336, -1.145951031... | \n", "-1.921211 | \n", "[[6.895525817007808e-17, -3.673276960380889e-1... | \n", "1 | \n", "
| 4 | \n", "(Atom('Cu', [-0.7029469904758565, 1.2175399025... | \n", "-2.453490 | \n", "[[5.204170427930421e-18, 7.28583859910259e-17,... | \n", "1 | \n", "
| \n", " | ase_atoms | \n", "energy | \n", "forces | \n", "number_of_atoms | \n", "
|---|---|---|---|---|
| 0 | \n", "(Atom('Cu', [-1.3265240321355765, -7.353189190... | \n", "-1.802887 | \n", "[[6.071532165918825e-18, -7.979727989493313e-1... | \n", "1 | \n", "
| 1 | \n", "(Atom('Cu', [0.0, 0.0, 0.24375080364530244], i... | \n", "-2.192044 | \n", "[[7.556889142223966e-17, 2.886146183156413e-16... | \n", "1 | \n", "
| 2 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0)) | \n", "-1.702372 | \n", "[[4.5102810375396984e-17, 1.708702623837155e-1... | \n", "1 | \n", "
| 3 | \n", "(Atom('Cu', [-1.1459510315187336, -1.145951031... | \n", "-1.921211 | \n", "[[6.895525817007808e-17, -3.673276960380889e-1... | \n", "1 | \n", "
| 4 | \n", "(Atom('Cu', [-0.7029469904758565, 1.2175399025... | \n", "-2.453490 | \n", "[[5.204170427930421e-18, 7.28583859910259e-17,... | \n", "1 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 1568 | \n", "(Atom('Cu', [0.07877639345419643, 0.3276080267... | \n", "-5.287408 | \n", "[[-2.5511153646601943, 0.8436956669030645, -1.... | \n", "2 | \n", "
| 1569 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0), Atom('C... | \n", "-4.389131 | \n", "[[-5.963111948670274e-17, -3.4876615484513707e... | \n", "2 | \n", "
| 1570 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0), Atom('C... | \n", "-4.417568 | \n", "[[-2.8027710360922775e-15, -1.7008963681952594... | \n", "2 | \n", "
| 1571 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0), Atom('C... | \n", "-5.346236 | \n", "[[-2.4824977143400595e-15, -1.9329156331071573... | \n", "2 | \n", "
| 1572 | \n", "(Atom('Cu', [0.0, 0.0, 0.0], index=0), Atom('C... | \n", "-4.695105 | \n", "[[-2.8142381681322062e-15, 3.803390538441569e-... | \n", "2 | \n", "
1573 rows × 4 columns
\n", "