{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:45:16.594788Z",
     "iopub.status.busy": "2025-09-09T00:45:16.594648Z",
     "iopub.status.idle": "2025-09-09T00:45:16.607320Z",
     "shell.execute_reply": "2025-09-09T00:45:16.606904Z",
     "shell.execute_reply.started": "2025-09-09T00:45:16.594769Z"
    }
   },
   "outputs": [],
   "source": [
    "# setup autoload\n",
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:21.040680Z",
     "start_time": "2024-05-16T13:58:19.777010Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:45:16.607887Z",
     "iopub.status.busy": "2025-09-09T00:45:16.607755Z",
     "iopub.status.idle": "2025-09-09T00:45:19.093469Z",
     "shell.execute_reply": "2025-09-09T00:45:19.092867Z",
     "shell.execute_reply.started": "2025-09-09T00:45:16.607874Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The autoreload extension is already loaded. To reload it, use:\n",
      "  %reload_ext autoreload\n"
     ]
    }
   ],
   "source": [
    "import ast\n",
    "import os\n",
    "import shutil\n",
    "import sys\n",
    "from collections import defaultdict\n",
    "\n",
    "import json\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from preference_data_preparation_auk import *\n",
    "from preference_helper import *\n",
    "from sklearn.model_selection import train_test_split\n",
    "from suno_utils.utils.s3 import download_s3_files\n",
    "from suno_utils.utils.text import read_json, read_jsonl, write_json, write_jsonl\n",
    "from tqdm import tqdm\n",
    "\n",
    "pd.set_option(\"display.max_rows\", 500)\n",
    "pd.set_option(\"display.max_columns\", 500)\n",
    "pd.set_option(\"display.width\", 1000)\n",
    "\n",
    "# setup autoload\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "\n",
    "def custom_parse(x):\n",
    "    try:\n",
    "        return json.loads(x)\n",
    "    except:\n",
    "        return {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:21.082172Z",
     "start_time": "2024-05-16T13:58:21.041926Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:45:19.094227Z",
     "iopub.status.busy": "2025-09-09T00:45:19.094022Z",
     "iopub.status.idle": "2025-09-09T00:45:19.153416Z",
     "shell.execute_reply": "2025-09-09T00:45:19.152931Z",
     "shell.execute_reply.started": "2025-09-09T00:45:19.094211Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N_TOKENS_AUDIO 13500\n"
     ]
    }
   ],
   "source": [
    "OUT_DATA_DIR = \"/app2/suno/data/dpo/bluejay_t1_v52\"\n",
    "os.makedirs(OUT_DATA_DIR, exist_ok=True)\n",
    "shutil.copyfile(\n",
    "    \"/app/suno/data/dpo/7v_v20_full/tokenizer_60k.json\",\n",
    "    os.path.join(OUT_DATA_DIR, \"tokenizer_60k.json\"),\n",
    ")\n",
    "NPZ_DIR = \"/app2/suno/data/dpo/bluejay_t1_npz\"\n",
    "N_TOKENS_AUDIO = 25 * 9 * 60\n",
    "print(\"N_TOKENS_AUDIO\", N_TOKENS_AUDIO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:45:19.154038Z",
     "iopub.status.busy": "2025-09-09T00:45:19.153900Z",
     "iopub.status.idle": "2025-09-09T00:47:51.440295Z",
     "shell.execute_reply": "2025-09-09T00:47:51.439696Z",
     "shell.execute_reply.started": "2025-09-09T00:45:19.154024Z"
    }
   },
   "outputs": [],
   "source": [
    "df = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/bluejay_t1/interesting_clips_bluejay_t1_20250901.pkl\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:47:51.441054Z",
     "iopub.status.busy": "2025-09-09T00:47:51.440905Z",
     "iopub.status.idle": "2025-09-09T00:48:08.362680Z",
     "shell.execute_reply": "2025-09-09T00:48:08.362072Z",
     "shell.execute_reply.started": "2025-09-09T00:47:51.441039Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after dropna (7907070, 86)\n"
     ]
    }
   ],
   "source": [
    "df = df.dropna(axis=1, how=\"all\")\n",
    "print(\"after dropna\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.199480Z",
     "start_time": "2024-05-16T13:58:53.963687Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:48:08.363441Z",
     "iopub.status.busy": "2025-09-09T00:48:08.363284Z",
     "iopub.status.idle": "2025-09-09T00:56:54.703738Z",
     "shell.execute_reply": "2025-09-09T00:56:54.702933Z",
     "shell.execute_reply.started": "2025-09-09T00:48:08.363427Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10734855\n",
      "10734855\n",
      "pre-downloaded df (7907070, 86)\n",
      "downloaded df (7907068, 86)\n"
     ]
    }
   ],
   "source": [
    "converted_paths = os.listdir(NPZ_DIR)\n",
    "print(len(converted_paths))\n",
    "\n",
    "converted_paths = set([f.replace(\".npz\", \"\") for f in converted_paths])\n",
    "print(len(converted_paths))\n",
    "\n",
    "print(\"pre-downloaded df\", df.shape)\n",
    "df[df[\"s3_id\"].isin(converted_paths)].shape\n",
    "df = df[df[\"s3_id\"].isin(converted_paths)].copy()\n",
    "print(\"downloaded df\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.467253Z",
     "start_time": "2024-05-16T13:58:56.207647Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:56:54.704705Z",
     "iopub.status.busy": "2025-09-09T00:56:54.704525Z",
     "iopub.status.idle": "2025-09-09T00:56:55.085657Z",
     "shell.execute_reply": "2025-09-09T00:56:55.085021Z",
     "shell.execute_reply.started": "2025-09-09T00:56:54.704688Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "task\n",
       "                      4826206\n",
       "cover                 1810930\n",
       "artist_consistency     565402\n",
       "artist_cover           291024\n",
       "extend                 131258\n",
       "playlist_condition     116600\n",
       "upload_extend           76514\n",
       "overpainting            28238\n",
       "infill                  27326\n",
       "artist_extend           21872\n",
       "underpainting           11698\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"task\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LET's do the data prep"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.592883Z",
     "start_time": "2024-05-16T13:58:56.470781Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:56:55.086540Z",
     "iopub.status.busy": "2025-09-09T00:56:55.086367Z",
     "iopub.status.idle": "2025-09-09T00:56:59.960739Z",
     "shell.execute_reply": "2025-09-09T00:56:59.959985Z",
     "shell.execute_reply.started": "2025-09-09T00:56:55.086524Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "preference  model_name      \n",
      "False       chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251919\n",
      "True        chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251921\n",
      "Name: count, dtype: int64\n",
      "before filter on model name (7907068, 86)\n",
      "after filter on model name (7907068, 86)\n",
      "is_public\n",
      "False    7463925\n",
      "True      443143\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "## for 13b this is easy for now\n",
    "print(df.groupby([\"preference\"])[\"model_name\"].value_counts())\n",
    "print(\"before filter on model name\", df.shape)\n",
    "df = df[df[\"model_name\"].isin([\"chirp-bluejay-t1\", \"chirp-bluejay-t2\"])]\n",
    "# df = df[df[\"model_name\"].isin([\"chirp-v3p5-engine-t-6\"])]\n",
    "print(\"after filter on model name\", df.shape)\n",
    "print(df[\"is_public\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.909539Z",
     "start_time": "2024-05-16T13:58:56.595736Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T00:56:59.961643Z",
     "iopub.status.busy": "2025-09-09T00:56:59.961475Z",
     "iopub.status.idle": "2025-09-09T00:57:20.764978Z",
     "shell.execute_reply": "2025-09-09T00:57:20.764234Z",
     "shell.execute_reply.started": "2025-09-09T00:56:59.961627Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "before filter on request id pairs (7907068, 86)\n",
      "after filter on request id pairs (7907066, 86)\n",
      "preference  model_name      \n",
      "False       chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251919\n",
      "True        chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251919\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(\"before filter on request id pairs\", df.shape)\n",
    "df = df[\n",
    "    df[\"request_id\"].isin(\n",
    "        df[\"request_id\"].value_counts().index[df[\"request_id\"].value_counts() == 2]\n",
    "    )\n",
    "]\n",
    "print(\"after filter on request id pairs\", df.shape)\n",
    "print(df.groupby([\"preference\"])[\"model_name\"].value_counts())\n",
    "assert df.shape[0] == df[\"request_id\"].nunique() * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:57:20.765931Z",
     "iopub.status.busy": "2025-09-09T00:57:20.765760Z",
     "iopub.status.idle": "2025-09-09T01:23:51.420788Z",
     "shell.execute_reply": "2025-09-09T01:23:51.419786Z",
     "shell.execute_reply.started": "2025-09-09T00:57:20.765915Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique_requests 3953533\n",
      "before removing duplicates (7907066, 196)\n",
      "after removing duplicates (7907066, 189)\n"
     ]
    }
   ],
   "source": [
    "# Let's use the old selection for now -- for quality assurance\n",
    "# expand the metadata columns -- this takes forever...~ 6 mins\n",
    "# test_slice = df[\"metadata\"].apply(lambda x: ast.literal_eval(str(x)))\n",
    "# test_slice = df[\"metadata\"].apply(lambda x: custom_parse(x))\n",
    "test_slice = df[\"metadata\"]  # .apply(lambda x: custom_parse(x))\n",
    "test_slice_series = test_slice.apply(pd.Series)\n",
    "df = pd.concat([df, test_slice_series], axis=1, join=\"inner\")\n",
    "print(\"unique_requests\", df[\"request_id\"].nunique())\n",
    "# remove the duplicates\n",
    "print(\"before removing duplicates\", df.shape)\n",
    "df = df.loc[:, ~df.columns.duplicated()].copy()\n",
    "print(\"after removing duplicates\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:23:51.421751Z",
     "iopub.status.busy": "2025-09-09T01:23:51.421579Z",
     "iopub.status.idle": "2025-09-09T01:24:26.646019Z",
     "shell.execute_reply": "2025-09-09T01:24:26.645345Z",
     "shell.execute_reply.started": "2025-09-09T01:23:51.421733Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pos_diff_preference\n",
       "1.0    2654294\n",
       "2.0    1299239\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = df.sort_values(by=[\"request_id\", \"preference\", \"diff_preference\"])\n",
    "df[\"pos_diff_preference\"] = df[\"diff_preference\"].diff()\n",
    "# df[\"cer_diff_preference\"] = df[\"cer\"].diff()\n",
    "df[df[\"preference\"]][\"pos_diff_preference\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:24:26.647362Z",
     "iopub.status.busy": "2025-09-09T01:24:26.646769Z",
     "iopub.status.idle": "2025-09-09T01:24:35.569153Z",
     "shell.execute_reply": "2025-09-09T01:24:35.568374Z",
     "shell.execute_reply.started": "2025-09-09T01:24:26.647343Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive param_experiment\n",
      "mask_control_slider    181709\n",
      "cfg_steps_240           64169\n",
      "n_tag_3                 63337\n",
      "cfg_steps_60            63288\n",
      "n_tag_1                 63075\n",
      "temp_s_80               62956\n",
      "temp_s_95               62840\n",
      "temp_s_85               62376\n",
      "cfg_steps_10            62093\n",
      "tag_cfg_05              59821\n",
      "tag_cfg_20              58763\n",
      "tag_cfg_1                2939\n",
      "tag_cfg_15               2835\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    print(\"positive\", df[df[\"preference\"]][\"param_experiment\"].value_counts())\n",
    "except:\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:24:35.570107Z",
     "iopub.status.busy": "2025-09-09T01:24:35.569928Z",
     "iopub.status.idle": "2025-09-09T01:24:35.588461Z",
     "shell.execute_reply": "2025-09-09T01:24:35.587851Z",
     "shell.execute_reply.started": "2025-09-09T01:24:35.570090Z"
    }
   },
   "outputs": [],
   "source": [
    "# cfg_step_subset_requests = df[df[\"param_experiment\"].isin([\"cfg_steps_240\", \"cfg_steps_60\", \"cfg_steps_10\"])][\"request_id\"].unique()\n",
    "# print(len(cfg_step_subset_requests))\n",
    "# df = df[df[\"request_id\"].isin(cfg_step_subset_requests)].copy()\n",
    "# print(df.shape)\n",
    "# longer_cfg_pos_mask = (df[\"preference\"]) & (df[\"param_experiment\"] == \"cfg_steps_240\")\n",
    "# longer_cfg_pos_mask_gen = (df[\"preference\"]) & ((df[\"task\"] != \"\") & (df[\"param_experiment\"] == \"cfg_steps_60\"))\n",
    "# shoter_cfg_neg_mask = (~df[\"preference\"]) & ((df[\"param_experiment\"] == \"cfg_steps_10\"))\n",
    "# shoter_cfg_neg_mask_gen = (~df[\"preference\"]) & ((df[\"task\"] == \"\") & (df[\"param_experiment\"] == \"cfg_steps_60\"))\n",
    "# print(sum(longer_cfg_pos_mask), sum(longer_cfg_pos_mask_gen), sum(shoter_cfg_neg_mask), sum(shoter_cfg_neg_mask_gen))\n",
    "# cfg_step_adhere_subset_requests = df[longer_cfg_pos_mask | longer_cfg_pos_mask_gen | shoter_cfg_neg_mask | shoter_cfg_neg_mask_gen][\"request_id\"].unique()\n",
    "# print(len(cfg_step_adhere_subset_requests))\n",
    "# df = df[df[\"request_id\"].isin(cfg_step_adhere_subset_requests)].copy()\n",
    "# print(df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:24:35.589330Z",
     "iopub.status.busy": "2025-09-09T01:24:35.589163Z",
     "iopub.status.idle": "2025-09-09T01:26:39.936924Z",
     "shell.execute_reply": "2025-09-09T01:26:39.936160Z",
     "shell.execute_reply.started": "2025-09-09T01:24:35.589314Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 519388 duplicated prompts 259694 unique requests\n",
      "Found 139301 request_ids with duplicate prompts but not highest play counts in their group\n",
      "['5da026c4-3736-4243-8a23-c3b44e079853', 'be457373-b1d7-43c8-bd01-17e07623b775', '3457d50f-d5a6-40e0-99fe-036b4068952d', '81bc7d09-a4df-4486-9b06-871094eb3637', 'e133f663-b418-4861-8c23-0e33546632a5', 'faf6c004-90cb-46c0-8a02-fb5726dd4355', '15c757b0-2ef3-48d7-ac29-adb46769ca59', '3dfd9a33-bd47-4546-aa68-ec641b613ff7', '46dba5fc-ee9a-4a96-807d-d5e426fb2384', '59e89d78-3eff-4511-aa7a-01397ad69cbc']\n",
      "Before dedup user gen requests 7907066\n",
      "After dedup user gen requests 7907066\n"
     ]
    }
   ],
   "source": [
    "# Find duplicated prompts with count > 2\n",
    "duplicate_entries = df.groupby(\n",
    "    [\"user_id\", \"prompt_text\", \"tags\", \"task\", \"edited_clip_id\"]\n",
    ").filter(lambda x: len(x) > 2)\n",
    "print(\n",
    "    \"Found\",\n",
    "    len(duplicate_entries),\n",
    "    \"duplicated prompts\",\n",
    "    len(duplicate_entries[\"request_id\"].unique()),\n",
    "    \"unique requests\",\n",
    ")\n",
    "\n",
    "# Group by user_id, prompt_text, and tags to find duplicate prompt groups\n",
    "prompt_groups = duplicate_entries.groupby(\n",
    "    [\"user_id\", \"prompt_text\", \"tags\", \"task\", \"edited_clip_id\"]\n",
    ")\n",
    "\n",
    "# For each prompt group, find the request_id with the highest total reaction_play_count\n",
    "low_play_count_request_ids = []\n",
    "for prompt_key, prompt_group in prompt_groups:\n",
    "    # Get the sum of reaction_play_count for each request_id in this group\n",
    "    request_play_counts = prompt_group.groupby(\"request_id\")[\n",
    "        \"reaction_play_count\"\n",
    "    ].sum()\n",
    "\n",
    "    # Find the max play count in this group\n",
    "    max_play_count = request_play_counts.max()\n",
    "\n",
    "    # Add request_ids that don't have the max play count to our filter list\n",
    "    lower_play_count_request_ids = request_play_counts[\n",
    "        request_play_counts < max_play_count\n",
    "    ].index.tolist()\n",
    "    low_play_count_request_ids.extend(lower_play_count_request_ids)\n",
    "\n",
    "# Display the filtered request IDs\n",
    "print(\n",
    "    f\"Found {len(low_play_count_request_ids)} request_ids with duplicate prompts but not highest play counts in their group\"\n",
    ")\n",
    "print(\n",
    "    low_play_count_request_ids[:10]\n",
    "    if len(low_play_count_request_ids) > 10\n",
    "    else low_play_count_request_ids\n",
    ")\n",
    "print(\"Before dedup user gen requests\", df.shape[0])\n",
    "# df = df[~df[\"request_id\"].isin(low_play_count_request_ids)]\n",
    "print(\"After dedup user gen requests\", df.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:40.799375Z",
     "start_time": "2024-05-16T13:59:36.394236Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:26:39.937831Z",
     "iopub.status.busy": "2025-09-09T01:26:39.937667Z",
     "iopub.status.idle": "2025-09-09T01:27:38.144034Z",
     "shell.execute_reply": "2025-09-09T01:27:38.143261Z",
     "shell.execute_reply.started": "2025-09-09T01:26:39.937815Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101683\n",
      "good_continue_at\n",
      "True     7895689\n",
      "False      11377\n",
      "Name: count, dtype: int64\n",
      "\n",
      " Check some basics... \n",
      " preference\n",
      "False    3953533\n",
      "True     3953533\n",
      "Name: count, dtype: int64 model_name\n",
      "chirp-bluejay-t2    7403228\n",
      "chirp-bluejay-t1     503838\n",
      "Name: count, dtype: int64 preference  model_name      \n",
      "False       chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251919\n",
      "True        chirp-bluejay-t2    3701614\n",
      "            chirp-bluejay-t1     251919\n",
      "Name: count, dtype: int64\n",
      "task\n",
      "                      4826204\n",
      "cover                 1810930\n",
      "artist_consistency     565402\n",
      "artist_cover           291024\n",
      "extend                 131258\n",
      "playlist_condition     116600\n",
      "upload_extend           76514\n",
      "overpainting            28238\n",
      "infill                  27326\n",
      "artist_extend           21872\n",
      "underpainting           11698\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df[\"id\"] = df[\"str_id\"]\n",
    "# get the original duration of the clips, if they are concacted\n",
    "df[\"original_duration_s\"] = df[\"total_start_s\"] + df[\"duration\"]\n",
    "# classify the continue at behavoirs by the duration choice\n",
    "audio_prompt_id_to_continue_at = {}\n",
    "\n",
    "for _, row in df[~df[\"continued_parent\"].isna()].iterrows():\n",
    "    audio_prompt_id = row[\"continued_parent\"]\n",
    "    if audio_prompt_id not in audio_prompt_id_to_continue_at:\n",
    "        audio_prompt_id_to_continue_at[audio_prompt_id] = row[\"continue_at\"]\n",
    "    else:\n",
    "        # pick the max\n",
    "        audio_prompt_id = max(\n",
    "            audio_prompt_id_to_continue_at[audio_prompt_id], row[\"continue_at\"]\n",
    "        )\n",
    "print(len(audio_prompt_id_to_continue_at))\n",
    "df[\"has_continue_and_start_continue_at\"] = df[\"id\"].apply(\n",
    "    lambda x: audio_prompt_id_to_continue_at.get(x)\n",
    ")\n",
    "# we want continue at to be at most of the clip...\n",
    "df[\"good_continue_at\"] = (\n",
    "    (df[\"has_continue_and_start_continue_at\"] / df[\"duration\"]) > 0.9\n",
    ") | df[\"has_continue_and_start_continue_at\"].isna()\n",
    "print(df[\"good_continue_at\"].value_counts())\n",
    "\n",
    "\n",
    "print(\n",
    "    \"\\n Check some basics... \\n\",\n",
    "    df[\"preference\"].value_counts(),\n",
    "    df[\"model_name\"].value_counts(),\n",
    "    df.groupby([\"preference\"])[\"model_name\"].value_counts(),\n",
    ")\n",
    "\n",
    "df = df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "df[\"duration_rel_diff\"] = df[\"duration\"].diff()\n",
    "df[\"play_rel_diff\"] = df[\"reaction_play_count\"].diff()\n",
    "print(df[\"task\"].value_counts())\n",
    "\n",
    "df[\"post_infill_duration\"] = (\n",
    "    df[\"duration\"]\n",
    "    + df[\"infill_context_end_s\"]\n",
    "    - df[\"infill_context_start_s\"]\n",
    "    - df[\"include_future_s\"]\n",
    "    - df[\"include_history_s\"]\n",
    "    - df[\"infill_dur_s\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.035167Z",
     "start_time": "2024-05-16T13:59:40.801098Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:27:38.145118Z",
     "iopub.status.busy": "2025-09-09T01:27:38.144825Z",
     "iopub.status.idle": "2025-09-09T01:28:19.835877Z",
     "shell.execute_reply": "2025-09-09T01:28:19.835081Z",
     "shell.execute_reply.started": "2025-09-09T01:27:38.145100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after duration 0.9993569043182389\n",
      "after infill duration 0.9998956629424871\n",
      "neg_filter_reaction_play_count 1.0\n",
      "neg_filter_upvote_count 0.9899\n",
      "neg_filter_norm_play_frac 1.0\n",
      "neg_filter_continues 1.0\n",
      "----------------\n",
      "pos_filter_continues 0.9971\n",
      "pos_filter_reaction_play_count 1.0\n",
      "pos_filter_relative_play_count 0.9786\n",
      "pos_filter_cer_diff_preference 1.0\n",
      "pos_filter_bad_flags 0.9998\n",
      "after filter on play counts 0.9816\n",
      "after filter on higher quality 0.3399\n",
      "----------------\n",
      "negative 3910328 positive 1247764\n",
      "----------------\n",
      "total pair requests 3953533  --> selected pair requests 1234273 frac 0.312  --> total intitial users 417983\n"
     ]
    }
   ],
   "source": [
    "normal_pos_play_count = 3\n",
    "# this is lower, cause a concat is probably already ensuring that it is good\n",
    "concat_pos_play_count = 1\n",
    "# this is a filter on the concated clip\n",
    "concat_total_play_count = 3\n",
    "\n",
    "all_fitlers = (df[\"duration\"] >= 10) & (df[\"duration\"] <= 480)\n",
    "print(\"after duration\", all_fitlers.sum() / df.shape[0])\n",
    "infill_duration_filter = ~df[\"task\"].isin(\n",
    "    [\n",
    "        \"infill\",\n",
    "        \"infill_intro\",\n",
    "        \"infill_outro\",\n",
    "    ]\n",
    ")  | (df[\"post_infill_duration\"] <= 239)\n",
    "print(\"after infill duration\", infill_duration_filter.sum() / df.shape[0])\n",
    "# negative fitlers\n",
    "total_negative = df[~df[\"preference\"]].shape[0]\n",
    "neg_filter_reaction_play_count = (~df[\"preference\"]) & (df[\"reaction_play_count\"] >= 1)\n",
    "print(\n",
    "    \"neg_filter_reaction_play_count\",\n",
    "    round(neg_filter_reaction_play_count.sum() / total_negative, 4),\n",
    ")\n",
    "neg_filter_upvote_count = (~df[\"preference\"]) & (df[\"upvote_count\"] == 0)\n",
    "print(\n",
    "    \"neg_filter_upvote_count\",\n",
    "    round(neg_filter_upvote_count.sum() / total_negative, 4),\n",
    ")\n",
    "neg_filter_norm_play_frac = (~df[\"preference\"]) & (df[\"norm_play_frac\"] <= 3.1)\n",
    "print(\n",
    "    \"neg_filter_norm_play_frac\",\n",
    "    round(neg_filter_norm_play_frac.sum() / total_negative, 4),\n",
    ")\n",
    "neg_filter_continues = (~df[\"preference\"]) & (\n",
    "    df[\"has_continue_and_start_continue_at\"].isna()\n",
    ")\n",
    "print(\n",
    "    \"neg_filter_continues\",\n",
    "    round(neg_filter_continues.sum() / total_negative, 4),\n",
    ")\n",
    "\n",
    "neg_filter_selection_mask = (\n",
    "    all_fitlers\n",
    "    & infill_duration_filter\n",
    "    & neg_filter_reaction_play_count\n",
    "    & neg_filter_upvote_count\n",
    "    & neg_filter_norm_play_frac\n",
    "    & neg_filter_continues\n",
    ")\n",
    "\n",
    "print(\"----------------\")\n",
    "total_positive = df[df[\"preference\"]].shape[0]\n",
    "assert total_positive == total_negative\n",
    "pos_filter_continues = (df[\"preference\"]) & (df[\"good_continue_at\"])\n",
    "print(\"pos_filter_continues\", round(pos_filter_continues.sum() / total_positive, 4))\n",
    "pos_filter_reaction_play_count = (df[\"preference\"]) & (df[\"reaction_play_count\"] >= 1)\n",
    "print(\n",
    "    \"pos_filter_reaction_play_count\",\n",
    "    round(pos_filter_reaction_play_count.sum() / total_positive, 4),\n",
    ")\n",
    "pos_filter_relative_play_count = (df[\"preference\"]) & (df[\"play_rel_diff\"] >= 0)\n",
    "print(\n",
    "    \"pos_filter_relative_play_count\",\n",
    "    round(pos_filter_relative_play_count.sum() / total_positive, 4),\n",
    ")\n",
    "pos_filter_cer_diff_preference = (\n",
    "    df[\n",
    "        \"preference\"\n",
    "    ]  # & (df[\"pos_diff_preference\"] == 2) # & (df[\"cer_diff_preference\"] < 0.5) & (df[\"cer\"] < 0.99)\n",
    ")\n",
    "print(\n",
    "    \"pos_filter_cer_diff_preference\",\n",
    "    round(pos_filter_cer_diff_preference.sum() / total_positive, 4),\n",
    ")\n",
    "pos_filter_bad_flags = (\n",
    "    (df[\"preference\"]) & (df[\"flag_count\"] == 0) & (df[\"dislike_count\"] == 0)\n",
    ")\n",
    "print(\n",
    "    \"pos_filter_bad_flags\",\n",
    "    round(pos_filter_bad_flags.sum() / total_positive, 4),\n",
    ")\n",
    "pos_filter_play_counts = (df[\"preference\"]) & (\n",
    "    (\n",
    "        (df[\"part_of_concat\"])\n",
    "        & (df[\"reaction_play_count\"] >= concat_pos_play_count)\n",
    "        & (df[\"concat_play_counts\"] >= concat_total_play_count)\n",
    "    )\n",
    "    | (\n",
    "        (~df[\"part_of_concat\"]) & (df[\"reaction_play_count\"] >= normal_pos_play_count)\n",
    "        # & (df[\"norm_play_frac\"] >= 2.1)  # this is a bit of a luxury cut...\n",
    "    )\n",
    "    | (df[\"task\"].isin([\"infill\", \"infill_intro\", \"infill_outro\"]))\n",
    ")\n",
    "print(\n",
    "    \"after filter on play counts\",\n",
    "    round(pos_filter_play_counts.sum() / total_positive, 4),\n",
    ")\n",
    "high_quality_tasks_filter = (\n",
    "    (\n",
    "        df[\"task\"].isin(\n",
    "            [\n",
    "                \"cover\",\n",
    "                \"upload_extend\",\n",
    "                \"cover_extend\",\n",
    "                \"artist_cover\",\n",
    "                \"extend\",\n",
    "                \"artist_consistency\",\n",
    "                \"artist_extend\",\n",
    "                \"playlist_condition\",\n",
    "                \"\",\n",
    "            ]\n",
    "        )\n",
    "    )\n",
    "    & (\n",
    "        (df[\"upvote_count\"] >= 1)  # (df[\"upvote_count\"] >= 1)\n",
    "        | (df[\"reaction_play_count\"] >= 5)\n",
    "        | (df[\"concat_play_counts\"] >= 5)\n",
    "    )\n",
    "    & (\n",
    "        (df[\"part_of_concat\"])\n",
    "        | (\n",
    "            (~df[\"part_of_concat\"])\n",
    "            & (df[\"norm_play_frac\"] >= 5.1)  # this is a bit of a luxury cut...\n",
    "            & (\n",
    "                df[\"norm_play_frac\"] >= df[\"reaction_play_count\"] / 3\n",
    "            )  # play duration is not low on average\n",
    "        )\n",
    "    )\n",
    ")\n",
    "medium_quality_tasks_filter = (\n",
    "    df[\"task\"].isin(\n",
    "        [\n",
    "            \"infill\",\n",
    "            \"infill_intro\",\n",
    "            \"infill_outro\",\n",
    "            \"overpainting\",\n",
    "            \"underpainting\",\n",
    "        ]\n",
    "    )\n",
    ") & (  # let more infill through only in this case...\n",
    "    (\n",
    "        df[\"upvote_count\"] >= 1\n",
    "    )  # (df[\"upvote_count\"] >= 1)  (df[\"pos_diff_preference\"] == 2)\n",
    "    | (df[\"reaction_play_count\"] >= 1)\n",
    "    | (df[\"concat_play_counts\"] >= 1)\n",
    ")\n",
    "pos_filter_higher_quality = (df[\"preference\"]) & (\n",
    "    high_quality_tasks_filter | medium_quality_tasks_filter\n",
    ")\n",
    "print(\n",
    "    \"after filter on higher quality\",\n",
    "    round(pos_filter_higher_quality.sum() / total_positive, 4),\n",
    ")\n",
    "\n",
    "user_gen_filter = (\n",
    "    df[\"user_n_clips\"] >= 20\n",
    ")  # user needs to have genereated at least 100 over the time period\n",
    "\n",
    "print(\"----------------\")\n",
    "pos_filter_selectin_mask = (\n",
    "    (df[\"preference\"])  # get basics aligned\n",
    "    & all_fitlers\n",
    "    & infill_duration_filter\n",
    "    & pos_filter_continues\n",
    "    & pos_filter_reaction_play_count\n",
    "    & pos_filter_relative_play_count\n",
    "    & pos_filter_cer_diff_preference\n",
    "    & pos_filter_bad_flags\n",
    "    & pos_filter_play_counts\n",
    "    & pos_filter_higher_quality\n",
    "    & user_gen_filter\n",
    ")\n",
    "print(\n",
    "    \"negative\",\n",
    "    sum(neg_filter_selection_mask),\n",
    "    \"positive\",\n",
    "    sum(pos_filter_selectin_mask),\n",
    ")\n",
    "\n",
    "neg_filter_requests = df[neg_filter_selection_mask][\"request_id\"].unique()\n",
    "pos_filter_requests = df[pos_filter_selectin_mask][\"request_id\"].unique()\n",
    "# looking for very strong signal here:\n",
    "# listen to the positive/negative more than once\n",
    "# disliked one of the clips\n",
    "unique_requests = set(pos_filter_requests).intersection(neg_filter_requests)\n",
    "print(\"----------------\")\n",
    "print(\n",
    "    \"total pair requests\",\n",
    "    df[\"request_id\"].nunique(),\n",
    "    \" --> selected pair requests\",\n",
    "    len(unique_requests),\n",
    "    f\"frac {len(unique_requests) / df['request_id'].nunique():.3f}\",\n",
    "    \" --> total intitial users\",\n",
    "    df[\"user_id\"].nunique(),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.250737Z",
     "start_time": "2024-05-16T13:59:41.036434Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:28:19.836852Z",
     "iopub.status.busy": "2025-09-09T01:28:19.836677Z",
     "iopub.status.idle": "2025-09-09T01:28:36.684403Z",
     "shell.execute_reply": "2025-09-09T01:28:36.683661Z",
     "shell.execute_reply.started": "2025-09-09T01:28:19.836834Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "task\n",
      "                      1541374\n",
      "cover                  469760\n",
      "artist_consistency     181802\n",
      "artist_cover            82652\n",
      "extend                  65534\n",
      "playlist_condition      36448\n",
      "overpainting            26160\n",
      "infill                  23698\n",
      "upload_extend           18640\n",
      "artist_extend           11612\n",
      "underpainting           10866\n",
      "Name: count, dtype: int64\n",
      "bluejay_t1_v52 requests 1234273 clips 2468546 total khrs 140.767; N gpus for 1000 iters 154.284; 4 gpus for x iters 38571.031; n unique users 246967 n pro users 226020\n"
     ]
    }
   ],
   "source": [
    "df_slice = df[df[\"request_id\"].isin(set(unique_requests))].copy()\n",
    "print(df_slice[\"task\"].value_counts())\n",
    "print(\n",
    "    f\"{os.path.basename(OUT_DATA_DIR)} requests\",\n",
    "    df_slice[\"request_id\"].nunique(),\n",
    "    \"clips\",\n",
    "    df_slice.shape[0],\n",
    "    f\"total khrs {sum(df_slice['duration'] / 3600 / 1000):.3f};\",\n",
    "    f\"N gpus for 1000 iters {df_slice.shape[0] / 8 / 2 / 1000:.3f};\",\n",
    "    f\"4 gpus for x iters {df_slice.shape[0] / 8 / 2 / 4:.3f};\",\n",
    "    f\"n unique users {df_slice['user_id'].nunique()}\",\n",
    "    f\"n pro users {df_slice[df_slice['is_pro_user']]['user_id'].nunique()}\",\n",
    ")\n",
    "# auk_mix_t1_v2 requests 102002 clips 204004 total khrs 9.191; N gpus for 1000 iters 12.750; 4 gpus for x iters 3187.562; n unique users 36408 n pro users 34038\n",
    "# auk_t1_v1 requests 9179 clips 18358 total khrs 0.854; N gpus for 1000 iters 1.147; 4 gpus for x iters 286.844; n unique users 6288 n pro users 6275\n",
    "# auk_t1_v2 requests 40903 clips 81806 total khrs 3.864; N gpus for 1000 iters 5.113; 4 gpus for x iters 1278.219; n unique users 21079 n pro users 20966\n",
    "# auk_t1_v3 requests 102015 clips 204030 total khrs 9.703; N gpus for 1000 iters 12.752; 4 gpus for x iters 3187.969; n unique users 42837 n pro users 42462\n",
    "# auk_t1_v4 requests 211452 clips 422904 total khrs 20.216; N gpus for 1000 iters 26.431; 4 gpus for x iters 6607.875; n unique users 71182 n pro users 70059\n",
    "# auk_t1_v9 requests 547743 clips 1095486 total khrs 56.567; N gpus for 1000 iters 68.468; 4 gpus for x iters 17116.969; n unique users 129354 n pro users 125126\n",
    "# auk_t1_v13 requests 627646 clips 1255292 total khrs 64.530; N gpus for 1000 iters 78.456; 4 gpus for x iters 19613.938; n unique users 139873 n pro users 134738\n",
    "# auk_t1_v17 requests 494902 clips 989804 total khrs 51.445; N gpus for 1000 iters 61.863; 4 gpus for x iters 15465.688; n unique users 114240 n pro users 109708\n",
    "# auk_t1_v19 requests 740881 clips 1481762 total khrs 76.133; N gpus for 1000 iters 92.610; 4 gpus for x iters 23152.531; n unique users 154570 n pro users 147261\n",
    "# auk_t1_v24 requests 717745 clips 1435490 total khrs 74.515; N gpus for 1000 iters 89.718; 4 gpus for x iters 22429.531; n unique users 139344 n pro users 130740\n",
    "# auk_t1_v29 requests 1097586 clips 2195172 total khrs 112.614; N gpus for 1000 iters 137.198; 4 gpus for x iters 34299.562; n unique users 193138 n pro users 179429\n",
    "# auk_t1_v30 requests 1224422 clips 2448844 total khrs 125.330; N gpus for 1000 iters 153.053; 4 gpus for x iters 38263.188; n unique users 203138 n pro users 186758\n",
    "# auk_t1_v31 requests 389265 clips 778530 total khrs 40.761; N gpus for 1000 iters 48.658; 4 gpus for x iters 12164.531; n unique users 85198 n pro users 78445\n",
    "# auk_t1_v33 requests 1285261 clips 2570522 total khrs 131.585; N gpus for 1000 iters 160.658; 4 gpus for x iters 40164.406; n unique users 208932 n pro users 191380\n",
    "# auk_t1_v33 requests 1086639 clips 2173278 total khrs 110.641; N gpus for 1000 iters 135.830; 4 gpus for x iters 33957.469; n unique users 197293 n pro users 180968 -- play dur from /3 to /2\n",
    "# auk_t1_v33 requests 806877 clips 1613754 total khrs 81.964; N gpus for 1000 iters 100.860; 4 gpus for x iters 25214.906; n unique users 156679 n pro users 144253 -- filter to web\n",
    "# auk_t1_v37 requests 1339132 clips 2678264 total khrs 137.055; N gpus for 1000 iters 167.392; 4 gpus for x iters 41847.875; n unique users 214313 n pro users 196815\n",
    "# auk_t1_v38 requests 979451 clips 1958902 total khrs 102.038; N gpus for 1000 iters 122.431; 4 gpus for x iters 30607.844; n unique users 170773 n pro users 156737\n",
    "# auk_t1_v43 requests 184775 clips 369550 total khrs 19.089; N gpus for 1000 iters 23.097; 4 gpus for x iters 5774.219; n unique users 60652 n pro users 59126\n",
    "# auk_t1_v45 requests 1176216 clips 2352432 total khrs 122.102; N gpus for 1000 iters 147.027; 4 gpus for x iters 36756.750; n unique users 176751 n pro users 163097\n",
    "# auk_t1_v48 requests 294407 clips 588814 total khrs 29.992; N gpus for 1000 iters 36.801; 4 gpus for x iters 9200.219; n unique users 80991 n pro users 78825\n",
    "# bluejay_t1_v1 requests 47405 clips 94810 total khrs 5.515; N gpus for 1000 iters 5.926; 4 gpus for x iters 1481.406; n unique users 24344 n pro users 24194\n",
    "# bluejay_t1_v2 requests 101265 clips 202530 total khrs 11.753; N gpus for 1000 iters 12.658; 4 gpus for x iters 3164.531; n unique users 44574 n pro users 44024\n",
    "# bluejay_t1_v3 requests 144765 clips 289530 total khrs 16.756; N gpus for 1000 iters 18.096; 4 gpus for x iters 4523.906; n unique users 58421 n pro users 57449\n",
    "# bluejay_t1_v5 requests 179289 clips 358578 total khrs 20.764; N gpus for 1000 iters 22.411; 4 gpus for x iters 5602.781; n unique users 67850 n pro users 66572\n",
    "# bluejay_t1_v7 requests 282305 clips 564610 total khrs 32.692; N gpus for 1000 iters 35.288; 4 gpus for x iters 8822.031; n unique users 93023 n pro users 90936\n",
    "# bluejay_t1_v9 requests 540570 clips 1081140 total khrs 62.455; N gpus for 1000 iters 67.571; 4 gpus for x iters 16892.812; n unique users 145720 n pro users 142027\n",
    "# bluejay_t1_v11 requests 184433 clips 368866 total khrs 20.955; N gpus for 1000 iters 23.054; 4 gpus for x iters 5763.531; n unique users 52149 n pro users 51402\n",
    "# bluejay_t1_v12 requests 293821 clips 587642 total khrs 33.820; N gpus for 1000 iters 36.728; 4 gpus for x iters 9181.906; n unique users 98138 n pro users 95838\n",
    "# bluejay_t1_v13 requests 355678 clips 711356 total khrs 40.908; N gpus for 1000 iters 44.460; 4 gpus for x iters 11114.938; n unique users 111544 n pro users 108497\n",
    "# bluejay_t1_v17 requests 415411 clips 830822 total khrs 48.043; N gpus for 1000 iters 51.926; 4 gpus for x iters 12981.594; n unique users 124572 n pro users 120683\n",
    "# bluejay_t1_v24 requests 486884 clips 973768 total khrs 56.292; N gpus for 1000 iters 60.861; 4 gpus for x iters 15215.125; n unique users 138727 n pro users 133829\n",
    "# bluejay_t1_v26 requests 336220 clips 672440 total khrs 38.800; N gpus for 1000 iters 42.028; 4 gpus for x iters 10506.875; n unique users 80832 n pro users 78854\n",
    "# bluejay_t1_v28 requests 683709 clips 1367418 total khrs 78.507; N gpus for 1000 iters 85.464; 4 gpus for x iters 21365.906; n unique users 172776 n pro users 164584\n",
    "# bluejay_t1_v28 requests 662650 clips 1325300 total khrs 76.539; N gpus for 1000 iters 82.831; 4 gpus for x iters 20707.812; n unique users 170192 n pro users 162222\n",
    "# bluejay_t1_v31 requests 855246 clips 1710492 total khrs 97.846; N gpus for 1000 iters 106.906; 4 gpus for x iters 26726.438; n unique users 198438 n pro users 186068\n",
    "# bluejay_t1_v31 requests 829339 clips 1658678 total khrs 95.430; N gpus for 1000 iters 103.667; 4 gpus for x iters 25916.844; n unique users 195575 n pro users 183523\n",
    "# bluejay_t1_v31 requests 932058 clips 1864116 total khrs 107.136; N gpus for 1000 iters 116.507; 4 gpus for x iters 29126.812; n unique users 203738 n pro users 190639\n",
    "# bluejay_t1_v41 requests 1122075 clips 2244150 total khrs 128.936; N gpus for 1000 iters 140.259; 4 gpus for x iters 35064.844; n unique users 232511 n pro users 214225\n",
    "# special CFG filtered data\n",
    "# bluejay_t1_v51 requests 68845 clips 137690 total khrs 7.659; N gpus for 1000 iters 8.606; 4 gpus for x iters 2151.406; n unique users 48849 n pro users 45297"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:28:36.685323Z",
     "iopub.status.busy": "2025-09-09T01:28:36.685158Z",
     "iopub.status.idle": "2025-09-09T01:30:33.033789Z",
     "shell.execute_reply": "2025-09-09T01:30:33.033119Z",
     "shell.execute_reply.started": "2025-09-09T01:28:36.685305Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total hoot cer scores: 3117160\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████| 130425/130425 [01:49<00:00, 1194.46it/s]\n"
     ]
    }
   ],
   "source": [
    "# Load existing hoot CER cache\n",
    "with open(\"/home/tony/Data/Preference/bluejay_t1/hoot_cer.json\", \"r\") as file:\n",
    "    clip_id_to_cer = json.load(file)\n",
    "print(\"Total hoot cer scores:\", len(clip_id_to_cer))\n",
    "\n",
    "JSON_DIR = \"/app2/suno/data/dpo/bluejay_t1_json/\"\n",
    "\n",
    "# Extract unique s3_ids from df_slice that are not already in the cache\n",
    "clip_ids = set(df_slice[\"s3_id\"]) - set(clip_id_to_cer.keys())\n",
    "\n",
    "for clip_id in tqdm(clip_ids):\n",
    "    hoot_json_path = os.path.join(JSON_DIR, f\"{clip_id}_hoot.json\")\n",
    "    if not os.path.exists(hoot_json_path):\n",
    "        clip_id_to_cer[clip_id] = 1.0\n",
    "        continue\n",
    "    with open(hoot_json_path, \"r\") as f:\n",
    "        data = json.load(f)\n",
    "    for data_dict in data:\n",
    "        if \"hoot_cer\" in data_dict:\n",
    "            clip_id_to_cer[clip_id] = data_dict[\"hoot_cer\"]\n",
    "            break\n",
    "\n",
    "# Update the hoot CER cache\n",
    "with open(\"/home/tony/Data/Preference/bluejay_t1/hoot_cer.json\", \"w\") as file:\n",
    "    json.dump(clip_id_to_cer, file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:33.034637Z",
     "iopub.status.busy": "2025-09-09T01:30:33.034474Z",
     "iopub.status.idle": "2025-09-09T01:31:03.857314Z",
     "shell.execute_reply": "2025-09-09T01:31:03.856676Z",
     "shell.execute_reply.started": "2025-09-09T01:30:33.034620Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count    1.234273e+06\n",
      "mean    -3.401354e-03\n",
      "std      1.210013e-01\n",
      "min     -1.000000e+00\n",
      "10%     -8.643016e-02\n",
      "50%      0.000000e+00\n",
      "90%      7.424242e-02\n",
      "95%      1.452660e-01\n",
      "96%      1.715753e-01\n",
      "97%      2.090635e-01\n",
      "98%      2.735754e-01\n",
      "99%      4.079015e-01\n",
      "max      1.000000e+00\n",
      "Name: cer_diff, dtype: float64\n",
      "bluejay_t1_v52 requests 1212996 clips 2425992 total khrs 138.816; N gpus for 1000 iters 151.625; 4 gpus for x iters 37906.125; n unique users 245031 n pro users 224356\n"
     ]
    }
   ],
   "source": [
    "# # add the cer to the df\n",
    "df_slice[\"cer\"] = df_slice[\"s3_id\"].map(clip_id_to_cer)\n",
    "df_slice = df_slice.fillna({\"cer\": 1})\n",
    "df_slice[\"cer_diff\"] = df_slice[\"cer\"].diff()\n",
    "df_slice = df_slice.fillna({\"cer_diff\": 0})\n",
    "print(df_slice[df_slice[\"preference\"]][\"cer_diff\"].describe(percentiles=[0.1, 0.5, 0.9, 0.95, 0.96, 0.97, 0.98, 0.99]))\n",
    "\n",
    "# just trimming off tail is fine and safe. Used to be 0.2. Multiple rounds now so probably 0.3 is still fine.\n",
    "cer_mask = (df_slice[\"preference\"]) & (df_slice[\"cer_diff\"] < 0.3)\n",
    "pos_cer_filter_requests = df_slice[cer_mask][\"request_id\"].unique()\n",
    "df_slice = df_slice[df_slice[\"request_id\"].isin(set(pos_cer_filter_requests))].copy()\n",
    "print(\n",
    "    f\"{os.path.basename(OUT_DATA_DIR)} requests\",\n",
    "    df_slice[\"request_id\"].nunique(),\n",
    "    \"clips\",\n",
    "    df_slice.shape[0],\n",
    "    f\"total khrs {sum(df_slice['duration'] / 3600 / 1000):.3f};\",\n",
    "    f\"N gpus for 1000 iters {df_slice.shape[0] / 8 / 2 / 1000:.3f};\",\n",
    "    f\"4 gpus for x iters {df_slice.shape[0] / 8 / 2 / 4:.3f};\",\n",
    "    f\"n unique users {df_slice['user_id'].nunique()}\",\n",
    "    f\"n pro users {df_slice[df_slice['is_pro_user']]['user_id'].nunique()}\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:03.858227Z",
     "iopub.status.busy": "2025-09-09T01:31:03.858069Z",
     "iopub.status.idle": "2025-09-09T01:31:04.326381Z",
     "shell.execute_reply": "2025-09-09T01:31:04.325893Z",
     "shell.execute_reply.started": "2025-09-09T01:31:03.858211Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "source\n",
       "web        1819954\n",
       "android     325466\n",
       "ios         280572\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_slice[\"source\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.277006Z",
     "start_time": "2024-05-16T13:59:41.252105Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:04.327066Z",
     "iopub.status.busy": "2025-09-09T01:31:04.326920Z",
     "iopub.status.idle": "2025-09-09T01:31:05.361471Z",
     "shell.execute_reply": "2025-09-09T01:31:05.360879Z",
     "shell.execute_reply.started": "2025-09-09T01:31:04.327051Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive in playlist (381626, 198)\n",
      "task\n",
      "                      1511526\n",
      "cover                  464250\n",
      "artist_consistency     179492\n",
      "artist_cover            81802\n",
      "extend                  64000\n",
      "playlist_condition      35944\n",
      "overpainting            25492\n",
      "infill                  23118\n",
      "upload_extend           18148\n",
      "artist_extend           11410\n",
      "underpainting           10810\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "test_mask = (df_slice[\"preference\"]) & (\n",
    "    (df_slice[\"is_in_playlist\"]) | (df_slice[\"concat_in_playlist\"])\n",
    ")\n",
    "print(\"positive in playlist\", df_slice[test_mask].shape)\n",
    "print(df_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:05.362193Z",
     "iopub.status.busy": "2025-09-09T01:31:05.362045Z",
     "iopub.status.idle": "2025-09-09T01:31:05.385967Z",
     "shell.execute_reply": "2025-09-09T01:31:05.385495Z",
     "shell.execute_reply.started": "2025-09-09T01:31:05.362177Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "is_public\n",
      "False    2208201\n",
      "True      217791\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df_slice[\"is_public\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:05.390490Z",
     "iopub.status.busy": "2025-09-09T01:31:05.390227Z",
     "iopub.status.idle": "2025-09-09T01:31:05.909340Z",
     "shell.execute_reply": "2025-09-09T01:31:05.908844Z",
     "shell.execute_reply.started": "2025-09-09T01:31:05.390474Z"
    }
   },
   "outputs": [],
   "source": [
    "df_slice[\"npz_path\"] = df_slice[\"s3_id\"].map(lambda x: f\"{NPZ_DIR}/{x}.npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:05.910002Z",
     "iopub.status.busy": "2025-09-09T01:31:05.909861Z",
     "iopub.status.idle": "2025-09-09T01:31:14.641435Z",
     "shell.execute_reply": "2025-09-09T01:31:14.640842Z",
     "shell.execute_reply.started": "2025-09-09T01:31:05.909988Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2425992, 199)\n"
     ]
    }
   ],
   "source": [
    "df_total = df_slice.copy()\n",
    "print(df_total.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SOME SNOWFLAKE LYRICS SHIT YOU DON\"T WNAT TO KNOW"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:14.642141Z",
     "iopub.status.busy": "2025-09-09T01:31:14.641996Z",
     "iopub.status.idle": "2025-09-09T01:31:18.605597Z",
     "shell.execute_reply": "2025-09-09T01:31:18.604837Z",
     "shell.execute_reply.started": "2025-09-09T01:31:14.642126Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PROD\n"
     ]
    }
   ],
   "source": [
    "home_dir = os.path.expanduser(\"~\")\n",
    "snow_password_path = os.path.join(home_dir, \".aws\", \"snow_pw.txt\")\n",
    "if os.path.exists(snow_password_path):\n",
    "    # !pip install snowflake\n",
    "    from snowflake.core import Root\n",
    "    from snowflake.snowpark import Session\n",
    "\n",
    "    with open(snow_password_path, \"r\") as fp:\n",
    "        fp_lines = fp.readlines()\n",
    "        snow_password = fp_lines[0].strip()\n",
    "        snow_username = fp_lines[1].strip()\n",
    "\n",
    "    CONNECTION_PARAMETERS = {\n",
    "        \"account\": \"fu90569.us-east-2.aws\",\n",
    "        \"user\": snow_username,\n",
    "        \"private_key_file\": \"/home/tony/.aws/rsa_key.p8\",\n",
    "        \"role\": \"ACCOUNTADMIN\",\n",
    "        \"database\": \"SUNO_PROD\",\n",
    "        \"warehouse\": \"SUNO_PROD_LARGE\",\n",
    "        \"schema\": \"PROD\",\n",
    "    }\n",
    "\n",
    "if not os.path.exists(snow_password_path):\n",
    "    raise Exception(\"you are not authorized to access snowflake -- please setup\")\n",
    "\n",
    "snow_session = Session.builder.configs(CONNECTION_PARAMETERS).create()\n",
    "\n",
    "snow_root = Root(snow_session)\n",
    "snow_schema = snow_root.databases[\"SUNO_PROD\"].schemas[\"PROD\"]\n",
    "print(snow_schema.name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:18.606538Z",
     "iopub.status.busy": "2025-09-09T01:31:18.606367Z",
     "iopub.status.idle": "2025-09-09T01:32:09.523648Z",
     "shell.execute_reply": "2025-09-09T01:32:09.523049Z",
     "shell.execute_reply.started": "2025-09-09T01:31:18.606521Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "No new clip IDs to query.\n",
      "Shape of df_snow_prompt:\n",
      "Rows: 2952956\n",
      "Columns: 2\n",
      "False    2297595\n",
      "True      128397\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "import pickle\n",
    "from tqdm import tqdm\n",
    "from typing import List\n",
    "\n",
    "PROMPT_PATH = \"/home/tony/Data/Preference/bluejay_t1/clip_prompt.pkl\"\n",
    "\n",
    "# Load existing prompts if available\n",
    "df_existing_prompts = pd.read_pickle(PROMPT_PATH)\n",
    "df_existing_prompts[\"id\"] = df_existing_prompts[\"id\"].astype(str)\n",
    "\n",
    "df_total[\"id\"] = df_total[\"id\"].astype(str)\n",
    "# Only query for new clip ids not already in the prompt cache\n",
    "existing_ids = set(df_existing_prompts[\"id\"])\n",
    "all_clip_ids = set(df_total[\"id\"].unique())\n",
    "new_clip_ids = list(all_clip_ids - existing_ids)\n",
    "\n",
    "snow_batch_size = 100_000\n",
    "snow_results: List[pd.DataFrame] = []\n",
    "\n",
    "if new_clip_ids:\n",
    "    for clip_ids_chunk in tqdm(\n",
    "        [new_clip_ids[i : i + snow_batch_size] for i in range(0, len(new_clip_ids), snow_batch_size)]\n",
    "    ):\n",
    "        id_query_str = \",\".join(\"'\" + x + \"'\" for x in clip_ids_chunk)\n",
    "        print(f\"Number of new clip IDs in this chunk: {len(clip_ids_chunk)}\")\n",
    "        print(f\"Length of the ID query string: {len(id_query_str)}\")\n",
    "\n",
    "        session_query = snow_session.sql(\n",
    "            f\"\"\"select ID, PROMPT_TEXT\n",
    "            from DDB_CLIP_META_HEAVY\n",
    "            where ID in ({id_query_str})\n",
    "            order by p_hour desc;\"\"\"\n",
    "        )\n",
    "        temp_df_snow = pd.DataFrame(session_query.collect())\n",
    "        snow_results.append(temp_df_snow)\n",
    "    print(f\"Number of new result batches: {len(snow_results)}\")\n",
    "    df_snow_new = pd.concat(snow_results, ignore_index=True)\n",
    "    df_snow_new = df_snow_new.rename(columns=lambda x: x.lower())\n",
    "    # Combine with existing prompts and drop duplicates (keep latest)\n",
    "    df_snow_prompt = pd.concat([df_existing_prompts, df_snow_new], ignore_index=True)\n",
    "    df_snow_prompt = df_snow_prompt.drop_duplicates(subset=[\"id\"], keep=\"last\")\n",
    "else:\n",
    "    print(\"No new clip IDs to query.\")\n",
    "    df_snow_prompt = df_existing_prompts\n",
    "\n",
    "# Save the updated prompt DataFrame every time\n",
    "df_snow_prompt.to_pickle(PROMPT_PATH)\n",
    "\n",
    "print(\"Shape of df_snow_prompt:\")\n",
    "print(f\"Rows: {df_snow_prompt.shape[0]}\")\n",
    "print(f\"Columns: {df_snow_prompt.shape[1]}\")\n",
    "\n",
    "df_total = df_total.rename(columns={'prompt_text': 'prompt_text_old'})\n",
    "df_total = df_total.merge(df_snow_prompt, on=\"id\", how=\"left\")\n",
    "print((df_total[\"prompt_text\"] == df_total[\"prompt_text_old\"]).value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fetch inference parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:38:50.445730Z",
     "iopub.status.busy": "2025-09-09T01:38:50.445362Z",
     "iopub.status.idle": "2025-09-09T01:39:56.064369Z",
     "shell.execute_reply": "2025-09-09T01:39:56.063796Z",
     "shell.execute_reply.started": "2025-09-09T01:38:50.445712Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "missing 0\n",
      "(2978298, 70)\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "from fetch_gen_config import query_dynamodb_by_uuids_optimized\n",
    "\n",
    "DYNAMO_PATH = \"/home/tony/Data/Preference/bluejay_t1/clip_dynamo.pkl\"\n",
    "\n",
    "# Load existing DynamoDB records if available\n",
    "if os.path.exists(DYNAMO_PATH):\n",
    "    df_dynamo = pd.read_pickle(DYNAMO_PATH)\n",
    "    existing_ids = set(df_dynamo[\"clipId\"].tolist())\n",
    "else:\n",
    "    df_dynamo = pd.DataFrame()\n",
    "    existing_ids = set()\n",
    "\n",
    "total_s3_ids = set(df_total[\"id\"].tolist())\n",
    "missing_ids = list(total_s3_ids - existing_ids)\n",
    "print(\"missing\", len(missing_ids))\n",
    "chunk_size = 10_000\n",
    "all_records = []\n",
    "\n",
    "for i in range(0, len(missing_ids), chunk_size):\n",
    "    chunk = missing_ids[i:i + chunk_size]\n",
    "    try:\n",
    "        records = query_dynamodb_by_uuids_optimized(chunk, profile_name=\"default\")\n",
    "        all_records.extend(records)\n",
    "    except Exception as e:\n",
    "        # Log and continue with next chunk\n",
    "        print(f\"Error querying DynamoDB for chunk {i // chunk_size}: {e}\")\n",
    "\n",
    "if all_records:\n",
    "    df_new = pd.DataFrame(all_records)\n",
    "    df_dynamo = pd.concat([df_dynamo, df_new], ignore_index=True)\n",
    "\n",
    "print(df_dynamo.shape)\n",
    "df_dynamo[df_dynamo[\"type\"] == \"gpt\"].to_pickle(DYNAMO_PATH)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:41:27.265622Z",
     "iopub.status.busy": "2025-09-09T01:41:27.265273Z",
     "iopub.status.idle": "2025-09-09T01:41:28.450154Z",
     "shell.execute_reply": "2025-09-09T01:41:28.449670Z",
     "shell.execute_reply.started": "2025-09-09T01:41:27.265604Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_total.to_pickle(\"/home/tony/Data/Preference/bluejay_t1/interesting_clips_bluejay_t1_20250817_subset_total.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:05.057151Z",
     "iopub.status.busy": "2025-09-09T01:42:05.056809Z",
     "iopub.status.idle": "2025-09-09T01:42:05.108293Z",
     "shell.execute_reply": "2025-09-09T01:42:05.107785Z",
     "shell.execute_reply.started": "2025-09-09T01:42:05.057133Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N_TOKENS_AUDIO 13500\n"
     ]
    }
   ],
   "source": [
    "OUT_DATA_DIR = \"/app2/suno/data/dpo/bluejay_t1_v54\"\n",
    "os.makedirs(OUT_DATA_DIR, exist_ok=True)\n",
    "shutil.copyfile(\n",
    "    \"/app/suno/data/dpo/7v_v20_full/tokenizer_60k.json\",\n",
    "    os.path.join(OUT_DATA_DIR, \"tokenizer_60k.json\"),\n",
    ")\n",
    "NPZ_DIR = \"/app2/suno/data/dpo/bluejay_t1_npz\"\n",
    "N_TOKENS_AUDIO = 25 * 9 * 60\n",
    "print(\"N_TOKENS_AUDIO\", N_TOKENS_AUDIO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:18.137355Z",
     "iopub.status.busy": "2025-09-09T01:42:18.137010Z",
     "iopub.status.idle": "2025-09-09T01:42:21.193600Z",
     "shell.execute_reply": "2025-09-09T01:42:21.192998Z",
     "shell.execute_reply.started": "2025-09-09T01:42:18.137336Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2425992, 200) (176956, 200)\n",
      "after date cut (176956, 200)\n"
     ]
    }
   ],
   "source": [
    "# # v18 # 07-22\n",
    "# # v19 # 07-26\n",
    "# # v20 # 07-29\n",
    "# # v21 # 08-01\n",
    "# # v22 # 08-04\n",
    "# # v23 # 08-09\n",
    "# # v24 07-30\n",
    "# # v28 # 07-29\n",
    "# # v29 # 08-07\n",
    "# # v30 # \n",
    "# # v32 # 07-22\n",
    "# # v33 # 07-26\n",
    "# # v34 # 07-29\n",
    "# # v35 # 08-04 342386\n",
    "# # v36 # 08-10 337956\n",
    "# # v37 # 08-16 321330\n",
    "# # v39 # 08-16 on 371610\n",
    "# # # \n",
    "# # v42 # 07-22 170036\n",
    "# # v43 # 07-26 181850\n",
    "# # v44 # 07-29 176956\n",
    "# # v45 # 08-04 360168\n",
    "# # v46 # 08-10 360288\n",
    "# # v47 # 08-16 351520\n",
    "# # v48 # 08-22 351814\n",
    "# # v49 # 08-29 366208\n",
    "# # v50 # everything else\n",
    "# # v52 # 07-22 170036\n",
    "# # v53 # 07-26 181850\n",
    "# # v54 # 07-29 176956\n",
    "# # v55 # 08-04 360168\n",
    "df_total[\"created_at\"] = pd.to_datetime(df_total[\"created_at\"], utc=True)\n",
    "start_cutoff_date = pd.to_datetime(\"2025-07-26\", utc=True)\n",
    "end_cutoff_date = pd.to_datetime(\"2025-07-29\", utc=True)\n",
    "date_mask = (df_total[\"created_at\"] < end_cutoff_date) & (df_total[\"created_at\"] >= start_cutoff_date)\n",
    "print(df_total.shape, df_total[date_mask].shape)\n",
    "df_slice = df_total[date_mask].copy()\n",
    "print(\"after date cut\", df_slice.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.554707Z",
     "iopub.status.busy": "2025-09-09T01:42:26.554360Z",
     "iopub.status.idle": "2025-09-09T01:42:26.574897Z",
     "shell.execute_reply": "2025-09-09T01:42:26.574422Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.554689Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice = df_total.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.575983Z",
     "iopub.status.busy": "2025-09-09T01:42:26.575738Z",
     "iopub.status.idle": "2025-09-09T01:42:26.593600Z",
     "shell.execute_reply": "2025-09-09T01:42:26.593164Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.575968Z"
    }
   },
   "outputs": [],
   "source": [
    "# from tqdm import tqdm\n",
    "\n",
    "# list_of_past_data = [\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v32\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v33\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v34\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v35\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v36\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v37\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v38\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v41\",\n",
    "# ]\n",
    "\n",
    "# # Collect all known train IDs from previous meta_tr.jsonl files, showing progress and set growth\n",
    "# known_train_ids = set()\n",
    "# for data_dir in tqdm(list_of_past_data, desc=\"Collecting known train IDs\"):\n",
    "#     metas = read_jsonl(os.path.join(data_dir, \"meta_tr.jsonl\"))\n",
    "#     before = len(known_train_ids)\n",
    "#     known_train_ids.update(meta[\"id\"] for meta in metas)\n",
    "#     after = len(known_train_ids)\n",
    "#     tqdm.write(f\"Added {after - before} new IDs from {data_dir} (total: {after})\")\n",
    "\n",
    "# print(f\"Total known train IDs: {len(known_train_ids)}\")\n",
    "# print(f\"Original df_slice shape: {df_slice.shape}\")\n",
    "# df_slice = df_slice[~df_slice[\"id\"].isin(known_train_ids)].copy()\n",
    "# print(f\"Filtered df_slice shape: {df_slice.shape}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.594306Z",
     "iopub.status.busy": "2025-09-09T01:42:26.594169Z",
     "iopub.status.idle": "2025-09-09T01:42:26.609117Z",
     "shell.execute_reply": "2025-09-09T01:42:26.608676Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.594292Z"
    }
   },
   "outputs": [],
   "source": [
    "# from collections import Counter, defaultdict\n",
    "# from typing import List, Dict, Set\n",
    "\n",
    "# # Read all meta files\n",
    "# meta_files: List[str] = [\n",
    "#     \"/app/suno/data/dpo/30b_t1_v23/meta_tr.jsonl\",\n",
    "#     \"/app/suno/data/dpo/30b_t6_v35/meta_tr.jsonl\",\n",
    "#     \"/app/suno/data/dpo/13b_s32_v34/meta_tr.jsonl\",\n",
    "#     \"/app/suno/data/dpo/auk_mix_t1_v6/meta_tr.jsonl\",\n",
    "#     \"/app/suno/data/dpo/auk_mix_t1_v14/meta_tr.jsonl\",\n",
    "#     \"/app2/suno/data/dpo/auk_t1_v6/meta_tr.jsonl\",\n",
    "#     \"/app2/suno/data/dpo/auk_t1_v7/meta_tr.jsonl\",\n",
    "#     \"/app2/suno/data/dpo/auk_t1_v19/meta_tr.jsonl\",\n",
    "#     \"/app2/suno/data/dpo/auk_t1_v29/meta_tr.jsonl\",\n",
    "# ]\n",
    "\n",
    "# user_id_counter: Counter[str] = Counter()\n",
    "# for meta_file in tqdm(meta_files):\n",
    "#     metas = read_jsonl(meta_file)\n",
    "#     # Count each user_id once per dataset\n",
    "#     user_ids: Set[str] = {meta[\"user_id\"] for meta in metas if \"user_id\" in meta}\n",
    "#     user_id_counter.update(user_ids)\n",
    "\n",
    "# # Map from count to set of user_ids\n",
    "# count_to_users: Dict[int, Set[str]] = defaultdict(set)\n",
    "# for user_id, count in user_id_counter.items():\n",
    "#     count_to_users[count].add(user_id)\n",
    "\n",
    "# for count in sorted(count_to_users):\n",
    "#     users = count_to_users[count]\n",
    "#     print(f\"Count {count}: {len(users)} users\")\n",
    "\n",
    "# # with open(\"/home/tony/Data/top_user_8.json\", \"w\") as fp:\n",
    "# #     json.dump(list(count_to_users[8]) , fp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.609823Z",
     "iopub.status.busy": "2025-09-09T01:42:26.609682Z",
     "iopub.status.idle": "2025-09-09T01:42:26.623983Z",
     "shell.execute_reply": "2025-09-09T01:42:26.623559Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.609810Z"
    }
   },
   "outputs": [],
   "source": [
    "# with open(\"/home/tony/Data/top_user/mask_control_low.json\", \"r\") as fp:\n",
    "#     very_good_users = json.load(fp)\n",
    "# # very_good_users = count_to_users[5]\n",
    "# very_good_users_mask = df_total[\"user_id\"].isin(very_good_users)\n",
    "# print(df_total[very_good_users_mask].shape, df_total.shape)\n",
    "# print(df_total[very_good_users_mask][\"user_id\"].nunique(), df_total[\"user_id\"].nunique())\n",
    "# # df_total[very_good_users_mask][\"task\"].value_counts()\n",
    "# df_slice = df_total[very_good_users_mask].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.625159Z",
     "iopub.status.busy": "2025-09-09T01:42:26.625020Z",
     "iopub.status.idle": "2025-09-09T01:42:26.639768Z",
     "shell.execute_reply": "2025-09-09T01:42:26.639339Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.625146Z"
    }
   },
   "outputs": [],
   "source": [
    "# print(\n",
    "#     \"Before filtering by user_id and task\",\n",
    "#     df_slice.shape[0],\n",
    "#     \"user_id unique:\",\n",
    "#     df_slice[\"user_id\"].nunique(),\n",
    "# )\n",
    "\n",
    "# # Create a copy to avoid fragmentation warning\n",
    "# df_slice = df_slice.copy()\n",
    "\n",
    "# # Calculate score for each row: reaction_play_count + 5 if preference is True, else 0\n",
    "# score_values = (\n",
    "#     df_slice[\"reaction_play_count\"] + (5 * df_slice[\"upvote_count\"].astype(int))\n",
    "# ) * df_slice[\"preference\"].astype(int)\n",
    "\n",
    "# # Use pd.concat to add the score column efficiently\n",
    "# df_slice = pd.concat(\n",
    "#     [df_slice, pd.DataFrame({\"score\": score_values}, index=df_slice.index)], axis=1\n",
    "# )\n",
    "\n",
    "# # Group by user_id and task, then for each group find the request_id with highest score\n",
    "# best_request_ids = []\n",
    "# for (user_id, task), group in tqdm(\n",
    "#     df_slice.groupby([\"user_id\", \"task\"]), desc=\"Processing user_id and task groups\"\n",
    "# ):\n",
    "#     # Get the request_id with the highest score in this group\n",
    "#     best_request_id = group.loc[group[\"score\"].idxmax(), \"request_id\"]\n",
    "#     best_request_ids.append(best_request_id)\n",
    "\n",
    "# # Filter df_slice to keep only the best request_ids for each user_id, task combination\n",
    "# df_slice = df_slice[df_slice[\"request_id\"].isin(best_request_ids)].copy()\n",
    "\n",
    "# print(\n",
    "#     \"After filtering by user_id and task\",\n",
    "#     df_slice.shape[0],\n",
    "#     \"user_id unique:\",\n",
    "#     df_slice[\"user_id\"].nunique(),\n",
    "# )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T14:00:20.866354Z",
     "start_time": "2024-05-16T14:00:12.443344Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:26.640455Z",
     "iopub.status.busy": "2025-09-09T01:42:26.640324Z",
     "iopub.status.idle": "2025-09-09T01:42:26.679350Z",
     "shell.execute_reply": "2025-09-09T01:42:26.677602Z",
     "shell.execute_reply.started": "2025-09-09T01:42:26.640443Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(176956, 200)\n",
      "task\n",
      "                      110902\n",
      "cover                  32938\n",
      "artist_consistency     13788\n",
      "artist_cover            6142\n",
      "extend                  4426\n",
      "playlist_condition      3472\n",
      "overpainting            1620\n",
      "upload_extend           1226\n",
      "artist_extend            858\n",
      "underpainting            796\n",
      "infill                   788\n",
      "Name: count, dtype: int64\n"
     ]
    },
    {
     "ename": "NameError",
     "evalue": "name 'BREAK' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[37], line 6\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[38;5;28mprint\u001b[39m(df_slice\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m      5\u001b[0m \u001b[38;5;28mprint\u001b[39m(df_slice[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtask\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mvalue_counts())\n\u001b[0;32m----> 6\u001b[0m \u001b[43mBREAK\u001b[49m\n\u001b[1;32m      7\u001b[0m \u001b[38;5;66;03m# (248196, 200)\u001b[39;00m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'BREAK' is not defined"
     ]
    }
   ],
   "source": [
    "# df_slice.to_pickle(\n",
    "#     \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250426_full_long_slice.pkl\"\n",
    "# )\n",
    "print(df_slice.shape)\n",
    "print(df_slice[\"task\"].value_counts())\n",
    "BREAK\n",
    "# (248196, 200)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Need to kick out the ones has gpt prompt -- these are pairs with different text inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:34.761942Z",
     "iopub.status.busy": "2025-09-09T01:42:34.761659Z",
     "iopub.status.idle": "2025-09-09T01:42:36.255908Z",
     "shell.execute_reply": "2025-09-09T01:42:36.255194Z",
     "shell.execute_reply.started": "2025-09-09T01:42:34.761926Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(176956, 200)\n",
      "(176956, 200)\n",
      "(176956, 200)\n"
     ]
    }
   ],
   "source": [
    "print(df_slice.shape)\n",
    "df_slice = df_slice[df_slice[\"request_id\"].apply(lambda x: len(x) > 3)]\n",
    "print(df_slice.shape)\n",
    "# df_slice = df_slice[df_slice[\"is_pro_user\"]].copy()\n",
    "print(df_slice.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.932296Z",
     "start_time": "2024-05-16T13:59:41.932287Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:36.257056Z",
     "iopub.status.busy": "2025-09-09T01:42:36.256883Z",
     "iopub.status.idle": "2025-09-09T01:42:36.286894Z",
     "shell.execute_reply": "2025-09-09T01:42:36.286328Z",
     "shell.execute_reply.started": "2025-09-09T01:42:36.257039Z"
    }
   },
   "outputs": [],
   "source": [
    "# don't have continue at\n",
    "df_slice[\"request_id\"] = df_slice[\"request_id\"].astype(str)\n",
    "# df_slice[\"npz_path\"] = df_slice[\"npz_path\"].apply(lambda x: str(x).replace(\"_npz\", \"_npz/\"))\n",
    "# df_slice[df_slice[\"continue_at\"].isna()][\"request_id\"].nunique(), df_slice[\"request_id\"].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.932966Z",
     "start_time": "2024-05-16T13:59:41.932957Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:36.287666Z",
     "iopub.status.busy": "2025-09-09T01:42:36.287516Z",
     "iopub.status.idle": "2025-09-09T01:42:36.334581Z",
     "shell.execute_reply": "2025-09-09T01:42:36.334004Z",
     "shell.execute_reply.started": "2025-09-09T01:42:36.287650Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88478\n"
     ]
    }
   ],
   "source": [
    "final_filtered_requests = df_slice[\"request_id\"].astype(str).unique()\n",
    "# final_filtered_requests = df_slice[df_slice[\"is_pro_user\"]][\"request_id\"].astype(str).unique()\n",
    "print(len(final_filtered_requests))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.934277Z",
     "start_time": "2024-05-16T13:59:41.934268Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:36.335327Z",
     "iopub.status.busy": "2025-09-09T01:42:36.335183Z",
     "iopub.status.idle": "2025-09-09T01:42:37.975911Z",
     "shell.execute_reply": "2025-09-09T01:42:37.975215Z",
     "shell.execute_reply.started": "2025-09-09T01:42:36.335312Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "87593 885\n",
      "(175186, 200) (1770, 200)\n"
     ]
    }
   ],
   "source": [
    "train_requests, val_requests = train_test_split(\n",
    "    sorted(list(final_filtered_requests)), test_size=0.01, random_state=42\n",
    ")\n",
    "print(len(train_requests), len(val_requests))\n",
    "\n",
    "train_df = df_slice[df_slice[\"request_id\"].astype(str).isin(set(train_requests))].copy()\n",
    "val_df = df_slice[df_slice[\"request_id\"].astype(str).isin(set(val_requests))].copy()\n",
    "train_df = train_df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "train_df = train_df  # .reset_index()\n",
    "val_df = val_df.sort_values(by=[\"request_id\", \"preference\"])\n",
    "val_df = val_df  # .reset_index()\n",
    "train_df = train_df.reset_index(drop=True)\n",
    "val_df = val_df.reset_index(drop=True)\n",
    "print(train_df.shape, val_df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Actually make"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.935620Z",
     "start_time": "2024-05-16T13:59:41.935613Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:37.977694Z",
     "iopub.status.busy": "2025-09-09T01:42:37.977262Z",
     "iopub.status.idle": "2025-09-09T01:42:44.608210Z",
     "shell.execute_reply": "2025-09-09T01:42:44.607502Z",
     "shell.execute_reply.started": "2025-09-09T01:42:37.977675Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 175186/175186 [00:06<00:00, 26518.59it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10,141 hours of 175186 clips, 10.949125 nodes, 228.10677083333334 iters\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "total_duration = 0\n",
    "for i, row in tqdm(train_df.iterrows(), total=len(train_df)):\n",
    "    # we need to alternate between preference: neg, pos\n",
    "    # print(i, row)\n",
    "    try:\n",
    "        assert row[\"preference\"] == (i % 2 == 1)\n",
    "        total_duration += row[\"duration\"]\n",
    "    except Exception as E:\n",
    "        print(i, row)\n",
    "        print(E)\n",
    "        raise ValueError()\n",
    "\n",
    "print(\n",
    "    f\"{round(total_duration / 60 / 60):,} hours of {train_df.shape[0]} clips, {train_df.shape[0] / 8 / 2 / 1000} nodes, {train_df.shape[0] / 8 / 6 / 16} iters\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.936268Z",
     "start_time": "2024-05-16T13:59:41.936260Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:42:44.609085Z",
     "iopub.status.busy": "2025-09-09T01:42:44.608919Z",
     "iopub.status.idle": "2025-09-09T01:43:01.928153Z",
     "shell.execute_reply": "2025-09-09T01:43:01.927404Z",
     "shell.execute_reply.started": "2025-09-09T01:42:44.609067Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t_data_memmap is set to: 13500\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1770/1770 [00:17<00:00, 102.41it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total 1770 clips, 0 different prompts, 0 different tags, 0 different negative tags\n",
      "68 hours of False\n",
      "67 hours of True\n",
      "artist_consistency: 16.1 hours\n",
      "gen: 64.9 hours\n",
      "cover: 35.2 hours\n",
      "extend: 4.5 hours\n",
      "overpainting: 2.1 hours\n",
      "artist_cover: 5.1 hours\n",
      "underpainting: 1.2 hours\n",
      "artist_extend: 1.7 hours\n",
      "playlist_condition: 4.2 hours\n",
      "infill: 0.1 hours\n",
      "\n",
      "--- Gender Distribution ---\n",
      "  female: 122 (6.9%)\n",
      "  male: 188 (10.6%)\n",
      "  unspecified: 1,460 (82.5%)\n",
      "\n",
      "--- Negative Tags Usage ---\n",
      "  has_neg_tags: 104 (5.9%)\n",
      "  no_neg_tags: 1,666 (94.1%)\n",
      "\n",
      "--- Control Slider Usage ---\n",
      "  has_control_slider: 576 (32.5% of clips)\n",
      "  no_control_slider: 1,194 (67.5% of clips)\n",
      "Done\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "make_dataset(\n",
    "    val_df, OUT_DATA_DIR, is_val=True, npz_dir=NPZ_DIR, t_data_memmap=N_TOKENS_AUDIO\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:43:01.929394Z",
     "iopub.status.busy": "2025-09-09T01:43:01.929027Z",
     "iopub.status.idle": "2025-09-09T01:43:01.951352Z",
     "shell.execute_reply": "2025-09-09T01:43:01.950777Z",
     "shell.execute_reply.started": "2025-09-09T01:43:01.929374Z"
    }
   },
   "outputs": [],
   "source": [
    "# test_npz = np.load(\"/app/suno/data/dpo/30b_npz/26d19085-18da-4701-af43-122684543891.npz\")\n",
    "# for k in test_npz.keys():\n",
    "#     print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.936964Z",
     "start_time": "2024-05-16T13:59:41.936957Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T01:43:01.952132Z",
     "iopub.status.busy": "2025-09-09T01:43:01.951973Z",
     "iopub.status.idle": "2025-09-09T02:13:34.313262Z",
     "shell.execute_reply": "2025-09-09T02:13:34.312633Z",
     "shell.execute_reply.started": "2025-09-09T01:43:01.952116Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t_data_memmap is set to: 13500\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████| 175186/175186 [30:32<00:00, 95.62it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total 175186 clips, 31 different prompts, 3 different tags, 0 different negative tags\n",
      "6,701 hours of False\n",
      "6,674 hours of True\n",
      "gen: 6501.9 hours\n",
      "cover: 3458.8 hours\n",
      "artist_cover: 755.7 hours\n",
      "extend: 391.0 hours\n",
      "artist_consistency: 1538.4 hours\n",
      "artist_extend: 97.9 hours\n",
      "playlist_condition: 388.5 hours\n",
      "overpainting: 157.8 hours\n",
      "underpainting: 70.1 hours\n",
      "infill: 15.1 hours\n",
      "\n",
      "--- Gender Distribution ---\n",
      "  female: 13,786 (7.9%)\n",
      "  male: 19,720 (11.3%)\n",
      "  unspecified: 141,680 (80.9%)\n",
      "\n",
      "--- Negative Tags Usage ---\n",
      "  has_neg_tags: 10,566 (6.0%)\n",
      "  no_neg_tags: 164,620 (94.0%)\n",
      "\n",
      "--- Control Slider Usage ---\n",
      "  has_control_slider: 58,824 (33.6% of clips)\n",
      "  no_control_slider: 116,362 (66.4% of clips)\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "make_dataset(\n",
    "    train_df, OUT_DATA_DIR, is_val=False, npz_dir=NPZ_DIR, t_data_memmap=N_TOKENS_AUDIO\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-01-29T19:46:47.549860Z",
     "start_time": "2024-01-29T19:46:47.548015Z"
    }
   },
   "source": [
    "# Validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.937879Z",
     "start_time": "2024-05-16T13:59:41.937870Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:34.314079Z",
     "iopub.status.busy": "2025-09-09T02:13:34.313918Z",
     "iopub.status.idle": "2025-09-09T02:13:35.591006Z",
     "shell.execute_reply": "2025-09-09T02:13:35.590398Z",
     "shell.execute_reply.started": "2025-09-09T02:13:34.314062Z"
    }
   },
   "outputs": [],
   "source": [
    "# verify\n",
    "mm = np.memmap(os.path.join(OUT_DATA_DIR, f\"data_val.bin\"), dtype=np.uint16, mode=\"r\")\n",
    "test_metas = read_jsonl(os.path.join(OUT_DATA_DIR, f\"meta_val.jsonl\"))\n",
    "test_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_val.json\"))\n",
    "mm = mm.reshape(-1, N_TOKENS_AUDIO, 1)\n",
    "assert len(mm) == len(test_metas)\n",
    "assert mm[:100, :, 0].min() >= 0\n",
    "assert mm[:100, :, 0].max() <= 4000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.591814Z",
     "iopub.status.busy": "2025-09-09T02:13:35.591656Z",
     "iopub.status.idle": "2025-09-09T02:13:35.613189Z",
     "shell.execute_reply": "2025-09-09T02:13:35.612715Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.591798Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({None: 1090, 'cover': 342, 'artist_consistency': 142, 'extend': 62, 'artist_cover': 42, 'playlist_condition': 40, 'overpainting': 20, 'artist_extend': 16, 'underpainting': 14, 'infill': 2})\n"
     ]
    }
   ],
   "source": [
    "task_counts = Counter()\n",
    "for test_meta in test_metas:\n",
    "    task_counts[test_meta.get(\"task\")] += 1\n",
    "print(task_counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.938629Z",
     "start_time": "2024-05-16T13:59:41.938621Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.613862Z",
     "iopub.status.busy": "2025-09-09T02:13:35.613712Z",
     "iopub.status.idle": "2025-09-09T02:13:35.629805Z",
     "shell.execute_reply": "2025-09-09T02:13:35.629381Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.613846Z"
    }
   },
   "outputs": [],
   "source": [
    "# # randomly listen to some stuff\n",
    "# from suno_utils.tasks.dac_2c_12cb import preload_models as preload_codec_models\n",
    "# from suno_utils.tasks.dac_2c_12cb import (\n",
    "#     encode as codec_encode,\n",
    "#     decode_stream_to_full_audio as codec_decode,\n",
    "#     EMBEDDING_RATE as CODEC_EMBEDDING_RATE,\n",
    "#     decode as decode\n",
    "# )\n",
    "# os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n",
    "# _ = preload_codec_models(\"/app/suno/data/dpo/models/dac_2c_25x12.pt\", device=\"cuda\")\n",
    "# assert len(test_metas) == len(mm)\n",
    "# idx_list = list(range(len(test_metas)))\n",
    "# # random.shuffle(idx_list)\n",
    "# # idx_list = [idx for idx in idx_list if \"text\" in test_metas[idx]]\n",
    "# print(len(mm))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.939205Z",
     "start_time": "2024-05-16T13:59:41.939198Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.630391Z",
     "iopub.status.busy": "2025-09-09T02:13:35.630254Z",
     "iopub.status.idle": "2025-09-09T02:13:35.645154Z",
     "shell.execute_reply": "2025-09-09T02:13:35.644724Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.630377Z"
    }
   },
   "outputs": [],
   "source": [
    "# import random\n",
    "# idx = random.choice(test_info[\"perference_0\"][\"idx_list\"])\n",
    "# assert \"original_duration_s\" in test_metas[idx]\n",
    "# # positive index should be shifted by 1\n",
    "# pos_idx = idx + 1\n",
    "# print(\n",
    "#     \"tags:\",\n",
    "#     test_metas[idx].get(\"tags\") == test_metas[pos_idx].get(\"tags\"),\n",
    "#     test_metas[idx].get(\"tags\"),\n",
    "# )\n",
    "# arr = mm[idx, 1:].copy().astype(np.int16)[:, 1:]\n",
    "# pos_arr = mm[pos_idx, 1:].copy().astype(np.int16)[:, 1:]\n",
    "# pad_idx_arr = np.where(arr == COARSE_PAD_TOKEN)[0]\n",
    "# if len(pad_idx_arr) > 0:\n",
    "#     arr = arr[: pad_idx_arr[0], :]\n",
    "# pos_pad_idx_arr = np.where(pos_arr == COARSE_PAD_TOKEN)[0]\n",
    "# if len(pos_pad_idx_arr) > 0:\n",
    "#     pos_arr = pos_arr[: pos_pad_idx_arr[0], :]\n",
    "# a = decode(arr)\n",
    "# print(\"\\n negative example \\n\", test_metas[idx])\n",
    "# a.play(compress=False)\n",
    "# pos_a = decode(pos_arr)\n",
    "# print(\"\\n positive example \\n\", test_metas[pos_idx])\n",
    "# pos_a.play(compress=False)\n",
    "# print(\n",
    "#     \"text:\",\n",
    "#     test_metas[idx].get(\"text\") == test_metas[pos_idx].get(\"text\"),\n",
    "#     test_metas[idx].get(\"text\"),\n",
    "# )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.939977Z",
     "start_time": "2024-05-16T13:59:41.939969Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.645783Z",
     "iopub.status.busy": "2025-09-09T02:13:35.645642Z",
     "iopub.status.idle": "2025-09-09T02:13:35.660097Z",
     "shell.execute_reply": "2025-09-09T02:13:35.659675Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.645769Z"
    }
   },
   "outputs": [],
   "source": [
    "# val_df[val_df[\"tags\"] == 'a vibrant blend of experimental jazz fusion, drum-and-bass and swagger fuzzed-out guitars']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.940610Z",
     "start_time": "2024-05-16T13:59:41.940603Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.662713Z",
     "iopub.status.busy": "2025-09-09T02:13:35.662297Z",
     "iopub.status.idle": "2025-09-09T02:13:35.676797Z",
     "shell.execute_reply": "2025-09-09T02:13:35.676371Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.662698Z"
    }
   },
   "outputs": [],
   "source": [
    "# from collections import Counter\n",
    "# c = Counter()\n",
    "# for _, row in df_slice.iterrows():\n",
    "#     # print(row[\"metadata\"])\n",
    "#     for k in ast.literal_eval(row[\"metadata\"]).keys():\n",
    "#         c[k] += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.941167Z",
     "start_time": "2024-05-16T13:59:41.941159Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.677374Z",
     "iopub.status.busy": "2025-09-09T02:13:35.677240Z",
     "iopub.status.idle": "2025-09-09T02:13:35.691911Z",
     "shell.execute_reply": "2025-09-09T02:13:35.691480Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.677361Z"
    }
   },
   "outputs": [],
   "source": [
    "# original_npz_path = f\"/app/suno/data/dpo/7b_npz/{test_metas[idx]['id']}.npz\"\n",
    "# original_npz_path = \"/app/suno/data/dpo/7b_npz/729c3011-f672-4ccd-8d82-1cbf2b52ff69.npz\"\n",
    "# original_arr = np.load(original_npz_path)[\"v2_raw\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.941801Z",
     "start_time": "2024-05-16T13:59:41.941793Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.692537Z",
     "iopub.status.busy": "2025-09-09T02:13:35.692393Z",
     "iopub.status.idle": "2025-09-09T02:13:35.709836Z",
     "shell.execute_reply": "2025-09-09T02:13:35.709374Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.692523Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "885 0\n"
     ]
    }
   ],
   "source": [
    "def validation_on_metas(input_metas):\n",
    "    total_bad = 0\n",
    "    total_good = 0\n",
    "    for idx in range(len(input_metas)):\n",
    "        if idx % 2 == 0:\n",
    "            pos_idx = idx + 1\n",
    "            if input_metas[idx].get(\"tags\") != input_metas[pos_idx].get(\"tags\"):\n",
    "                print(\n",
    "                    input_metas[idx].get(\"id\"),\n",
    "                    input_metas[idx].get(\"tags\"),\n",
    "                    input_metas[pos_idx].get(\"id\"),\n",
    "                    input_metas[pos_idx].get(\"tags\"),\n",
    "                )\n",
    "                # print(test_metas[idx].get(\"text\") == test_metas[pos_idx].get(\"text\"), test_metas[idx].get(\"tags\"), test_metas[pos_idx].get(\"tags\"))\n",
    "                total_bad += 1\n",
    "            elif input_metas[idx].get(\"text\") != input_metas[pos_idx].get(\"text\"):\n",
    "                # print(test_metas[idx].get(\"text\") == test_metas[pos_idx].get(\"text\"), test_metas[idx].get(\"tags\"), test_metas[pos_idx].get(\"tags\"))\n",
    "                total_bad += 1\n",
    "            else:\n",
    "                total_good += 1\n",
    "    print(total_good, total_bad)\n",
    "    return\n",
    "\n",
    "\n",
    "validation_on_metas(test_metas)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.942520Z",
     "start_time": "2024-05-16T13:59:41.942511Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.710490Z",
     "iopub.status.busy": "2025-09-09T02:13:35.710350Z",
     "iopub.status.idle": "2025-09-09T02:13:35.737557Z",
     "shell.execute_reply": "2025-09-09T02:13:35.737113Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.710476Z"
    }
   },
   "outputs": [],
   "source": [
    "train_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_tr.json\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.943072Z",
     "start_time": "2024-05-16T13:59:41.943065Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.738173Z",
     "iopub.status.busy": "2025-09-09T02:13:35.738031Z",
     "iopub.status.idle": "2025-09-09T02:13:35.759619Z",
     "shell.execute_reply": "2025-09-09T02:13:35.759177Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.738159Z"
    }
   },
   "outputs": [],
   "source": [
    "n_neg_tr = train_info[\"perference_0\"][\"idx_list\"]\n",
    "n_pos_tr = train_info[\"perference_1\"][\"idx_list\"]\n",
    "assert len(n_pos_tr) == len(n_neg_tr)\n",
    "# make sure they are offset by 1 and exactly 1\n",
    "for i, j in zip(n_neg_tr, n_pos_tr):\n",
    "    assert i == j - 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.944246Z",
     "start_time": "2024-05-16T13:59:41.944237Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.760258Z",
     "iopub.status.busy": "2025-09-09T02:13:35.760119Z",
     "iopub.status.idle": "2025-09-09T02:13:35.774990Z",
     "shell.execute_reply": "2025-09-09T02:13:35.774542Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.760244Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total samples 175186 (175186, 200)\n"
     ]
    }
   ],
   "source": [
    "total_iters = len(n_neg_tr) + len(n_pos_tr)\n",
    "print(\"total samples\", total_iters, train_df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:35.775597Z",
     "iopub.status.busy": "2025-09-09T02:13:35.775461Z",
     "iopub.status.idle": "2025-09-09T02:13:38.745477Z",
     "shell.execute_reply": "2025-09-09T02:13:38.744858Z",
     "shell.execute_reply.started": "2025-09-09T02:13:35.775583Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "87593 0\n"
     ]
    }
   ],
   "source": [
    "metas_tr = read_jsonl(os.path.join(OUT_DATA_DIR, \"meta_tr.jsonl\"))\n",
    "validation_on_metas(metas_tr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.746263Z",
     "iopub.status.busy": "2025-09-09T02:13:38.746103Z",
     "iopub.status.idle": "2025-09-09T02:13:38.768211Z",
     "shell.execute_reply": "2025-09-09T02:13:38.767757Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.746246Z"
    }
   },
   "outputs": [],
   "source": [
    "# new_metas_tr = []\n",
    "# for index, l in enumerate(metas_tr):\n",
    "#     if index % 2 == 1:\n",
    "#         last_l = new_metas_tr[-1]\n",
    "#         if l[\"tags\"] != last_l[\"tags\"]:\n",
    "#             print(l[\"tags\"], last_l[\"tags\"])\n",
    "#             l[\"tags\"] = last_l[\"tags\"]\n",
    "#     new_metas_tr.append(l)\n",
    "# validation_on_metas(new_metas_tr)\n",
    "# write_jsonl(new_metas_tr, os.path.join(OUT_DATA_DIR, \"meta_tr.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.945249Z",
     "start_time": "2024-05-16T13:59:41.945241Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.768826Z",
     "iopub.status.busy": "2025-09-09T02:13:38.768681Z",
     "iopub.status.idle": "2025-09-09T02:13:38.786783Z",
     "shell.execute_reply": "2025-09-09T02:13:38.786334Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.768812Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 epoch per batch 4, total 684.3203125\n",
      "1 epoch per batch 6, total 228.10677083333334\n",
      "1 epoch per batch 8, total 171.080078125\n"
     ]
    }
   ],
   "source": [
    "print(\"1 epoch per batch 4, total\", total_iters / 8 / 8 / 4)\n",
    "print(\"1 epoch per batch 6, total\", total_iters / 16 / 8 / 6)\n",
    "print(\"1 epoch per batch 8, total\", total_iters / 16 / 8 / 8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.787398Z",
     "iopub.status.busy": "2025-09-09T02:13:38.787262Z",
     "iopub.status.idle": "2025-09-09T02:13:38.801628Z",
     "shell.execute_reply": "2025-09-09T02:13:38.801197Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.787385Z"
    }
   },
   "outputs": [],
   "source": [
    "# import time\n",
    "# time.sleep(60 * 60 * 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.945972Z",
     "start_time": "2024-05-16T13:59:41.945964Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.802198Z",
     "iopub.status.busy": "2025-09-09T02:13:38.802064Z",
     "iopub.status.idle": "2025-09-09T02:13:38.816616Z",
     "shell.execute_reply": "2025-09-09T02:13:38.816191Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.802185Z"
    }
   },
   "outputs": [],
   "source": [
    "# !cd /home/tony/Work/tony/slurm/bluejay && sbatch sbatch_ipo_bluejay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.817231Z",
     "iopub.status.busy": "2025-09-09T02:13:38.817094Z",
     "iopub.status.idle": "2025-09-09T02:13:38.840838Z",
     "shell.execute_reply": "2025-09-09T02:13:38.840386Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.817218Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cache kept!\n"
     ]
    }
   ],
   "source": [
    "import shutil\n",
    "\n",
    "# Basic file copy\n",
    "shutil.copy(\n",
    "    \"/home/tony/Work/tony/Preference/make_dataset_bluejay_t1_dup.ipynb\",\n",
    "    os.path.join(OUT_DATA_DIR, \"make_dataset.ipynb\"),\n",
    ")\n",
    "print(\"Cache kept!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# some gymathtics loading prev data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.946562Z",
     "start_time": "2024-05-16T13:59:41.946555Z"
    },
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.841432Z",
     "iopub.status.busy": "2025-09-09T02:13:38.841297Z",
     "iopub.status.idle": "2025-09-09T02:13:38.855803Z",
     "shell.execute_reply": "2025-09-09T02:13:38.855380Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.841419Z"
    }
   },
   "outputs": [],
   "source": [
    "# prev_v3_data = \"/app/suno/data/dpo/7v_v20_full/\"\n",
    "\n",
    "# test_val_metas = read_jsonl(os.path.join(prev_v3_data, f\"meta_val.jsonl\"))\n",
    "# test_tr_metas = read_jsonl(os.path.join(prev_v3_data, f\"meta_tr.jsonl\"))\n",
    "\n",
    "# all_ids = set()\n",
    "# for meta in test_val_metas:\n",
    "#     all_ids.add(meta[\"id\"])\n",
    "# for meta in test_tr_metas:\n",
    "#     all_ids.add(meta[\"id\"])\n",
    "# print(len(all_ids), len(test_val_metas) + len(test_tr_metas))\n",
    "\n",
    "# all_ids = list(all_ids)\n",
    "# with open(\"/home/tony/Data/Preference/7b_v2/7v_v20_full_recut_id.json\", \"w\") as fp:\n",
    "#     json.dump(all_ids, fp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.856627Z",
     "iopub.status.busy": "2025-09-09T02:13:38.856482Z",
     "iopub.status.idle": "2025-09-09T02:13:38.870911Z",
     "shell.execute_reply": "2025-09-09T02:13:38.870486Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.856614Z"
    }
   },
   "outputs": [],
   "source": [
    "# x_data = train_df[train_df[\"preference\"]][\"similarity\"]\n",
    "# y_data = train_df[~train_df[\"preference\"]][\"similarity\"]\n",
    "# from matplotlib.colors import LogNorm\n",
    "\n",
    "# fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 10))\n",
    "\n",
    "# # 2D Histogram\n",
    "# h = ax1.hist2d(\n",
    "#     x_data,\n",
    "#     y_data,\n",
    "#     bins=(50, 50),\n",
    "#     cmap=\"coolwarm\",\n",
    "#     range=[[0, 1], [0, 1]],\n",
    "#     norm=LogNorm(),\n",
    "# )\n",
    "\n",
    "# ax1.set_xlabel(\"Semantic Distance (Preferred)\")\n",
    "# ax1.set_ylabel(\"Semantic Distance (Non-Preferred)\")\n",
    "# ax1.set_title(\n",
    "#     \"2D Histogram of Semantic Distances: Preferred vs Non-Preferred (Log Scale)\"\n",
    "# )\n",
    "\n",
    "# cbar1 = plt.colorbar(h[3], ax=ax1)\n",
    "# cbar1.set_label(\"Number of Request IDs (Log Scale)\")\n",
    "\n",
    "# # Scatter plot\n",
    "# ax2.scatter(x_data, y_data, alpha=0.1, s=1)\n",
    "# ax2.set_xlabel(\"Semantic Distance (Preferred)\")\n",
    "# ax2.set_ylabel(\"Semantic Distance (Non-Preferred)\")\n",
    "# ax2.set_title(\"Scatter Plot of Semantic Distances: Preferred vs Non-Preferred\")\n",
    "# ax2.set_xlim(0, 1)\n",
    "# ax2.set_ylim(0, 1)\n",
    "\n",
    "# plt.tight_layout()\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.871514Z",
     "iopub.status.busy": "2025-09-09T02:13:38.871378Z",
     "iopub.status.idle": "2025-09-09T02:13:38.885738Z",
     "shell.execute_reply": "2025-09-09T02:13:38.885320Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.871500Z"
    }
   },
   "outputs": [],
   "source": [
    "# train_metas = read_jsonl(os.path.join(OUT_DATA_DIR, f\"meta_tr.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.886336Z",
     "iopub.status.busy": "2025-09-09T02:13:38.886202Z",
     "iopub.status.idle": "2025-09-09T02:13:38.900528Z",
     "shell.execute_reply": "2025-09-09T02:13:38.900095Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.886323Z"
    }
   },
   "outputs": [],
   "source": [
    "# train_info.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.901138Z",
     "iopub.status.busy": "2025-09-09T02:13:38.901001Z",
     "iopub.status.idle": "2025-09-09T02:13:38.915388Z",
     "shell.execute_reply": "2025-09-09T02:13:38.914964Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.901125Z"
    }
   },
   "outputs": [],
   "source": [
    "# import torch\n",
    "\n",
    "# a = torch.tensor([6.2500e-04, 3.9062e-05, 2.3462e-03])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.915969Z",
     "iopub.status.busy": "2025-09-09T02:13:38.915838Z",
     "iopub.status.idle": "2025-09-09T02:13:38.930217Z",
     "shell.execute_reply": "2025-09-09T02:13:38.929792Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.915956Z"
    }
   },
   "outputs": [],
   "source": [
    "# a.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.931016Z",
     "iopub.status.busy": "2025-09-09T02:13:38.930878Z",
     "iopub.status.idle": "2025-09-09T02:13:38.944959Z",
     "shell.execute_reply": "2025-09-09T02:13:38.944522Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.931003Z"
    }
   },
   "outputs": [],
   "source": [
    "# import time\n",
    "# time.sleep(3600 * 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.945586Z",
     "iopub.status.busy": "2025-09-09T02:13:38.945445Z",
     "iopub.status.idle": "2025-09-09T02:13:38.959736Z",
     "shell.execute_reply": "2025-09-09T02:13:38.959314Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.945573Z"
    }
   },
   "outputs": [],
   "source": [
    "# !cd /home/tony/Work/tony/slurm/diffusion && sbatch run_diffusion_infill.sh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:13:38.960352Z",
     "iopub.status.busy": "2025-09-09T02:13:38.960216Z",
     "iopub.status.idle": "2025-09-09T02:15:19.600742Z",
     "shell.execute_reply": "2025-09-09T02:15:19.600144Z",
     "shell.execute_reply.started": "2025-09-09T02:13:38.960339Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "check subset shape (7907066, 197) (632232, 197)\n",
      "user_id\n",
      "9      1.000000\n",
      "20     0.000000\n",
      "199    1.000000\n",
      "591    0.352941\n",
      "717    0.500000\n",
      "Name: preference, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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jGpLmv7++2+sXbsWO3fuRP369asrDCIiIiKFVFvSdPPmTchkMjg5OYllBQUFuHz5MkJCQhAYGIi8vDy8ePFCbrZJJpNBV1cXwOsZo+JXuRVdXfdmneJX3KWmpkJLSwuamppQVVWFmppaiZO+ZTJZiRkqIiIien9V2zlNH3/8MY4cOYLw8HDxx9jYGEOHDhV/V1dXR2RkpLhPQkICHj9+DHNzcwCAubk57t69K5fwREREQEtLC/r6+mKdqKgoub4jIiLENjQ0NGBkZCTXT2FhISIjI2FhYVFFR09ERES1TbXNNGlpaUEikciVNWzYEM2aNRPLnZ2d4e3tjaZNm0JLSwtr1qyBhYWFmPDY2dlBX18fixYtwsKFC5GSkgJfX1+MHTsWGhoaAIBRo0YhJCQEGzZsgLOzM6KionD8+HEEBASI/U6cOBGLFy+GsbExTE1NsXv3bmRlZcnNghEREdH7rUbfEXzp0qVQVVXFnDlzkJubCzs7O6xYsULcrqamhq1bt2LlypVwcXFBgwYN4OjoiDlz5oh12rdvj4CAAHh5eSE4OBitW7fGmjVr0LNnT7HOkCFDkJaWBj8/P6SkpMDQ0BA7duzg8hwRERGJVARBEKo7iLokNfUlOKJERET/zvXr0ejXrxdaT/BF/db6yPknDv/s/gKnT/8OU1PzSu1LRQXQ0Wn81nrVfp8mIiIiotqASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmASRMRERGRApg0ERERESmgWpOmffv2YejQobC0tISlpSVcXFxw7tw5cfu4ceMglUrlfpYvXy7XxuPHjzF16lSYmZnBxsYG69evR35+vlydS5cuwdHREcbGxujfvz8OHTpUIpaQkBDY29vDxMQEI0aMwPXr16vmoImIiKhWqlednbdu3RoLFixAx44dIQgCwsPDMXPmTISFheHDDz8EAIwcORJz5swR92nQoIH4e0FBAdzd3aGjo4PQ0FA8ffoUixcvhrq6OubNmwcASEpKgru7O0aNGgUfHx9ERkZi2bJl0NXVRc+ePQEAx44dg5eXFzw9PWFmZobdu3dj8uTJOHHiBLS1td/hiBAREVFNVa0zTfb29ujduzc6deqEzp0748svv0TDhg0RHR0t1tHU1ISurq74o6WlJW67cOEC4uLi8M0338DQ0BC9e/fG3LlzERISgtzcXABAaGgo2rVrBw8PD+jp6cHV1RUDBw7Erl27xHaCgoIwcuRIODs7Q19fH56entDU1MTBgwff1VAQERFRDVdjzmkqKCjA0aNHkZmZCQsLC7H8yJEjsLa2xieffIKNGzciKytL3BYdHQ2JRAIdHR2xzM7ODhkZGYiLixPr2NjYyPVlZ2cnJma5ubm4efMmbG1txe2qqqqwtbXFtWvXquJQiYiIqBaq1uU5ALhz5w5GjRqFnJwcNGzYEP7+/tDX1wcAfPLJJ2jTpg1atmyJO3fuwMfHB/fv38eWLVsAAKmpqXIJEwDxcUpKSrl1MjIykJ2djfT0dBQUFJRYhtPW1kZCQkKVHDMRERHVPtWeNHXu3Bnh4eF4+fIlTp48icWLF2Pv3r3Q19eHi4uLWE8qlUJXVxdubm5ITExEhw4dqjFqIiIiet9U+/KchoYGOnbsCGNjY8yfPx8GBgYIDg4uta6ZmRkA4OHDhwBezxilpqbK1Sl6rKurW24dLS0taGpqonnz5lBTU4NMJpOrI5PJSsxQERER0fur2pOm4goLC8WTuIuLjY0F8H8Jkbm5Oe7evSuX8EREREBLS0tc4jM3N0dUVJRcOxERETA3NwfwOmkzMjJCZGSkXAyRkZFy51YRERHR+61ak6aNGzfi8uXLSE5Oxp07d7Bx40b88ccfGDp0KBITE+Hv74+YmBgkJyfj119/xeLFi9G9e3cYGBgAeH1Ct76+PhYtWoTbt2/j/Pnz8PX1xdixY6GhoQEAGDVqFJKSkrBhwwbEx8cjJCQEx48fh5ubmxjHxIkTsX//foSFhSE+Ph4rV65EVlYWnJycqmNYiIiIqAaq1nOaZDIZFi9ejKdPn6Jx48aQSqUIDAxEjx498PfffyMyMhLBwcHIzMzEBx98gAEDBmDGjBni/mpqati6dStWrlwJFxcXNGjQAI6OjnL3dWrfvj0CAgLg5eWF4OBgtG7dGmvWrBHv0QQAQ4YMQVpaGvz8/JCSkgJDQ0Ps2LGDy3NEREQkUhEEQajuIOqS1NSX4IgSERH9O9evR6Nfv15oPcEX9VvrI+efOPyz+wucPv07TE3NK7UvFRVAR6fxW+vVuHOaiIiIiGoiJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECmDSRERERKQAJk1ERERECqjWpGnfvn0YOnQoLC0tYWlpCRcXF5w7d07cnpOTA09PT1hbW8PCwgKzZ89GamqqXBuPHz/G1KlTYWZmBhsbG6xfvx75+flydS5dugRHR0cYGxujf//+OHToUIlYQkJCYG9vDxMTE4wYMQLXr1+vmoMmIiKiWqlak6bWrVtjwYIFOHToEA4ePIiPP/4YM2fOxL179wAA69atw2+//QZfX1/s2bMHT58+xaxZs8T9CwoK4O7ujry8PISGhsLb2xthYWHw8/MT6yQlJcHd3R3W1tb4+eefMWHCBCxbtgznz58X6xw7dgxeXl6YOXMmwsLCYGBggMmTJ0Mmk727wSAiIqIarVqTJnt7e/Tu3RudOnVC586d8eWXX6Jhw4aIjo7Gy5cvcfDgQXh4eMDGxgbGxsZYt24drl27hujoaADAhQsXEBcXh2+++QaGhobo3bs35s6di5CQEOTm5gIAQkND0a5dO3h4eEBPTw+urq4YOHAgdu3aJcYRFBSEkSNHwtnZGfr6+vD09ISmpiYOHjxYDaNCRERENVGNOaepoKAAR48eRWZmJiwsLBATE4O8vDzY2tqKdfT09NCmTRsxaYqOjoZEIoGOjo5Yx87ODhkZGYiLixPr2NjYyPVlZ2cntpGbm4ubN2/K9aOqqgpbW1tcu3atio6WiIiIapt61R3AnTt3MGrUKOTk5KBhw4bw9/eHvr4+YmNjoa6ujiZNmsjV19bWRkpKCgAgNTVVLmECID5+W52MjAxkZ2cjPT0dBQUF0NbWLtFPQkJCpR4rERER1V7VnjR17twZ4eHhePnyJU6ePInFixdj79691R0WERERkZxqT5o0NDTQsWNHAICxsTFu3LiB4OBgDB48GHl5eXjx4oXcbJNMJoOu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9u3by23H2tq6xAxZca6urnB1dX1rTERERPT+UTppAl4vm02fPr2yYyEiIiKqsSqUNKWnp+PAgQOIj48HAOjr68PJyQnNmjWrzNiIiIiIagylTwS/fPky7O3tsWfPHrx48QIvXrzAnj170LdvX1y+fLkqYiQiIiKqdkrPNK1atQpDhgzBypUroaamBuD1l+Z6enpi1apVOHLkSKUHSURERFTdlJ5pevjwISZOnCgmTMDrK9jc3Nzw8OHDSg2OiIiIqKZQOmnq2rUrEhISSpQnJCTAwMCgUoIiIiIiqmkUWp67ffu2+Pv48eOxdu1aPHz4EGZmZgCAv/76CyEhIViwYEHVRElERERUzRRKmj777DOoqKhAEASx7JtvvilRb/78+RgyZEjlRUdERERUQyiUNP36669VHQcRERFRjaZQ0tS2bduqjoOIiIioRqvQzS2fPHmCq1evIi0tDYWFhXLbxo8fXymBEREREdUkSidNhw4dwvLly6Guro7mzZvLbVNRUWHSRERERHWS0knTd999h5kzZ8Ld3R2qqkrfsYCIiIioVlI668nOzoaDgwMTJiIiInqvKJ35ODs748SJE1URCxEREVGNpfTy3Pz58+Hu7o7z589DIpGgXj35JpYsWVJpwRERERHVFEonTQEBAbhw4QI6d+5cYpuKikqlBEVERERU0yidNAUFBWHdunVwcnKqiniIiIiIaiSlz2nS0NCApaVlVcRCREREVGMpnTSNHz8ee/furYpYiIiIiGospZfnrl+/jqioKPz222/48MMPS5wIvmXLlkoLjoiIiKimUDppatKkCQYMGFAVsRARERHVWEonTV5eXlURBxEREVGNxtt6ExERESlA6Zkme3v7cu/H9Ouvvyrc1uXLlxEYGIiYmBikpKTA398f/fr1E7d7eHggLCxMbh87OzsEBgaKj58/f47Vq1fjt99+g6qqKgYMGICvvvoKjRo1Euvcvn0bq1atwo0bN9CiRQu4urpiypQpcu0eP34c3333HR49eoROnTphwYIF6N27t8LHQkRERHWb0knThAkT5B7n5+fj1q1buHDhAiZPnqxUW5mZmZBKpXB2dsasWbNKrdOzZ0+5JUENDQ257QsWLEBKSgqCgoKQl5eHpUuXYvny5di4cSMAICMjA5MnT4aNjQ08PT1x9+5dLF26FE2aNIGLiwsA4M8//8T8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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def get_control_slider(metadata):\n",
    "    if \"param_experiment\" in metadata:\n",
    "        exp = metadata.get(\"param_experiment\", \"\")\n",
    "        if exp:\n",
    "            if exp == \"mask_control_slider\":\n",
    "                if not metadata.get(\"control_sliders\", None):\n",
    "                    return False\n",
    "                else:\n",
    "                    return True\n",
    "            return None\n",
    "\n",
    "df[\"mask_control\"] = df.apply(\n",
    "    lambda row: get_control_slider(row[\"metadata\"]), axis=1\n",
    ")\n",
    "masked_request_id = df[~df[\"mask_control\"].isna()][\"request_id\"].unique()\n",
    "subset_df = df[df[\"request_id\"].isin(masked_request_id)].copy()\n",
    "print(\"check subset shape\", df.shape, subset_df.shape)\n",
    "# control masked\n",
    "user_pref_pct = (\n",
    "    subset_df[subset_df[\"mask_control\"] == True].groupby(\"user_id\")[\"preference\"]\n",
    "    .apply(lambda x: x.mean())\n",
    ")\n",
    "print(user_pref_pct.head())\n",
    "# Plot a histogram of the user preference percentages\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.hist(user_pref_pct, bins=np.linspace(0, 1, 100), edgecolor=\"black\")\n",
    "plt.xlabel(\"Preference % for mask_control\")\n",
    "plt.ylabel(\"Number of Users\")\n",
    "plt.title(\"Histogram of User Preference for 'mask_control'\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:19.601646Z",
     "iopub.status.busy": "2025-09-09T02:15:19.601367Z",
     "iopub.status.idle": "2025-09-09T02:15:20.826930Z",
     "shell.execute_reply": "2025-09-09T02:15:20.826377Z",
     "shell.execute_reply.started": "2025-09-09T02:15:19.601629Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60260"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_counts = subset_df.groupby(\"user_id\")[\"preference\"].count()\n",
    "eligible_users = user_counts[user_counts >= 4].index\n",
    "len(eligible_users)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:20.827683Z",
     "iopub.status.busy": "2025-09-09T02:15:20.827533Z",
     "iopub.status.idle": "2025-09-09T02:15:22.737481Z",
     "shell.execute_reply": "2025-09-09T02:15:22.736790Z",
     "shell.execute_reply.started": "2025-09-09T02:15:20.827668Z"
    }
   },
   "outputs": [],
   "source": [
    "# control masked\n",
    "eligible_user_pref_pct = (\n",
    "    subset_df[subset_df[\"user_id\"].isin(eligible_users) & (subset_df[\"mask_control\"] == True)].groupby(\"user_id\")[\"preference\"]\n",
    "    .apply(lambda x: x.mean())\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:22.738446Z",
     "iopub.status.busy": "2025-09-09T02:15:22.738205Z",
     "iopub.status.idle": "2025-09-09T02:15:22.909402Z",
     "shell.execute_reply": "2025-09-09T02:15:22.908864Z",
     "shell.execute_reply.started": "2025-09-09T02:15:22.738430Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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CEova9y4MUJCQl47bvv27REZGVkeJRIREVEVVCme00RERERU0RiaiIiIiJTA0ERERESkBIYmIiIiIiUwNBEREREpgaGJiIiISAkMTURERERKYGgiIiIiUgJDExEREZESGJqIiIiIlMDQRERERKSESvfdc0RERG+SkpKMjAy5WsY2MjKGmVkTtYxNmo2hiYiIqpSUlGQ4uzghPy9XLeNXr1ETMdGXGJzeQwxNRERUpWRkyJGflwvjj2dA17h8g02BPBny/65FRoacoek9xNBERERVkq5xE1Rv2Kqiy6AqhBeCExERESmBoYmIiIhICQxNREREREpgaCIiIiJSAkMTERERkRIYmoiIiIiUwEcOEBFVQup84vXt23+oZVyiyo6hiYioklH3E6+JqGwMTURElYw6n3gNALlJl5AZtbPcxyWq7BiaiIgqKXU98bpAnlzuYxJVBbwQnIiIiEgJDE1ERERESmBoIiIiIlKCRoem4OBgDBgwAA4ODnB2dsbkyZORlJSk0Cc/Px9+fn5o3749HBwc8PnnnyM9PV2hz8OHDzF+/HjY2dnB2dkZq1atQmFhoUKfCxcuoH///rC2tka3bt1w6NAhte8fERERVR4aHZp+/fVXDB8+HPv370dYWBgKCwvh7e2NnJwcqc+KFSvw888/Y926ddixYwcePXqEKVOmSMuLioowYcIEFBQUYO/evVi5ciUiIiKwYcMGqU9ycjImTJiA9u3b4/vvv8eoUaOwYMECREVFvdP9JSIiIs2l0XfPhYaGKvy8cuVKODs74/fff0e7du3w5MkTHDx4EGvWrIGzszOA5yGqd+/euHr1Kuzt7fHLL78gISEBYWFhMDExgZWVFaZNm4Y1a9ZgypQp0NPTw969e2FmZoY5c+YAAMzNzXH58mVs27YNHTt2fOf7TURERJpHo0PTy548eQIAMDQ0BADExcWhoKAALi4uUh9zc3M0atRICk1Xr16FTCaDiYmJ1MfV1RVLlixBQkICWrdujatXr0qh68U+K1aseAd7RURElY06n5puZGQMM7Pyf/4W/XOVJjQVFxdjxYoVcHR0hEwmAwCkp6dDV1cXderUUehrbGyMtLQ0qc+LgQmA9POb+mRnZyMvLw81atRQyz4REVHlUpT9N6ClhUmTfNS2jeo1aiIm+hKDkwaqNKHJz88Pt2/fxu7duyu6FCIiek8V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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot a histogram of the user preference percentages\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.hist(eligible_user_pref_pct, bins=np.linspace(0, 1, 20), edgecolor=\"black\")\n",
    "plt.xlabel(\"Preference % for mask_control\")\n",
    "plt.ylabel(\"Number of Users\")\n",
    "plt.title(\"Histogram of User Preference for 'mask_control'\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sliders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:22.910259Z",
     "iopub.status.busy": "2025-09-09T02:15:22.910005Z",
     "iopub.status.idle": "2025-09-09T02:15:22.930358Z",
     "shell.execute_reply": "2025-09-09T02:15:22.929825Z",
     "shell.execute_reply.started": "2025-09-09T02:15:22.910244Z"
    }
   },
   "outputs": [],
   "source": [
    "from typing import Any\n",
    "import pandas as pd\n",
    "\n",
    "def map_control_sliders_to_df(df: pd.DataFrame) -> pd.DataFrame:\n",
    "    \"\"\"Extracts 'style_weight' and 'weirdness_constraint' from the 'control_sliders' dict in the 'metadata' column\n",
    "    and adds them as new columns to the DataFrame.\n",
    "\n",
    "    Args:\n",
    "        df (pd.DataFrame): DataFrame with a 'metadata' column containing a 'control_sliders' dict.\n",
    "\n",
    "    Returns:\n",
    "        pd.DataFrame: DataFrame with added 'style_weight' and 'weirdness_constraint' columns.\n",
    "\n",
    "    Raises:\n",
    "        KeyError: If 'control_sliders', 'style_weight', or 'weirdness_constraint' are missing in any row.\n",
    "        TypeError: If the extracted values are not floats.\n",
    "\n",
    "    Example:\n",
    "        >>> import pandas as pd\n",
    "        >>> data = [{'metadata': {'control_sliders': {'style_weight': 0.89, 'weirdness_constraint': 0.8}}}]\n",
    "        >>> df = pd.DataFrame(data)\n",
    "        >>> df = map_control_sliders_to_df(df)\n",
    "        >>> df[['style_weight', 'weirdness_constraint']].iloc[0].tolist()\n",
    "        [0.89, 0.8]\n",
    "    \"\"\"\n",
    "    # Vectorized extraction for performance\n",
    "    sliders = df[\"metadata\"].map(lambda m: m.get(\"control_sliders\", {}))\n",
    "    style_weight = sliders.map(lambda s: s.get(\"style_weight\", None))\n",
    "    weirdness_constraint = sliders.map(lambda s: s.get(\"weirdness_constraint\", None))\n",
    "    audio_weight = sliders.map(lambda s: s.get(\"audio_weight\", None))\n",
    "\n",
    "    df[\"style_weight\"] = style_weight\n",
    "    df[\"weirdness_constraint\"] = weirdness_constraint\n",
    "    df[\"audio_weight\"] = audio_weight\n",
    "    return df\n",
    "\n",
    "def print_percentiles(\n",
    "    data: np.ndarray,\n",
    "    percentiles: list[float] = [5, 10, 20, 25, 50, 75, 80, 90, 95]\n",
    ") -> None:\n",
    "    \"\"\"Prints specified percentiles of the data.\n",
    "\n",
    "    Args:\n",
    "        data (np.ndarray): Array of values to compute percentiles for.\n",
    "        percentiles (list[float], optional): List of percentiles to print. Defaults to [5, 10, 20, 25, 50, 75, 80, 90, 95].\n",
    "\n",
    "    Example:\n",
    "        >>> print_percentiles(np.array([1, 2, 3, 4, 5]))\n",
    "    \"\"\"\n",
    "    data = data[~data.isna()]\n",
    "    results = np.percentile(data, percentiles)\n",
    "    print(\"Percentiles:\")\n",
    "    for p, v in zip(percentiles, results):\n",
    "        print(f\"  {p:>3}%: {v:.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:22.931166Z",
     "iopub.status.busy": "2025-09-09T02:15:22.930933Z",
     "iopub.status.idle": "2025-09-09T02:15:26.446575Z",
     "shell.execute_reply": "2025-09-09T02:15:26.445974Z",
     "shell.execute_reply.started": "2025-09-09T02:15:22.931151Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>style_weight</th>\n",
       "      <th>weirdness_constraint</th>\n",
       "      <th>audio_weight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>603538.000000</td>\n",
       "      <td>568996.000000</td>\n",
       "      <td>377774.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.753585</td>\n",
       "      <td>0.409650</td>\n",
       "      <td>0.662223</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.228370</td>\n",
       "      <td>0.278598</td>\n",
       "      <td>0.293329</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.640000</td>\n",
       "      <td>0.160000</td>\n",
       "      <td>0.470000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>0.800000</td>\n",
       "      <td>0.400000</td>\n",
       "      <td>0.730000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.950000</td>\n",
       "      <td>0.660000</td>\n",
       "      <td>0.940000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        style_weight  weirdness_constraint   audio_weight\n",
       "count  603538.000000         568996.000000  377774.000000\n",
       "mean        0.753585              0.409650       0.662223\n",
       "std         0.228370              0.278598       0.293329\n",
       "min         0.000000              0.000000       0.000000\n",
       "25%         0.640000              0.160000       0.470000\n",
       "50%         0.800000              0.400000       0.730000\n",
       "75%         0.950000              0.660000       0.940000\n",
       "max         1.000000              1.000000       1.000000"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_total = map_control_sliders_to_df(df_total)\n",
    "df_total[[\"style_weight\",\"weirdness_constraint\",\"audio_weight\"]].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:26.447597Z",
     "iopub.status.busy": "2025-09-09T02:15:26.447350Z",
     "iopub.status.idle": "2025-09-09T02:15:26.749872Z",
     "shell.execute_reply": "2025-09-09T02:15:26.749267Z",
     "shell.execute_reply.started": "2025-09-09T02:15:26.447581Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.2900\n",
      "   10%: 0.4600\n",
      "   20%: 0.6000\n",
      "   25%: 0.6400\n",
      "   50%: 0.8000\n",
      "   75%: 0.9500\n",
      "   80%: 1.0000\n",
      "   90%: 1.0000\n",
      "   95%: 1.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABuV0lEQVR4nO3de1xUdf4/8NfMcAdllYsmmLmoqMnNMFfCWC+pX8nMu3khXctEy2x1zVXznrhm5nXV1CzMTa3UNLHdtM0o8Q4SLl5CLdFd5ZLSwDD33x/+ODJyEZhh5jCf1/Px8FGc85lz3h9eiPOec1OYzWYziIiIiIiIrKB0dAFERERERNTwsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIiIiIiKrsbEgIqqjtWvXIjQ01C77Gjt2LMaOHSt9feLECYSGhuKrr76yy/5nzZqFnj172mVfdVVcXIw5c+bgqaeeQmhoKN5++21HlwQACA0Nxdq1ax1dRq3k5uYiNDQUe/bsqfNrt27dWg+VEZGcsbEgIgKwZ88ehIaGSn/CwsIQGxuLCRMmIDk5GWq12ib7uXXrFtauXYvs7GybbM+W5FxbTWzatAl79+7FCy+8gOXLl2PgwIFVjtXpdPjoo4/w/PPPo3PnzoiOjkZ8fDzeeust5OTkSOPOnj2LtWvXoqioyB5TeKj+/fvjueeeq7D866+/RmhoKMaMGVNh3WeffYbQ0FB8//339iixVo4ePdrgmi4iqpqLowsgIpKTqVOnIjg4GAaDAfn5+Th58iSWLl2KDz/8EH//+9/Rvn17aWxiYiImTpxYq+3fvn0b69atQ1BQEDp06FDj19nj09/qalu8eDHMZnO912CN48ePIyIiAq+++upDx06dOhXfffcd4uPjMWzYMBgMBly5cgXffvstoqKiEBISAgBIT0/HunXrMGjQIDRu3Li+p/BQTzzxBD777DP89ttvaNSokbT87NmzcHFxwY8//gi9Xg9XV1eLdSqVCpGRkTXeT1BQEDIzM+HiUr9vE44ePYodO3bgtddeq9f9EJF9sLEgIirn6aefRlhYmPT1K6+8grS0NEyaNAmTJ09GSkoKPDw8AAAuLi71/sZLo9HA09MTbm5u9bqfhyn/RlWuCgoK0KZNm4eOy8zMxL///W+88cYbmDRpksU6o9Eom6MTlXniiSewe/dunD17FnFxcdLys2fPol+/fvjyyy9x/vx5iybizJkzCA0NhY+PT433o1Ao4O7ubsvSiUgAPBWKiOghunXrhsmTJ+PGjRvYv3+/tLyyayx++OEHvPDCC4iOjkZUVBT69u2LlStXArh3XcTQoUMBAH/961+l067KzmMfO3Ysnn32WWRlZWH06NGIiIiQXvvgNRZlTCYTVq5ciaeeegqRkZGYNGkS/vvf/1qM6dmzJ2bNmlXhteW3+bDaKrvGoqSkBMuWLUNcXBw6deqEvn37YuvWrRWObISGhmLRokU4fPgwnn32WXTq1Anx8fH47rvvqvu2SwoKCjB79mzExMQgLCwMzz33HPbu3SutL7veJDc3F99++61Ue25ubqXbu379OgCgc+fOFdapVCo0adIEwL18ly9fDgDo1auXxXbHjBlT6SlJANC3b19MmDCh2jndunULf/3rXxETEyN9Pz777LOHfi+eeOIJAPcaiTJarRbnz59Hnz590LJlS4t1hYWFuHbtmvS6mu67qmssDh06hP79+yMsLAzPPvssvv7662qvv9m1axd69+6NTp06YciQIcjMzJTWzZo1Czt27AAAi9MQiajh4hELIqIaGDhwIFauXInvv/8ew4cPr3TM5cuX8corryA0NBRTp06Fm5sbfv75Z+mNXkhICKZOnYo1a9ZgxIgR0pu98m9w79y5g5dffhnx8fF47rnn4OfnV21dGzZsgEKhwMsvv4yCggJ89NFHGDduHL744gvpyEpN1KS28sxmMxITE6WGpEOHDkhNTcXy5ctx69YtzJ4922L8mTNn8K9//QujRo2Ct7c3tm/fjqlTp+Lf//639Ea+MqWlpRg7dix++eUXjB49GsHBwfjqq68wa9YsFBUV4cUXX0RISAiWL1+OpKQkNG/eHOPHjwcANG3atNJttmjRAgBw4MABdO7cucqjTs888wyuXbuGL7/8En/961+lOps2bYqBAwdi7ty5uHTpEtq1aye9JjMzE9euXUNiYmKVc8rPz8fw4cOhUCgwevRoNG3aFN999x3mzJkDtVqNcePGVfnali1bIjAw0KJ5KDv9KSoqClFRUTh79iz+9Kc/AbjfgJTlaM2+v/32W7zxxhto164dpk+fjrt372LOnDlo1qxZpeO//PJL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2xteXl4IDw+3OHJQG76+vhg1ahQGDx4s3W62VatWFrfEHTZsGP75z3/ipZdewv/93//hl19+wYEDByqc1lWb2nr27ImuXbvivffew40bNxAaGooffvgBR44cwYsvvljtKWO1MWLECOzatQuzZs3C+fPnERQUhH/+8584e/YsZs+eXauHvpW5cOECZsyYge7duyM6Ohq+vr64desW9u3bh9u3b2P27NnSUYfHH38cwL27KfXv3x+urq7o0aOHdHF2x44d0a5dO3z11VcICQmRxldn+vTpOHHiBIYPH45hw4ahTZs2uHv3Ls6fP4+0tDScPHnyodso+3lKT0+v8NTqyMhIKBQKZGRkoEePHhZHBazZ9xtvvIHJkyfjhRdewODBg1FUVIQdO3agXbt21d7UoDpl368lS5YgNjYWKpUK8fHxddoWETkeGwsionLWrFkD4N5pMb/73e/Qrl07zJ49G4MHD37om9iePXvixo0b+Pzzz/Hrr7+iSZMmePLJJ/Haa6+hUaNG0naXLVuGlStXYsGCBTAYDEhKSqpzYzFp0iRcvHgR77//PoqLi9GtWzfMnz9f+iQYALp3745Zs2Zh27ZtWLp0KTp16oSNGzfib3/7m8W2alObUqnEhg0bsGbNGqSkpGDPnj0ICgrCzJkzpWco2IKHhwe2b9+OFStWYO/evVCr1WjdujWSkpJqdfes8rp06YKpU6ciNTUV27Ztw6+//gpvb2906NABM2bMQN++faWx4eHheP3117Fz506kpqbCZDLhyJEjFnd9GjhwIN55550a3zLV398fn376KdavX4+vv/4an3zyCX73u9+hTZs2FreurU5kZCRcXFxgMBikO0KV8fHxQdu2bXHx4kWLB+NZu++ePXti5cqVWLt2Ld5991089thjSEpKwr59+3D58uUa1f2gPn36YOzYsTh48CD2798Ps9nMxoKoAVOYeRUVERFRnX300UdISkrCN998Y9NrPhqKgQMHomnTpti2bZujSyEiB+M1FkRERHVkNpvx2WefoUuXLk7fVOj1ehgMBotlJ06cwIULF/Dkk086qCoikhOeCkVERFRLJSUl+Oabb3DixAlcunQJf//73x1dUr27desWxo8fj+eeew6BgYG4cuUKdu7ciYCAgBo/KZ6InBsbCyIioloqLCzE9OnT0bhxY0yaNAm9evVydEn1ztfX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TU3FBx98AOD+UYmaCAoKQm5uLrKzs1FYWFjlxfBERA0ZGwsiIqqUt7c3IiIi8NFHH2HMmDEYMGAAVq9ejWHDhmHevHnSuDfffBPHjh3DH//4RwwaNMhiG0OHDoVer8eQIUOq3Vf79u2xfft2XLt2DaNGjcKgQYOwZs0aBAYGVvu6li1bIigoCMXFxejSpYu0vEWLFggMDIRer7doOLp3746NGzfi+++/x9ChQzF8+HB8+OGHCAoKqnT7Pj4+2LBhA7KzszFw4EC89957mDJlCgBIRzBqom/fvujevTsSEhLQrVs3fPnllzV+LRFRQ6Ewm81mRxdBRETOaf369fjqq68sLspu6Pbv34/Zs2fj9OnTvLsTEVE5vMaCiIhsrri4GDdu3MCOHTswbdo0R5djlX379iE4OBjNmjXDxYsXsWLFCvTr149NBRHRA9hYEBGRzS1evBhffvklevfu/dDToOQuLy8Pa9asQV5eHgICAtCvXz+88cYbji6LiEh2eCoUERERERFZjRdvExERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1dhYEBERERGR1f4f0jlrd7antqkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "df_total[\"style_weight\"].hist(bins=np.linspace(0, 1, 100), color=\"skyblue\", edgecolor=\"black\")\n",
    "print_percentiles(df_total[\"style_weight\"])\n",
    "plt.title(\"Distribution of Style Weight\")\n",
    "plt.xlabel(\"Style Weight\")\n",
    "plt.ylabel(\"Counts\")\n",
    "plt.grid(True, linestyle=\"--\", alpha=0.6)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:26.753067Z",
     "iopub.status.busy": "2025-09-09T02:15:26.752627Z",
     "iopub.status.idle": "2025-09-09T02:15:27.023629Z",
     "shell.execute_reply": "2025-09-09T02:15:27.023068Z",
     "shell.execute_reply.started": "2025-09-09T02:15:26.753051Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.0000\n",
      "   10%: 0.0000\n",
      "   20%: 0.1000\n",
      "   25%: 0.1600\n",
      "   50%: 0.4000\n",
      "   75%: 0.6600\n",
      "   80%: 0.7000\n",
      "   90%: 0.7600\n",
      "   95%: 0.8000\n"
     ]
    },
    {
     "data": {
      "image/png": "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qq6jR49qzZo13lN0zj//fN13331atmyZRowYUcnRVa62k61du1YbN27Ufffdp9GjR0uShg0bpjFjxmjRokW68cYbddZZZ3m337t3r9asWeNd1qNHD1111VV67733Sr1Yutibb76pvXv36umnn/ZecH3ddddp+PDheu6553T11VcrLi5OV111lWbOnKlmzZpVWLt0oklYt26d91qKLVu2qGXLlmratKkSExM1Z84c77ZfffWVpN+PdPzzn/+Uy+XS6tWrvU3R9ddfrwceeEBz5szRddddV25T53Q61b9/f40dO9a77Ntvv9W7776rG264QY899pj3+Rw7dqx2795d6n46dOigadOmeX8+cuSI3n77bW9jcfDgQc2ePVv33XefRo0a5d3usssu06BBg/T6669r1KhR2rt3rw4cOKCZM2eqf//+3u1Ovlalor9tAObhVCgA8ENMTIxycnLKXF98fv/atWvldrur9RgREREaPHhwpbf/61//6nPef//+/dWkSRN98skn1Xr8yvr000/lcDhKnJ516623yuPxlDjNKSkpyafRaN++vWJjY8tt1Iofp0mTJrr88su9y8LDwzV8+HDl5ubqiy++qFb9F1xwgc+1FFu2bFFiYqKkE01HZmam9u/fL0naunWrWrZsqWbNmsnj8eg///mP+vTpI4/Ho6ysLO9/ycnJOn78eInrM0pz/fXX+/xcnNepz+dNN91U5j5ObT67deumI0eOeGcw+/DDD+V2u/WXv/zFp864uDidffbZ2rRpkyR5/34+++yzUk+lkgLztw0guHDEAgD8kJubW+6pSQMGDNBbb72liRMn6tlnn1XPnj315z//Wf3791doaOW+22nWrFmVLpI+++yzfX4OCQnR2WefrYMHD1Z6H9Vx8OBBNW3atMTFzG3atPGuP9kZZ5xRYh8NGjTQsWPHKnycs88+u8TzV/w4hw4dqnLtku91Fl26dNHWrVt17733SpLatWun2NhYbdmyRWeccYZ27NihAQMGSDpxvcWxY8f05ptv6s033yx131lZWeU+dlhYmJo3b+6z7ODBgwoNDfVpviTp3HPPLXM/Z555ps/PxR/+jx49qtjYWO3fv18ej0eXXXZZmXVIJ04Nu+WWW7Rw4UKtXr1a3bp1U58+fXTllVd6Z80KxN82gOBCYwEA1fTLL7/o+PHjJT74nSwqKkpLlizRpk2btG7dOq1fv15r1qzRm2++qVdeeaXC2YGK91FbXC5XpWoKhLIex6opbNu3b6969erpq6++Uu/evXXkyBHvNRShoaHq0qWLvvrqK5111lkqLCz0NiLF39ZfeeWVGjRoUKn7ruimiREREQH5MF7WPoqfU7fbrZCQEM2fP7/U5z8mJsb7/+PHj9egQYO0du1aff7555o6darmzZunZcuWqXnz5gH52wYQXGgsAKCa3nnnHUlScnJyuduFhoaqZ8+e6tmzpx5++GG9+OKL+uc//6lNmzYpKSlJISEhAa3rxx9/9PnZ4/Hoxx9/9PlwW9aRgUOHDqlVq1ben6tSW4sWLZSamqrs7Gyfoxb79u3zrg+EFi1aaPfu3XK73T4fpIsf59Rv7Sur+J4UW7Zs0VdffaXY2Fi1a9fOuz4xMVFr1qzxHhEqbiwaNWqkevXqye12KykpqbrDKqFFixZyu9366aeffI5SFI+zOs466yx5PB61bNlSrVu3rnD74tm07rzzTm3ZskXXX3+93njjDd1///2SKv7bBmAWjlUCQDWkpqbq+eefV8uWLUu9Y3OxI0eOlFhWfKM5p9MpSYqOjpakCk8BqqxVq1b53BX8gw8+UHp6unr16uVd1qpVK3399dfeGiTp448/LjHlaFVq69Wrl1wul5YsWeKz/NVXX1VISIjP4/ujV69eSk9P15o1a7zLioqKtHjxYsXExKh79+7V3nfXrl2VlZWlFStWqEuXLj6NS2Jion744QetXbtWp59+uvfUK4fDoX79+unf//63vvvuuxL7rOg0qLIUP1+LFy/2Wf7aa69Va3/SiYu0HQ6H5syZU+LIkMfj0W+//SZJys7OVlFRkc/6du3aKTQ01Ps3U5m/bQBm4YgFAFTg008/1b59++RyuZSRkaFNmzbp888/15lnnqkXXnih3BvizZ07V19++aV69+6tFi1aKDMzU6+//rqaN2/u/cb7rLPO0mmnnaalS5eqXr16iomJUefOnX2OHFRFgwYNdMMNN2jw4MHe6WbPPvtsnylxhwwZon//+9/629/+pr/85S/66aeftHr16hKndVWltj59+qhHjx765z//qYMHDyo+Pl6ff/651q5dq5tuuqncU8aq4tprr9Wbb76p8ePHa+fOnWrRooX+/e9/a8uWLZowYUKVblh3quJMtm7dqnvuucdnXUJC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u+ROYwEEgchIe1zUhcAid3ORvbnI3kx2yZ3GAggC4eH2mIYOgUXu5iJ7c5G9meySO40FAAAAAL/RWAAAAADwG40FEAScTntc1IXAIndzkb25yN5Mdsnd8sbi8OHDevDBB9WjRw917txZV1xxhf73v/9513s8Hs2cOVPJycnq3Lmzbr75Zu3fv99nH0eOHNHYsWPVtWtXdevWTRMmTFBOTo7PNt9++61uuOEGderUSb1799b8+fNL1PL++++rf//+6tSpk6644gp98sknNTJmINCcTntMQ4fAIndzkb25yN5Mdsnd0sbi6NGjuv766xUeHq758+frvffe00MPPaQGDRp4t5k/f74WL16sxx9/XMuWLVN0dLRGjhypgoIC7zYPPvigvv/+ey1cuFAvvviivvzySz366KPe9dnZ2Ro5cqTOPPNMrVixQuPGjdOcOXP05ptverfZsmWLxo4dq2uuuUarVq3SpZdeqrvuukvfffdd7TwZgB+io8OtLgEWIHdzkb25yN5Mdsnd0sZi/vz5at68uVJSUtS5c2e1atVKycnJOuussySdOFqxaNEijR49Wn379lX79u01ffp0/frrr/roo48kSXv37tX69es1depUdenSRd26ddPEiRP13nvv6fDhw5Kkd999V4WFhZo2bZrOO+88DRw4UMOHD9fChQu9tSxatEgXX3yx/va3v6lNmza67777dP755+tf//pX7T8xQBU5HJYffIQFyN1cZG8usjeTXXK3tMr//ve/6tixo8aMGaOePXvqr3/9q5YtW+Zdf+DAAaWnpyspKcm7rH79+urSpYu2bt0qSdq6datOO+00derUybtNUlKSQkNDtX37dknStm3b1K1bN0VERHi3SU5O1g8//KCjR496t+nZs6dPfcnJydq2bVvAxw0AAAAEG0vvtpGWlqY33nhDt9xyi0aNGqX//e9/mjp1qsLDwzVo0CClp6dLkho3buzze40bN1ZGRoYkKSMjQ40aNfJZHxYWpgYNGnh/PyMjQy1btvTZJi4uzruuQYMGysjI8C4r7XEqq169SO//Fxa6VFBQpMjIMJ/5h53OIjmdLkVHh/t0oPn5RSoqcikmJkKhoSHe5Xl5hXK53KpXL1Ihvy9Wbq5TbrdHsbGRio7+vWkqTVTUifUOR6jP4TS326PcXKfCwhyKivr9z8Hlcisvr1AREQ5F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dis8PLzE8rCwMLnd9riBBwAAAIDAqVZj8cc//lFPPPGEDh8+7F12+PBhpaSkqGfPngErDgAAAIA9VOvi7UcffVSjR4/WpZdequbNm0uSfvnlF5133nl6+umnA1oggIplZxdYXQIsQO7mIntzkb2Z7JJ7tRqLM844QytXrtSGDRu0b98+SVKbNm2UlJQU0OIAVE5oaIhtZoxA4JC7ucjeXGRvJrvkXqVToVJTUzVgwABlZ2crJCREF110kYYPH67hw4erU6dOGjhwoL788suaqhVAGWJiIqwuARYgd3ORvbnI3kx2yb1KjcVrr72moUOHKjY2tsS6+vXr69prr9XChQsDVhwAAAAAe6hSY7F7925dfPHFZa6/6KKLtHPnTr+LAgAAAGAvVWosMjIyFBZW9mUZYWFhysrK8rsoAFXjqfunXaIGkLu5yN5cZG8mu+RepcaiWbNm2rNnT5nrd+/erSZNmvhdFICqycmxx2wRCCxyNxfZm4vszWSX3KvUWPTu3VszZ85UQUHJweXn52v27Nm65JJLAlYcgMpxOKp1SxrYHLmbi+zNRfZmskvuVZpudvTo0frPf/6jfv36adiwYWrdurUkad++fXr99dflcrk0atSoGikUQNmio8NtM8c1AofczUX25iJ7M9kl9yo1FnFxcVq6dKkef/xxzZgxQ57/f8JXSEiIkpOT9eijjyouLq5GCgUAAABQd1X5uEqLFi00f/58bdy4UcuWLdOyZcu0ceNGzZ8/X61atap2IS+99JLi4+P1xBNPeJcVFBRo0qRJ6tGjhxITE3XPPfcoIyPD5/cOHTqk22+/XV26dFHPnj311FNPqaioyGebTZs2adCgQerYsaP+/Oc/a8WKFSUef8mSJerTp486deqkIUOGaPv27dUeCwAAAGCaap+w1aBBA3Xu3FmdO3dWgwYN/Cpi+/btWrp0qeLj432WT5s2TR9//LGee+45LV68WL/++qvuvvtu73qXy6U77rhDhYWFWrp0qZ588kmtXLlSs2bN8m6TlpamO+64Qz169NA777yjm266SRMnTtT69eu926xZs0YpKSm66667tHLlSrVv314jR45UZmamX+MCaosd7saJwCN3c5G9ucjeTHbJ3fIrQXJycvT3v/9dU6dO9WlQjh8/ruXLl2v8+PHq2bOnOnbsqGnTpmnr1q3atm2bJOmzzz7T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f8UVV+i3337TDTfcII/Ho6KiIl133XUaNWpUbZQMi5T2GS8uLk7Z2dnKz89XVFSURZVxjQUQtF566SWtWbNGc+bMUWRkpNXloAZlZ2dr3LhxmjJliho1amR1OahlHo9HjRs31pQpU9SxY0cNGDBAo0aN0tKlS60uDTVs06ZNmjdvnh577DGtWLFCc+bM0SeffKK5c+daXRoMxRELG2jYsKEcDkeJi7cyMzNLdKzF4uLiShydKG971D3Vyb3YggUL9NJLL2nhwoVq3759TZaJGlDV7NPS0nTw4EGNHj3au8ztdkuSzj//fH3wwQc666yzarZoBER1XvdNmjRRWFiYHA6Hd9m5556r9PR0OZ1ORURE1GjNCIzqZD9z5kxdeeWV3tMf4+PjlZubq0cffVSjR49WaCjfHwej0j7jZWRkKDY21tKjFRJHLGwhIiJCf/jDH5Samupd5na7lZqaqsTExFJ/JyEhQRs3bvRZtmHDBiUkJNRkqQig6uQuSfPnz9fzzz+vl19+WZ06daqNUhFgVc3+3HPP1erVq7Vq1Srvf3369FGPHj20atUqNW/evDbLhx+q87rv2rWrfvrpJ28zKUn79+9XkyZNaCpspDrZ5+fnl2geihtMj8dTc8XCUnX5Mx6NhU3ccsstWrZsmVauXKm9e/fq8ccfV15engYPHixJGjdunJ599lnv9iNGjND69ev1yiuvaO/evZo9e7Z27NihG2+80aohoBqqmvtLL72kmTNnatq0aWrRooXS09OVnp6unJwcq4aAaqpK9pGRkWrXrp3Pf6eddprq1aundu3a8eHSZqr6ur/++ut15MgRPfHEE/rhhx+0bt06zZs3T8OGDbNqCKimqmZ/ySWX6I033tB7772ntLQ0ff7555o5c6YuueQSnyNYqNtycnK0a9cu7dq1S9KJacN37dqlQ4cOSZKeffZZjRs3zrv9ddddp7S0NE2fPl179+7VkiVL9P777+vmm2+2onwfnAplEwMGDFBWVpZmzZql9PR0dejQQS+//LL38OjPP//s861F165d9cwzz+i5557TjBkzdM4552ju3Llq166dVUNANVQ196VLl6qwsFBjxozx2c/dd9+te+65p1Zrh3+qmj2CR1WzP+OMM7RgwQKlpKToyiuvVLNmzTRixAjddtttVg0B1VTV7EePHq2QkBA999xzOnz4sBo1aqRLLrlE999/v1VDQDXs2LFDI0aM8P6ckpIiSRo0aJCefPJJpaen6+eff/aub9WqlebNm6eUlBQtWrRIzZs319SpU3XxxRfXeu2nCvFwrAwAAACAn/i6CwAAAIDfaCwAAAAA+I3GAgAAAIDfaCwAAAAA+I3GAgAAAIDfaCwAAAAA+I3GAgAAAIDfaCwAAAAA+I3GAgAM0KdPH7366qtV/r3Zs2frqquuCnxBKNemTZsUHx+vY8eOWV0KAFQajQUAGODtt9/Wtddea3UZQevAgQOKj4/Xrl27ArK/xMREffbZZ6pfv36lf2f8+PG68847A/L4AFAdNBYAYIBGjRopOjq6zPWFhYW1WI25nE5npbaLiIhQkyZNFBISUsMVAUDg0FgAQB308ccfq1u3bnK5XJKkXbt2KT4+Xs8884x3m0ceeUQPPvigJOnLL7/UDTfcoM6dO6t3796aOnWqcnNzvdueeipUfHy8Xn/9dY0aNUoJCQl68cUXJUkvvfSSkpKSlJiYqAkTJqigoMCnruJvxRcsWKDk5GT16NFDkyZN8mlMnE6nnnrqKV188cVKSEjQkCFDtGnTJu/6gwcPatSoUerevbsSEhI0cOBAffLJJ5Kko0ePauzYsfrjH/+ozp0767LLLtPy5csr9Zz98ssveuCBB3ThhRcqISFBgwcP1tdff+1d//rrr6tv377q2LGj+vXrp1WrVvn8fnx8vN566y3ddddd6tKliy677DKtXbvWu7682i699FJJ0l//+lfFx8dr+PDhPs/XCy+8oOTkZPXv31+StGrVKg0ePFiJiYm66KKLNHbsWGVmZnof69RToVasWKFu3bpp/fr1+stf/qLExESNHDlSv/76q6QTp6ytXLlSa9euVXx8vOLj432ecwCoDWFWFwAAKKlbt27KycnRN998o06dOmnz5s1q2LChNm/e7N3miy++0G233aaffvpJt912m+69915NmzZNWVlZmjJliqZMmaKUlJQyH2POnDkaO3asHnnkETkcDq1Zs0azZ8/Wo48+qgsuuEDvvPOOFi9erFatWvn83qZNm9SkSRO99tpr+umnn3T//ferQ4cOGjp0qCRp8uTJ+v777/XPf/5TTZs21Ycffqi//e1vWr16tc455xxNnjxZhYWF+te//qWYmBh9//33iomJkSTNnDlTe/fu1fz589WwYUP99NNPys/Pr/D5ysnJ0Y033qhmzZrp+eefV5MmTbRz50653W5J0ocffqhp06bp4YcfVlJSktatW6cJEyaoefPm+uMf/+jznPz973/XuHHjtHjxYj344IP6+OOPdfrpp5db21tvvaUhQ4bo1VdfVdu2bRUeHu7dZ2pqqmJjY7Vw4ULvsqKiIt17770699xzlZmZqSeffFLjx4/X/Pnzyxxjfn6+XnnlFU2fPl2hoaH6+9//rqeeekrPPvusbr31Vu3du1fZ2dnezBs0aFDh8wYAgURjAQB1UP369dWhQwdt3rzZ21jcfPPNmjNnjnJycpSdna0ff/xR3bt317x583TFFVfo5ptvliSdc845euSRRzR8+HA9/vjjioyMLPUxLr/8cl199dXenx944AFdc801GjJkiCTp/vvvV2pqaomjFg0aNNCjjz4qh8OhNm3aqHfv3kpNTdXQoUN16NAhrVixQh9//LGaNWsmSRo5cqTWr1+vFStW6IEHHtChQ4fUr18/xcfHS5JP43Lo0CF16NBBnTp1kiS1bNmyUs/X//3f/ykrK0tvv/22Tj/9dEnS2Wef7V2/YMECDRo0SMOGDZMktW7dWtu2bdMrr7zi01gMGjRIl19+uff5WLx4sbZv365evXqVW1ujRo0kSaeffrqaNGniU1tMTIymTp2qiIgI77JrrrnG+/+tWrXSI488omuuuUY5OTmqV69eqWMsLCzUpEmTdNZZZ0mShg0bpueff16SVK9ePUVFRcnpdJZ4fACoLTQWAFBHde/eXZs3b9att96qL7/8Ug888IDef/99ffXVVzp69KiaNm2qc845R99++612796t1atXe3/X4/HI7XbrwIEDatOmTan779ixo8/Pe/fu1XXXXeezLCEhocQpNW3btpXD4fD+3KRJE3333XeSpO+++04ul8t7yk8xp9Pp/cA/YsQIPf744/rss8+UlJSkyy67TO3bt5ckXX/99RozZoy++eYbXXTRRerbt6+6du1a4XO1a9cunX/++d7HONW+fftKXLzetWtXLVq0yGdZcbMjnWgIYmNjlZWV5Vdt7dq182kqJGnHjh2aM2eOvv32Wx09elQej0eS9PPPP6tt27al7ic6OtrbVEhS06ZNfU6fAgCr0VgAQB114YUXavny5fr2228VHh6uNm3a6MILL9TmzZt17NgxXXjhhZKk3NxcXXfddd7z+k92xhlnlLn/4tOPqioszPefjpCQEO8H49zcXDkcDi1fvtyn+Tj58YYMGaLk5GStW7dOn3/+uV566SU99NBDGj58uHr37q2PP/5Yn3zyiT7//HPdfPPNGjZsmB566KFya4qKiqrWWE518ilMxWMrPp2qurWdetF8bm6uRo4cqeTkZD3zzDNq2LChfv75Z40cObLci+jLe94BoC7g4m0AqKOKr7N49dVX1b17d0lSjx49tHnzZm3atMnbWJx//vn6/vvvdfbZZ5f479RvysvTpk0bn4udJZX4uSIdOnSQy+VSVlZWiVpOPkXnjDPO0PXXX685c+bolltu0bJly7zrGjVqpEGDBumZZ57RhAkT9Oabb1b4uMVTvR45cqTU9eeee662bNnis2zLli1lHh0oS1m1FTckxRfbl2ffvn06cuSIHnzwQXXr1k1t2rQJyJGH8PBwbxMEAFagsQCAOqpBgwaKj4/X6tWrvU1Et27d9M0332j//v3eZuO2227T1q1bNXnyZO3atUv79+/XRx99pMmTJ1fp8UaMGKHly5dr+fLl+uGHHzRr1izt2bOnSvto3bq1rrjiCo0bN07/+c9/lJaWpu3bt2vevHlat26dJOmJJ57Q+vXrlZaWpp07d2rTpk3e07Vmzpypjz76SD/++KP27NmjdevWlXkq18kGDhyouLg43XXXXfrqq6+Ulpamf//739q6dask6W9/+5tWrlyp119/Xfv379fChQv14Ycf6tZbb6302MqrrXHjxoqKitL69euVkZGh48ePl7mfM888U+Hh4Vq8eLHS0tK0du1a77US/mjRooV2796tffv2KSsriymEAdQ6ToUCgDqse/fu2rVrl7exOP30073fcJ977rmSpPbt22vx4sV67rnndMMNN0g6cUHwgAEDqvRYAwYM0E8//aSnn35aBQUF6tevn66//np99tlnVdpPSkqKXnjhBT355JP69ddfdfrppyshIUF/+tOfJElut1uTJ0/WL7/8otjYWF188cV6+OGHJZ341n3GjBk6ePCgoqKidMEFF2jGjBkVPmZERIReeeUVPfXUU7r99tvlcrnUpk0bPfbYY5Kkvn37asKECXrllVc0bdo0tWjRQtOmTVOPHj0qPa7yagsLC9PEiRM1d+5czZo1S926ddPixYtL3U+jRo305JNPasaMGVq8eLH+8Ic/6KGHHtLo0aMrXUtphg4dqs2bN+vqq69Wbm6uFi1aVKXxAYC/QjycoAkAAADAT5wKBQAAAMBvnAoFAKjzXnzxRc2bN6/UdRdccIFefvnlWq4IAHAqToUCANR5R44c0dGjR0tdFxUV5b0ZHwDAOjQWAAAAAPzGNRYAAAAA/EZjAQAAAMBvNBYAAAAA/EZjAQAAAMBvNBYAAAAA/EZjAQAAAMBvNBYAAAAA/EZjAQAAAMBv/w8m+Yg45vYw+QAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "df_total[\"weirdness_constraint\"].hist(bins=np.linspace(0, 1, 100), color=\"skyblue\", edgecolor=\"black\")\n",
    "print_percentiles(df_total[\"weirdness_constraint\"])\n",
    "plt.title(\"Distribution of Weirdness\")\n",
    "plt.xlabel(\"weirdness_constraint\")\n",
    "plt.ylabel(\"Counts\")\n",
    "plt.grid(True, linestyle=\"--\", alpha=0.6)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:27.024379Z",
     "iopub.status.busy": "2025-09-09T02:15:27.024231Z",
     "iopub.status.idle": "2025-09-09T02:15:27.291136Z",
     "shell.execute_reply": "2025-09-09T02:15:27.290574Z",
     "shell.execute_reply.started": "2025-09-09T02:15:27.024364Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.1000\n",
      "   10%: 0.2000\n",
      "   20%: 0.4000\n",
      "   25%: 0.4700\n",
      "   50%: 0.7300\n",
      "   75%: 0.9400\n",
      "   80%: 1.0000\n",
      "   90%: 1.0000\n",
      "   95%: 1.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwzElEQVR4nO3de1xUZf4H8A8zzMBwkU3wkmjloiKFCGaxEMpmtpampealvGd5z2orc81U0sSsXNMumhqGUUYplpu2u3bFQE2DTFdNUQtkf8olLwMDc/394XJkuDMDnMN5Pu/Xy9dLnvPMOc8zn0HPd87Nw+FwOEBEREREROQGjdwDICIiIiKi1o+FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRERERERuY2FBRFRHdauXYvQ0NAW2daECRMwYcIE6ef9+/cjNDQUX3zxRYtsf/78+RgwYECLbMtVJSUleP7553HHHXcgNDQUL730ktxDwvbt2xEaGoq8vDyprWqWrYk7Y58wYQLuu+++Jh4REbUWnnIPgIiopWzfvh1/+9vfpJ/1ej0CAgIQGhqK+Ph4jBgxAn5+fm5v5/z580hNTcXAgQMRFhbm9vqakpLH1hDr169HWloaZs2ahS5duiAkJETuIZELWvvnkIhqxsKCiIQzd+5cdO7cGVarFYWFhThw4ACWL1+OzZs346233kLPnj2lvjNnzsS0adMatf4LFy7gjTfeQHBwcKN2mjZt2tSo7biirrEtXboUDoej2cfgjn379qF3796YM2eO3EOpU0tk2Vzk/hwSUevFwoKIhNO/f3/06tVL+nn69OnIzMzEjBkzMGvWLOzatQve3t4AAE9PT3h6Nu8/lSaTCQaDAXq9vlm3Ux+dTifr9huiqKgI3bp1k3sY9ZI7S3e05rETkbx4jQUREYCYmBjMmjUL586dw2effSa113SNxffff4+HHnoIffv2RVRUFAYNGoRVq1YBuHpdxIMPPggA+Nvf/obQ0FCEhoZi+/btAK6dg37kyBGMGzcOvXv3ll5b27ntdrsdq1atwh133IHIyEjMmDED//3vf536DBgwAPPnz6/22srrrG9sNV1jUVpaihUrViA+Ph7h4eEYNGgQNm3aVO3IRmhoKF588UXs2bMH9913H8LDwzFkyBB89913db3tkqKiIixYsACxsbHo1asXhg0bhrS0NGl5xfUmeXl5+Oabb6SxV76uoapt27Zh4sSJiImJQXh4OAYPHowPPvigWr/Q0FCsXbu2WntN7+nJkycxceJEREREoH///njrrbdgt9urvbamLOubY0MkJycjLCwMly9fltreffddhIaGIjExUWqz2WyIiorCK6+8IrXZ7XZs3rwZQ4YMQa9evRAbG4tFixbh0qVL9Y793LlzmDFjBiIjIxETE4Ply5cjPT0doaGh2L9/f7Vxnjp1ChMmTEDv3r3Rr18/bNiwQVpW3+eQiFovHrEgIvqf+++/H6tWrcLevXsxevToGvucPHkS06dPR2hoKObOnQu9Xo9ff/0VP/74IwAgJCQEc+fOxZo1azBmzBjceuutAIA+ffpI67h48SIee+wxDBkyBMOGDUNgYGCd43r77bfh4eGBxx57DEVFRXjvvfcwefJkfPrpp9KRlYZoyNgqczgcmDlzprQjGBYWhvT0dKxcuRLnz5/HggULnPofOnQI//rXv/Dwww/D19cXW7Zswdy5c/H111/juuuuq3VcZWVlmDBhAn777TeMGzcOnTt3xhdffIH58+fj8uXLmDRpEkJCQrBy5UokJiaiY8eOmDJlCgCgbdu2ta73ww8/RPfu3TFgwAB4enri66+/RkJCAhwOB8aNG9fg961CQUEBJk6cCJvNhmnTpsFgMCA1NRVeXl71vrYhc2yIvn37wm6349ChQ7jzzjsBAAcPHoRGo8HBgwelfv/5z39QWlqK2267TWpbtGgR0tLSMGLECEyYMAF5eXlISUnBf/7zH3z44Ye1HrEqLS3FpEmTpPkHBQXhH//4R40FBQBcunQJjz76KO6++27ce++9+Oc//4lXX30VPXr0QHx8fKM/h0TUerCwICL6n44dO8Lf3x+5ubm19vn+++9hsViwYcOGGndqg4KC0L9/f6xZswaRkZG4//77q/UpKChAQkICxo4d26BxXbp0Cbt27ZIuLL/55pvx5JNPIjU1FRMnTmzg7Bo2tsq+/PJL7Nu3D08++SRmzpwJABg3bhzmzp2L5ORkjB8/HjfccIPUPycnB7t27ZLaoqOjcf/99+Pzzz/H+PHja93ORx99hJycHLzyyisYNmwYAGDs2LGYMGECVq9ejZEjRyIoKAj3338/Xn/9dXTo0KHesQPA+++/71R4jR8/HlOnTkVSUpJLhcWGDRtQXFyMjz/+GBEREQCA4cOH4y9/+Uu9r23IHBty44CePXvCz88PBw8exJ133gmHw4FDhw7hL3/5C/7973+jpKQEvr6+OHToEDQajbSzfvDgQXz88cd49dVXMXToUGl90dHRePTRR/HFF184tVcde25uLt58800MHDhQGvsDDzxQY/8LFy7g5ZdflpY/+OCDGDBgALZt24b4+PhGfw6JqPXgqVBERJX4+PigpKSk1uVt2rQBcHWnu6ZTYBpCr9djxIgRDe7/wAMPOO103nPPPWjXrh2+/fZbl7bfUN999x20Wm2102IeeeQROByOaqc5xcbGOhUaFTvBdRVqFdtp166d021KdTodJkyYgNLSUvzwww8ujb9yUXHlyhUUFxfj9ttvR25uLq5cudLo9X377beIjIyUigrg6hGT2nbIK2uqOWo0GkRFRUlHJ3JycnDx4kVMmzYNDocD2dnZAK4WEt27d5c+r1988QX8/f1xxx13oLi4WPpzyy23wMfHp9ajDwCQnp6ODh064K677pLavLy8aj2q5+Pj41Qs6PV69OrVq97PARG1fjxiQURUSWlpaZ2nJg0ePBgff/wxFi5ciNdeew0xMTG4++67cc8990Cjadh3NR06dGjUBbI33nij088eHh648cYbce7cuQavwxXnzp1D+/btq32TXnGL16rbv/7666utIyAgwOl6gNq2c+ONN1Z7/yq2k5+f3+ixA1dPzVq7di2ys7NhMpmcll25cgX+/v6NWl9+fj569+5drb1r1671vrYp59i3b1+88cYbKCsrw8GDB9GuXTvccsst6NmzJw4ePIg77rgDhw4dwr333iu95tdff8WVK1cQExNT4zqLiorqHPsNN9wADw8Pp/bKRWRlHTt2rNY3ICAAJ06caOgUiaiVYmFBRPQ///d//4crV67UusMEXP0WPCUlBfv378c333yD9PR07Nq1Cx999BHeffddaLXaerfTmOsi3GWz2Ro0pqZQ23bkuIXtb7/9hsmTJ+OPf/wj5s+fj+uvvx46nQ7ffvstNm/e3KCjTTabrQVG2ni33norLBYLsrKycPDgQfTt21dqP3jwIHJyclBcXCy1A1cv3A4MDMSrr75a4zrrulalsVrq80ZEysPCgojofz799FMAQFxcXJ39NBoNYmJiEBMTg7/97W9Yt24d/v73v2P//v2IjY2t9m2tu3799Vennx0OB3799Venu1XVdmQgPz8fXbp0kX5uzNiCg4ORmZkJo9HodNTi9OnT0vKmEBwcjBMnTsButzt9o1+xnU6dOjV6nV999RXMZjPefvttp9fXdMpPTe+d2WxGQUGBU1unTp2qZQEAZ86cqXc8TTnHiIgI6HQ6HDp0CIcOHcLUqVMBALfddhs+/vhj7Nu3DwCcCosbbrgBmZmZ6NOnT6ML2+DgYJw6dQoOh8Pp8/Pbb781aj2VNfXvCBEpA6+xICICkJmZibfeegudO3eWLq6tycWLF6u1VTzgy2w2AwAMBgMA1HsKUEPt2LEDRqNR+vmLL75AQUEB+vfvL7V16dIFP/30kzQGAPj666+r3Za2MWPr378/bDYbUlJSnNo3b94MDw8Pp+27o3///igoKMCuXbukNqvVii1btsDHx8fpzkYNVfGteeWjJVeuXMG2bduq9e3SpYvTHZUAIDU1tdoRi/j4eGRnZ+Pw4cNSW3FxMXbu3FnveJpyjl5eXujVqxf+8Y9/ID8/Xyog+vbti7KyMiQnJ+OGG25A+/btpdfce++9sNlseOutt6qtz2q11vl5iIuLw/nz5/Hll19KbeXl5UhNTW3wmKtq6t8RIlIGHrEgIuF89913OH36NGw2GwoLC7F//358//336NSpE95+++06bx/65ptv4uDBg4iPj0dwcDCKiorwwQcfoGPHjtJtM2+44Qa0adMGW7duha+vL3x8fBAREeF05KAxAgIC8PDDD2PEiBHS7WZvvPFGp4tnR40ahX/+85949NFHce+99+K3337Dzp07q53W1ZixDRgwANHR0fj73/+Oc+fOITQ0FN9//z2+/PJLTJo0qc5TxhpjzJgx+OijjzB//nwcPXoUwcHB+Oc//4kff/wRCxYsaNDdkqq64447oNPpMGPGDIwdOxYlJSX4+OOPERgYWO1IxKhRo7B48WI8/vjjiI2NxfHjx7F3795qt8h99NFH8emnn+LRRx/FxIkTpdvNdurUqd7rB5p6jn379sU777wDf39/9OjRAwAQGBiIrl274syZM9VuDnD77bdjzJgxWL9+PY4dOya9P2fPnsUXX3yB559/Hvfcc0+tY3///ffx9NNPY+LEiWjXrh127twp/Z64cvShqX9HiEgZWFgQkXDWrFkD4Opdef7whz+gR48eWLBgAUaMGFHvDt6AAQNw7tw5bNu2Db///juuu+463H777Xj88celi4F1Oh1WrFiBVatWYcmSJbBarUhMTHR5p2nGjBk4ceIE3nnnHZSUlCAmJgaLFy+WvvUFgH79+mH+/PlISkrC8uXLER4ejnXr1uHll192WldjxqbRaPD2229jzZo12LVrF7Zv347g4GDMmzcPjzzyiEtzqYm3tze2bNmCV199FWlpaTAajejatSsSExMbdfesyv74xz9izZo1WL16NV5++WUEBQXhoYceQtu2bas9f2P06NHIy8vDJ598gvT0dNx6661ISkrC5MmTnfq1b98eycnJWLZsGd555x384Q9/wNixY9G+fXs8//zzLTrHisIiKirK6dSqvn374syZM1KRW9mLL76I8PBwbN26FX//+9+h1WoRHByMYcOG1fkMCV9fX7z33ntYtmwZkpOT4ePjgwceeABRUVF4/PHHG/Qcj6qa+neEiJTBwyHHVXVERETUqm3evBmJiYn47rvv0KFDB7mHQ0QKwGssiIiIqE5lZWVOP5eXl+Ojjz7CTTfdxKKCiCQ8FYqIiEgBLl68CIvFUutyrVbbpLeFbYw5c+agU6dO6NmzJ4xGIz777DOcPn261tvXEpGYeCoUERGRAkyYMAEHDhyodXlwcDC++uqrFhzRNZs3b8Ynn3yCc+fOwWazoVu3bnj00UcxePBgWcZDRMrEwoKIiEgBjhw5UuftV728vGq8KJuISClYWBARERERkdt48TYREREREbmNhQUREREREbmNhQUREREREbmNt5ttYkVFVyDXVSu+vl4oKSmXZ+MkK2YvJuYuLmYvLmYvJjlz9/AAAgP9G9SXhUUTczggW2FRsX0SE7MXE3MXF7MXF7MXU2vInadCERERERGR21hYEBERERGR2/gciyZWWCjfNRZERERERE3JwwMICmrYNRY8YqEiGo2H3EMgmTB7MTF3cTF7cTF7MbWW3FlYqIiPj17uIZBMmL2YmLu4mL24mL2YWkvuLCyIiIiIiMhtLCyIiIiIiMhtLCxUhBeNi4vZi4m5i4vZi4vZi6m15M67QjUx3hWKiIiIiNSCd4USlFbLOEXF7MXE3MXF7MXF7MXUWnJvHaOkBjEYdHIPgWTC7MXE3MXF7MXF7MXUWnJnYUFERERERG5jYUFERERERG5j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",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "df_total[\"audio_weight\"].hist(bins=np.linspace(0, 1, 100), color=\"skyblue\", edgecolor=\"black\")\n",
    "print_percentiles(df_total[\"audio_weight\"])\n",
    "plt.title(\"Distribution of audio_weight\")\n",
    "plt.xlabel(\"audio_weight\")\n",
    "plt.ylabel(\"Counts\")\n",
    "plt.grid(True, linestyle=\"--\", alpha=0.6)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fetch other parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:27.292046Z",
     "iopub.status.busy": "2025-09-09T02:15:27.291749Z",
     "iopub.status.idle": "2025-09-09T02:15:27.308851Z",
     "shell.execute_reply": "2025-09-09T02:15:27.308327Z",
     "shell.execute_reply.started": "2025-09-09T02:15:27.292031Z"
    }
   },
   "outputs": [],
   "source": [
    "# test_metas = read_jsonl(os.path.join('/app2/suno/data/dpo/bluejay_t1_v42', f\"meta_val.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:27.309680Z",
     "iopub.status.busy": "2025-09-09T02:15:27.309532Z",
     "iopub.status.idle": "2025-09-09T02:15:27.324622Z",
     "shell.execute_reply": "2025-09-09T02:15:27.324112Z",
     "shell.execute_reply.started": "2025-09-09T02:15:27.309666Z"
    }
   },
   "outputs": [],
   "source": [
    "# for x in test_metas:\n",
    "#     if x.get(\"neg_tags\"):\n",
    "#         print(x.get(\"neg_tags\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:27.325480Z",
     "iopub.status.busy": "2025-09-09T02:15:27.325204Z",
     "iopub.status.idle": "2025-09-09T02:15:27.340041Z",
     "shell.execute_reply": "2025-09-09T02:15:27.339530Z",
     "shell.execute_reply.started": "2025-09-09T02:15:27.325466Z"
    }
   },
   "outputs": [],
   "source": [
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:15:27.340973Z",
     "iopub.status.busy": "2025-09-09T02:15:27.340594Z",
     "iopub.status.idle": "2025-09-09T02:15:27.355990Z",
     "shell.execute_reply": "2025-09-09T02:15:27.355428Z",
     "shell.execute_reply.started": "2025-09-09T02:15:27.340958Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pop\n",
      " dance – avoid melodic hooks\n",
      " upbeat pop rhythms\n",
      " or polished vocals\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for x in re.split(r\"[,\\.]\", \"pop, dance – avoid melodic hooks, upbeat pop rhythms, or polished vocals.\")[:5]:\n",
    "    print(x)"
   ]
  },
  {
   "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.10.15"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
