diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip new file mode 100644 index 000000000..7622a114d Binary files /dev/null and b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-energy-mlearn_Si-test-mae.csv.zip differ diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip new file mode 100644 index 000000000..da6c4e446 Binary files /dev/null and b/jarvis_leaderboard/contributions/chgnet_mlearn/AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip differ diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/Train_CHGNet.ipynb b/jarvis_leaderboard/contributions/chgnet_mlearn/Train_CHGNet.ipynb new file mode 100644 index 000000000..80232da21 --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/Train_CHGNet.ipynb @@ -0,0 +1,1184 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q98RWu5O4wIm", + "outputId": "91f1c6e3-3220-4138-8b24-d0c1723d770b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.2/9.2 MB\u001b[0m \u001b[31m23.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m54.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.2/7.2 MB\u001b[0m \u001b[31m32.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", + " Installing backend dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.9/42.9 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.2/18.2 MB\u001b[0m \u001b[31m23.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m332.3/332.3 kB\u001b[0m \u001b[31m35.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m561.4/561.4 kB\u001b[0m \u001b[31m55.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.4/116.4 kB\u001b[0m \u001b[31m15.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m807.7/807.7 kB\u001b[0m \u001b[31m63.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m98.4/98.4 kB\u001b[0m \u001b[31m14.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m526.7/526.7 kB\u001b[0m \u001b[31m46.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Building wheel for nvidia-ml-py3 (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Building wheel for pymatgen (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "lida 0.0.10 requires fastapi, which is not installed.\n", + "lida 0.0.10 requires kaleido, which is not installed.\n", + "lida 0.0.10 requires python-multipart, which is not installed.\n", + "lida 0.0.10 requires uvicorn, which is not installed.\u001b[0m\u001b[31m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "pip install -q chgnet" + ] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "if not os.path.exists('jarvis_leaderboard'):\n", + " !git clone https://github.com/usnistgov/jarvis_leaderboard.git\n", + "os.chdir('jarvis_leaderboard')\n", + "!pip install -e ." + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QsDnBjVsAK-E", + "outputId": "c75eefea-83c4-4a2c-8c19-9acbe5be53c7" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'jarvis_leaderboard'...\n", + "remote: Enumerating objects: 61347, done.\u001b[K\n", + "remote: Counting objects: 100% (1359/1359), done.\u001b[K\n", + "remote: Compressing objects: 100% (325/325), done.\u001b[K\n", + "remote: Total 61347 (delta 648), reused 1131 (delta 434), pack-reused 59988\u001b[K\n", + "Receiving objects: 100% (61347/61347), 390.63 MiB | 24.60 MiB/s, done.\n", + "Resolving deltas: 100% (32065/32065), done.\n", + "Updating files: 100% (3650/3650), done.\n", + "Obtaining file:///content/jarvis_leaderboard\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.26.3)\n", + "Requirement already satisfied: scipy>=1.6.3 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.11.4)\n", + "Collecting jarvis-tools>=2021.07.19 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading jarvis_tools-2023.12.12-py2.py3-none-any.whl (975 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m975.7/975.7 kB\u001b[0m \u001b[31m6.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: scikit-learn>=0.24.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.2.2)\n", + "Requirement already satisfied: pandas>=1.2.4 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.5.3)\n", + "Collecting rouge>=1.0.1 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading rouge-1.0.1-py3-none-any.whl (13 kB)\n", + "Collecting mkdocs>=1.5.2 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs-1.5.3-py3-none-any.whl (3.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.7/3.7 MB\u001b[0m \u001b[31m40.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting mkdocs-material>=9.0.5 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs_material-9.5.6-py3-none-any.whl (8.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.6/8.6 MB\u001b[0m \u001b[31m61.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pydantic>=2.3.0 (from jarvis-leaderboard==2024.1.16)\n", + " Downloading pydantic-2.5.3-py3-none-any.whl (381 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m381.9/381.9 kB\u001b[0m \u001b[31m44.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: markdown>=3.2.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (3.5.2)\n", + "Requirement already satisfied: plotly in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (5.15.0)\n", + "Requirement already satisfied: absl-py==1.4.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (1.4.0)\n", + "Requirement already satisfied: nltk==3.8.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-leaderboard==2024.1.16) (3.8.1)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (8.1.7)\n", + "Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (1.3.2)\n", + "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (2023.6.3)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from nltk==3.8.1->jarvis-leaderboard==2024.1.16) (4.66.1)\n", + "Requirement already satisfied: matplotlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.7.1)\n", + "Requirement already satisfied: spglib>=1.14.1 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.3.0)\n", + "Requirement already satisfied: requests>=2.23.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.31.0)\n", + "Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (0.12.0)\n", + "Collecting xmltodict>=0.11.0 (from jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16)\n", + " Downloading xmltodict-0.13.0-py2.py3-none-any.whl (10.0 kB)\n", + "Collecting ghp-import>=1.0 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading ghp_import-2.1.0-py3-none-any.whl (11 kB)\n", + "Requirement already satisfied: jinja2>=2.11.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (3.1.3)\n", + "Requirement already satisfied: markupsafe>=2.0.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (2.1.4)\n", + "Collecting mergedeep>=1.3.4 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading mergedeep-1.3.4-py3-none-any.whl (6.4 kB)\n", + "Requirement already satisfied: packaging>=20.5 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (23.2)\n", + "Collecting pathspec>=0.11.1 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading pathspec-0.12.1-py3-none-any.whl (31 kB)\n", + "Requirement already satisfied: platformdirs>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (4.1.0)\n", + "Collecting pyyaml-env-tag>=0.1 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading pyyaml_env_tag-0.1-py3-none-any.whl (3.9 kB)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16) (6.0.1)\n", + "Collecting watchdog>=2.0 (from mkdocs>=1.5.2->jarvis-leaderboard==2024.1.16)\n", + " Downloading watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl (82 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m82.1/82.1 kB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: babel~=2.10 in /usr/local/lib/python3.10/dist-packages (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16) (2.14.0)\n", + "Collecting colorama~=0.4 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", + "Collecting mkdocs-material-extensions~=1.3 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading mkdocs_material_extensions-1.3.1-py3-none-any.whl (8.7 kB)\n", + "Collecting paginate~=0.5 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading paginate-0.5.6.tar.gz (12 kB)\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: pygments~=2.16 in /usr/local/lib/python3.10/dist-packages (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16) (2.16.1)\n", + "Collecting pymdown-extensions~=10.2 (from mkdocs-material>=9.0.5->jarvis-leaderboard==2024.1.16)\n", + " Downloading pymdown_extensions-10.7-py3-none-any.whl (250 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m250.8/250.8 kB\u001b[0m \u001b[31m26.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2.4->jarvis-leaderboard==2024.1.16) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2.4->jarvis-leaderboard==2024.1.16) (2023.3.post1)\n", + "Collecting annotated-types>=0.4.0 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading annotated_types-0.6.0-py3-none-any.whl (12 kB)\n", + "Collecting pydantic-core==2.14.6 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m52.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting typing-extensions>=4.6.1 (from pydantic>=2.3.0->jarvis-leaderboard==2024.1.16)\n", + " Downloading typing_extensions-4.9.0-py3-none-any.whl (32 kB)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from rouge>=1.0.1->jarvis-leaderboard==2024.1.16) (1.16.0)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.24.1->jarvis-leaderboard==2024.1.16) (3.2.0)\n", + "Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from plotly->jarvis-leaderboard==2024.1.16) (8.2.3)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (1.4.5)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.0.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.1.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.23.0->jarvis-tools>=2021.07.19->jarvis-leaderboard==2024.1.16) (2023.11.17)\n", + "Building wheels for collected packages: paginate\n", + " Building wheel for paginate (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for paginate: filename=paginate-0.5.6-py3-none-any.whl size=12666 sha256=517456dd89a7c9640d4e4972a0d06e84b29d559715e835d6809eb5d5b218feb0\n", + " Stored in directory: /root/.cache/pip/wheels/47/d3/18/0b5bebc873f29bea61fedece1e92cbcbef416839dfe5bd0eef\n", + "Successfully built paginate\n", + "Installing collected packages: paginate, xmltodict, watchdog, typing-extensions, rouge, pyyaml-env-tag, pymdown-extensions, pathspec, mkdocs-material-extensions, mergedeep, colorama, annotated-types, pydantic-core, ghp-import, pydantic, mkdocs, mkdocs-material, jarvis-tools, jarvis-leaderboard\n", + " Attempting uninstall: typing-extensions\n", + " Found existing installation: typing_extensions 4.5.0\n", + " Uninstalling typing_extensions-4.5.0:\n", + " Successfully uninstalled typing_extensions-4.5.0\n", + " Attempting uninstall: pydantic\n", + " Found existing installation: pydantic 1.10.14\n", + " Uninstalling pydantic-1.10.14:\n", + " Successfully uninstalled pydantic-1.10.14\n", + " Running setup.py develop for jarvis-leaderboard\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "lida 0.0.10 requires fastapi, which is not installed.\n", + "lida 0.0.10 requires kaleido, which is not installed.\n", + "lida 0.0.10 requires python-multipart, which is not installed.\n", + "lida 0.0.10 requires uvicorn, which is not installed.\n", + "llmx 0.0.15a0 requires cohere, which is not installed.\n", + "llmx 0.0.15a0 requires openai, which is not installed.\n", + "llmx 0.0.15a0 requires tiktoken, which is not installed.\n", + "tensorflow-probability 0.22.0 requires typing-extensions<4.6.0, but you have typing-extensions 4.9.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed annotated-types-0.6.0 colorama-0.4.6 ghp-import-2.1.0 jarvis-leaderboard-2024.1.16 jarvis-tools-2023.12.12 mergedeep-1.3.4 mkdocs-1.5.3 mkdocs-material-9.5.6 mkdocs-material-extensions-1.3.1 paginate-0.5.6 pathspec-0.12.1 pydantic-2.5.3 pydantic-core-2.14.6 pymdown-extensions-10.7 pyyaml-env-tag-0.1 rouge-1.0.1 typing-extensions-4.9.0 watchdog-3.0.0 xmltodict-0.13.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install --upgrade git+https://gitlab.com/ase/ase.git@optimizer-tests" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "y0cmiCNb870a", + "outputId": "93bbf0d7-5fcd-41c4-efa4-fa62787de752" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting git+https://gitlab.com/ase/ase.git@optimizer-tests\n", + " Cloning https://gitlab.com/ase/ase.git (to revision optimizer-tests) to /tmp/pip-req-build-qdlv58l1\n", + " Running command git clone --filter=blob:none --quiet https://gitlab.com/ase/ase.git /tmp/pip-req-build-qdlv58l1\n", + " Running command git checkout -b optimizer-tests --track origin/optimizer-tests\n", + " Switched to a new branch 'optimizer-tests'\n", + " Branch 'optimizer-tests' set up to track remote branch 'optimizer-tests' from 'origin'.\n", + " Resolved https://gitlab.com/ase/ase.git to commit a9012957be4fe649aedef9e8e626d332dccdb83d\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (1.26.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (1.11.4)\n", + "Requirement already satisfied: matplotlib>=3.3.4 in /usr/local/lib/python3.10/dist-packages (from ase==3.23.0b1) (3.7.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (4.47.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (23.2)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.3.4->ase==3.23.0b1) (2.8.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=3.3.4->ase==3.23.0b1) (1.16.0)\n", + "Building wheels for collected packages: ase\n", + " Building wheel for ase (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for ase: filename=ase-3.23.0b1-py3-none-any.whl size=2422389 sha256=690f31bc0a6ec0b051471247bd57b46af596e1a213d836cb40460a4c733b6190\n", + " Stored in directory: /tmp/pip-ephem-wheel-cache-u_a9z7gg/wheels/02/41/aa/7f35c006fc1c7a98036f78766e96ed43a92fae3dfffec81fcd\n", + "Successfully built ase\n", + "Installing collected packages: ase\n", + " Attempting uninstall: ase\n", + " Found existing installation: ase 3.22.1\n", + " Uninstalling ase-3.22.1:\n", + " Successfully uninstalled ase-3.22.1\n", + "Successfully installed ase-3.23.0b1\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install numpy==1.23.5\n", + "# then restart session" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "m_m1uNro40XM", + "outputId": "947d8f84-4250-43b1-c27b-9305a3c1ac44" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting numpy==1.23.5\n", + " Downloading numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.1/17.1 MB\u001b[0m \u001b[31m35.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: numpy\n", + " Attempting uninstall: numpy\n", + " Found existing installation: numpy 1.26.3\n", + " Uninstalling numpy-1.26.3:\n", + " Successfully uninstalled numpy-1.26.3\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "lida 0.0.10 requires fastapi, which is not installed.\n", + "lida 0.0.10 requires kaleido, which is not installed.\n", + "lida 0.0.10 requires python-multipart, which is not installed.\n", + "lida 0.0.10 requires uvicorn, which is not installed.\n", + "pymatgen 2024.1.27 requires numpy>=1.25.0, but you have numpy 1.23.5 which is incompatible.\n", + "tensorflow-probability 0.22.0 requires typing-extensions<4.6.0, but you have typing-extensions 4.9.0 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed numpy-1.23.5\n" + ] + }, + { + "output_type": "display_data", + "data": { + "application/vnd.colab-display-data+json": { + "pip_warning": { + "packages": [ + "numpy" + ] + } + } + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "!wget https://figshare.com/ndownloader/files/40357663 -O mlearn.json.zip" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XTOtokdn424A", + "outputId": "7ebef737-b988-4633-afe9-edef24a92cc4" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2024-01-29 14:08:23-- https://figshare.com/ndownloader/files/40357663\n", + "Resolving figshare.com (figshare.com)... 54.155.30.132, 34.249.162.182, 2a05:d018:1f4:d003:d154:8468:3af7:d7f0, ...\n", + "Connecting to figshare.com (figshare.com)|54.155.30.132|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://s3-eu-west-1.amazonaws.com/pfigshare-u-files/40357663/mlearn.json.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIYCQYOYV5JSSROOA/20240129/eu-west-1/s3/aws4_request&X-Amz-Date=20240129T140824Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ffe714d51f8d6abe1cb20ae7dc8b12d39d11210addae408d0b6846dfd870f38d [following]\n", + "--2024-01-29 14:08:24-- https://s3-eu-west-1.amazonaws.com/pfigshare-u-files/40357663/mlearn.json.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIYCQYOYV5JSSROOA/20240129/eu-west-1/s3/aws4_request&X-Amz-Date=20240129T140824Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ffe714d51f8d6abe1cb20ae7dc8b12d39d11210addae408d0b6846dfd870f38d\n", + "Resolving s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)... 52.218.56.227, 52.218.61.195, 52.92.16.176, ...\n", + "Connecting to s3-eu-west-1.amazonaws.com (s3-eu-west-1.amazonaws.com)|52.218.56.227|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 2542319 (2.4M) [application/zip]\n", + "Saving to: ‘mlearn.json.zip’\n", + "\n", + "mlearn.json.zip 100%[===================>] 2.42M 3.24MB/s in 0.7s \n", + "\n", + "2024-01-29 14:08:25 (3.24 MB/s) - ‘mlearn.json.zip’ saved [2542319/2542319]\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import json,zipfile\n", + "mlearn = json.loads(\n", + " zipfile.ZipFile(\"mlearn.json.zip\").read(\n", + " \"mlearn.json\"\n", + " )\n", + " )" + ], + "metadata": { + "id": "cLYOlQDZ44yr" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "from jarvis.core.atoms import Atoms\n", + "import json\n", + "import shutil\n", + "import warnings\n", + "os.chdir('/content')\n", + "elements = ['Si']\n", + "max_epochs=100\n", + "models={}\n", + "for element in elements:\n", + "\n", + " benchmark_energies = (\n", + " \"jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_\"\n", + " + element\n", + " + \"_energy.json.zip\"\n", + " )\n", + " temp_energies = benchmark_energies.split(\"/\")[-1].split(\".zip\")[0]\n", + " energies = json.loads(\n", + " zipfile.ZipFile(benchmark_energies).read(temp_energies)\n", + " )\n", + " train_ids = list(energies[\"train\"].keys())\n", + " test_ids = list(energies[\"test\"].keys())\n", + "\n", + " train_energies=[]\n", + " train_forces=[]\n", + " train_stresses=[]\n", + " train_structures=[]\n", + " for i in mlearn:\n", + " if i[\"jid\"] in train_ids:\n", + " # print(i)\n", + "\n", + " train_forces.append(i[\"forces\"])\n", + " train_stresses.append(i['stresses'])\n", + " atoms = Atoms.from_dict(i[\"atoms\"])\n", + " train_energies.append(i[\"energy\"]/atoms.num_atoms)\n", + " train_structures.append(atoms.pymatgen_converter())\n", + "\n", + " test_energies=[]\n", + " test_forces=[]\n", + " test_stresses=[]\n", + " test_structures=[]\n", + " tids = []\n", + " for i in mlearn:\n", + " if i[\"jid\"] in test_ids:\n", + " # print(i)\n", + "\n", + " test_forces.append(i[\"forces\"])\n", + " test_stresses.append(i['stresses'])\n", + " atoms = Atoms.from_dict(i[\"atoms\"])\n", + " test_energies.append(i[\"energy\"]/atoms.num_atoms)\n", + " test_structures.append(atoms.pymatgen_converter())\n", + " tids.append(i['jid'])\n" + ], + "metadata": { + "id": "5K3KZB1U5DAx" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "len(test_structures)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IHzj_PBt6GMO", + "outputId": "18dd8f47-5dd7-434d-f16d-960cf17a5661" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "25" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "source": [ + "%%time\n", + "from chgnet.data.dataset import StructureData, get_train_val_test_loader\n", + "from chgnet.trainer import Trainer\n", + "from torch.utils.data import DataLoader, Dataset\n", + "from chgnet.model.model import CHGNet\n", + "from chgnet.data.dataset import collate_graphs\n", + "chgnet = CHGNet()\n", + "\n", + "batch_size = 2\n", + "train_dataset = StructureData(\n", + " structures=train_structures,\n", + " energies=train_energies,\n", + " forces=train_forces,\n", + " #stresses=train_stresses,\n", + " # magmoms=None,\n", + ")\n", + "test_dataset = StructureData(\n", + " structures=test_structures,\n", + " energies=test_energies,\n", + " forces=test_forces,\n", + " #stresses=test_stresses,\n", + " # magmoms=None,\n", + ")\n", + "train_loader = DataLoader(\n", + " train_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "val_loader = DataLoader(\n", + " test_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "test_loader = DataLoader(\n", + " test_dataset,\n", + " batch_size=batch_size,\n", + " collate_fn=collate_graphs,\n", + " num_workers=0,\n", + " pin_memory=False,\n", + ")\n", + "trainer = Trainer(\n", + " model=chgnet,\n", + " targets=\"ef\",\n", + " optimizer=\"Adam\",\n", + " criterion=\"MSE\",\n", + " learning_rate=1e-2,\n", + " epochs=100,\n", + " use_device=\"cuda\",\n", + ")\n", + "\n", + "trainer.train(train_loader, val_loader, test_loader)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2LY5p0ku6Nry", + "outputId": "7d864a14-5169-4fef-f449-b09a367da97f" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CHGNet initialized with 412,525 parameters\n", + "214 structures imported\n", + "25 structures imported\n", + "Begin Training: using cuda:0 device\n", + "training targets: ef\n", + "Epoch: [0][1/107] | Time (4.033)(0.505) | Loss 2.5361(2.5361) | MAE e 1.182(1.182) f 0.670(0.670) \n", + "Epoch: [0][100/107] | Time (0.160)(0.047) | Loss 0.0118(0.4400) | MAE e 0.058(0.219) f 0.050(0.340) \n", + "* e_MAE (0.243) \tf_MAE (0.346) \t\n", + "Epoch: [1][1/107] | Time (0.124)(0.000) | Loss 0.6876(0.6876) | MAE e 0.245(0.245) f 0.503(0.503) \n", + "Epoch: [1][100/107] | Time (0.083)(0.000) | Loss 0.0316(0.2385) | MAE e 0.052(0.179) f 0.096(0.257) \n", + "* e_MAE (0.282) \tf_MAE (0.306) \t\n", + "Epoch: [2][1/107] | Time (0.078)(0.000) | Loss 0.4482(0.4482) | MAE e 0.281(0.281) f 0.392(0.392) \n", + "Epoch: [2][100/107] | Time (0.077)(0.000) | Loss 0.0287(0.1919) | MAE e 0.054(0.170) f 0.089(0.241) \n", + "* e_MAE (0.658) \tf_MAE (0.538) \t\n", + "Epoch: [3][1/107] | Time (0.074)(0.001) | Loss 1.6055(1.6055) | MAE e 0.757(0.757) f 0.633(0.633) \n", + "Epoch: [3][100/107] | Time (0.078)(0.000) | Loss 0.0734(1.5978) | MAE e 0.049(0.442) f 0.148(0.552) \n", + "* e_MAE (0.144) \tf_MAE (0.425) \t\n", + "Epoch: [4][1/107] | Time (0.081)(0.000) | Loss 0.5444(0.5444) | MAE e 0.165(0.165) f 0.458(0.458) \n", + "Epoch: [4][100/107] | Time (0.073)(0.000) | Loss 0.0489(0.5145) | MAE e 0.029(0.249) f 0.122(0.377) \n", + "* e_MAE (0.150) \tf_MAE (0.389) \t\n", + "Epoch: [5][1/107] | Time (0.096)(0.000) | Loss 0.4475(0.4475) | MAE e 0.166(0.166) f 0.416(0.416) \n", + "Epoch: [5][100/107] | Time (0.078)(0.000) | Loss 0.0430(0.4194) | MAE e 0.053(0.185) f 0.111(0.355) \n", + "* e_MAE (0.122) \tf_MAE (0.348) \t\n", + "Epoch: [6][1/107] | Time (0.070)(0.000) | Loss 0.3375(0.3375) | MAE e 0.142(0.142) f 0.341(0.341) \n", + "Epoch: [6][100/107] | Time (0.076)(0.000) | Loss 0.0513(0.3327) | MAE e 0.146(0.164) f 0.096(0.319) \n", + "* e_MAE (0.107) \tf_MAE (0.322) \t\n", + "Epoch: [7][1/107] | Time (0.084)(0.000) | Loss 0.2703(0.2703) | MAE e 0.132(0.132) f 0.287(0.287) \n", + "Epoch: [7][100/107] | Time (0.076)(0.000) | Loss 0.0345(0.2482) | MAE e 0.119(0.150) f 0.082(0.276) \n", + "* e_MAE (0.112) \tf_MAE (0.286) \t\n", + "Epoch: [8][1/107] | Time (0.072)(0.000) | Loss 0.1825(0.1825) | MAE e 0.134(0.134) f 0.230(0.230) \n", + "Epoch: [8][100/107] | Time (0.071)(0.000) | Loss 0.0210(0.1906) | MAE e 0.059(0.145) f 0.076(0.239) \n", + "* e_MAE (0.125) \tf_MAE (0.254) \t\n", + "Epoch: [9][1/107] | Time (0.070)(0.000) | Loss 0.1555(0.1555) | MAE e 0.147(0.147) f 0.210(0.210) \n", + "Epoch: [9][100/107] | Time (0.090)(0.000) | Loss 0.0279(0.1673) | MAE e 0.103(0.156) f 0.076(0.218) \n", + "* e_MAE (0.125) \tf_MAE (0.242) \t\n", + "Epoch: [10][1/107] | Time (0.072)(0.000) | Loss 0.1489(0.1489) | MAE e 0.152(0.152) f 0.203(0.203) \n", + "Epoch: [10][100/107] | Time (0.076)(0.000) | Loss 0.0303(0.1524) | MAE e 0.121(0.147) f 0.072(0.212) \n", + "* e_MAE (0.125) \tf_MAE (0.237) \t\n", + "Epoch: [11][1/107] | Time (0.077)(0.000) | Loss 0.1434(0.1434) | MAE e 0.154(0.154) f 0.195(0.195) \n", + "Epoch: [11][100/107] | Time (0.077)(0.000) | Loss 0.0272(0.1434) | MAE e 0.114(0.139) f 0.069(0.209) \n", + "* e_MAE (0.125) \tf_MAE (0.235) \t\n", + "Epoch: [12][1/107] | Time (0.071)(0.000) | Loss 0.1390(0.1390) | MAE e 0.153(0.153) f 0.198(0.198) \n", + "Epoch: [12][100/107] | Time (0.071)(0.000) | Loss 0.0260(0.1363) | MAE e 0.111(0.134) f 0.068(0.207) \n", + "* e_MAE (0.123) \tf_MAE (0.233) \t\n", + "Epoch: [13][1/107] | Time (0.071)(0.000) | Loss 0.1359(0.1359) | MAE e 0.151(0.151) f 0.206(0.206) \n", + "Epoch: [13][100/107] | Time (0.082)(0.000) | Loss 0.0253(0.1303) | MAE e 0.105(0.129) f 0.069(0.204) \n", + "* e_MAE (0.121) \tf_MAE (0.226) \t\n", + "Epoch: [14][1/107] | Time (0.082)(0.000) | Loss 0.1339(0.1339) | MAE e 0.148(0.148) f 0.213(0.213) \n", + "Epoch: [14][100/107] | Time (0.076)(0.000) | Loss 0.0245(0.1259) | MAE e 0.101(0.127) f 0.069(0.202) \n", + "* e_MAE (0.119) \tf_MAE (0.221) \t\n", + "Epoch: [15][1/107] | Time (0.078)(0.000) | Loss 0.1303(0.1303) | MAE e 0.145(0.145) f 0.213(0.213) \n", + "Epoch: [15][100/107] | Time (0.075)(0.000) | Loss 0.0230(0.1221) | MAE e 0.094(0.124) f 0.069(0.200) \n", + "* e_MAE (0.118) \tf_MAE (0.213) \t\n", + "Epoch: [16][1/107] | Time (0.073)(0.000) | Loss 0.1257(0.1257) | MAE e 0.143(0.143) f 0.209(0.209) \n", + "Epoch: [16][100/107] | Time (0.072)(0.000) | Loss 0.0207(0.1187) | MAE e 0.083(0.121) f 0.069(0.198) \n", + "* e_MAE (0.119) \tf_MAE (0.206) \t\n", + "Epoch: [17][1/107] | Time (0.073)(0.000) | Loss 0.1196(0.1196) | MAE e 0.143(0.143) f 0.199(0.199) \n", + "Epoch: [17][100/107] | Time (0.082)(0.000) | Loss 0.0184(0.1152) | MAE e 0.071(0.118) f 0.067(0.195) \n", + "* e_MAE (0.120) \tf_MAE (0.201) \t\n", + "Epoch: [18][1/107] | Time (0.071)(0.000) | Loss 0.1155(0.1155) | MAE e 0.142(0.142) f 0.192(0.192) \n", + "Epoch: [18][100/107] | Time (0.077)(0.000) | Loss 0.0167(0.1119) | MAE e 0.061(0.114) f 0.066(0.193) \n", + "* e_MAE (0.119) \tf_MAE (0.196) \t\n", + "Epoch: [19][1/107] | Time (0.070)(0.000) | Loss 0.1109(0.1109) | MAE e 0.141(0.141) f 0.186(0.186) \n", + "Epoch: [19][100/107] | Time (0.072)(0.000) | Loss 0.0154(0.1089) | MAE e 0.052(0.111) f 0.065(0.191) \n", + "* e_MAE (0.116) \tf_MAE (0.192) \t\n", + "Epoch: [20][1/107] | Time (0.106)(0.000) | Loss 0.1059(0.1059) | MAE e 0.139(0.139) f 0.179(0.179) \n", + "Epoch: [20][100/107] | Time (0.073)(0.000) | Loss 0.0147(0.1055) | MAE e 0.048(0.106) f 0.065(0.189) \n", + "* e_MAE (0.112) \tf_MAE (0.188) \t\n", + "Epoch: [21][1/107] | Time (0.069)(0.000) | Loss 0.0990(0.0990) | MAE e 0.136(0.136) f 0.167(0.167) \n", + "Epoch: [21][100/107] | Time (0.080)(0.000) | Loss 0.0150(0.1014) | MAE e 0.055(0.101) f 0.064(0.186) \n", + "* e_MAE (0.106) \tf_MAE (0.185) \t\n", + "Epoch: [22][1/107] | Time (0.077)(0.000) | Loss 0.0911(0.0911) | MAE e 0.131(0.131) f 0.152(0.152) \n", + "Epoch: [22][100/107] | Time (0.082)(0.000) | Loss 0.0157(0.0978) | MAE e 0.069(0.096) f 0.061(0.184) \n", + "* e_MAE (0.100) \tf_MAE (0.184) \t\n", + "Epoch: [23][1/107] | Time (0.073)(0.000) | Loss 0.0861(0.0861) | MAE e 0.127(0.127) f 0.154(0.154) \n", + "Epoch: [23][100/107] | Time (0.071)(0.000) | Loss 0.0143(0.0938) | MAE e 0.059(0.090) f 0.060(0.182) \n", + "* e_MAE (0.095) \tf_MAE (0.181) \t\n", + "Epoch: [24][1/107] | Time (0.105)(0.000) | Loss 0.0808(0.0808) | MAE e 0.122(0.122) f 0.142(0.142) \n", + "Epoch: [24][100/107] | Time (0.073)(0.000) | Loss 0.0168(0.0912) | MAE e 0.080(0.084) f 0.058(0.181) \n", + "* e_MAE (0.093) \tf_MAE (0.181) \t\n", + "Epoch: [25][1/107] | Time (0.072)(0.000) | Loss 0.0817(0.0817) | MAE e 0.119(0.119) f 0.155(0.155) \n", + "Epoch: [25][100/107] | Time (0.076)(0.000) | Loss 0.0197(0.0891) | MAE e 0.087(0.081) f 0.062(0.180) \n", + "* e_MAE (0.089) \tf_MAE (0.187) \t\n", + "Epoch: [26][1/107] | Time (0.069)(0.000) | Loss 0.0860(0.0860) | MAE e 0.118(0.118) f 0.176(0.176) \n", + "Epoch: [26][100/107] | Time (0.082)(0.000) | Loss 0.0113(0.0911) | MAE e 0.054(0.081) f 0.052(0.183) \n", + "* e_MAE (0.093) \tf_MAE (0.182) \t\n", + "Epoch: [27][1/107] | Time (0.069)(0.000) | Loss 0.0853(0.0853) | MAE e 0.118(0.118) f 0.164(0.164) \n", + "Epoch: [27][100/107] | Time (0.070)(0.000) | Loss 0.0158(0.0939) | MAE e 0.020(0.081) f 0.070(0.186) \n", + "* e_MAE (0.123) \tf_MAE (0.234) \t\n", + "Epoch: [28][1/107] | Time (0.073)(0.000) | Loss 0.1580(0.1580) | MAE e 0.160(0.160) f 0.254(0.254) \n", + "Epoch: [28][100/107] | Time (0.076)(0.000) | Loss 0.0121(0.0931) | MAE e 0.040(0.088) f 0.059(0.182) \n", + "* e_MAE (0.091) \tf_MAE (0.174) \t\n", + "Epoch: [29][1/107] | Time (0.072)(0.000) | Loss 0.0838(0.0838) | MAE e 0.117(0.117) f 0.171(0.171) \n", + "Epoch: [29][100/107] | Time (0.076)(0.000) | Loss 0.0129(0.0793) | MAE e 0.057(0.072) f 0.056(0.172) \n", + "* e_MAE (0.086) \tf_MAE (0.175) \t\n", + "Epoch: [30][1/107] | Time (0.075)(0.000) | Loss 0.0797(0.0797) | MAE e 0.111(0.111) f 0.167(0.167) \n", + "Epoch: [30][100/107] | Time (0.082)(0.000) | Loss 0.0118(0.0753) | MAE e 0.048(0.063) f 0.054(0.168) \n", + "* e_MAE (0.079) \tf_MAE (0.179) \t\n", + "Epoch: [31][1/107] | Time (0.068)(0.000) | Loss 0.0809(0.0809) | MAE e 0.104(0.104) f 0.174(0.174) \n", + "Epoch: [31][100/107] | Time (0.070)(0.000) | Loss 0.0103(0.0755) | MAE e 0.039(0.059) f 0.052(0.169) \n", + "* e_MAE (0.086) \tf_MAE (0.187) \t\n", + "Epoch: [32][1/107] | Time (0.070)(0.000) | Loss 0.0850(0.0850) | MAE e 0.107(0.107) f 0.178(0.178) \n", + "Epoch: [32][100/107] | Time (0.076)(0.000) | Loss 0.0125(0.0838) | MAE e 0.039(0.067) f 0.059(0.176) \n", + "* e_MAE (0.074) \tf_MAE (0.180) \t\n", + "Epoch: [33][1/107] | Time (0.069)(0.000) | Loss 0.0858(0.0858) | MAE e 0.100(0.100) f 0.183(0.183) \n", + "Epoch: [33][100/107] | Time (0.076)(0.000) | Loss 0.0082(0.0737) | MAE e 0.015(0.063) f 0.050(0.165) \n", + "* e_MAE (0.077) \tf_MAE (0.183) \t\n", + "Epoch: [34][1/107] | Time (0.080)(0.000) | Loss 0.0842(0.0842) | MAE e 0.100(0.100) f 0.181(0.181) \n", + "Epoch: [34][100/107] | Time (0.077)(0.000) | Loss 0.0078(0.0734) | MAE e 0.019(0.057) f 0.047(0.165) \n", + "* e_MAE (0.061) \tf_MAE (0.172) \t\n", + "Epoch: [35][1/107] | Time (0.100)(0.000) | Loss 0.0727(0.0727) | MAE e 0.079(0.079) f 0.173(0.173) \n", + "Epoch: [35][100/107] | Time (0.072)(0.000) | Loss 0.0077(0.0721) | MAE e 0.030(0.057) f 0.045(0.162) \n", + "* e_MAE (0.080) \tf_MAE (0.191) \t\n", + "Epoch: [36][1/107] | Time (0.067)(0.000) | Loss 0.0887(0.0887) | MAE e 0.098(0.098) f 0.187(0.187) \n", + "Epoch: [36][100/107] | Time (0.076)(0.000) | Loss 0.0137(0.1011) | MAE e 0.029(0.080) f 0.064(0.192) \n", + "* e_MAE (0.103) \tf_MAE (0.179) \t\n", + "Epoch: [37][1/107] | Time (0.077)(0.000) | Loss 0.0878(0.0878) | MAE e 0.123(0.123) f 0.169(0.169) \n", + "Epoch: [37][100/107] | Time (0.076)(0.000) | Loss 0.0066(0.0724) | MAE e 0.005(0.059) f 0.046(0.160) \n", + "* e_MAE (0.065) \tf_MAE (0.171) \t\n", + "Epoch: [38][1/107] | Time (0.071)(0.000) | Loss 0.0810(0.0810) | MAE e 0.079(0.079) f 0.186(0.186) \n", + "Epoch: [38][100/107] | Time (0.076)(0.000) | Loss 0.0064(0.0692) | MAE e 0.008(0.058) f 0.044(0.158) \n", + "* e_MAE (0.066) \tf_MAE (0.177) \t\n", + "Epoch: [39][1/107] | Time (0.075)(0.000) | Loss 0.0824(0.0824) | MAE e 0.081(0.081) f 0.189(0.189) \n", + "Epoch: [39][100/107] | Time (0.076)(0.000) | Loss 0.0066(0.0684) | MAE e 0.019(0.055) f 0.044(0.159) \n", + "* e_MAE (0.061) \tf_MAE (0.177) \t\n", + "Epoch: [40][1/107] | Time (0.074)(0.000) | Loss 0.0731(0.0731) | MAE e 0.074(0.074) f 0.176(0.176) \n", + "Epoch: [40][100/107] | Time (0.076)(0.000) | Loss 0.0068(0.0675) | MAE e 0.024(0.054) f 0.044(0.158) \n", + "* e_MAE (0.056) \tf_MAE (0.170) \t\n", + "Epoch: [41][1/107] | Time (0.072)(0.000) | Loss 0.0648(0.0648) | MAE e 0.067(0.067) f 0.163(0.163) \n", + "Epoch: [41][100/107] | Time (0.073)(0.000) | Loss 0.0069(0.0640) | MAE e 0.034(0.053) f 0.042(0.154) \n", + "* e_MAE (0.055) \tf_MAE (0.167) \t\n", + "Epoch: [42][1/107] | Time (0.069)(0.000) | Loss 0.0652(0.0652) | MAE e 0.062(0.062) f 0.168(0.168) \n", + "Epoch: [42][100/107] | Time (0.073)(0.000) | Loss 0.0065(0.0629) | MAE e 0.032(0.054) f 0.041(0.153) \n", + "* e_MAE (0.054) \tf_MAE (0.166) \t\n", + "Epoch: [43][1/107] | Time (0.074)(0.000) | Loss 0.0662(0.0662) | MAE e 0.059(0.059) f 0.171(0.171) \n", + "Epoch: [43][100/107] | Time (0.076)(0.000) | Loss 0.0063(0.0620) | MAE e 0.033(0.054) f 0.040(0.152) \n", + "* e_MAE (0.052) \tf_MAE (0.165) \t\n", + "Epoch: [44][1/107] | Time (0.070)(0.000) | Loss 0.0648(0.0648) | MAE e 0.056(0.056) f 0.170(0.170) \n", + "Epoch: [44][100/107] | Time (0.078)(0.000) | Loss 0.0063(0.0611) | MAE e 0.033(0.054) f 0.040(0.151) \n", + "* e_MAE (0.052) \tf_MAE (0.164) \t\n", + "Epoch: [45][1/107] | Time (0.071)(0.000) | Loss 0.0654(0.0654) | MAE e 0.055(0.055) f 0.171(0.171) \n", + "Epoch: [45][100/107] | Time (0.072)(0.000) | Loss 0.0060(0.0602) | MAE e 0.029(0.053) f 0.040(0.150) \n", + "* e_MAE (0.051) \tf_MAE (0.164) \t\n", + "Epoch: [46][1/107] | Time (0.078)(0.000) | Loss 0.0652(0.0652) | MAE e 0.053(0.053) f 0.171(0.171) \n", + "Epoch: [46][100/107] | Time (0.072)(0.000) | Loss 0.0061(0.0597) | MAE e 0.032(0.053) f 0.039(0.149) \n", + "* e_MAE (0.048) \tf_MAE (0.162) \t\n", + "Epoch: [47][1/107] | Time (0.105)(0.000) | Loss 0.0625(0.0625) | MAE e 0.049(0.049) f 0.167(0.167) \n", + "Epoch: [47][100/107] | Time (0.079)(0.000) | Loss 0.0059(0.0584) | MAE e 0.033(0.052) f 0.039(0.148) \n", + "* e_MAE (0.049) \tf_MAE (0.161) \t\n", + "Epoch: [48][1/107] | Time (0.074)(0.000) | Loss 0.0633(0.0633) | MAE e 0.049(0.049) f 0.168(0.168) \n", + "Epoch: [48][100/107] | Time (0.078)(0.000) | Loss 0.0057(0.0578) | MAE e 0.031(0.051) f 0.039(0.147) \n", + "* e_MAE (0.049) \tf_MAE (0.161) \t\n", + "Epoch: [49][1/107] | Time (0.217)(0.001) | Loss 0.0641(0.0641) | MAE e 0.049(0.049) f 0.169(0.169) \n", + "Epoch: [49][100/107] | Time (0.102)(0.000) | Loss 0.0056(0.0569) | MAE e 0.030(0.050) f 0.038(0.146) \n", + "* e_MAE (0.050) \tf_MAE (0.161) \t\n", + "Epoch: [50][1/107] | Time (0.070)(0.000) | Loss 0.0651(0.0651) | MAE e 0.049(0.049) f 0.169(0.169) \n", + "Epoch: [50][100/107] | Time (0.079)(0.000) | Loss 0.0061(0.0563) | MAE e 0.037(0.049) f 0.038(0.145) \n", + "* e_MAE (0.049) \tf_MAE (0.158) \t\n", + "Epoch: [51][1/107] | Time (0.093)(0.000) | Loss 0.0607(0.0607) | MAE e 0.046(0.046) f 0.163(0.163) \n", + "Epoch: [51][100/107] | Time (0.072)(0.000) | Loss 0.0051(0.0544) | MAE e 0.024(0.048) f 0.037(0.142) \n", + "* e_MAE (0.054) \tf_MAE (0.162) \t\n", + "Epoch: [52][1/107] | Time (0.073)(0.000) | Loss 0.0692(0.0692) | MAE e 0.054(0.054) f 0.172(0.172) \n", + "Epoch: [52][100/107] | Time (0.076)(0.000) | Loss 0.0055(0.0551) | MAE e 0.029(0.047) f 0.038(0.143) \n", + "* e_MAE (0.051) \tf_MAE (0.157) \t\n", + "Epoch: [53][1/107] | Time (0.074)(0.000) | Loss 0.0601(0.0601) | MAE e 0.049(0.049) f 0.159(0.159) \n", + "Epoch: [53][100/107] | Time (0.077)(0.000) | Loss 0.0056(0.0536) | MAE e 0.031(0.047) f 0.038(0.141) \n", + "* e_MAE (0.050) \tf_MAE (0.156) \t\n", + "Epoch: [54][1/107] | Time (0.071)(0.000) | Loss 0.0586(0.0586) | MAE e 0.046(0.046) f 0.156(0.156) \n", + "Epoch: [54][100/107] | Time (0.078)(0.000) | Loss 0.0050(0.0525) | MAE e 0.025(0.046) f 0.037(0.140) \n", + "* e_MAE (0.052) \tf_MAE (0.158) \t\n", + "Epoch: [55][1/107] | Time (0.099)(0.000) | Loss 0.0663(0.0663) | MAE e 0.050(0.050) f 0.166(0.166) \n", + "Epoch: [55][100/107] | Time (0.075)(0.000) | Loss 0.0064(0.0527) | MAE e 0.041(0.046) f 0.038(0.140) \n", + "* e_MAE (0.051) \tf_MAE (0.153) \t\n", + "Epoch: [56][1/107] | Time (0.075)(0.000) | Loss 0.0542(0.0542) | MAE e 0.046(0.046) f 0.148(0.148) \n", + "Epoch: [56][100/107] | Time (0.077)(0.000) | Loss 0.0046(0.0511) | MAE e 0.013(0.046) f 0.037(0.137) \n", + "* e_MAE (0.063) \tf_MAE (0.163) \t\n", + "Epoch: [57][1/107] | Time (0.069)(0.000) | Loss 0.0756(0.0756) | MAE e 0.061(0.061) f 0.170(0.170) \n", + "Epoch: [57][100/107] | Time (0.078)(0.000) | Loss 0.0069(0.0523) | MAE e 0.044(0.045) f 0.039(0.138) \n", + "* e_MAE (0.054) \tf_MAE (0.152) \t\n", + "Epoch: [58][1/107] | Time (0.072)(0.000) | Loss 0.0515(0.0515) | MAE e 0.049(0.049) f 0.140(0.140) \n", + "Epoch: [58][100/107] | Time (0.072)(0.000) | Loss 0.0048(0.0503) | MAE e 0.016(0.047) f 0.037(0.136) \n", + "* e_MAE (0.060) \tf_MAE (0.162) \t\n", + "Epoch: [59][1/107] | Time (0.075)(0.000) | Loss 0.0737(0.0737) | MAE e 0.058(0.058) f 0.165(0.165) \n", + "Epoch: [59][100/107] | Time (0.083)(0.000) | Loss 0.0058(0.0509) | MAE e 0.037(0.045) f 0.037(0.137) \n", + "* e_MAE (0.050) \tf_MAE (0.152) \t\n", + "Epoch: [60][1/107] | Time (0.070)(0.000) | Loss 0.0612(0.0612) | MAE e 0.043(0.043) f 0.159(0.159) \n", + "Epoch: [60][100/107] | Time (0.076)(0.000) | Loss 0.0050(0.0497) | MAE e 0.030(0.044) f 0.036(0.135) \n", + "* e_MAE (0.050) \tf_MAE (0.152) \t\n", + "Epoch: [61][1/107] | Time (0.073)(0.000) | Loss 0.0592(0.0592) | MAE e 0.042(0.042) f 0.153(0.153) \n", + "Epoch: [61][100/107] | Time (0.072)(0.000) | Loss 0.0058(0.0487) | MAE e 0.038(0.043) f 0.037(0.134) \n", + "* e_MAE (0.051) \tf_MAE (0.149) \t\n", + "Epoch: [62][1/107] | Time (0.096)(0.000) | Loss 0.0528(0.0528) | MAE e 0.045(0.045) f 0.144(0.144) \n", + "Epoch: [62][100/107] | Time (0.075)(0.000) | Loss 0.0051(0.0476) | MAE e 0.024(0.043) f 0.037(0.132) \n", + "* e_MAE (0.051) \tf_MAE (0.149) \t\n", + "Epoch: [63][1/107] | Time (0.072)(0.000) | Loss 0.0534(0.0534) | MAE e 0.044(0.044) f 0.140(0.140) \n", + "Epoch: [63][100/107] | Time (0.084)(0.000) | Loss 0.0044(0.0469) | MAE e 0.020(0.042) f 0.035(0.131) \n", + "* e_MAE (0.052) \tf_MAE (0.152) \t\n", + "Epoch: [64][1/107] | Time (0.076)(0.000) | Loss 0.0623(0.0623) | MAE e 0.042(0.042) f 0.155(0.155) \n", + "Epoch: [64][100/107] | Time (0.077)(0.000) | Loss 0.0059(0.0471) | MAE e 0.038(0.041) f 0.037(0.131) \n", + "* e_MAE (0.053) \tf_MAE (0.147) \t\n", + "Epoch: [65][1/107] | Time (0.074)(0.000) | Loss 0.0484(0.0484) | MAE e 0.047(0.047) f 0.132(0.132) \n", + "Epoch: [65][100/107] | Time (0.073)(0.000) | Loss 0.0040(0.0468) | MAE e 0.013(0.043) f 0.035(0.130) \n", + "* e_MAE (0.059) \tf_MAE (0.155) \t\n", + "Epoch: [66][1/107] | Time (0.084)(0.000) | Loss 0.0707(0.0707) | MAE e 0.049(0.049) f 0.159(0.159) \n", + "Epoch: [66][100/107] | Time (0.082)(0.000) | Loss 0.0045(0.0484) | MAE e 0.017(0.042) f 0.036(0.131) \n", + "* e_MAE (0.047) \tf_MAE (0.146) \t\n", + "Epoch: [67][1/107] | Time (0.075)(0.000) | Loss 0.0504(0.0504) | MAE e 0.034(0.034) f 0.134(0.134) \n", + "Epoch: [67][100/107] | Time (0.085)(0.000) | Loss 0.0048(0.0513) | MAE e 0.023(0.043) f 0.036(0.133) \n", + "* e_MAE (0.047) \tf_MAE (0.156) \t\n", + "Epoch: [68][1/107] | Time (0.069)(0.000) | Loss 0.0645(0.0645) | MAE e 0.039(0.039) f 0.153(0.153) \n", + "Epoch: [68][100/107] | Time (0.075)(0.000) | Loss 0.0089(0.0480) | MAE e 0.057(0.043) f 0.042(0.130) \n", + "* e_MAE (0.052) \tf_MAE (0.144) \t\n", + "Epoch: [69][1/107] | Time (0.070)(0.000) | Loss 0.0458(0.0458) | MAE e 0.043(0.043) f 0.125(0.125) \n", + "Epoch: [69][100/107] | Time (0.071)(0.000) | Loss 0.0049(0.0471) | MAE e 0.014(0.043) f 0.039(0.129) \n", + "* e_MAE (0.047) \tf_MAE (0.147) \t\n", + "Epoch: [70][1/107] | Time (0.076)(0.000) | Loss 0.0496(0.0496) | MAE e 0.032(0.032) f 0.137(0.137) \n", + "Epoch: [70][100/107] | Time (0.076)(0.000) | Loss 0.0047(0.0453) | MAE e 0.018(0.042) f 0.037(0.128) \n", + "* e_MAE (0.047) \tf_MAE (0.144) \t\n", + "Epoch: [71][1/107] | Time (0.072)(0.000) | Loss 0.0513(0.0513) | MAE e 0.033(0.033) f 0.140(0.140) \n", + "Epoch: [71][100/107] | Time (0.083)(0.000) | Loss 0.0049(0.0449) | MAE e 0.014(0.043) f 0.038(0.127) \n", + "* e_MAE (0.047) \tf_MAE (0.141) \t\n", + "Epoch: [72][1/107] | Time (0.072)(0.000) | Loss 0.0459(0.0459) | MAE e 0.035(0.035) f 0.128(0.128) \n", + "Epoch: [72][100/107] | Time (0.072)(0.000) | Loss 0.0040(0.0442) | MAE e 0.011(0.044) f 0.035(0.126) \n", + "* e_MAE (0.045) \tf_MAE (0.142) \t\n", + "Epoch: [73][1/107] | Time (0.093)(0.000) | Loss 0.0463(0.0463) | MAE e 0.034(0.034) f 0.129(0.129) \n", + "Epoch: [73][100/107] | Time (0.074)(0.000) | Loss 0.0039(0.0437) | MAE e 0.013(0.044) f 0.034(0.125) \n", + "* e_MAE (0.042) \tf_MAE (0.141) \t\n", + "Epoch: [74][1/107] | Time (0.076)(0.000) | Loss 0.0452(0.0452) | MAE e 0.029(0.029) f 0.127(0.127) \n", + "Epoch: [74][100/107] | Time (0.076)(0.000) | Loss 0.0039(0.0427) | MAE e 0.018(0.042) f 0.033(0.123) \n", + "* e_MAE (0.038) \tf_MAE (0.140) \t\n", + "Epoch: [75][1/107] | Time (0.072)(0.000) | Loss 0.0444(0.0444) | MAE e 0.022(0.022) f 0.127(0.127) \n", + "Epoch: [75][100/107] | Time (0.082)(0.000) | Loss 0.0041(0.0415) | MAE e 0.019(0.041) f 0.033(0.122) \n", + "* e_MAE (0.037) \tf_MAE (0.139) \t\n", + "Epoch: [76][1/107] | Time (0.069)(0.000) | Loss 0.0430(0.0430) | MAE e 0.018(0.018) f 0.126(0.126) \n", + "Epoch: [76][100/107] | Time (0.070)(0.000) | Loss 0.0042(0.0404) | MAE e 0.022(0.040) f 0.034(0.120) \n", + "* e_MAE (0.036) \tf_MAE (0.137) \t\n", + "Epoch: [77][1/107] | Time (0.071)(0.000) | Loss 0.0418(0.0418) | MAE e 0.014(0.014) f 0.126(0.126) \n", + "Epoch: [77][100/107] | Time (0.075)(0.000) | Loss 0.0045(0.0396) | MAE e 0.025(0.039) f 0.034(0.119) \n", + "* e_MAE (0.034) \tf_MAE (0.136) \t\n", + "Epoch: [78][1/107] | Time (0.072)(0.000) | Loss 0.0407(0.0407) | MAE e 0.009(0.009) f 0.125(0.125) \n", + "Epoch: [78][100/107] | Time (0.077)(0.000) | Loss 0.0047(0.0390) | MAE e 0.028(0.038) f 0.034(0.118) \n", + "* e_MAE (0.033) \tf_MAE (0.136) \t\n", + "Epoch: [79][1/107] | Time (0.074)(0.000) | Loss 0.0397(0.0397) | MAE e 0.004(0.004) f 0.124(0.124) \n", + "Epoch: [79][100/107] | Time (0.072)(0.000) | Loss 0.0049(0.0385) | MAE e 0.031(0.038) f 0.034(0.117) \n", + "* e_MAE (0.034) \tf_MAE (0.135) \t\n", + "Epoch: [80][1/107] | Time (0.108)(0.000) | Loss 0.0389(0.0389) | MAE e 0.002(0.002) f 0.123(0.123) \n", + "Epoch: [80][100/107] | Time (0.079)(0.000) | Loss 0.0050(0.0380) | MAE e 0.032(0.038) f 0.034(0.116) \n", + "* e_MAE (0.036) \tf_MAE (0.134) \t\n", + "Epoch: [81][1/107] | Time (0.074)(0.000) | Loss 0.0383(0.0383) | MAE e 0.007(0.007) f 0.122(0.122) \n", + "Epoch: [81][100/107] | Time (0.075)(0.000) | Loss 0.0050(0.0376) | MAE e 0.030(0.037) f 0.035(0.116) \n", + "* e_MAE (0.037) \tf_MAE (0.133) \t\n", + "Epoch: [82][1/107] | Time (0.070)(0.000) | Loss 0.0377(0.0377) | MAE e 0.010(0.010) f 0.121(0.121) \n", + "Epoch: [82][100/107] | Time (0.074)(0.000) | Loss 0.0048(0.0373) | MAE e 0.026(0.037) f 0.035(0.116) \n", + "* e_MAE (0.037) \tf_MAE (0.132) \t\n", + "Epoch: [83][1/107] | Time (0.078)(0.000) | Loss 0.0371(0.0371) | MAE e 0.010(0.010) f 0.119(0.119) \n", + "Epoch: [83][100/107] | Time (0.071)(0.000) | Loss 0.0045(0.0370) | MAE e 0.019(0.037) f 0.035(0.115) \n", + "* e_MAE (0.036) \tf_MAE (0.131) \t\n", + "Epoch: [84][1/107] | Time (0.083)(0.000) | Loss 0.0364(0.0364) | MAE e 0.008(0.008) f 0.118(0.118) \n", + "Epoch: [84][100/107] | Time (0.084)(0.000) | Loss 0.0044(0.0367) | MAE e 0.019(0.037) f 0.036(0.115) \n", + "* e_MAE (0.037) \tf_MAE (0.130) \t\n", + "Epoch: [85][1/107] | Time (0.077)(0.000) | Loss 0.0356(0.0356) | MAE e 0.013(0.013) f 0.115(0.115) \n", + "Epoch: [85][100/107] | Time (0.076)(0.000) | Loss 0.0043(0.0365) | MAE e 0.020(0.037) f 0.036(0.115) \n", + "* e_MAE (0.039) \tf_MAE (0.128) \t\n", + "Epoch: [86][1/107] | Time (0.070)(0.000) | Loss 0.0351(0.0351) | MAE e 0.016(0.016) f 0.112(0.112) \n", + "Epoch: [86][100/107] | Time (0.071)(0.000) | Loss 0.0042(0.0362) | MAE e 0.020(0.037) f 0.035(0.114) \n", + "* e_MAE (0.040) \tf_MAE (0.127) \t\n", + "Epoch: [87][1/107] | Time (0.074)(0.000) | Loss 0.0349(0.0349) | MAE e 0.018(0.018) f 0.108(0.108) \n", + "Epoch: [87][100/107] | Time (0.076)(0.000) | Loss 0.0040(0.0360) | MAE e 0.020(0.037) f 0.034(0.114) \n", + "* e_MAE (0.042) \tf_MAE (0.126) \t\n", + "Epoch: [88][1/107] | Time (0.073)(0.000) | Loss 0.0352(0.0352) | MAE e 0.024(0.024) f 0.104(0.104) \n", + "Epoch: [88][100/107] | Time (0.089)(0.000) | Loss 0.0039(0.0357) | MAE e 0.021(0.037) f 0.032(0.113) \n", + "* e_MAE (0.046) \tf_MAE (0.126) \t\n", + "Epoch: [89][1/107] | Time (0.069)(0.000) | Loss 0.0357(0.0357) | MAE e 0.031(0.031) f 0.103(0.103) \n", + "Epoch: [89][100/107] | Time (0.071)(0.000) | Loss 0.0038(0.0353) | MAE e 0.023(0.036) f 0.031(0.112) \n", + "* e_MAE (0.048) \tf_MAE (0.125) \t\n", + "Epoch: [90][1/107] | Time (0.113)(0.000) | Loss 0.0360(0.0360) | MAE e 0.033(0.033) f 0.106(0.106) \n", + "Epoch: [90][100/107] | Time (0.072)(0.000) | Loss 0.0037(0.0351) | MAE e 0.026(0.036) f 0.029(0.112) \n", + "* e_MAE (0.046) \tf_MAE (0.125) \t\n", + "Epoch: [91][1/107] | Time (0.071)(0.000) | Loss 0.0358(0.0358) | MAE e 0.030(0.030) f 0.108(0.108) \n", + "Epoch: [91][100/107] | Time (0.077)(0.000) | Loss 0.0034(0.0348) | MAE e 0.026(0.036) f 0.028(0.111) \n", + "* e_MAE (0.043) \tf_MAE (0.125) \t\n", + "Epoch: [92][1/107] | Time (0.073)(0.000) | Loss 0.0353(0.0353) | MAE e 0.025(0.025) f 0.108(0.108) \n", + "Epoch: [92][100/107] | Time (0.079)(0.000) | Loss 0.0031(0.0346) | MAE e 0.025(0.036) f 0.027(0.111) \n", + "* e_MAE (0.041) \tf_MAE (0.125) \t\n", + "Epoch: [93][1/107] | Time (0.081)(0.000) | Loss 0.0350(0.0350) | MAE e 0.021(0.021) f 0.108(0.108) \n", + "Epoch: [93][100/107] | Time (0.071)(0.000) | Loss 0.0030(0.0344) | MAE e 0.024(0.035) f 0.026(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [94][1/107] | Time (0.107)(0.000) | Loss 0.0345(0.0345) | MAE e 0.016(0.016) f 0.108(0.108) \n", + "Epoch: [94][100/107] | Time (0.075)(0.000) | Loss 0.0029(0.0343) | MAE e 0.024(0.035) f 0.025(0.110) \n", + "* e_MAE (0.039) \tf_MAE (0.124) \t\n", + "Epoch: [95][1/107] | Time (0.081)(0.000) | Loss 0.0339(0.0339) | MAE e 0.014(0.014) f 0.106(0.106) \n", + "Epoch: [95][100/107] | Time (0.077)(0.000) | Loss 0.0027(0.0341) | MAE e 0.022(0.035) f 0.025(0.110) \n", + "* e_MAE (0.039) \tf_MAE (0.124) \t\n", + "Epoch: [96][1/107] | Time (0.071)(0.000) | Loss 0.0335(0.0335) | MAE e 0.013(0.013) f 0.105(0.105) \n", + "Epoch: [96][100/107] | Time (0.075)(0.000) | Loss 0.0026(0.0340) | MAE e 0.021(0.034) f 0.025(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [97][1/107] | Time (0.074)(0.000) | Loss 0.0333(0.0333) | MAE e 0.013(0.013) f 0.103(0.103) \n", + "Epoch: [97][100/107] | Time (0.076)(0.000) | Loss 0.0025(0.0338) | MAE e 0.021(0.034) f 0.025(0.110) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [98][1/107] | Time (0.068)(0.000) | Loss 0.0332(0.0332) | MAE e 0.012(0.012) f 0.103(0.103) \n", + "Epoch: [98][100/107] | Time (0.076)(0.000) | Loss 0.0024(0.0338) | MAE e 0.021(0.034) f 0.025(0.109) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "Epoch: [99][1/107] | Time (0.068)(0.000) | Loss 0.0331(0.0331) | MAE e 0.012(0.012) f 0.102(0.102) \n", + "Epoch: [99][100/107] | Time (0.077)(0.000) | Loss 0.0024(0.0337) | MAE e 0.021(0.034) f 0.025(0.109) \n", + "* e_MAE (0.040) \tf_MAE (0.124) \t\n", + "---------Evaluate Model on Test Set---------------\n", + "** e_MAE (0.033) \tf_MAE (0.136) \t\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "best_model = trainer.best_model" + ], + "metadata": { + "id": "-uwIrYD76Nm0" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "out = best_model.predict_structure(test_structures[0])" + ], + "metadata": { + "id": "FkRCehT26Nj4" + }, + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "out.keys()" + ], + "metadata": { + "id": "8W9vPeDISw0O", + "outputId": "a294f043-2308-4e5d-acac-ce98fabfcba7", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "dict_keys(['s', 'f', 'e', 'm'])" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import glob\n", + "import numpy as np\n", + "def get_chgnet_pred(atoms=None,model=None):\n", + " pmg = atoms.pymatgen_converter()\n", + " out = model.predict_structure(pmg)\n", + " return out['e']*atoms.num_atoms,out['f'],out['s']\n", + "\n", + "best_model = trainer.best_model\n", + "df = pd.DataFrame(mlearn)\n", + "for i in glob.glob(\"jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/*energy*.zip\"):\n", + "\n", + " if \"mlearn\" in i and element in i:\n", + " fname_e = (\n", + " \"AI-MLFF-energy-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-mae.csv\"\n", + " )\n", + " fname_f = (\n", + " \"AI-MLFF-forces-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-multimae.csv\"\n", + " )\n", + " fname_s = (\n", + " \"AI-MLFF-stresses-\"\n", + " + i.split(\"/\")[-1].split(\"_energy.json.zip\")[0]\n", + " + \"-test-multimae.csv\"\n", + " )\n", + " f_e = open(fname_e, \"w\")\n", + " f_f = open(fname_f, \"w\")\n", + " # f_s = open(fname_s, \"w\")\n", + "\n", + " f_e.write(\"id,target,prediction\\n\")\n", + " f_f.write(\"id,target,prediction\\n\")\n", + " # f_s.write(\"id,prediction\\n\")\n", + " #\n", + " print(i)\n", + " dat = json.loads(\n", + " zipfile.ZipFile(i).read(\n", + " i.split(\"/\")[-1].split(\".zip\")[0]\n", + " )\n", + " )\n", + " print(dat[\"test\"])\n", + " for key, val in dat[\"test\"].items():\n", + " entry = df[df[\"jid\"] == key]\n", + " atoms = Atoms.from_dict(entry.atoms.values[0])\n", + " # print(key,val,df[df['jid']==key],atoms)\n", + " # energy,forces=get_alignn_forces(atoms)\n", + " energy, forces, stress = get_chgnet_pred(\n", + " model=best_model, atoms=atoms\n", + " )\n", + " print(key, val, energy, atoms.num_atoms)\n", + " line = (\n", + " key\n", + " + \",\"\n", + " + str(entry.energy.values[0])\n", + " + \",\"\n", + " + str(energy)\n", + " + \"\\n\"\n", + " )\n", + " f_e.write(line)\n", + " line = (\n", + " key\n", + " + \",\"\n", + " + str(\n", + " \";\".join(\n", + " map(\n", + " str,\n", + " np.array(\n", + " entry.forces.values[0]\n", + " ).flatten(),\n", + " )\n", + " )\n", + " )\n", + " + \",\"\n", + " + str(\n", + " \";\".join(map(str, np.array(forces).flatten()))\n", + " )\n", + " + \"\\n\"\n", + " )\n", + " f_f.write(line)\n", + " # line = (\n", + " # key\n", + " # + \",\"\n", + " # + str(\";\".join(map(str, np.array(stress).flatten())))\n", + " # + \"\\n\"\n", + " # )\n", + " # f_s.write(line)\n", + " f_e.close()\n", + " f_f.close()\n", + " # f_s.close()\n", + " zname = fname_e + \".zip\"\n", + " with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " myzip.write(fname_e)\n", + "\n", + " zname = fname_f + \".zip\"\n", + " with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " myzip.write(fname_f)\n", + "\n", + " # zname = fname_s + \".zip\"\n", + " # with zipfile.ZipFile(zname, \"w\") as myzip:\n", + " # myzip.write(fname_s)\n" + ], + "metadata": { + "id": "NIx3D0rBUJ8Z", + "outputId": "bb55f847-ea2e-4b03-8196-def522cd47c2", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_Si_energy.json.zip\n", + "{'Si-215': -297.62773938, 'Si-216': -295.77170067, 'Si-217': -291.28958206, 'Si-218': -296.24088456, 'Si-219': -294.41361742, 'Si-220': -334.75283939, 'Si-221': -334.69215136, 'Si-222': -184.71808052, 'Si-223': -121.41180043, 'Si-224': -338.93899696, 'Si-225': -338.83557056, 'Si-226': -335.68901422, 'Si-227': -333.7064957, 'Si-228': -344.85564046, 'Si-229': -344.81108268, 'Si-230': -298.83222646, 'Si-231': -298.96501782, 'Si-232': -295.20943762, 'Si-233': -291.86293882, 'Si-234': -344.74080048, 'Si-235': -344.74080047, 'Si-236': -344.74080046, 'Si-237': -341.22165747, 'Si-238': -341.22165734, 'Si-239': -341.22165747}\n", + "Si-215 -297.62773938 -295.70447158813477 63\n", + "Si-216 -295.77170067 -293.5783681869507 63\n", + "Si-217 -291.28958206 -293.8524899482727 63\n", + "Si-218 -296.24088456 -292.3929605484009 63\n", + "Si-219 -294.41361742 -294.08515548706055 63\n", + "Si-220 -334.75283939 -337.6295700073242 63\n", + "Si-221 -334.69215136 -337.80278491973877 63\n", + "Si-222 -184.71808052 -190.18782806396484 36\n", + "Si-223 -121.41180043 -124.60493087768555 24\n", + "Si-224 -338.93899696 -338.8770446777344 64\n", + "Si-225 -338.83557056 -338.87109375 64\n", + "Si-226 -335.68901422 -336.1199951171875 64\n", + "Si-227 -333.7064957 -333.7171630859375 64\n", + "Si-228 -344.85564046 -344.50006103515625 64\n", + "Si-229 -344.81108268 -344.46112060546875 64\n", + "Si-230 -298.83222646 -299.8096618652344 64\n", + "Si-231 -298.96501782 -300.45489501953125 64\n", + "Si-232 -295.20943762 -298.00830078125 64\n", + "Si-233 -291.86293882 -294.3046875 64\n", + "Si-234 -344.74080048 -342.12744140625 64\n", + "Si-235 -344.74080047 -342.1274108886719 64\n", + "Si-236 -344.74080046 -342.12744140625 64\n", + "Si-237 -341.22165747 -340.90899658203125 64\n", + "Si-238 -341.22165734 -340.90899658203125 64\n", + "Si-239 -341.22165747 -340.90899658203125 64\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "en_df = pd.read_csv('AI-MLFF-energy-mlearn_Si-test-mae.csv.zip')\n", + "from sklearn.metrics import mean_absolute_error\n", + "print(mean_absolute_error(en_df['target'],en_df['prediction']))\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(en_df['target'],en_df['prediction'],'.')\n", + "plt.xlabel('DFT energy(eV)')\n", + "plt.ylabel('FF energy(eV)')" + ], + "metadata": { + "id": "tLzFJFQDTyTW", + "outputId": "0654c572-79b0-474e-f3ea-a2a117b6af3c", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + } + }, + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.729472648798191\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0, 0.5, 'FF energy(eV)')" + ] + }, + "metadata": {}, + "execution_count": 18 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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QE1zOBzdcsstevDBB6ujFgAAAKdzOBwlJydXRx0AAAAuweExR5L0008/6bPPPtP8+fN1+vRpSVJeXp5+/PHHKi0OAACgpjncc3T48GH1799fR44cUUlJie699141aNBAb7zxhkpKSjRv3rzqqBMAAKBGONxz9Pzzz6tHjx46deqUfHx8zPW//OUvlZ6eXqXFAQAA1DSHe442bNigzZs3y9PT0259q1atlJubW2WFAQAAOIPDPUelpaW6ePFiufXHjh27KR4fAgAA6jaHw9F9992n//3f/zVf22w2/fjjj3rllVd0//33V2VtAAAANc7hB88eO3ZMsbGxMgxD+/fvV48ePbR//34FBgbq66+/VpMmTaqrVpfAg2cBAKh9HPn77XA4ki7dyr906VJt375dP/74o7p166bHHnvMboB2XUU4AgCg9nHk77fDA7IlqV69eho6dOh1FQcAAODKrisc7d+/X1988YX+9a9/qbS01G7blClTqqQwAAAAZ3A4HL333nt6+umnFRgYqJCQENlsNnObzWYjHAEAgFrN4XD0u9/9TtOmTdPYsWOrox4AAACncvhW/lOnTmnIkCHVUQsAAIDTORyOhgwZovXr11dHLQAAAE7n8GW1tm3bavLkydqyZYsiIiLk4eFht/25556rsuIAAABqmsPzHLVu3frKO7PZdPDgwRsu6nI5OTmaOnWqPv/8cxUUFKhp06YaOnSoJk6caD7jLScnp8LaMjIy1Lt3b/P1ihUrNHnyZOXk5Khdu3Z64403HJrZm3mOAACofap1nqNDhw5dd2HXa+/evSotLdX8+fPVtm1b7dy5UyNGjNCZM2f05ptv2rX97LPP1LlzZ/N148aNzZ83b96sRx55RDNmzNADDzygJUuWKC4uTtu2bVOXLl1q7HgAAIDruq4ZsiXp/PnzOnTokNq0aaN69a5ruqQbMmvWLM2dO9fsqSrrOcrMzFRkZGSF74mPj9eZM2e0du1ac13v3r0VGRmpefPmVepz6TkCAKD2ceTvt8MDss+ePavExET5+vqqc+fOOnLkiCTpN7/5jZKSkq6v4utQWFioRo0alVs/cOBANWnSRH369NHq1avttmVkZKhfv35262JjY5WRkXHFzykpKVFRUZHdAgAA6i6Hw9H48eP13Xff6csvv5S3t7e5vl+/flq2bFmVFnclBw4c0Jw5czRy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uxYvXmz3maWlpTp06JA6deokSbr11lvN7TabTSEhIfrXv/5l7uPAgQNq0KCB3b7PnTun7Oxs83VERIQ8PT3N1/v27dOtt95qdzns9ttvt9tH06ZNNWDAAC1cuFC333671qxZo5KSEg0ZMsRsU1xcXO6S2nfffadNmzaZPUWSdPHiRZ07d05nz56Vr6+vHnnkEf32t7/V8uXLNXz4cC1btkxubm6Kj48v93vy8fHR2bNnr/KbBHA5whGAarFnzx61bt3abl1gYKB5SelG/fjjjxo5cqSee+65cttatGhh/uzh4WG3zWazmXfS/fjjj+revbtdwCoTFBRk/uzn53ddNf7617/W448/rrffflvJycmKj4+Xr6+vuT0wMFCnTp0qd1yvvfaaBg8eXG5/ZUHK399fDz30kJKTk83Ldw8//LDq169f7j0nT560OxYA10Y4AlDlPv/8c+3YsUO//e1vq+0zunXrpt27d99Q2OrWrZuWLVumJk2ayN/fv9Lv69Chg/7yl7+opKREXl5ekqRvvvmmXLv7779ffn5+mjt3rj755BN9/fXXdtu7du2q3bt3l6tp37591zyuxMRE3XXXXVq7dq02b96sWbNmlWuTnZ2tc+fOqWvXrpU+NgAMyAZwg0pKSlRQUKDc3Fxt27ZN06dP16BBg/TAAw9o2LBh1fa5Y8eO1ebNm/Xss88qKytL+/fv16pVq8oNyL6axx57TIGBgRo0aJA2bNigQ4cO6csvv9Rzzz2nY8eOXfF9jz76qEpLS/Xkk09qz549+vTTT80706yXEt3d3ZWQkKDx48erXbt2ioqKsttPbGxsubvOpkyZokWLFum1117Trl27tGfPHi1dulSTJk2ya1c2sHvYsGHq2LGjoqOjy9W5YcMGhYeHq02bNpX+nQAgHAG4QZ988olCQ0PVqlUr9e/fX1988YV+//vfa9WqVZWa2PB63Xrrrfrqq6/0/fff64477lDXrl01ZcoUNW3atNL78PX11ddff60WLVpo8ODB6tSpkxITE3Xu3Lmr9iT5+/trzZo1ysrKUmRkpCZOnKgpU6ZIUrkxRImJiTp//rx+9atfldvPY489pl27dpl3z0mXAtPatWu1fv169ezZU71799bbb7+tli1b2r237I64U6dOafjw4RXW+de//lUjRoyo9O8DwCU2wzAMZxcBALXd4sWL9atf/UqFhYXy8fEx12/YsEH33HOPjh49quDg4HLve+mll1RUVKT58+dXaT27du3S3Xffre+//14BAQFVum+grqPnCACuw6JFi7Rx40YdOnRIK1eu1NixY/Xwww+bwaikpETHjh3Tq6++qiFDhlQYjCRp4sSJatmyZbnHrdyo/Px8LVq0iGAEXAd6jgDgOsycOVPvvvuuCgoKFBoaas6iXXY3WkpKihITExUZGanVq1erWbNmTq4YQGURjgAAACy4rAYAAGBBOAIAALAgHAEAAFgQjgAAACwIRwAAABaEIwAAAAvCEQAAgAXhCAAAwOL/A9A1UXfmOq4IAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "f_df = pd.read_csv('AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip')\n", + "target = np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['target'].values])\n", + "pred= np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['prediction'].values])\n", + "print(mean_absolute_error(target,pred))\n", + "plt.plot(target,pred,'.')\n", + "plt.xlabel('DFT forces(eV/A)')\n", + "plt.ylabel('FF forces(eV/A)')\n" + ], + "metadata": { + "id": "SWxlMW6tTnnp", + "outputId": "5448aa6e-9512-40b5-fe89-e6ae5e095954", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 485 + } + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0.1355192138227571\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Text(0, 0.5, 'FF forces(eV/A)')" + ] + }, + "metadata": {}, + "execution_count": 19 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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pAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAgMNURERKQIDDVERESkCAw1REREpAheFWq2bduGXr16QaPRIDAwEMOGDZO7JCIiIvIQt8hdgKPS09MxefJkLFiwAP3798fNmzdx7NgxucsiIiIiD+EVoebmzZt48sknsXjxYkyaNMl0vUuXLnafV1FRgYqKCtP3JSUlbquRiIiI5OUV00+HDh1CYWEhVCoVevTogdDQUAwePLjGkZrU1FRotVrTV3h4eD1VTERERPXNK0LNuXPnAAAvvfQSnn/+eXzxxRcIDAxE3759ceXKFZvPS0lJgV6vN30VFBTUV8lERERUz2QNNcnJyRAEwe5Xbm4uDAYDAOC5557DiBEjEBcXhzVr1kAQBHzyySc2X9/X1xcBAQEWX0RERKRMsvbUPPPMM5gwYYLde6KioqDT6QBY9tD4+voiKioK+fn57iyRiIiIvISsoSYkJAQhISE13hcXFwdfX1+cOnUKffr0AQDcuHEDeXl5aNeunbvLJCIiIi/gFaufAgICMHXqVLz44osIDw9Hu3btsHjxYgDAyJEjZa6OiIiIPIFXhBoAWLx4MW655RY8/PDDKC8vR69evZCZmYnAwEC5SyMiIiIPIIiiKMpdRH0pKSmBVquFXq9n0zAREZGXcPTz2yuWdBMRERHVhKGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhhoiIiBSBoYaIiIgUgaGGiIiIFIGhxgV0+nLsPVsEnb5c7lKIiIgaLK85pdtTpWXnI2VTDgwioBKA1OExGNWzrdxlERERNTgcqakDnb7cFGgAwCACczcd44gNERGRDBhq6uB8Uakp0BhViiLyisrkKYiIiKgBY6ipg8hgf6gEy2tqQUBEsJ88BRERETVgDDV1EKrVIHV4DNRCVbJRCwIWDO+KUK1G5sqIiIgaHjYK19Gonm2R1DEEeUVliAj2Y6AhIiKSCUONC4RqNQwzREREMuP0ExERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpAkMNERERKQJDDRERESkCQw0REREpQoM6+0kURQBASUmJzJUQERGR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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "hrHpS1VgTnlX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "T8zLxVLfTni6" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "XRKpe0T4Tngo" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "HFpUXITaTneR" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "Za-gJ5q-Tnb4" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json b/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json new file mode 100644 index 000000000..696163aa8 --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/metadata.json @@ -0,0 +1,29 @@ +{ + "model_name": "CHGNET", + "project_url": "https://github.com/CederGroupHub/chgnet", + "date_submitted": "01-29-2024", + "author_email": "knc6@nist.gov", + "database_version": "12-12-2022", + "team_name": "CHGNET", + "time_taken_seconds": { + "AI-MLFF-energy-mlearn_Cu-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Ge-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Li-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Mo-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Ni-test-mae.csv.zip": "", + "AI-MLFF-energy-mlearn_Si-test-mae.csv.zip": "", + "AI-MLFF-forces-mlearn_Cu-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Ge-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Li-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Mo-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Ni-test-multimae.csv.zip": "", + "AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip": "" + }, + "language": "python", + "os": "linux", + "software_used": "jarvis-tools,numpy,scipy,torch,m3gnet", + "hardware_used": "nisaba-cluster at NIST, V100 Tesla GPU", + "git_url": [ + "https://github.com/CederGroupHub/chgnet" + ] +} diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/run.py b/jarvis_leaderboard/contributions/chgnet_mlearn/run.py new file mode 100644 index 000000000..7abae658b --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/run.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +"""Train_CHGNet.ipynb + +Automatically generated by Colaboratory. + +Original file is located at + https://colab.research.google.com/github/knc6/jarvis-tools-notebooks/blob/master/jarvis-tools-notebooks/Train_CHGNet.ipynb +""" + +pip install -q chgnet + +import os +if not os.path.exists('jarvis_leaderboard'): + !git clone https://github.com/usnistgov/jarvis_leaderboard.git +os.chdir('jarvis_leaderboard') +!pip install -e . + +!pip install --upgrade git+https://gitlab.com/ase/ase.git@optimizer-tests + +!pip install numpy==1.23.5 +# then restart session + +!wget https://figshare.com/ndownloader/files/40357663 -O mlearn.json.zip + +import json,zipfile +mlearn = json.loads( + zipfile.ZipFile("mlearn.json.zip").read( + "mlearn.json" + ) + ) + +import os +from jarvis.core.atoms import Atoms +import json +import shutil +import warnings +os.chdir('/content') +elements = ['Si'] +max_epochs=100 +models={} +for element in elements: + + benchmark_energies = ( + "jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/mlearn_" + + element + + "_energy.json.zip" + ) + temp_energies = benchmark_energies.split("/")[-1].split(".zip")[0] + energies = json.loads( + zipfile.ZipFile(benchmark_energies).read(temp_energies) + ) + train_ids = list(energies["train"].keys()) + test_ids = list(energies["test"].keys()) + + train_energies=[] + train_forces=[] + train_stresses=[] + train_structures=[] + for i in mlearn: + if i["jid"] in train_ids: + # print(i) + + train_forces.append(i["forces"]) + train_stresses.append(i['stresses']) + atoms = Atoms.from_dict(i["atoms"]) + train_energies.append(i["energy"]/atoms.num_atoms) + train_structures.append(atoms.pymatgen_converter()) + + test_energies=[] + test_forces=[] + test_stresses=[] + test_structures=[] + tids = [] + for i in mlearn: + if i["jid"] in test_ids: + # print(i) + + test_forces.append(i["forces"]) + test_stresses.append(i['stresses']) + atoms = Atoms.from_dict(i["atoms"]) + test_energies.append(i["energy"]/atoms.num_atoms) + test_structures.append(atoms.pymatgen_converter()) + tids.append(i['jid']) + +len(test_structures) + +# Commented out IPython magic to ensure Python compatibility. +# %%time +# from chgnet.data.dataset import StructureData, get_train_val_test_loader +# from chgnet.trainer import Trainer +# from torch.utils.data import DataLoader, Dataset +# from chgnet.model.model import CHGNet +# from chgnet.data.dataset import collate_graphs +# chgnet = CHGNet() +# +# batch_size = 2 +# train_dataset = StructureData( +# structures=train_structures, +# energies=train_energies, +# forces=train_forces, +# #stresses=train_stresses, +# # magmoms=None, +# ) +# test_dataset = StructureData( +# structures=test_structures, +# energies=test_energies, +# forces=test_forces, +# #stresses=test_stresses, +# # magmoms=None, +# ) +# train_loader = DataLoader( +# train_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# val_loader = DataLoader( +# test_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# test_loader = DataLoader( +# test_dataset, +# batch_size=batch_size, +# collate_fn=collate_graphs, +# num_workers=0, +# pin_memory=False, +# ) +# trainer = Trainer( +# model=chgnet, +# targets="ef", +# optimizer="Adam", +# criterion="MSE", +# learning_rate=1e-2, +# epochs=100, +# use_device="cuda", +# ) +# +# trainer.train(train_loader, val_loader, test_loader) + +best_model = trainer.best_model + +out = best_model.predict_structure(test_structures[0]) + +out.keys() + +import pandas as pd +import glob +import numpy as np +def get_chgnet_pred(atoms=None,model=None): + pmg = atoms.pymatgen_converter() + out = model.predict_structure(pmg) + return out['e']*atoms.num_atoms,out['f'],out['s'] + +best_model = trainer.best_model +df = pd.DataFrame(mlearn) +for i in glob.glob("jarvis_leaderboard/jarvis_leaderboard/benchmarks/AI/MLFF/*energy*.zip"): + + if "mlearn" in i and element in i: + fname_e = ( + "AI-MLFF-energy-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-mae.csv" + ) + fname_f = ( + "AI-MLFF-forces-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-multimae.csv" + ) + fname_s = ( + "AI-MLFF-stresses-" + + i.split("/")[-1].split("_energy.json.zip")[0] + + "-test-multimae.csv" + ) + f_e = open(fname_e, "w") + f_f = open(fname_f, "w") + # f_s = open(fname_s, "w") + + f_e.write("id,target,prediction\n") + f_f.write("id,target,prediction\n") + # f_s.write("id,prediction\n") + # + print(i) + dat = json.loads( + zipfile.ZipFile(i).read( + i.split("/")[-1].split(".zip")[0] + ) + ) + print(dat["test"]) + for key, val in dat["test"].items(): + entry = df[df["jid"] == key] + atoms = Atoms.from_dict(entry.atoms.values[0]) + # print(key,val,df[df['jid']==key],atoms) + # energy,forces=get_alignn_forces(atoms) + energy, forces, stress = get_chgnet_pred( + model=best_model, atoms=atoms + ) + print(key, val, energy, atoms.num_atoms) + line = ( + key + + "," + + str(entry.energy.values[0]) + + "," + + str(energy) + + "\n" + ) + f_e.write(line) + line = ( + key + + "," + + str( + ";".join( + map( + str, + np.array( + entry.forces.values[0] + ).flatten(), + ) + ) + ) + + "," + + str( + ";".join(map(str, np.array(forces).flatten())) + ) + + "\n" + ) + f_f.write(line) + # line = ( + # key + # + "," + # + str(";".join(map(str, np.array(stress).flatten()))) + # + "\n" + # ) + # f_s.write(line) + f_e.close() + f_f.close() + # f_s.close() + zname = fname_e + ".zip" + with zipfile.ZipFile(zname, "w") as myzip: + myzip.write(fname_e) + + zname = fname_f + ".zip" + with zipfile.ZipFile(zname, "w") as myzip: + myzip.write(fname_f) + + # zname = fname_s + ".zip" + # with zipfile.ZipFile(zname, "w") as myzip: + # myzip.write(fname_s) + +# Commented out IPython magic to ensure Python compatibility. +en_df = pd.read_csv('AI-MLFF-energy-mlearn_Si-test-mae.csv.zip') +from sklearn.metrics import mean_absolute_error +print(mean_absolute_error(en_df['target'],en_df['prediction'])) +# %matplotlib inline +import matplotlib.pyplot as plt +plt.plot(en_df['target'],en_df['prediction'],'.') +plt.xlabel('DFT energy(eV)') +plt.ylabel('FF energy(eV)') + +f_df = pd.read_csv('AI-MLFF-forces-mlearn_Si-test-multimae.csv.zip') +target = np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['target'].values]) +pred= np.concatenate([np.array(i.split(';'),dtype='float') for i in f_df['prediction'].values]) +print(mean_absolute_error(target,pred)) +plt.plot(target,pred,'.') +plt.xlabel('DFT forces(eV/A)') +plt.ylabel('FF forces(eV/A)') + + + + + + + + + diff --git a/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh b/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh new file mode 100644 index 000000000..250a2b095 --- /dev/null +++ b/jarvis_leaderboard/contributions/chgnet_mlearn/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +# python jid_vac_alignn.py +python make_pred.py