{ "cells": [ { "cell_type": "markdown", "id": "116bcc5c", "metadata": {}, "source": [ "# Benchmarking\n", "\n", "In this section, we benchmark `GaugeFixer`'s computational performance for gauge-fixing computation in comparison with direct multiplication with the dense projection matrix.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "23db982a", "metadata": {}, "outputs": [], "source": [ "import tracemalloc\n", "from time import time\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from itertools import product\n", "from matplotlib.ticker import LogLocator, NullFormatter\n", "from gaugefixer import AllOrderModel, PairwiseModel" ] }, { "cell_type": "markdown", "id": "ab3054d0", "metadata": {}, "source": [ "### Model configurations\n", "\n", "For simplicity, we will evaluate the performance on all-order and pairwise interaction models defined over protein sequences of different lengths. " ] }, { "cell_type": "code", "execution_count": 2, "id": "1ef8bc62", "metadata": {}, "outputs": [], "source": [ "results = []\n", "n_points = 12\n", "alphabet_name = \"protein\"\n", "models = [AllOrderModel, PairwiseModel]\n", "seq_lengths = [np.arange(2, 6), np.geomspace(3, 150, n_points).astype(int)]" ] }, { "cell_type": "markdown", "id": "f036b5a7", "metadata": {}, "source": [ "### Evaluate running time and memory usage" ] }, { "cell_type": "code", "execution_count": 3, "id": "7badb1fc", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "model", "rawType": "object", "type": "string" }, { "name": "n_features", "rawType": "int64", "type": "integer" }, { "name": "alphabet_name", "rawType": "object", "type": "string" }, { "name": "time", "rawType": "float64", "type": "float" }, { "name": "current_memory", "rawType": "float64", "type": "float" }, { "name": "peak_memory", "rawType": "float64", "type": "float" }, { "name": "dense_matrix", "rawType": "bool", "type": "boolean" } ], "ref": "3e036c7e-d1e2-43ad-8d6c-b17a009e960f", "rows": [ [ "0", "AllOrderModel", "441", "protein", "0.0016045570373535156", "0.010924", "0.048751", "False" ], [ "1", "AllOrderModel", "441", "protein", "0.0011653900146484375", "0.009152", "0.047243", "False" ], [ "2", "AllOrderModel", "441", "protein", "0.0010368824005126953", "0.009824", "0.047979", "False" ], [ "3", "AllOrderModel", "441", "protein", "0.0010228157043457031", "0.00928", "0.047371", "False" ], [ "4", "AllOrderModel", "441", "protein", "0.0016942024230957031", "0.009121", "0.047276", "False" ], [ "5", "AllOrderModel", "441", "protein", "0.0009927749633789062", "0.009088", "0.047243", "False" ], [ "6", "AllOrderModel", "441", "protein", "0.0009667873382568359", "0.009088", "0.047243", "False" ], [ "7", "AllOrderModel", "441", "protein", "0.0008757114410400391", "0.009088", "0.047243", "False" ], [ "8", "AllOrderModel", "441", "protein", "0.0009107589721679688", "0.009088", "0.047243", "False" ], [ "9", "AllOrderModel", "441", "protein", "0.001306772232055664", "0.009459", "0.047614", "False" ], [ "10", "AllOrderModel", "441", "protein", "0.003393411636352539", "0.012876", "3.209792", "True" ], [ "11", "AllOrderModel", "441", "protein", "0.00487828254699707", "0.0129", "3.209816", "True" ], [ "12", "AllOrderModel", "441", "protein", "0.003950595855712891", "0.0129", "3.209816", "True" ], [ "13", "AllOrderModel", "441", "protein", "0.005503177642822266", "0.0129", "3.209816", "True" ], [ "14", "AllOrderModel", "441", "protein", "0.00510716438293457", "0.0129", "3.209816", "True" ], [ "15", "AllOrderModel", "441", "protein", "0.007420539855957031", "0.012964", "3.209816", "True" ], [ "16", "AllOrderModel", "441", "protein", "0.005437374114990234", "0.012964", "3.209816", "True" ], [ "17", "AllOrderModel", "441", "protein", "0.005404949188232422", "0.012964", "3.209816", "True" ], [ "18", "AllOrderModel", "441", "protein", "0.00561070442199707", "0.012964", "3.209816", "True" ], [ "19", "AllOrderModel", "441", "protein", "0.005711555480957031", "0.012964", "3.209816", "True" ], [ "20", "AllOrderModel", "9261", "protein", "0.0030248165130615234", "0.15028", "0.774419", "False" ], [ "21", "AllOrderModel", "9261", "protein", "0.0030622482299804688", "0.150304", "0.774443", "False" ], [ "22", "AllOrderModel", "9261", "protein", "0.003171205520629883", "0.150368", "0.774443", "False" ], [ "23", "AllOrderModel", "9261", "protein", "0.002008199691772461", "0.150368", "0.774443", "False" ], [ "24", "AllOrderModel", "9261", "protein", "0.001842498779296875", "0.150368", "0.774443", "False" ], [ "25", "AllOrderModel", "9261", "protein", "0.0019376277923583984", "0.150368", "0.774443", "False" ], [ "26", "AllOrderModel", "9261", "protein", "0.0020265579223632812", "0.150368", "0.774443", "False" ], [ "27", "AllOrderModel", "9261", "protein", "0.0026235580444335938", "0.150368", "0.774443", "False" ], [ "28", "AllOrderModel", "9261", "protein", "0.002708911895751953", "0.150368", "0.774443", "False" ], [ "29", "AllOrderModel", "9261", "protein", "0.0018563270568847656", "0.150368", "0.774443", "False" ], [ "30", "AllOrderModel", "9261", "protein", "1.5646154880523682", "0.154044", "1374.057512", "True" ], [ "31", "AllOrderModel", "9261", "protein", "1.593005895614624", "0.154132", "1374.057536", "True" ], [ "32", "AllOrderModel", "9261", "protein", "1.5537986755371094", "0.155528", "1374.059192", "True" ], [ "33", "AllOrderModel", "9261", "protein", "1.4868297576904297", "0.154132", "1374.057536", "True" ], [ "34", "AllOrderModel", "9261", "protein", "1.392214059829712", "0.154132", "1374.057536", "True" ], [ "35", "AllOrderModel", "9261", "protein", "1.6476714611053467", "0.155404", "1374.057888", "True" ], [ "36", "AllOrderModel", "9261", "protein", "1.5982186794281006", "0.154428", "1374.057832", "True" ], [ "37", "AllOrderModel", "9261", "protein", "1.3910224437713623", "0.154132", "1374.057536", "True" ], [ "38", "AllOrderModel", "9261", "protein", "1.3454842567443848", "0.154577", "1374.057981", "True" ], [ "39", "AllOrderModel", "9261", "protein", "1.4789447784423828", "0.154744", "1374.058376", "True" ], [ "40", "AllOrderModel", "194481", "protein", "0.0207822322845459", "3.114688", "15.967235", "False" ], [ "41", "AllOrderModel", "194481", "protein", "0.021856069564819336", "3.114712", "15.967259", "False" ], [ "42", "AllOrderModel", "194481", "protein", "0.019771337509155273", "3.115118", "15.967601", "False" ], [ "43", "AllOrderModel", "194481", "protein", "0.028174400329589844", "3.114776", "15.967259", "False" ], [ "44", "AllOrderModel", "194481", "protein", "0.025847196578979492", "3.114776", "15.967259", "False" ], [ "45", "AllOrderModel", "194481", "protein", "0.023633241653442383", "3.114885", "15.967368", "False" ], [ "46", "AllOrderModel", "194481", "protein", "0.0224611759185791", "3.114776", "15.967259", "False" ], [ "47", "AllOrderModel", "194481", "protein", "0.023927927017211914", "3.114776", "15.967259", "False" ], [ "48", "AllOrderModel", "194481", "protein", "0.022050857543945312", "3.114272", "15.966755", "False" ], [ "49", "AllOrderModel", "194481", "protein", "0.02091503143310547", "3.113936", "15.966419", "False" ] ], "shape": { "columns": 7, "rows": 210 } }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modeln_featuresalphabet_nametimecurrent_memorypeak_memorydense_matrix
0AllOrderModel441protein0.0016050.0109240.048751False
1AllOrderModel441protein0.0011650.0091520.047243False
2AllOrderModel441protein0.0010370.0098240.047979False
3AllOrderModel441protein0.0010230.0092800.047371False
4AllOrderModel441protein0.0016940.0091210.047276False
........................
205PairwiseModel4473001protein5.17906971.571140295.822343False
206PairwiseModel4473001protein4.99905771.570496295.821699False
207PairwiseModel4473001protein5.33272171.571140295.822343False
208PairwiseModel4473001protein4.82577571.570496295.821699False
209PairwiseModel4473001protein5.12709771.571140295.822343False
\n", "

210 rows × 7 columns

\n", "
" ], "text/plain": [ " model n_features alphabet_name time current_memory \\\n", "0 AllOrderModel 441 protein 0.001605 0.010924 \n", "1 AllOrderModel 441 protein 0.001165 0.009152 \n", "2 AllOrderModel 441 protein 0.001037 0.009824 \n", "3 AllOrderModel 441 protein 0.001023 0.009280 \n", "4 AllOrderModel 441 protein 0.001694 0.009121 \n", ".. ... ... ... ... ... \n", "205 PairwiseModel 4473001 protein 5.179069 71.571140 \n", "206 PairwiseModel 4473001 protein 4.999057 71.570496 \n", "207 PairwiseModel 4473001 protein 5.332721 71.571140 \n", "208 PairwiseModel 4473001 protein 4.825775 71.570496 \n", "209 PairwiseModel 4473001 protein 5.127097 71.571140 \n", "\n", " peak_memory dense_matrix \n", "0 0.048751 False \n", "1 0.047243 False \n", "2 0.047979 False \n", "3 0.047371 False \n", "4 0.047276 False \n", ".. ... ... \n", "205 295.822343 False \n", "206 295.821699 False \n", "207 295.822343 False \n", "208 295.821699 False \n", "209 295.822343 False \n", "\n", "[210 rows x 7 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for model, Ls in zip(models, seq_lengths):\n", " for L in Ls:\n", " m = model(alphabet_name=alphabet_name, L=L)\n", " m.set_random_params()\n", " \n", " for use_dense_matrix in [False, True]:\n", " if use_dense_matrix and m.n_features > 10000:\n", " continue\n", "\n", " for i in range(11):\n", " tracemalloc.start()\n", " current1, peak1 = tracemalloc.get_traced_memory()\n", " t0 = time()\n", " theta_fixed = m.get_fixed_params(\n", " gauge=\"zero-sum\", use_dense_matrix=use_dense_matrix\n", " )\n", " t1 = time() - t0\n", " current2, peak2 = tracemalloc.get_traced_memory()\n", " tracemalloc.stop()\n", "\n", " # Skip the first run (warm-up)\n", " if i == 0:\n", " continue\n", "\n", " results.append(\n", " {\n", " \"model\": model.__name__,\n", " \"n_features\": m.n_features,\n", " \"alphabet_name\": alphabet_name,\n", " \"time\": t1,\n", " \"current_memory\": (current2 - current1) / 1e6,\n", " \"peak_memory\": (peak2 - peak1) / 1e6,\n", " \"dense_matrix\": use_dense_matrix,\n", " }\n", " )\n", "results = pd.DataFrame(results)\n", "results" ] }, { "cell_type": "markdown", "id": "686f45e8", "metadata": {}, "source": [ "### Visualize computational performance" ] }, { "cell_type": "code", "execution_count": 4, "id": "67ba4291", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "model", "rawType": "object", "type": "string" }, { "name": "n_features", "rawType": "int64", "type": "integer" }, { "name": "alphabet_name", "rawType": "object", "type": "string" }, { "name": "time", "rawType": "float64", "type": "float" }, { "name": "current_memory", "rawType": "float64", "type": "float" }, { "name": "peak_memory", "rawType": "float64", "type": "float" }, { "name": "dense_matrix", "rawType": "bool", "type": "boolean" }, { "name": "label", "rawType": "object", "type": "string" } ], "ref": "039673f7-d265-454f-af66-abbcd7f91415", "rows": [ [ "0", "AllOrderModel", "441", "protein", "0.0016045570373535156", "0.010924", "0.048751", "False", "all-order (GaugeFixer)" ], [ "1", "AllOrderModel", "441", "protein", "0.0011653900146484375", "0.009152", "0.047243", "False", "all-order (GaugeFixer)" ], [ "2", "AllOrderModel", "441", "protein", "0.0010368824005126953", "0.009824", "0.047979", "False", "all-order (GaugeFixer)" ], [ "3", "AllOrderModel", "441", "protein", "0.0010228157043457031", "0.00928", "0.047371", "False", "all-order (GaugeFixer)" ], [ "4", "AllOrderModel", "441", "protein", "0.0016942024230957031", "0.009121", "0.047276", "False", "all-order (GaugeFixer)" ], [ "5", "AllOrderModel", "441", "protein", "0.0009927749633789062", "0.009088", "0.047243", "False", "all-order (GaugeFixer)" ], [ "6", "AllOrderModel", "441", "protein", "0.0009667873382568359", "0.009088", "0.047243", "False", "all-order (GaugeFixer)" ], [ "7", "AllOrderModel", "441", "protein", "0.0008757114410400391", "0.009088", "0.047243", "False", "all-order (GaugeFixer)" ], [ "8", "AllOrderModel", "441", "protein", "0.0009107589721679688", "0.009088", "0.047243", "False", "all-order (GaugeFixer)" ], [ "9", "AllOrderModel", "441", "protein", "0.001306772232055664", "0.009459", "0.047614", "False", "all-order (GaugeFixer)" ], [ "10", "AllOrderModel", "441", "protein", "0.003393411636352539", "0.012876", "3.209792", "True", "all-order (standard)" ], [ "11", "AllOrderModel", "441", "protein", "0.00487828254699707", "0.0129", "3.209816", "True", "all-order (standard)" ], [ "12", "AllOrderModel", "441", "protein", "0.003950595855712891", "0.0129", "3.209816", "True", "all-order (standard)" ], [ "13", "AllOrderModel", "441", "protein", "0.005503177642822266", "0.0129", "3.209816", "True", "all-order (standard)" ], [ "14", "AllOrderModel", "441", "protein", "0.00510716438293457", "0.0129", "3.209816", "True", "all-order (standard)" ], [ "15", "AllOrderModel", "441", "protein", "0.007420539855957031", "0.012964", "3.209816", "True", "all-order (standard)" ], [ "16", "AllOrderModel", "441", "protein", "0.005437374114990234", "0.012964", "3.209816", "True", "all-order (standard)" ], [ "17", "AllOrderModel", "441", "protein", "0.005404949188232422", "0.012964", "3.209816", "True", "all-order (standard)" ], [ "18", "AllOrderModel", "441", "protein", "0.00561070442199707", "0.012964", "3.209816", "True", "all-order (standard)" ], [ "19", "AllOrderModel", "441", "protein", "0.005711555480957031", "0.012964", "3.209816", "True", "all-order (standard)" ], [ "20", "AllOrderModel", "9261", "protein", "0.0030248165130615234", "0.15028", "0.774419", "False", "all-order (GaugeFixer)" ], [ "21", "AllOrderModel", "9261", "protein", "0.0030622482299804688", "0.150304", "0.774443", "False", "all-order (GaugeFixer)" ], [ "22", "AllOrderModel", "9261", "protein", "0.003171205520629883", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "23", "AllOrderModel", "9261", "protein", "0.002008199691772461", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "24", "AllOrderModel", "9261", "protein", "0.001842498779296875", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "25", "AllOrderModel", "9261", "protein", "0.0019376277923583984", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "26", "AllOrderModel", "9261", "protein", "0.0020265579223632812", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "27", "AllOrderModel", "9261", "protein", "0.0026235580444335938", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "28", "AllOrderModel", "9261", "protein", "0.002708911895751953", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "29", "AllOrderModel", "9261", "protein", "0.0018563270568847656", "0.150368", "0.774443", "False", "all-order (GaugeFixer)" ], [ "30", "AllOrderModel", "9261", "protein", "1.5646154880523682", "0.154044", "1374.057512", "True", "all-order (standard)" ], [ "31", "AllOrderModel", "9261", "protein", "1.593005895614624", "0.154132", "1374.057536", "True", "all-order (standard)" ], [ "32", "AllOrderModel", "9261", "protein", "1.5537986755371094", "0.155528", "1374.059192", "True", "all-order (standard)" ], [ "33", "AllOrderModel", "9261", "protein", "1.4868297576904297", "0.154132", "1374.057536", "True", "all-order (standard)" ], [ "34", "AllOrderModel", "9261", "protein", "1.392214059829712", "0.154132", "1374.057536", "True", "all-order (standard)" ], [ "35", "AllOrderModel", "9261", "protein", "1.6476714611053467", "0.155404", "1374.057888", "True", "all-order (standard)" ], [ "36", "AllOrderModel", "9261", "protein", "1.5982186794281006", "0.154428", "1374.057832", "True", "all-order (standard)" ], [ "37", "AllOrderModel", "9261", "protein", "1.3910224437713623", "0.154132", "1374.057536", "True", "all-order (standard)" ], [ "38", "AllOrderModel", "9261", "protein", "1.3454842567443848", "0.154577", "1374.057981", "True", "all-order (standard)" ], [ "39", "AllOrderModel", "9261", "protein", "1.4789447784423828", "0.154744", "1374.058376", "True", "all-order (standard)" ], [ "40", "AllOrderModel", "194481", "protein", "0.0207822322845459", "3.114688", "15.967235", "False", "all-order (GaugeFixer)" ], [ "41", "AllOrderModel", "194481", "protein", "0.021856069564819336", "3.114712", "15.967259", "False", "all-order (GaugeFixer)" ], [ "42", "AllOrderModel", "194481", "protein", "0.019771337509155273", "3.115118", "15.967601", "False", "all-order (GaugeFixer)" ], [ "43", "AllOrderModel", "194481", "protein", "0.028174400329589844", "3.114776", "15.967259", "False", "all-order (GaugeFixer)" ], [ "44", "AllOrderModel", "194481", "protein", "0.025847196578979492", "3.114776", "15.967259", "False", "all-order (GaugeFixer)" ], [ "45", "AllOrderModel", "194481", "protein", "0.023633241653442383", "3.114885", "15.967368", "False", "all-order (GaugeFixer)" ], [ "46", "AllOrderModel", "194481", "protein", "0.0224611759185791", "3.114776", "15.967259", "False", "all-order (GaugeFixer)" ], [ "47", "AllOrderModel", "194481", "protein", "0.023927927017211914", "3.114776", "15.967259", "False", "all-order (GaugeFixer)" ], [ "48", "AllOrderModel", "194481", "protein", "0.022050857543945312", "3.114272", "15.966755", "False", "all-order (GaugeFixer)" ], [ "49", "AllOrderModel", "194481", "protein", "0.02091503143310547", "3.113936", "15.966419", "False", "all-order (GaugeFixer)" ] ], "shape": { "columns": 8, "rows": 210 } }, "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", " \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", "
modeln_featuresalphabet_nametimecurrent_memorypeak_memorydense_matrixlabel
0AllOrderModel441protein0.0016050.0109240.048751Falseall-order (GaugeFixer)
1AllOrderModel441protein0.0011650.0091520.047243Falseall-order (GaugeFixer)
2AllOrderModel441protein0.0010370.0098240.047979Falseall-order (GaugeFixer)
3AllOrderModel441protein0.0010230.0092800.047371Falseall-order (GaugeFixer)
4AllOrderModel441protein0.0016940.0091210.047276Falseall-order (GaugeFixer)
...........................
205PairwiseModel4473001protein5.17906971.571140295.822343Falsepairwise (GaugeFixer)
206PairwiseModel4473001protein4.99905771.570496295.821699Falsepairwise (GaugeFixer)
207PairwiseModel4473001protein5.33272171.571140295.822343Falsepairwise (GaugeFixer)
208PairwiseModel4473001protein4.82577571.570496295.821699Falsepairwise (GaugeFixer)
209PairwiseModel4473001protein5.12709771.571140295.822343Falsepairwise (GaugeFixer)
\n", "

210 rows × 8 columns

\n", "
" ], "text/plain": [ " model n_features alphabet_name time current_memory \\\n", "0 AllOrderModel 441 protein 0.001605 0.010924 \n", "1 AllOrderModel 441 protein 0.001165 0.009152 \n", "2 AllOrderModel 441 protein 0.001037 0.009824 \n", "3 AllOrderModel 441 protein 0.001023 0.009280 \n", "4 AllOrderModel 441 protein 0.001694 0.009121 \n", ".. ... ... ... ... ... \n", "205 PairwiseModel 4473001 protein 5.179069 71.571140 \n", "206 PairwiseModel 4473001 protein 4.999057 71.570496 \n", "207 PairwiseModel 4473001 protein 5.332721 71.571140 \n", "208 PairwiseModel 4473001 protein 4.825775 71.570496 \n", "209 PairwiseModel 4473001 protein 5.127097 71.571140 \n", "\n", " peak_memory dense_matrix label \n", "0 0.048751 False all-order (GaugeFixer) \n", "1 0.047243 False all-order (GaugeFixer) \n", "2 0.047979 False all-order (GaugeFixer) \n", "3 0.047371 False all-order (GaugeFixer) \n", "4 0.047276 False all-order (GaugeFixer) \n", ".. ... ... ... \n", "205 295.822343 False pairwise (GaugeFixer) \n", "206 295.821699 False pairwise (GaugeFixer) \n", "207 295.822343 False pairwise (GaugeFixer) \n", "208 295.821699 False pairwise (GaugeFixer) \n", "209 295.822343 False pairwise (GaugeFixer) \n", "\n", "[210 rows x 8 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "colors = [\"C0\", \"C0\", \"C1\", \"C1\"]\n", "models = [\"AllOrderModel\", \"PairwiseModel\"]\n", "model_labels = [\"all-order\", \"pairwise\"]\n", "model_dict = dict(zip(models, model_labels))\n", "\n", "dense = [True, False]\n", "dense_labels = [\"standard\", \"GaugeFixer\"]\n", "dense_dict = dict(zip(dense, dense_labels))\n", "\n", "labels = [\n", " f\"{model} ({dense})\" for model, dense in product(model_labels, dense_labels)\n", "]\n", "palette = dict(zip(labels, colors))\n", "labels_dict = dict(zip(models, labels))\n", "results[\"label\"] = [\n", " f\"{model_dict[m]} ({dense_dict[d]})\"\n", " for m, d in zip(results[\"model\"], results[\"dense_matrix\"])\n", "]\n", "results" ] }, { "cell_type": "code", "execution_count": 5, "id": "8ee57219", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "variables = {\n", " \"time\": \"runtime (s)\",\n", " \"peak_memory\": \"memory (MB)\",\n", "}\n", "\n", "lw = 1\n", "kwargs = {\n", " \"palette\": palette,\n", " \"errorbar\": \"sd\",\n", " \"err_style\": \"bars\",\n", " \"err_kws\": {\"capsize\": lw, \"elinewidth\": lw, \"capthick\": lw},\n", " \"lw\": lw\n", "}\n", "\n", "fig, subplots = plt.subplots(\n", " 1,\n", " 2,\n", " figsize=(7, 3.25),\n", " sharex=True,\n", " sharey=False,\n", ")\n", "\n", "for i, (axes, (y, ylabel)) in enumerate(zip(subplots, variables.items())):\n", " for (dense, data), linestyle in zip(results.groupby('dense_matrix'), ['--', 'solid']):\n", " sns.lineplot(\n", " x=\"n_features\",\n", " y=y,\n", " hue=\"label\",\n", " data=data,\n", " ax=axes,\n", " linestyle=linestyle,\n", " **kwargs,\n", " )\n", "\n", " if i == 0:\n", " yticks=(1E-5,1E-4,1E-3,1E-2,1E-1,1E0,1E1)\n", " ylim=(3E-6, 3E1)\n", " else:\n", " yticks=(1E-3,1E-2,1E-1,1E0,1E1,1E2,1E3)\n", " ylim=(3E-4, 3E3)\n", " \n", " axes.set(\n", " xlabel=\"num parameters\",\n", " ylabel=ylabel,\n", " xscale=\"log\",\n", " yscale=\"log\",\n", " xlim=(90, 2e7),\n", " ylim=ylim,\n", " xticks=(1E2,1E3,1E4,1E5,1E6,1E7),\n", " yticks=yticks,\n", " ymargin=0.2,\n", " )\n", "\n", " # Set log-scale minor tickmarks\n", " axes.xaxis.set_minor_locator(LogLocator(base=10.0, subs=np.arange(2, 10)*0.1, numticks=100))\n", " axes.xaxis.set_minor_formatter(NullFormatter())\n", " axes.legend_.set_visible(False)\n", " axes.legend(loc=4)\n", "\n", "fig.tight_layout(pad=0.2, w_pad=1)" ] } ], "metadata": { "kernelspec": { "display_name": "gauge", "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.16" } }, "nbformat": 4, "nbformat_minor": 5 }