diff --git a/scripts/evaluate-generated-mofs/0_effect-of-training.ipynb b/scripts/evaluate-generated-mofs/0_effect-of-training.ipynb deleted file mode 100644 index 0ca3b6a4..00000000 --- a/scripts/evaluate-generated-mofs/0_effect-of-training.ipynb +++ /dev/null @@ -1,467 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "1719a71e-77b6-4edf-aea7-06656446ba2f", - "metadata": {}, - "source": [ - "# Are MOFs Generated by Later Models Better?\n", - "We periodically retrain the DiffLinker, and hope that the ones generated by later interations of the model are better." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "9b732ebf-fe93-4610-bd44-9430b14f79fe", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from matplotlib import pyplot as plt\n", - "from datetime import datetime\n", - "from pathlib import Path\n", - "from tqdm import tqdm\n", - "import pandas as pd\n", - "import json\n", - "import gzip" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "9efc8697-48e3-4fc5-8181-63ecb29c4fba", - "metadata": {}, - "outputs": [], - "source": [ - "run_dir = Path('../prod-runs/256-nodes/')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "7d8cb69f-e7ba-4aee-8652-0fed12d6eaf8", - "metadata": {}, - "outputs": [], - "source": [ - "Path('figures').mkdir(exist_ok=True)" - ] - }, - { - "cell_type": "markdown", - "id": "88b14321-1e9c-48c0-872a-7fcbd734ac13", - "metadata": {}, - "source": [ - "## Load the Data from Disk\n", - "And make it compact\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f510924d-3905-41db-aa68-2aecfbe8e75a", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "32341it [01:43, 312.62it/s]\n" - ] - } - ], - "source": [ - "records = []\n", - "with gzip.open(run_dir / 'mofs.json.gz', 'rt') as fp:\n", - " for line in tqdm(fp):\n", - " record = json.loads(line)\n", - "\n", - " # Remove structure data, label linkers by anchor\n", - " for k in ['md_trajectory', 'nodes', 'structure', '_id']:\n", - " del record[k]\n", - " for ligand in record.pop('ligands'):\n", - " record[f'ligand.{ligand[\"anchor_type\"]}'] = ligand\n", - " for k in ['xyz', 'dummy_element', 'anchor_type']:\n", - " del ligand[k]\n", - "\n", - " record['time'] = record.pop('times')['created']['$date']\n", - " records.append(pd.json_normalize(record))\n", - "records = pd.concat(records, ignore_index=True)" - ] - }, - { - "cell_type": "markdown", - "id": "b16f764b-dfa9-4928-99e6-898155e24e45", - "metadata": {}, - "source": [ - "Store the model versions" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "6445ea74-8c5b-43bf-97b1-c680a9d3f1a3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nametopologycatenationtimegas_storage.CO2structure_stability.uffligand.COO.nameligand.COO.smilesligand.COO.prompt_atomsligand.COO.metadata.model_versionligand.cyano.nameligand.cyano.smilesligand.cyano.prompt_atomsligand.cyano.metadata.model_version
0mof-00a88ea5NoneNone2024-04-13T23:18:21.584Z[10000.0, 0.0862266618]0.209704ligand-a1037294O=C([O-])c1ccc(C=C=[S+2]=C/[C-]=C/c2ccc(C(=O)O...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-6536db2cN#Cc1ccc(C#CC#CC#Cc2ccc(C#N)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
1mof-89fd0977NoneNone2024-04-13T23:18:00.040Z[10000.0, 0.0756631463]0.228959ligand-0bb2fcf6[O-][C+](O)[C-]1[CH+][CH+][C+]([C][C][CH+][C][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-b53051b9[N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
2mof-1ef2070fNoneNone2024-04-13T23:17:59.318Z[10000.0, 0.2165945735]0.201553ligand-0fa742f0O=C([O-])c1ccc(C#C/[S+]=C/C#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-145bcf48[N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
3mof-b3a06d94NoneNone2024-04-13T23:18:01.291Z[10000.0, 0.0723458327]0.073941ligand-0fa742f0O=C([O-])c1ccc(C#C/[S+]=C/C#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-818dbabc[N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][N-][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
4mof-9d97b1ecNoneNone2024-04-13T23:18:05.109Z[10000.0, 0.0714736096]0.260291ligand-0bb2fcf6[O-][C+](O)[C-]1[CH+][CH+][C+]([C][C][CH+][C][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-b9f216ab[N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
\n", - "
" - ], - "text/plain": [ - " name topology catenation time \\\n", - "0 mof-00a88ea5 None None 2024-04-13T23:18:21.584Z \n", - "1 mof-89fd0977 None None 2024-04-13T23:18:00.040Z \n", - "2 mof-1ef2070f None None 2024-04-13T23:17:59.318Z \n", - "3 mof-b3a06d94 None None 2024-04-13T23:18:01.291Z \n", - "4 mof-9d97b1ec None None 2024-04-13T23:18:05.109Z \n", - "\n", - " gas_storage.CO2 structure_stability.uff ligand.COO.name \\\n", - "0 [10000.0, 0.0862266618] 0.209704 ligand-a1037294 \n", - "1 [10000.0, 0.0756631463] 0.228959 ligand-0bb2fcf6 \n", - "2 [10000.0, 0.2165945735] 0.201553 ligand-0fa742f0 \n", - "3 [10000.0, 0.0723458327] 0.073941 ligand-0fa742f0 \n", - "4 [10000.0, 0.0714736096] 0.260291 ligand-0bb2fcf6 \n", - "\n", - " ligand.COO.smiles \\\n", - "0 O=C([O-])c1ccc(C=C=[S+2]=C/[C-]=C/c2ccc(C(=O)O... \n", - "1 [O-][C+](O)[C-]1[CH+][CH+][C+]([C][C][CH+][C][... \n", - "2 O=C([O-])c1ccc(C#C/[S+]=C/C#Cc2ccc(C(=O)O)cc2)cc1 \n", - "3 O=C([O-])c1ccc(C#C/[S+]=C/C#Cc2ccc(C(=O)O)cc2)cc1 \n", - "4 [O-][C+](O)[C-]1[CH+][CH+][C+]([C][C][CH+][C][... \n", - "\n", - " ligand.COO.prompt_atoms \\\n", - "0 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", - "1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", - "2 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", - "3 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", - "4 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", - "\n", - " ligand.COO.metadata.model_version ligand.cyano.name \\\n", - "0 0 ligand-6536db2c \n", - "1 0 ligand-b53051b9 \n", - "2 0 ligand-145bcf48 \n", - "3 0 ligand-818dbabc \n", - "4 0 ligand-b9f216ab \n", - "\n", - " ligand.cyano.smiles \\\n", - "0 N#Cc1ccc(C#CC#CC#Cc2ccc(C#N)cc2)cc1 \n", - "1 [N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][... \n", - "2 [N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C... \n", - "3 [N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][N-][... \n", - "4 [N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][... \n", - "\n", - " ligand.cyano.prompt_atoms \\\n", - "0 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", - "1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", - "2 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", - "3 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", - "4 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", - "\n", - " ligand.cyano.metadata.model_version \n", - "0 0 \n", - "1 0 \n", - "2 0 \n", - "3 0 \n", - "4 0 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "records.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "70f48759-1d7e-4ec3-bbce-1112ebc144ca", - "metadata": {}, - "outputs": [], - "source": [ - "records['model_version'] = records[['ligand.cyano.metadata.model_version', 'ligand.COO.metadata.model_version']].max(axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "e9be34a8-308d-49de-a7aa-8e6ffa7bbb15", - "metadata": {}, - "outputs": [], - "source": [ - "records['time'] = records['time'].apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ'))\n", - "records['walltime'] = (records['time'] - records['time'].min()).apply(lambda x: x.total_seconds())" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "67963d35-eccc-422f-a2d2-060b5796431b", - "metadata": {}, - "outputs": [], - "source": [ - "records.sort_values('walltime', inplace=True)" - ] - }, - { - "cell_type": "markdown", - "id": "54c1dcfe-036e-4393-964d-16cd8a746608", - "metadata": {}, - "source": [ - "## Plot Stability over Time\n", - "Do they get better or worse over time?" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "88d8f1b6-6343-4207-a635-047b4bf3615c", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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beu4+l/Ps3hNPS0Zh3P++hh3n348wweY9a4+29AQJCH4EA7oONlE+zbw7/c/ZHifPtiWpF95OX84/GjO/vdjrG7OOuaWb9jAsg0bCp4/ok903a2qWPH6ALe9+xp79q/jf2Y9hyabvuqiaXIyzP3+z1mfauFfS+cxZ+1n1MSTfH/YbgwoT3D6mzfS7LaisUhagpgU/GCbQ3lo+YvBhcYsNzdcGIAHlk1mcAGlKJWeyQdfvIMlKqirPpWK+Mi2b1Y34KtAqqeffjonnngigwaZhBM/AeCtt95ixx137FKfnbrC//7v/+b222+noqKCe++9l4svvpiRI0fy4osvcuSRR7LPPvtw5513dqivmTNnsnr1avbaay9s28a2baZPn85tt92GbduBhJorca5evTo4VltbSzqdzvPUhdsUQiKRoLq6OrK1hUyqsBf6xQdeLUioAMKLmURK8O2JQoBtQdyGmJX/REhh9kvheWCy5KEBlYh+XVqDsgCLojGsxeC4ikefms1Bew4nZstASjXz7EAH7bTRGtKOyxPvLGizacZV/PrBaTz4+rv84833WLIm+12u3tjIyX96kFPu/ge/fmQag6oq82JdBSDTGGmynTeKFHDra2/wh5df5Yqnp3HmPx/lsZNOJh6SSHxurs5ZoE8Kwf/bN1pVbMfe/TlscOGyfh/Uf8HxT/6dz1sb8469v/5znv30Q/b9121cPWsajy+dT7kd4z/L5/Kj126gyW1FA7ZQWNJBizRz179PTXytNzuFUvlfuYWiWq4LB38Amn7WBjKpJ/ii6UlWNf6TOSu/S1M6PxSwu+FoSUZFt87EqV577bXsvffeVFVVMWDAAI477jg+/PDDSJuORAi1hYkTJ3LPPfdw9tln89prr5HwCulYlsXll1/e4X7C6FQ91d69e/P666+z00470dLSwujRo1m4cGFwfPXq1UyYMIH777+/3b4aGhoCNd7H6aefzo477sgvfvELdt55Z+rq6rj44ou57LLLAEin0wwYMIDrr78+cFT179+fv//975x4oql6tHLlSgYPHsyTTz7ZYUdVW/Ui166q5wd1Z3eonzBkdRUimUSUJdGua57WiiRkMtDUihoyICiSAkaFVXGPaIVAtmbMZy9cR1kCFYvGoGoJKi4M+cr8+NTysjjNOSFfSmD6kRgisrxoBMDNVRjakP40mKIqgjYJ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r9t96ch119bWkk6nqa+vL9qmhK0bJVJtA+F6jmFMmzaNfffddwvNassglUrx/vvvM2jQIIYNG0ZtbW3kvqTTaaZPn75V35eOXPdee+1FLBaLtFm5ciXz5s3bqu9NCSFsWT9Zz8fUqVN1LBbT99xzj16wYIGeMGGCrqio0EuWLNnSU9usuPTSS/VLL72kFy1apN988009fvx4XVVVFVz3ddddp2tqavQjjzyi586dq3/4wx/qQYMG6Y0bN27hmW8aGhoa9OzZs/Xs2bM1oG+66SY9e/ZsvXTpUq11x677nHPO0YMHD9bPPfecnjVrlj7kkEP0brvtph3H2VKXVcKXiBKpdgD/+7//q4cOHarj8bjec8899fTp07f0lDY7TjrpJD1o0CAdi8V0XV2dPv744/X8+fOD40opfdVVV+na2lqdSCT0gQceqOfOnbsFZ9w9ePHFFzWQt5166qla645dd0tLiz7//PN1nz59dFlZmR4/frxetmzZFriaErYESqX/SiihhBK6ESWbagkllFBCN6JEqiWUUEIJ3YgSqZZQQgkldCNKpFpCCSWU0I0okWoJJZRQQjeiRKollFBCCd2IEqmWUEIJJXQjSqRaQgkllNCNKJFqCV3GxIkT2X333bfY+L/+9a85++yzN6mPuXPnMnjwYJqamrppViV83VHKqCqhINorU3fqqacyefJkUqkUffv2/ZJmlcXnn3/OiBEjeO+999h22203qa/jjz+ePffck1/96lfdM7kSvtYokWoJBREub/fggw/ym9/8hg8//DDYV1ZWRk1NzZaYGgCTJk1i+vTpPPPMM5vc1xNPPME555zDsmXLsCyrG2ZXwtcZJfW/hIKora0NtpqammA11fC+XPX/tNNO47jjjmPSpEkMHDiQXr168dvf/hbHcfj5z39Onz59GDx4MH/5y18iY61YsYKTTjqJ3r1707dvX4499liWLFnS5vymTp3KMcccE9l30EEHccEFFzBhwgR69+7NwIEDueuuu2hqauL000+nqqqK4cOH89RTT0XOO/LII1m7di3Tp0/fpHtWQglQItUSuhkvvPACn332GS+//DI33XQTEydOZPz48fTu3Zu33nqLc845h3POOYfly5cD0NzczMEHH0xlZSUvv/wyr776KpWVlRx11FGk0+mCY9TX1zNv3jzGjBmTd2zKlCn069ePt99+mwsuuICf/exnnHDCCey7777MmjWLI488klNOOYXm5ubgnHg8zm677fa1WHq8hC8BW7JEVglfDdx77726pqYmb3/uiqunnnqqHjp0qHZdN9i3ww476AMOOCD47DiOrqio0A888IDWWut77rlH77DDDlopFbRJpVK6rKxMP/PMMwXn49c6zS2nN27cOL3//vvnjXXKKacE+1auXKkB/cYbb0TO/e53v6tPO+20Nu5CCSV0DKU1qkroVuy8885ImVWABg4cyOjRo4PPlmXRt29fVq9eDZjVRz/55BOqqqoi/bS2trJw4cKCY7S0tACQTCbzju266655Y+2yyy6R+QDB+D7Kysoi0msJJXQVJVItoVsRi8Uin4UQBfcppQBQSrHXXnvxf//3f3l99e/fv+AY/fr1A4wZILdNe+P7UQ3++D7WrVvH8OHDi15XCSV0FCVSLWGLYs899+TBBx9kwIABVFdXd+ic4cOHU11dzYIFCxg5cmS3zGPevHl8//vf75a+Svh6o+SoKmGL4kc/+hH9+vXj2GOP5ZVXXmHx4sVMnz6diy66iE8//bTgOVJKDjvsMF599dVumcOSJUtYsWIFhx12WLf0V8LXGyVSLWGLory8nJdffpltttmG448/np122okzzjiDlpaWNiXXs88+m6lTp+ap8V3BAw88wBFHHMHQoUM3ua8SSigF/5fwlYTWmm9961tMmDCBH/7wh13uJ5VKMWLECB544AH222+/bpxhCV9XlCTVEr6SEEJw11134TjOJvWzdOlSrrzyyhKhltBtKEmqJZRQQgndiJKkWkIJJZTQjSiRagkllFBCN6JEqiWUUEIJ3YgSqZZQQgkldCNKpFpCCSWU0I0okWoJJZRQQjeiRKollFBCCd2IEqmWUEIJJXQjSqRaQgkllNCN+P9lLQBnLVFGoQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", - "\n", - "sc = ax.scatter(records['walltime'] / 60, records['structure_stability.uff'] * 100, s=10,\n", - " c=records['model_version'])\n", - "\n", - "fig.colorbar(sc, label='Model Version')\n", - "\n", - "ax.set_xlabel('Time (m)')\n", - "ax.set_ylabel('Strain (%)')\n", - "\n", - "fig.tight_layout()\n", - "fig.savefig('figures/stability-over-time.png', dpi=320)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "20859044-0e0e-44b9-b32d-c155782403bd", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", - "\n", - "records['cumulative_found'] = (records['structure_stability.uff'] < 0.1).cumsum()\n", - "sc = ax.scatter(\n", - " records['walltime'] / 60,\n", - " records['cumulative_found'],\n", - " s=10, c=records['model_version']\n", - ")\n", - "#ax.step(records['walltime'] / 60, count, zorder=-1, c='k', lw=1)\n", - "\n", - "fig.colorbar(sc, label='Model Version')\n", - "\n", - "ax.set_xlabel('Time (min)')\n", - "ax.set_ylabel('Stable Found')\n", - "\n", - "fig.tight_layout()\n", - "fig.savefig('figures/stability-over-time-step.png', dpi=320)" - ] - }, - { - "cell_type": "markdown", - "id": "b525d928-fff2-410c-87d7-3a5339e6dc65", - "metadata": {}, - "source": [ - "Save results" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "858ecab3-c4cc-458b-9472-9988d31b5a1d", - "metadata": {}, - "outputs": [], - "source": [ - "summary_dir = Path('summaries')\n", - "summary_dir.mkdir(exist_ok=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "d0e8f32e-2f60-48df-9c6f-9758a6a2e4f8", - "metadata": {}, - "outputs": [], - "source": [ - "records.to_csv(summary_dir / f'{run_dir.name}.csv.gz', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f7b64b08-6697-4069-95d3-522e0fa6b0d1", - "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.10.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/scripts/evaluate-generated-mofs/0_summarize-model-outcomes.ipynb b/scripts/evaluate-generated-mofs/0_summarize-model-outcomes.ipynb new file mode 100644 index 00000000..5c2caa26 --- /dev/null +++ b/scripts/evaluate-generated-mofs/0_summarize-model-outcomes.ipynb @@ -0,0 +1,467 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1719a71e-77b6-4edf-aea7-06656446ba2f", + "metadata": {}, + "source": [ + "# Are MOFs Generated by Later Models Better?\n", + "We periodically retrain the DiffLinker, and hope that the ones generated by later interations of the model are better." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9b732ebf-fe93-4610-bd44-9430b14f79fe", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "from datetime import datetime\n", + "from pathlib import Path\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import json\n", + "import gzip" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9efc8697-48e3-4fc5-8181-63ecb29c4fba", + "metadata": {}, + "outputs": [], + "source": [ + "run_dir = Path('../prod-runs/64-nodes_no-retrain_repeat-2/')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "7d8cb69f-e7ba-4aee-8652-0fed12d6eaf8", + "metadata": {}, + "outputs": [], + "source": [ + "Path('figures').mkdir(exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "id": "88b14321-1e9c-48c0-872a-7fcbd734ac13", + "metadata": {}, + "source": [ + "## Load the Data from Disk\n", + "And make it compact\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f510924d-3905-41db-aa68-2aecfbe8e75a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "9770it [00:46, 207.89it/s]\n" + ] + } + ], + "source": [ + "records = []\n", + "with gzip.open(run_dir / 'mofs.json.gz', 'rt') as fp:\n", + " for line in tqdm(fp):\n", + " record = json.loads(line)\n", + "\n", + " # Remove structure data, label linkers by anchor\n", + " for k in ['md_trajectory', 'nodes', 'structure', '_id']:\n", + " del record[k]\n", + " for ligand in record.pop('ligands'):\n", + " record[f'ligand.{ligand[\"anchor_type\"]}'] = ligand\n", + " for k in ['xyz', 'dummy_element', 'anchor_type']:\n", + " del ligand[k]\n", + "\n", + " record['time'] = record.pop('times')['created']['$date']\n", + " records.append(pd.json_normalize(record))\n", + "records = pd.concat(records, ignore_index=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b16f764b-dfa9-4928-99e6-898155e24e45", + "metadata": {}, + "source": [ + "Store the model versions" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "6445ea74-8c5b-43bf-97b1-c680a9d3f1a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametopologycatenationtimegas_storage.CO2structure_stability.uffligand.COO.nameligand.COO.smilesligand.COO.prompt_atomsligand.COO.metadata.model_versionligand.cyano.nameligand.cyano.smilesligand.cyano.prompt_atomsligand.cyano.metadata.model_version
0mof-0c85fcdcNoneNone2024-10-05T18:34:31.991Z0.0707120.198765ligand-f36f085aO=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-b1ae0877[N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
1mof-71f74056NoneNone2024-10-05T18:34:31.269Z0.0877370.201572ligand-f36f085aO=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-fd4b41eb[N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
2mof-12eebf0fNoneNone2024-10-05T18:34:30.214Z0.0747910.288125ligand-f36f085aO=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-a3cb2664[N-2][C][c+]1[cH-][cH+][c-]([C][C][C][C][C][CH...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
3mof-28b7f140NoneNone2024-10-05T18:34:30.073Z0.0945160.157505ligand-f36f085aO=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-7cc6d992[N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
4mof-93190b3cNoneNone2024-10-05T18:34:30.003Z0.0791150.230479ligand-f36f085aO=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13...0ligand-d6b66392[N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][CH+][C...[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ...0
\n", + "
" + ], + "text/plain": [ + " name topology catenation time \\\n", + "0 mof-0c85fcdc None None 2024-10-05T18:34:31.991Z \n", + "1 mof-71f74056 None None 2024-10-05T18:34:31.269Z \n", + "2 mof-12eebf0f None None 2024-10-05T18:34:30.214Z \n", + "3 mof-28b7f140 None None 2024-10-05T18:34:30.073Z \n", + "4 mof-93190b3c None None 2024-10-05T18:34:30.003Z \n", + "\n", + " gas_storage.CO2 structure_stability.uff ligand.COO.name \\\n", + "0 0.070712 0.198765 ligand-f36f085a \n", + "1 0.087737 0.201572 ligand-f36f085a \n", + "2 0.074791 0.288125 ligand-f36f085a \n", + "3 0.094516 0.157505 ligand-f36f085a \n", + "4 0.079115 0.230479 ligand-f36f085a \n", + "\n", + " ligand.COO.smiles \\\n", + "0 O=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1 \n", + "1 O=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1 \n", + "2 O=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1 \n", + "3 O=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1 \n", + "4 O=C([O-])c1ccc(C=[N+]=C=CC#Cc2ccc(C(=O)O)cc2)cc1 \n", + "\n", + " ligand.COO.prompt_atoms \\\n", + "0 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", + "1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", + "2 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", + "3 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", + "4 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13... \n", + "\n", + " ligand.COO.metadata.model_version ligand.cyano.name \\\n", + "0 0 ligand-b1ae0877 \n", + "1 0 ligand-fd4b41eb \n", + "2 0 ligand-a3cb2664 \n", + "3 0 ligand-7cc6d992 \n", + "4 0 ligand-d6b66392 \n", + "\n", + " ligand.cyano.smiles \\\n", + "0 [N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C... \n", + "1 [N-2][C][c+]1[cH-][cH+][c-]([C][CH+][CH+][C][C... \n", + "2 [N-2][C][c+]1[cH-][cH+][c-]([C][C][C][C][C][CH... \n", + "3 [N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][C][C][... \n", + "4 [N-2][C][c+]1[cH-][cH+][c-]([C][C][CH+][CH+][C... \n", + "\n", + " ligand.cyano.prompt_atoms \\\n", + "0 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", + "1 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", + "2 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", + "3 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", + "4 [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, ... \n", + "\n", + " ligand.cyano.metadata.model_version \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "records.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "70f48759-1d7e-4ec3-bbce-1112ebc144ca", + "metadata": {}, + "outputs": [], + "source": [ + "records['model_version'] = records[['ligand.cyano.metadata.model_version', 'ligand.COO.metadata.model_version']].max(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "e9be34a8-308d-49de-a7aa-8e6ffa7bbb15", + "metadata": {}, + "outputs": [], + "source": [ + "records['time'] = records['time'].apply(lambda x: datetime.strptime(x[:x.index(\".\")] + \"Z\" if \".\" in x else x, '%Y-%m-%dT%H:%M:%SZ'))\n", + "records['walltime'] = (records['time'] - records['time'].min()).apply(lambda x: x.total_seconds())" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "67963d35-eccc-422f-a2d2-060b5796431b", + "metadata": {}, + "outputs": [], + "source": [ + "records.sort_values('walltime', inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "54c1dcfe-036e-4393-964d-16cd8a746608", + "metadata": {}, + "source": [ + "## Plot Stability over Time\n", + "Do they get better or worse over time?" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "88d8f1b6-6343-4207-a635-047b4bf3615c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", + "\n", + "sc = ax.scatter(records['walltime'] / 60, records['structure_stability.uff'] * 100, s=10,\n", + " c=records['model_version'])\n", + "\n", + "fig.colorbar(sc, label='Model Version')\n", + "\n", + "ax.set_xlabel('Time (m)')\n", + "ax.set_ylabel('Strain (%)')\n", + "\n", + "fig.tight_layout()\n", + "fig.savefig('figures/stability-over-time.png', dpi=320)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "20859044-0e0e-44b9-b32d-c155782403bd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", + "\n", + "records['cumulative_found'] = (records['structure_stability.uff'] < 0.1).cumsum()\n", + "sc = ax.scatter(\n", + " records['walltime'] / 60,\n", + " records['cumulative_found'],\n", + " s=10, c=records['model_version']\n", + ")\n", + "#ax.step(records['walltime'] / 60, count, zorder=-1, c='k', lw=1)\n", + "\n", + "fig.colorbar(sc, label='Model Version')\n", + "\n", + "ax.set_xlabel('Time (min)')\n", + "ax.set_ylabel('Stable Found')\n", + "\n", + "fig.tight_layout()\n", + "fig.savefig('figures/stability-over-time-step.png', dpi=320)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "b525d928-fff2-410c-87d7-3a5339e6dc65", + "metadata": {}, + "source": [ + "Save results" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "858ecab3-c4cc-458b-9472-9988d31b5a1d", + "metadata": {}, + "outputs": [], + "source": [ + "summary_dir = Path('summaries')\n", + "summary_dir.mkdir(exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "d0e8f32e-2f60-48df-9c6f-9758a6a2e4f8", + "metadata": {}, + "outputs": [], + "source": [ + "records.to_csv(summary_dir / f'{run_dir.name}.csv.gz', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7b64b08-6697-4069-95d3-522e0fa6b0d1", + "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.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scripts/evaluate-generated-mofs/1_effect-of-scale.ipynb b/scripts/evaluate-generated-mofs/1_effect-of-scale.ipynb index 5aa1a03b..b8772979 100644 --- a/scripts/evaluate-generated-mofs/1_effect-of-scale.ipynb +++ b/scripts/evaluate-generated-mofs/1_effect-of-scale.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "id": "a838a8d1-1402-4371-a3d6-54d63e91f034", "metadata": {}, "outputs": [], @@ -19,6 +19,7 @@ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "from pathlib import Path\n", + "from itertools import chain\n", "import pandas as pd\n", "import numpy as np" ] @@ -34,16 +35,25 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 22, "id": "27ca604d-d7d1-421d-b636-29145e3a0807", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 6 runs: 32 32 64 128 256 450\n" + ] + } + ], "source": [ "summaries = []\n", - "for path in Path('summaries').glob('*csv.gz'):\n", + "for path in chain(Path('summaries').glob('*-nodes.csv.gz'), Path('summaries').glob('*-nodes_repeat-*.csv.gz')):\n", " count = int(path.name.split(\"-\")[0])\n", " summaries.append([count, pd.read_csv(path)])\n", - "summaries.sort(key=lambda x: x[0])" + "summaries.sort(key=lambda x: x[0])\n", + "print(f'Found {len(summaries)} runs:', \" \".join(str(x[0]) for x in summaries))" ] }, { @@ -57,42 +67,58 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "cd067d19-e292-4cdd-9bc4-cd754b49532a", + "execution_count": 25, + "id": "e6e85eea-4df6-412f-acf0-4d2b86fa88e2", "metadata": {}, "outputs": [], "source": [ + "sizes = sorted(set(x[0] for x in summaries))\n", "cmap = plt.get_cmap('copper_r')\n", - "steps = np.linspace(0.1, 1., len(summaries))" + "steps = np.linspace(0.2, 1., len(sizes))\n", + "colors = dict((size, cmap(step)) for size, step in zip(sizes, steps))" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "a0c741fc-b772-46fc-9fec-dcbe9971008f", + "execution_count": 26, + "id": "f9b000b1-bf87-4812-a001-50189252f639", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", "text/plain": [ - "
" + "{32: (0.9882350615917502, 0.62496, 0.398, 1.0),\n", + " 64: (0.7411762961938126, 0.46871999999999997, 0.2985, 1.0),\n", + " 128: (0.49411753079587517, 0.31248000000000004, 0.199, 1.0),\n", + " 256: (0.24705876539793759, 0.15623999999999993, 0.09949999999999998, 1.0),\n", + " 450: (0.0, 0.0, 0.0, 1.0)}" ] }, + "execution_count": 26, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], + "source": [ + "colors" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a0c741fc-b772-46fc-9fec-dcbe9971008f", + "metadata": {}, + "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", "\n", - "for (count, summary), step in zip(summaries, steps):\n", + "for count, summary in summaries:\n", " summary = summary.query(f'walltime > {15 * 60}')\n", " ax.plot(\n", " summary['walltime'] / 60,\n", " summary['cumulative_found'] / count / summary['walltime'] * 3600,\n", " '-',\n", - " color=cmap(step),\n", + " color=colors[count],\n", " label=f'N={count}'\n", " )\n", "ax.legend(fontsize=6)\n", @@ -105,10 +131,57 @@ "fig.savefig('figures/stable-found-per-node-hour.pdf')" ] }, + { + "cell_type": "code", + "execution_count": 30, + "id": "085439d4-1eaa-4102-bd74-23661a27ec69", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(3.5, 2.))\n", + "\n", + "lowest_slope = np.mean(\n", + " [summary['cumulative_found'].iloc[-1] / summary['walltime'].iloc[-1] * 3600\n", + " for count, summary in summaries if count == min(colors.keys())]\n", + ")\n", + "done = set()\n", + "for count, summary in summaries:\n", + " ax.plot(\n", + " summary['walltime'] / 3600,\n", + " summary['cumulative_found'],\n", + " '-',\n", + " color=colors[count],\n", + " alpha=0.8,\n", + " label=f'N={count}' if count not in done else None\n", + " )\n", + " done.add(count)\n", + "\n", + "ax.set_xlim(0, 2.8)\n", + "for count, summary in summaries:\n", + " ax.plot(ax.get_xlim(), np.multiply(ax.get_xlim(), lowest_slope * (count - 1) / 31), '--', lw=1, color=colors[count])\n", + " \n", + "ax.legend(fontsize=6)\n", + "\n", + "ax.set_xlabel('Walltime (hr)')\n", + "ax.set_ylabel('Stable MOFs Found')\n", + "\n", + "fig.tight_layout()\n", + "fig.savefig('figures/stable-found-per-hour.png', dpi=320)\n", + "fig.savefig('figures/stable-found-per-hour.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a98ccfb2-4c17-4e91-8a77-dbea2bde6056", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, - "id": "03e91217-cb40-46a6-b143-8e2ff6d44694", + "id": "25317804-b828-4f0a-ab5e-2ab66f61ea86", "metadata": {}, "outputs": [], "source": [] diff --git a/scripts/evaluate-generated-mofs/2_effect-of-training.ipynb b/scripts/evaluate-generated-mofs/2_effect-of-training.ipynb new file mode 100644 index 00000000..9bbe8356 --- /dev/null +++ b/scripts/evaluate-generated-mofs/2_effect-of-training.ipynb @@ -0,0 +1,232 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5211ca75-c0ed-4e81-ae37-2a21533656f1", + "metadata": {}, + "source": [ + "# Evaluate the Effect of Training \n", + "We can assess whether retraining Difflinker leads to improved performance in two ways:\n", + "1. Evaluate how much the success rate improves with re-training\n", + "2. The difference between the total number of stable MOFs found w/ and w/o a closed loop" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e0c564c2-ec6d-4d55-bc8e-944a80d35598", + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import chain\n", + "from scipy.interpolate import interp1d\n", + "from pathlib import Path\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "c56bd56d-a264-4e11-a7ec-e3bb62268e42", + "metadata": {}, + "source": [ + "## Route 1: Measure Success Rate by Model Generation" + ] + }, + { + "cell_type": "markdown", + "id": "c8bb1426-af24-4159-b1c4-55e9c203bfde", + "metadata": {}, + "source": [ + "## Round 2: Assess workflow outcomes w/o retraining\n", + "Show that it gets better" + ] + }, + { + "cell_type": "markdown", + "id": "10478466-dfd8-41c0-bf53-20dcb394fb91", + "metadata": {}, + "source": [ + "### Get the \"Stable Found\" at 90 minutes\n", + "Loop over all runs and store: scale, if retrained or not, and the number of stable found after 90 minutes. \n", + "The 450-node run switches how it trained DiffLinker at around 90 minutes, and we don't want to study that effect yet." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "aa46b598-7a7f-4f13-8a7c-c991ef4e2013", + "metadata": {}, + "outputs": [], + "source": [ + "hours = 1.5" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "98400659-f017-4b68-8ac7-1e9643c10c65", + "metadata": {}, + "outputs": [], + "source": [ + "success_data = []\n", + "for path in chain(Path('summaries').glob('*-nodes.csv.gz'), Path('summaries').glob('*-nodes_repeat-*.csv.gz'), Path('summaries').glob('*no-retrain*.csv.gz')):\n", + " # Get metadata\n", + " count = int(path.name.split(\"-\")[0])\n", + " retrain = 'no-retrain' not in path.name\n", + "\n", + " # Pull the success rate\n", + " mofs = pd.read_csv(path)\n", + " num_found = interp1d(mofs['walltime'], mofs['cumulative_found'], kind='previous')(hours * 3600).item()\n", + "\n", + " success_data.append({\n", + " 'nodes': count,\n", + " 'retrain': retrain,\n", + " 'found': num_found,\n", + " 'found_node-hr': num_found / (count * hours)\n", + " })\n", + "success_data = pd.DataFrame(success_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "ac0c533f-f071-4e74-95d1-77fb0a9e17d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
foundfound_node-hr
nodesretrain
32False133.02.770833
True313.06.520833
64False426.54.442708
True641.06.677083
128True1622.08.447917
256True3633.09.460938
450True6554.09.709630
\n", + "
" + ], + "text/plain": [ + " found found_node-hr\n", + "nodes retrain \n", + "32 False 133.0 2.770833\n", + " True 313.0 6.520833\n", + "64 False 426.5 4.442708\n", + " True 641.0 6.677083\n", + "128 True 1622.0 8.447917\n", + "256 True 3633.0 9.460938\n", + "450 True 6554.0 9.709630" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "success_data.groupby(['nodes', 'retrain']).mean()" + ] + }, + { + "cell_type": "markdown", + "id": "a973a7cb-e161-429e-9707-4f6b6a608bd2", + "metadata": {}, + "source": [ + "TBD: Make a plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "269787d5-5319-47f7-83ce-1a807bf14583", + "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.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scripts/evaluate-generated-mofs/figures/stability-over-time-step.png b/scripts/evaluate-generated-mofs/figures/stability-over-time-step.png index c4afb8e1..c3ab0d46 100644 Binary files a/scripts/evaluate-generated-mofs/figures/stability-over-time-step.png and b/scripts/evaluate-generated-mofs/figures/stability-over-time-step.png differ diff --git a/scripts/evaluate-generated-mofs/figures/stability-over-time.png b/scripts/evaluate-generated-mofs/figures/stability-over-time.png index 9339969e..81c1ef5a 100644 Binary files a/scripts/evaluate-generated-mofs/figures/stability-over-time.png and b/scripts/evaluate-generated-mofs/figures/stability-over-time.png differ diff --git a/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.pdf b/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.pdf new file mode 100644 index 00000000..8521d73c Binary files /dev/null and b/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.pdf differ diff --git a/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.png b/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.png new file mode 100644 index 00000000..6d2e0c6b Binary files /dev/null and b/scripts/evaluate-generated-mofs/figures/stable-found-per-hour.png differ diff --git a/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.pdf b/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.pdf index a56d34cc..b684127d 100644 Binary files a/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.pdf and b/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.pdf differ diff --git a/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.png b/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.png index 5c0ee7d8..890b9151 100644 Binary files a/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.png and b/scripts/evaluate-generated-mofs/figures/stable-found-per-node-hour.png differ