{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "22e44d2d-6987-4daa-b6a2-c5422d27b0d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import mlatom as ml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4b74579b-ea47-45e4-8174-6da305c6f664",
   "metadata": {},
   "outputs": [],
   "source": [
    "# get initial structure\n",
    "h2 = ml.molecule.from_xyz_string('''2\n",
    "\n",
    "H 0 0 0\n",
    "H 0 0 0.7\n",
    "''')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "97b70cef-3541-43a3-9d97-6b93db33536a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define the reference method\n",
    "dft = ml.models.methods(method='B3LYP/6-31G*')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d2c7267e-4c48-427e-a1d4-14c42eb04c69",
   "metadata": {},
   "outputs": [],
   "source": [
    "# optimize geometry and calculate frequency\n",
    "'''optmol = ml.optimize_geometry(\n",
    "    model=dft,\n",
    "    initial_molecule=h2\n",
    "    ).optimized_molecule\n",
    "freq = ml.freq(model=dft,\n",
    "molecule=optmol)\n",
    "'''\n",
    "optmol = ml.molecule.load('materials/h2_freq.json')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "bf23832a-7b71-4abd-892d-3303f0ff12a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# settings for sampling points during AL loop\n",
    "sampler_kwargs = {\n",
    "    'initcond_sampler':'wigner',\n",
    "    'initcond_sampler_kwargs':{\n",
    "        'molecule':optmol,\n",
    "        'number_of_initial_conditions':100,\n",
    "        'initial_temperature':300},\n",
    "    'maximum_propagation_time':100.0,\n",
    "    'time_step':0.5,\n",
    "    'uq_threshold':0.000001,\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2db3efbc-603d-43a8-b93c-4b1b51e238aa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Initial points sampling: Use cross validation\n",
      " Initial points sampling: Number of CV splits = 5\n",
      "Start initial points sampling...\n",
      " Initial points sampling: initial points RMSE threshold not found, fit learning curve instead\n",
      " Initial points sampling: Train on energies only\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=6.038879764503849e-10, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "    Number of points: 50\n",
      "    eRMSE = 1.0850793908605848e-06 Hartree\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "    Number of points: 100\n",
      "    eRMSE = 2.577756354077729e-07 Hartree\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "    Number of points: 150\n",
      "    eRMSE = 7.148229877763e-08 Hartree\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "    Number of points: 200\n",
      "    eRMSE = 3.1661348155695476e-07 Hartree\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.35355339059327373\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.03125000000000001\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "    Number of points: 250\n",
      "    eRMSE = 1.7222338387532526e-07 Hartree\n",
      "        Linear regression: log(e) = -9.959073131303462 + -1.072119399985807 log(Ntr)\n",
      "        Linear regression: Pearson correlation coefficient = -0.6886462379669256\n",
      "        [e(Ntr)-e(Ntr+50)]/e(Ntr) = 0.17755237655667533\n",
      "        Improvement is large, continue sampling\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=1.189207115002721\n",
      "Training the main auxiliary model\n",
      "Optimized hyperparameters for energy aux model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "    Number of points: 300\n",
      "    eRMSE = 1.096682985216811e-06 Hartree\n",
      "        Linear regression: log(e) = -13.295918146719133 + -0.3276593524230377 log(Ntr)\n",
      "        Linear regression: Pearson correlation coefficient = -0.20364644630691536\n",
      "        [e(Ntr)-e(Ntr+50)]/e(Ntr) = 0.04925454434025745\n",
      "        Improvement is small, initial points sampling done\n",
      "    Number of initial points: 300\n",
      "Initial points sampling time: 42.54678368102759 s\n",
      "Active learning iteration 0\n",
      "Points to label: 300\n",
      "New labeled points: 300\n",
      "0 points are abandoned due to failed calculation\n",
      "Number of points in the labeled data set: 300\n",
      "Optimized hyperparameters for main model: lambda=2.9103830456733704e-11, sigma=0.10511205190671434\n",
      "Optimized hyperparameters for aux model: lambda=2.9103830456733704e-11, sigma=0.03125000000000001\n",
      "New threshold: 1.0227106919180605e-08\n",
      "    Number of training points: 300\n",
      "        Number of subtraining points: 270\n",
      "        Number of validation points: 30\n",
      "        Main model\n",
      "            Subtraining set:\n",
      "                RMSE of values = 5.881435953785552e-09\n",
      "                Correlation coefficient = 0.9999999999998377\n",
      "                RMSE of gradients = 2.490201827173034e-09\n",
      "                Correlation coefficient = 0.9999999999999997\n",
      "            Validation set:\n",
      "                RMSE of values = 0.0\n",
      "                Correlation coefficient = 0.9999999999999999\n",
      "                RMSE of gradients = 0.0\n",
      "                Correlation coefficient = 0.9999999999999998\n",
      "        Auxiliary model\n",
      "            Subtraining set:\n",
      "                RMSE of values = 9.34233727021504e-10\n",
      "                Correlation coefficient = 0.9999999999999958\n",
      "            Validation set:\n",
      "                RMSE of values = 5.469203647668958e-09\n",
      "                Correlation coefficient = 0.9999999999999115\n",
      "UQ threshold is provided in sampler, overwriting saved threshold\n",
      "Current threshold: 1e-06\n",
      "Trajectory 1 number of steps: 201\n",
      "Trajectory 2 number of steps: 201\n",
      "Trajectory 3 number of steps: 201\n",
      "Trajectory 4 number of steps: 201\n",
      "Trajectory 5 number of steps: 201\n",
      "Trajectory 6 number of steps: 201\n",
      "Trajectory 7 number of steps: 201\n",
      "Trajectory 8 number of steps: 201\n",
      "Trajectory 9 number of steps: 201\n",
      "Trajectory 10 number of steps: 9\n",
      "Adding molecule from trajectory 10 at time 4.00 fs\n",
      "Trajectory 11 number of steps: 201\n",
      "Trajectory 12 number of steps: 201\n",
      "Trajectory 13 number of steps: 1\n",
      "Adding molecule from trajectory 13 at time 0.00 fs\n",
      "Trajectory 14 number of steps: 6\n",
      "Adding molecule from trajectory 14 at time 2.50 fs\n",
      "Trajectory 15 number of steps: 201\n",
      "Trajectory 16 number of steps: 201\n",
      "Trajectory 17 number of steps: 201\n",
      "Trajectory 18 number of steps: 201\n",
      "Trajectory 19 number of steps: 201\n",
      "Trajectory 20 number of steps: 201\n",
      "Trajectory 21 number of steps: 201\n",
      "Trajectory 22 number of steps: 4\n",
      "Adding molecule from trajectory 22 at time 1.50 fs\n",
      "Trajectory 23 number of steps: 201\n",
      "Trajectory 24 number of steps: 1\n",
      "Adding molecule from trajectory 24 at time 0.00 fs\n",
      "Trajectory 25 number of steps: 201\n",
      "Trajectory 26 number of steps: 12\n",
      "Adding molecule from trajectory 26 at time 5.50 fs\n",
      "Trajectory 27 number of steps: 201\n",
      "Trajectory 28 number of steps: 201\n",
      "Trajectory 29 number of steps: 201\n",
      "Trajectory 30 number of steps: 201\n",
      "Trajectory 31 number of steps: 201\n",
      "Trajectory 32 number of steps: 201\n",
      "Trajectory 33 number of steps: 201\n",
      "Trajectory 34 number of steps: 7\n",
      "Adding molecule from trajectory 34 at time 3.00 fs\n",
      "Trajectory 35 number of steps: 11\n",
      "Adding molecule from trajectory 35 at time 5.00 fs\n",
      "Trajectory 36 number of steps: 201\n",
      "Trajectory 37 number of steps: 5\n",
      "Adding molecule from trajectory 37 at time 2.00 fs\n",
      "Trajectory 38 number of steps: 201\n",
      "Trajectory 39 number of steps: 201\n",
      "Trajectory 40 number of steps: 201\n",
      "Trajectory 41 number of steps: 201\n",
      "Trajectory 42 number of steps: 201\n",
      "Trajectory 43 number of steps: 11\n",
      "Adding molecule from trajectory 43 at time 5.00 fs\n",
      "Trajectory 44 number of steps: 201\n",
      "Trajectory 45 number of steps: 201\n",
      "Trajectory 46 number of steps: 201\n",
      "Trajectory 47 number of steps: 201\n",
      "Trajectory 48 number of steps: 201\n",
      "Trajectory 49 number of steps: 201\n",
      "Trajectory 50 number of steps: 201\n",
      "Trajectory 51 number of steps: 12\n",
      "Adding molecule from trajectory 51 at time 5.50 fs\n",
      "Trajectory 52 number of steps: 201\n",
      "Trajectory 53 number of steps: 6\n",
      "Adding molecule from trajectory 53 at time 2.50 fs\n",
      "Trajectory 54 number of steps: 201\n",
      "Trajectory 55 number of steps: 201\n",
      "Trajectory 56 number of steps: 201\n",
      "Trajectory 57 number of steps: 10\n",
      "Adding molecule from trajectory 57 at time 4.50 fs\n",
      "Trajectory 58 number of steps: 201\n",
      "Trajectory 59 number of steps: 201\n",
      "Trajectory 60 number of steps: 201\n",
      "Trajectory 61 number of steps: 201\n",
      "Trajectory 62 number of steps: 201\n",
      "Trajectory 63 number of steps: 201\n",
      "Trajectory 64 number of steps: 201\n",
      "Trajectory 65 number of steps: 201\n",
      "Trajectory 66 number of steps: 201\n",
      "Trajectory 67 number of steps: 201\n",
      "Trajectory 68 number of steps: 201\n",
      "Trajectory 69 number of steps: 201\n",
      "Trajectory 70 number of steps: 201\n",
      "Trajectory 71 number of steps: 201\n",
      "Trajectory 72 number of steps: 201\n",
      "Trajectory 73 number of steps: 201\n",
      "Trajectory 74 number of steps: 201\n",
      "Trajectory 75 number of steps: 201\n",
      "Trajectory 76 number of steps: 201\n",
      "Trajectory 77 number of steps: 201\n",
      "Trajectory 78 number of steps: 201\n",
      "Trajectory 79 number of steps: 201\n",
      "Trajectory 80 number of steps: 201\n",
      "Trajectory 81 number of steps: 201\n",
      "Trajectory 82 number of steps: 5\n",
      "Adding molecule from trajectory 82 at time 2.00 fs\n",
      "Trajectory 83 number of steps: 201\n",
      "Trajectory 84 number of steps: 201\n",
      "Trajectory 85 number of steps: 201\n",
      "Trajectory 86 number of steps: 13\n",
      "Adding molecule from trajectory 86 at time 6.00 fs\n",
      "Trajectory 87 number of steps: 201\n",
      "Trajectory 88 number of steps: 201\n",
      "Trajectory 89 number of steps: 201\n",
      "Trajectory 90 number of steps: 201\n",
      "Trajectory 91 number of steps: 201\n",
      "Trajectory 92 number of steps: 201\n",
      "Trajectory 93 number of steps: 201\n",
      "Trajectory 94 number of steps: 201\n",
      "Trajectory 95 number of steps: 201\n",
      "Trajectory 96 number of steps: 201\n",
      "Trajectory 97 number of steps: 201\n",
      "Trajectory 98 number of steps: 201\n",
      "Trajectory 99 number of steps: 201\n",
      "Trajectory 100 number of steps: 201\n",
      "Iteration 0 takes 72.60129306931049 s\n",
      "  Labeling time: 38.02987134503201 s\n",
      "  Training time: 15.152436579111964 s\n",
      "  Sampling time: 19.418985145166516 s\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "Active learning iteration 1\n",
      "Points to label: 15\n",
      "New labeled points: 15\n",
      "0 points are abandoned due to failed calculation\n",
      "Number of points in the labeled data set: 315\n"
     ]
    }
   ],
   "source": [
    "# start active learning\n",
    "ml.al(molecule=optmol,\n",
    "      ml_model='KREG',\n",
    "      sampler = 'md',\n",
    "      sampler_kwargs=sampler_kwargs,\n",
    "      min_new_points=5,\n",
    "      reference_method=dft)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8e05325-1dd2-4b6f-9284-149bb5664ef5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# check the final labeled database\n",
    "db = ml.molecular_database.load(filename='labeled_db.json', format='json')\n",
    "len(db)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27f81e60-e537-462f-9a64-ba27b5751cc9",
   "metadata": {},
   "outputs": [],
   "source": [
    "for imol in range(len(db)):\n",
    "    print(db[imol].internuclear_distance(0, 1), db[imol].energy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ea683fe5-af9f-4597-9153-b138f950468c",
   "metadata": {},
   "outputs": [],
   "source": [
    "db.view()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d7fb4d47-20df-4e78-9de4-121ec068ea06",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
