From 41efaae0b2dc811af7083dd3c0bbd3db596172f5 Mon Sep 17 00:00:00 2001 From: Janne Date: Wed, 7 Feb 2024 15:46:54 +0100 Subject: [PATCH] doubling efforts --- docs/notebooks/application1_copy.ipynb | 646 +++++++++++++++++++++++++ 1 file changed, 646 insertions(+) create mode 100644 docs/notebooks/application1_copy.ipynb diff --git a/docs/notebooks/application1_copy.ipynb b/docs/notebooks/application1_copy.ipynb new file mode 100644 index 0000000..609b560 --- /dev/null +++ b/docs/notebooks/application1_copy.ipynb @@ -0,0 +1,646 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import numpy as np\n", + "from torch import Tensor\n", + "import pandas as pd\n", + "\n", + "from labproject.plotting import cm2inch, place_boxplot, place_violin\n", + "\n", + "from matplotlib import rc_file\n", + "rc_file(\"../../matplotlibrc\")\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.gridspec as gridspec\n", + "\n", + "import seaborn as sns\n", + "\n", + "from labproject.metrics.MMD import *\n", + "from labproject.metrics.sliced_wasserstein import sliced_wasserstein_distance\n", + "from labproject.metrics.c2st import *" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "cxr1 = torch.load('../../data/cxr/encs_real.pt')\n", + "cxr2 = torch.load('../../data/cxr/encs_fake_pggan.pt')\n", + "cxr3 = torch.load('../../data/cxr/encs_fake_stable_diffusion.pt')\n", + "ddm1 = torch.load('../../data/ddm/real_data.pt')\n", + "ddm2 = torch.load('../../data/ddm/generated_data.pt')\n", + "ddm3 = torch.load('../../data/ddm/gaussian_data.pt')" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "class Metric:\n", + " def __init__(self, name: str, func: callable, **kwargs):\n", + " self.name = name\n", + " self.func = func\n", + " self.kwargs = kwargs\n", + "\n", + " def __call__(self, x: Tensor, y: Tensor) -> Tensor:\n", + " return self.func(x, y, **self.kwargs)\n", + " \n", + "\n", + "class DistComp:\n", + " def __init__(self, dataset1: Tensor, dataset2: Tensor, metric: Metric, \n", + " n_perms: int = 100, perm_size=1000, descr=\"\"):\n", + " self.dataset1 = dataset1\n", + " self.dataset2 = dataset2\n", + " self.metric = metric\n", + " self.n_perms = n_perms\n", + " self.perm_size = perm_size\n", + " self.descr = descr\n", + "\n", + " columns = [metric.name]\n", + " self.results_df = pd.DataFrame(np.nan, index=range(self.n_perms), columns=columns)\n", + "\n", + " def run_experiment(self):\n", + " for i in range(self.n_perms):\n", + " self.results_df.loc[i, self.metric.name] = np.random.normal()\n", + " # for i in range(self.n_perms):\n", + " # dataset2_perm = self.dataset2[torch.randperm(len(self.dataset2))[:self.perm_size]]\n", + " # dataset1_perm = self.dataset1[torch.randperm(len(self.dataset1))[:self.perm_size]]\n", + " # metric = self.metric(dataset1_perm.double, dataset2_perm.double())\n", + " # if isinstance(metric, torch.Tensor):\n", + " # metric = metric.numpy()\n", + " # else:\n", + " # self.results_df.loc[i, self.metric.name] = metric\n", + " \n", + " def reformat_df(self, data):\n", + " \"\"\"\n", + " reformat the results_df to work with seaborn plot expectations.\n", + " \"\"\"\n", + " metric = [column_name for _, row in data.iterrows() for column_name, _ in row.items()]\n", + " split_ind = [i for i, _ in data.iterrows() for _ in range(len(data.columns))]\n", + " distance = [value for _, row in data.iterrows() for _, value in row.items()]\n", + "\n", + " return pd.DataFrame({\"metric\": metric, \"distance\": distance, \"split_ind\": split_ind})\n", + " \n", + " def __repr__(self):\n", + " return f\"{self.__class__.__name__}\\nDescription:{self.descr}\"\n", + "\n", + "def tiled_ticks(x0, x1, n_major_ticks, n_minor_ticks, offset):\n", + " X = (\n", + " np.tile(\n", + " np.linspace(\n", + " x0 - offset,\n", + " x0 + offset,\n", + " n_minor_ticks,\n", + " ),\n", + " n_major_ticks,\n", + " ).reshape(n_major_ticks, n_minor_ticks)\n", + " + np.linspace(x0, x1, n_major_ticks)[:, None]\n", + " )\n", + " return X\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "datasets = [\n", + " (ddm1, ddm1),\n", + " (ddm1, ddm2),\n", + " (ddm2, ddm2),\n", + " (ddm1, ddm3),\n", + " (ddm2, ddm3),\n", + " (ddm3, ddm3),\n", + " (cxr1, cxr1),\n", + " (cxr1, cxr2),\n", + " (cxr2, cxr2),\n", + " (cxr1, cxr3),\n", + " (cxr2, cxr3),\n", + " (cxr3, cxr3),\n", + "]\n", + "\n", + "datasets_list = [\"ddm\", \"cxr\"]\n", + "comparisons_lists = {\"ddm\": [\"real vs real\", \"real vs DDM\", \"DDM vs DDM\", \"real vs Gaussian\", \"DDM vs Gaussian\", \"Gaussian vs Gaussian\"], \n", + " \"cxr\": [\"real vs real\", \"real vs PGGAN\", \"PGGAN vs PGGAN\", \"real vs Stable Diffusion\", \"PGGAN vs Stable Diffusion\", \"Stable Diffusion vs Stable Diffusion\"]}\n", + "\n", + "descr_list = ['ddm - real vs real',\n", + " 'ddm - real vs DDM',\n", + " 'ddm - DDM vs DDM',\n", + " 'ddm - real vs Gaussian',\n", + " 'ddm - DDM vs Gaussian',\n", + " 'ddm - Gaussian vs Gaussian',\n", + " 'cxr - real vs real',\n", + " 'cxr - real vs PGGAN',\n", + " 'cxr - PGGAN vs PGGAN',\n", + " 'cxr - real vs Stable Diffusion',\n", + " 'cxr - PGGAN vs Stable Diffusion',\n", + " 'cxr - Stable Diffusion vs Stable Diffusion']\n", + "\n", + "datasets_dict = {desc: dataset for desc, dataset in zip(descr_list, datasets)}\n", + "\n", + "metrics = [\n", + " Metric('SW', \n", + " sliced_wasserstein_distance),\n", + " Metric('MMD', \n", + " mmd_rbf),\n", + " Metric('C2ST', \n", + " c2st_nn,\n", + " ),\n", + "]\n", + "\n", + "n_metrics = len(metrics)\n", + "n_modalities = len(datasets_list)\n", + "\n", + "# assuming same number of comparisons per dataset\n", + "n_comparisons = len(datasets) // n_modalities\n", + "\n", + "experiments = np.zeros([n_metrics, n_modalities, n_comparisons], dtype=object)\n", + "\n", + "for i, metric in enumerate(metrics):\n", + " for j, dataset_id in enumerate(dataset_list):\n", + " for k, comparison in enumerate(comparisons_lists[dataset_id]):\n", + " # print(i, j, k, metric, dataset_id, comparison)\n", + " descr = f\"{dataset_id} - {comparison}\"\n", + " dataset = datasets_dict[descr]\n", + " experiments[i, j, k] = DistComp(dataset[0], dataset[1], metric, n_perms=10, perm_size=100, descr=descr)\n", + " experiments[i, j, k].run_experiment()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_palette(hex_color, n_colors=5, saturation=\"light\"):\n", + " if saturation == \"light\":\n", + " palette = sns.light_palette(hex_color, n_colors=n_colors, as_cmap=False)\n", + " elif saturation == \"dark\":\n", + " palette = sns.dark_palette(hex_color, n_colors=n_colors, as_cmap=False)\n", + " return palette\n", + "\n", + "color_dict = {\"SW\": \"#cc241d\", \"MMD\": \"#eebd35\", \"C2ST\": \"#458588\", \"FID\": \"#8ec07c\"}" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "X = tiled_ticks(0, 1, n_major_ticks=2, n_minor_ticks=6, offset=0.15)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[DistComp\n", + " Description:ddm - real vs real, DistComp\n", + " Description:ddm - real vs DDM,\n", + " DistComp\n", + " Description:ddm - DDM vs DDM,\n", + " DistComp\n", + " Description:ddm - real vs Gaussian,\n", + " DistComp\n", + " Description:ddm - DDM vs Gaussian,\n", + " DistComp\n", + " Description:ddm - Gaussian vs Gaussian],\n", + " [DistComp\n", + " Description:cxr - real vs real,\n", + " DistComp\n", + " Description:cxr - real vs PGGAN,\n", + " DistComp\n", + " Description:cxr - PGGAN vs PGGAN,\n", + " DistComp\n", + " Description:cxr - real vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - PGGAN vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - Stable Diffusion vs Stable Diffusion]],\n", + "\n", + " [[DistComp\n", + " Description:ddm - real vs real, DistComp\n", + " Description:ddm - real vs DDM,\n", + " DistComp\n", + " Description:ddm - DDM vs DDM,\n", + " DistComp\n", + " Description:ddm - real vs Gaussian,\n", + " DistComp\n", + " Description:ddm - DDM vs Gaussian,\n", + " DistComp\n", + " Description:ddm - Gaussian vs Gaussian],\n", + " [DistComp\n", + " Description:cxr - real vs real,\n", + " DistComp\n", + " Description:cxr - real vs PGGAN,\n", + " DistComp\n", + " Description:cxr - PGGAN vs PGGAN,\n", + " DistComp\n", + " Description:cxr - real vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - PGGAN vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - Stable Diffusion vs Stable Diffusion]],\n", + "\n", + " [[DistComp\n", + " Description:ddm - real vs real, DistComp\n", + " Description:ddm - real vs DDM,\n", + " DistComp\n", + " Description:ddm - DDM vs DDM,\n", + " DistComp\n", + " Description:ddm - real vs Gaussian,\n", + " DistComp\n", + " Description:ddm - DDM vs Gaussian,\n", + " DistComp\n", + " Description:ddm - Gaussian vs Gaussian],\n", + " [DistComp\n", + " Description:cxr - real vs real,\n", + " DistComp\n", + " Description:cxr - real vs PGGAN,\n", + " DistComp\n", + " Description:cxr - PGGAN vs PGGAN,\n", + " DistComp\n", + " Description:cxr - real vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - PGGAN vs Stable Diffusion,\n", + " DistComp\n", + " Description:cxr - Stable Diffusion vs Stable Diffusion]]],\n", + " dtype=object)" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "experiments" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n" + ] + }, + { + "data": { + "image/png": "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x62urm7Omr/97W8WiURsbGzMZmZmrKWlxX75y18uum8hyWTSJJkkSyaTfscGkEXZyg0zsgPIRyEzs3SLzuTkpGKxmP75z3+qsLBQZqZIJKJTp04pFoul1v3P//yPhoaGdPjwYUnS//7v/+q///u/derUqQX3fZbneamvk8mkysrKJEkTExMqKiry39QAZMytt96qUCi06Lqgc0MiO4BclW5uLKbQz+LR0VFFIhEVFl4/LBQKKRqNKpFIzAqhRCKh1atXp76vqKhQIpFYdN9nhcPheS8vLS31MzaAJZBMJtMqAkHnhkR2ALkq3dxYDCfsAvhcPv3sBgCkI1O54euZl1WrVmlsbEzT09Opp38TiYSi0eisddFoVENDQ6nvR0ZGUmsW2vdZyWQy9fWVK1cUiUQkSePj4zd8ZJVrPM9LPdpz5SlrZg6G6zPfeuutaR0TdG5I7meH678bzLx0XJ853dxYlN+TZL71rW/NOvHurrvumrNmaGhozsl1L7744qL7FuLqSXcuzs3MwfhPmjlbufFFZs4mZg4GMwdjKWb2/bJRZ2enOjs7VVVVpYMHD6q7u1uS1NbWpr6+PklSZWWlOjo61NjYqFgsphUrVqi9vX3RfQDyE7kBIJN8vdsomzzPSz3dm6kTfoLg4tzMHAxmDgYzB4OZg8HM1zlTXgAAACTebQQAABxDeQEAAE6hvAAAAKdQXgAAgFNysrxk4hNog5bOzG+88YY2bdqk9evXq7q6Wvv379fMzEwWpv1Euv/WkmRm2rx5s7785S8HN+A80p35T3/6k+655x6tW7dO69atU29vb8CTfiKdmWdmZrRv3z6tX79eX/va19TU1KTBwcEsTCs98cQTqqioUCgU0rlz5264LpfugxLZERRyIxiu5YYUYHZk5K/FZNgX/QTabEhn5rNnz9rQ0JCZmV29etUaGxtTx2RLOnN/7NChQ9bW1mbFxcXBDHcD6czseZ595Stfsf7+fjMzm56etsnJySDHnCWdmX/729/apk2b7N///reZmT3//PP28MMPBzlmyptvvmmjo6O2evVqe/fdd+ddk2v3QTOyIyjkRjBcyw2z4LIj58rLxMSELV++3KampszMbGZmxkpLS21gYGDWup/97GfW3t6e+v7111+3xsbGQGf9WLozf9bjjz9uzz33XAATzs/P3O+995594xvfsMHBwayG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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(3, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metric: SW\n", + " Experiment: ddm - real vs real\n" + ] + }, + { + "ename": "KeyError", + "evalue": "'real vs real'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[21], line 45\u001b[0m\n\u001b[1;32m 42\u001b[0m X \u001b[38;5;241m=\u001b[39m X_order[dataset_key[j]] \u001b[38;5;241m+\u001b[39m spacer\n\u001b[1;32m 43\u001b[0m spacer \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m X_space\n\u001b[1;32m 44\u001b[0m place_violin(ax, X, Y, width\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.3\u001b[39m, median_color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m, median_bar_length\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, median_lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, scatter_radius\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m5\u001b[39m, scatter_face_color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m\"\u001b[39m, whisker_color\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mk\u001b[39m\u001b[38;5;124m'\u001b[39m, whisker_lw\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m,\n\u001b[0;32m---> 45\u001b[0m violin_face_color\u001b[38;5;241m=\u001b[39m\u001b[43mcondition_body_color\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcondition_key\u001b[49m\u001b[43m[\u001b[49m\u001b[43mj\u001b[49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m, violin_edge_color\u001b[38;5;241m=\u001b[39mcondition_edge_color[condition_key[j]])\n\u001b[1;32m 50\u001b[0m \u001b[38;5;66;03m# subplot-level parameters\u001b[39;00m\n\u001b[1;32m 51\u001b[0m ax\u001b[38;5;241m.\u001b[39mset_ylabel(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmetric_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mdistance\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mKeyError\u001b[0m: 'real vs real'" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n", + "findfont: Generic family 'serif' not found because none of the following families were found: Arial, sans-serif\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X_space = 0.5\n", + "X_order = {\"ddm\": 0, \"cxr\": .75}\n", + "\n", + "shade = {}\n", + "\n", + "experiments_reshaped = np.array(experiments).reshape([len(metrics),len(descr_list)])\n", + "\n", + "fig, axes = plt.subplots(len(metrics), 1, figsize=cm2inch((10, 15)), sharex=\"col\")\n", + "\n", + "\n", + "for ax in axes.flatten():\n", + " # move spines outward\n", + " ax.spines['bottom'].set_position(('outward', 4))\n", + " ax.spines['left'].set_position(('outward', 4))\n", + " ax.locator_params(nbins=3)\n", + "\n", + "for i, ax in enumerate(axes): \n", + " \n", + " metric_name = metrics[i].name\n", + " metric_experiments = experiments_reshaped[i]\n", + " \n", + " print(f\"Metric: {metric_name}\")\n", + "\n", + " # divide by dataset \n", + " dataset_key = [e.descr.split(\"-\")[0][:-1] for e in metric_experiments]\n", + " condition_key = [e.descr.split(\"-\")[1][1:] for e in metric_experiments]\n", + " \n", + " body_colors = generate_palette(color_dict[metric_name], n_colors=len(metric_experiments))[2:]\n", + " condition_body_color = {condition: color for condition, color in zip(np.unique(condition_key), body_colors)}\n", + " \n", + " edge_colors = generate_palette(color_dict[metric_name], n_colors=len(metric_experiments), saturation=\"dark\")[:3]\n", + " condition_edge_color = {condition: color for condition, color in zip(np.unique(condition_key), edge_colors)}\n", + " \n", + " spacer = 0\n", + "\n", + " for j, exp in enumerate(metric_experiments):\n", + " exp_details = exp.descr\n", + " print(f\" Experiment: {exp_details}\")\n", + " \n", + " Y = exp.results_df.to_numpy().flatten() \n", + " X = X_order[dataset_key[j]] + spacer\n", + " spacer += X_space\n", + " place_violin(ax, X, Y, width=0.3, median_color='k', median_bar_length=1, median_lw=1, scatter_radius=5, scatter_face_color=\"none\", whisker_color='k', whisker_lw=1,\n", + " violin_face_color=condition_body_color[condition_key[j]], violin_edge_color=condition_edge_color[condition_key[j]])\n", + "\n", + " \n", + "\n", + "\n", + " # subplot-level parameters\n", + " ax.set_ylabel(f\"{metric_name}\\ndistance\")\n", + "\n", + " ax.set_xticks()\n", + " ax.set_xticklabels([0, 1], X_order.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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.18" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}