{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:54:10.893200Z",
     "iopub.status.busy": "2025-09-09T00:54:10.893066Z",
     "iopub.status.idle": "2025-09-09T00:54:10.906369Z",
     "shell.execute_reply": "2025-09-09T00:54:10.905952Z",
     "shell.execute_reply.started": "2025-09-09T00:54:10.893183Z"
    }
   },
   "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:54:10.907888Z",
     "iopub.status.busy": "2025-09-09T00:54:10.907775Z",
     "iopub.status.idle": "2025-09-09T00:54:12.975114Z",
     "shell.execute_reply": "2025-09-09T00:54:12.974554Z",
     "shell.execute_reply.started": "2025-09-09T00:54:10.907875Z"
    }
   },
   "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:54:12.977202Z",
     "iopub.status.busy": "2025-09-09T00:54:12.977076Z",
     "iopub.status.idle": "2025-09-09T00:54:13.033311Z",
     "shell.execute_reply": "2025-09-09T00:54:13.032843Z",
     "shell.execute_reply.started": "2025-09-09T00:54:12.977188Z"
    }
   },
   "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:54:13.034949Z",
     "iopub.status.busy": "2025-09-09T00:54:13.034823Z",
     "iopub.status.idle": "2025-09-09T00:56:37.125610Z",
     "shell.execute_reply": "2025-09-09T00:56:37.125051Z",
     "shell.execute_reply.started": "2025-09-09T00:54:13.034936Z"
    }
   },
   "outputs": [],
   "source": [
    "df = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/bluejay_t1/interesting_clips_bluejay_t1_20250908.pkl\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T00:56:37.128034Z",
     "iopub.status.busy": "2025-09-09T00:56:37.127906Z",
     "iopub.status.idle": "2025-09-09T00:56:45.698385Z",
     "shell.execute_reply": "2025-09-09T00:56:45.697795Z",
     "shell.execute_reply.started": "2025-09-09T00:56:37.128020Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after dropna (6915436, 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:56:45.699199Z",
     "iopub.status.busy": "2025-09-09T00:56:45.698960Z",
     "iopub.status.idle": "2025-09-09T01:03:38.715700Z",
     "shell.execute_reply": "2025-09-09T01:03:38.714935Z",
     "shell.execute_reply.started": "2025-09-09T00:56:45.699183Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10734855\n",
      "10734855\n",
      "pre-downloaded df (6915436, 86)\n",
      "downloaded df (6915436, 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-09T01:03:38.716662Z",
     "iopub.status.busy": "2025-09-09T01:03:38.716490Z",
     "iopub.status.idle": "2025-09-09T01:03:39.527802Z",
     "shell.execute_reply": "2025-09-09T01:03:39.527165Z",
     "shell.execute_reply.started": "2025-09-09T01:03:38.716645Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "task\n",
       "                      4207358\n",
       "cover                 1632888\n",
       "artist_consistency     475806\n",
       "artist_cover           255468\n",
       "extend                 115322\n",
       "playlist_condition      83168\n",
       "upload_extend           63286\n",
       "infill                  27212\n",
       "overpainting            25546\n",
       "artist_extend           19142\n",
       "underpainting           10240\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-09T01:03:39.528706Z",
     "iopub.status.busy": "2025-09-09T01:03:39.528535Z",
     "iopub.status.idle": "2025-09-09T01:03:49.996148Z",
     "shell.execute_reply": "2025-09-09T01:03:49.995378Z",
     "shell.execute_reply.started": "2025-09-09T01:03:39.528690Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "preference  model_name      \n",
      "False       chirp-bluejay-t2    3457718\n",
      "True        chirp-bluejay-t2    3457718\n",
      "Name: count, dtype: int64\n",
      "before filter on model name (6915436, 86)\n",
      "after filter on model name (6915436, 86)\n",
      "is_public\n",
      "False    6533396\n",
      "True      382040\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-09T01:03:49.997078Z",
     "iopub.status.busy": "2025-09-09T01:03:49.996908Z",
     "iopub.status.idle": "2025-09-09T01:04:04.527562Z",
     "shell.execute_reply": "2025-09-09T01:04:04.526984Z",
     "shell.execute_reply.started": "2025-09-09T01:03:49.997060Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "before filter on request id pairs (6915436, 86)\n",
      "after filter on request id pairs (6915436, 86)\n",
      "preference  model_name      \n",
      "False       chirp-bluejay-t2    3457718\n",
      "True        chirp-bluejay-t2    3457718\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-09T01:04:04.528319Z",
     "iopub.status.busy": "2025-09-09T01:04:04.528171Z",
     "iopub.status.idle": "2025-09-09T01:24:21.386871Z",
     "shell.execute_reply": "2025-09-09T01:24:21.386288Z",
     "shell.execute_reply.started": "2025-09-09T01:04:04.528304Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique_requests 3457718\n",
      "before removing duplicates (6915436, 195)\n",
      "after removing duplicates (6915436, 188)\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:24:21.387622Z",
     "iopub.status.busy": "2025-09-09T01:24:21.387471Z",
     "iopub.status.idle": "2025-09-09T01:24:41.538585Z",
     "shell.execute_reply": "2025-09-09T01:24:41.538088Z",
     "shell.execute_reply.started": "2025-09-09T01:24:21.387608Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pos_diff_preference\n",
       "1.0    2322736\n",
       "2.0    1134982\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:41.539328Z",
     "iopub.status.busy": "2025-09-09T01:24:41.539160Z",
     "iopub.status.idle": "2025-09-09T01:24:47.704951Z",
     "shell.execute_reply": "2025-09-09T01:24:47.704378Z",
     "shell.execute_reply.started": "2025-09-09T01:24:41.539313Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive param_experiment\n",
      "mask_control_slider    162843\n",
      "cfg_steps_240           56451\n",
      "n_tag_3                 55580\n",
      "cfg_steps_60            55521\n",
      "temp_s_95               55397\n",
      "n_tag_1                 55383\n",
      "tag_cfg_05              54984\n",
      "temp_s_85               54833\n",
      "temp_s_80               54793\n",
      "cfg_steps_10            54383\n",
      "tag_cfg_20              53833\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:47.705702Z",
     "iopub.status.busy": "2025-09-09T01:24:47.705555Z",
     "iopub.status.idle": "2025-09-09T01:26:27.991157Z",
     "shell.execute_reply": "2025-09-09T01:26:27.990589Z",
     "shell.execute_reply.started": "2025-09-09T01:24:47.705687Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 448660 duplicated prompts 224330 unique requests\n",
      "Found 119429 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', '0be30ee8-fcb6-4f33-98fd-81bc2d5d040f', '15c757b0-2ef3-48d7-ac29-adb46769ca59', '3dfd9a33-bd47-4546-aa68-ec641b613ff7', '46dba5fc-ee9a-4a96-807d-d5e426fb2384']\n",
      "Before dedup user gen requests 6915436\n",
      "After dedup user gen requests 6915436\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": 14,
   "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:27.991837Z",
     "iopub.status.busy": "2025-09-09T01:26:27.991693Z",
     "iopub.status.idle": "2025-09-09T01:27:10.947089Z",
     "shell.execute_reply": "2025-09-09T01:27:10.946522Z",
     "shell.execute_reply.started": "2025-09-09T01:26:27.991821Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "89912\n",
      "good_continue_at\n",
      "True     6905854\n",
      "False       9582\n",
      "Name: count, dtype: int64\n",
      "\n",
      " Check some basics... \n",
      " preference\n",
      "False    3457718\n",
      "True     3457718\n",
      "Name: count, dtype: int64 model_name\n",
      "chirp-bluejay-t2    6915436\n",
      "Name: count, dtype: int64 preference  model_name      \n",
      "False       chirp-bluejay-t2    3457718\n",
      "True        chirp-bluejay-t2    3457718\n",
      "Name: count, dtype: int64\n",
      "task\n",
      "                      4207358\n",
      "cover                 1632888\n",
      "artist_consistency     475806\n",
      "artist_cover           255468\n",
      "extend                 115322\n",
      "playlist_condition      83168\n",
      "upload_extend           63286\n",
      "infill                  27212\n",
      "overpainting            25546\n",
      "artist_extend           19142\n",
      "underpainting           10240\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": 15,
   "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:10.947963Z",
     "iopub.status.busy": "2025-09-09T01:27:10.947812Z",
     "iopub.status.idle": "2025-09-09T01:27:39.742167Z",
     "shell.execute_reply": "2025-09-09T01:27:39.741580Z",
     "shell.execute_reply.started": "2025-09-09T01:27:10.947949Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after duration 0.9993466789368016\n",
      "after infill duration 0.999883593745933\n",
      "neg_filter_reaction_play_count 1.0\n",
      "neg_filter_upvote_count 0.9901\n",
      "neg_filter_norm_play_frac 1.0\n",
      "neg_filter_continues 1.0\n",
      "----------------\n",
      "pos_filter_continues 0.9972\n",
      "pos_filter_reaction_play_count 1.0\n",
      "pos_filter_relative_play_count 0.979\n",
      "pos_filter_cer_diff_preference 1.0\n",
      "pos_filter_bad_flags 0.9998\n",
      "after filter on play counts 0.9815\n",
      "after filter on higher quality 0.3425\n",
      "----------------\n",
      "negative 3420719 positive 1099636\n",
      "----------------\n",
      "total pair requests 3457718  --> selected pair requests 1088048 frac 0.315  --> total intitial users 395253\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": 16,
   "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:27:39.743017Z",
     "iopub.status.busy": "2025-09-09T01:27:39.742865Z",
     "iopub.status.idle": "2025-09-09T01:27:52.030865Z",
     "shell.execute_reply": "2025-09-09T01:27:52.030282Z",
     "shell.execute_reply.started": "2025-09-09T01:27:39.743002Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "task\n",
      "                      1353304\n",
      "cover                  427420\n",
      "artist_consistency     155402\n",
      "artist_cover            72724\n",
      "extend                  58386\n",
      "playlist_condition      25858\n",
      "infill                  23800\n",
      "overpainting            23680\n",
      "upload_extend           15718\n",
      "artist_extend           10330\n",
      "underpainting            9474\n",
      "Name: count, dtype: int64\n",
      "bluejay_t1_v52 requests 1088048 clips 2176096 total khrs 123.098; N gpus for 1000 iters 136.006; 4 gpus for x iters 34001.500; n unique users 231476 n pro users 213838\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",
    "# bluejay_t1_v42 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"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:27:52.031619Z",
     "iopub.status.busy": "2025-09-09T01:27:52.031464Z",
     "iopub.status.idle": "2025-09-09T01:30:06.185050Z",
     "shell.execute_reply": "2025-09-09T01:30:06.184477Z",
     "shell.execute_reply.started": "2025-09-09T01:27:52.031604Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total hoot cer scores: 3117160\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████████| 117122/117122 [02:06<00:00, 924.81it/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": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:06.185819Z",
     "iopub.status.busy": "2025-09-09T01:30:06.185670Z",
     "iopub.status.idle": "2025-09-09T01:30:32.133144Z",
     "shell.execute_reply": "2025-09-09T01:30:32.132561Z",
     "shell.execute_reply.started": "2025-09-09T01:30:06.185804Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count    1.088048e+06\n",
      "mean    -3.460458e-03\n",
      "std      1.210695e-01\n",
      "min     -1.000000e+00\n",
      "10%     -8.744787e-02\n",
      "50%      0.000000e+00\n",
      "90%      7.519261e-02\n",
      "95%      1.465617e-01\n",
      "96%      1.726848e-01\n",
      "97%      2.103685e-01\n",
      "98%      2.744285e-01\n",
      "99%      4.073425e-01\n",
      "max      1.000000e+00\n",
      "Name: cer_diff, dtype: float64\n",
      "bluejay_t1_v52 requests 1069195 clips 2138390 total khrs 121.385; N gpus for 1000 iters 133.649; 4 gpus for x iters 33412.344; n unique users 229677 n pro users 212242\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": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:32.133876Z",
     "iopub.status.busy": "2025-09-09T01:30:32.133726Z",
     "iopub.status.idle": "2025-09-09T01:30:32.547824Z",
     "shell.execute_reply": "2025-09-09T01:30:32.547320Z",
     "shell.execute_reply.started": "2025-09-09T01:30:32.133862Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "source\n",
       "web        1575668\n",
       "android     292850\n",
       "ios         269872\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_slice[\"source\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "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:30:32.552083Z",
     "iopub.status.busy": "2025-09-09T01:30:32.551634Z",
     "iopub.status.idle": "2025-09-09T01:30:33.461975Z",
     "shell.execute_reply": "2025-09-09T01:30:33.461422Z",
     "shell.execute_reply.started": "2025-09-09T01:30:32.552062Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive in playlist (327627, 197)\n",
      "task\n",
      "                      1326902\n",
      "cover                  422452\n",
      "artist_consistency     153472\n",
      "artist_cover            71920\n",
      "extend                  57074\n",
      "playlist_condition      25428\n",
      "infill                  23226\n",
      "overpainting            23068\n",
      "upload_extend           15284\n",
      "artist_extend           10132\n",
      "underpainting            9432\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": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:33.462709Z",
     "iopub.status.busy": "2025-09-09T01:30:33.462559Z",
     "iopub.status.idle": "2025-09-09T01:30:33.486069Z",
     "shell.execute_reply": "2025-09-09T01:30:33.485592Z",
     "shell.execute_reply.started": "2025-09-09T01:30:33.462694Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "is_public\n",
      "False    1949366\n",
      "True      189024\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df_slice[\"is_public\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:33.486844Z",
     "iopub.status.busy": "2025-09-09T01:30:33.486706Z",
     "iopub.status.idle": "2025-09-09T01:30:33.945970Z",
     "shell.execute_reply": "2025-09-09T01:30:33.945431Z",
     "shell.execute_reply.started": "2025-09-09T01:30:33.486829Z"
    }
   },
   "outputs": [],
   "source": [
    "df_slice[\"npz_path\"] = df_slice[\"s3_id\"].map(lambda x: f\"{NPZ_DIR}/{x}.npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:33.946677Z",
     "iopub.status.busy": "2025-09-09T01:30:33.946523Z",
     "iopub.status.idle": "2025-09-09T01:30:41.623405Z",
     "shell.execute_reply": "2025-09-09T01:30:41.622824Z",
     "shell.execute_reply.started": "2025-09-09T01:30:33.946662Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2138390, 198)\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": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:41.624151Z",
     "iopub.status.busy": "2025-09-09T01:30:41.623987Z",
     "iopub.status.idle": "2025-09-09T01:30:45.801269Z",
     "shell.execute_reply": "2025-09-09T01:30:45.800724Z",
     "shell.execute_reply.started": "2025-09-09T01:30:41.624135Z"
    }
   },
   "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": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:30:45.801978Z",
     "iopub.status.busy": "2025-09-09T01:30:45.801826Z",
     "iopub.status.idle": "2025-09-09T01:31:31.661964Z",
     "shell.execute_reply": "2025-09-09T01:31:31.661390Z",
     "shell.execute_reply.started": "2025-09-09T01:30:45.801962Z"
    }
   },
   "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    2023082\n",
      "True      115308\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": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:31:31.662690Z",
     "iopub.status.busy": "2025-09-09T01:31:31.662538Z",
     "iopub.status.idle": "2025-09-09T01:32:52.235235Z",
     "shell.execute_reply": "2025-09-09T01:32:52.234429Z",
     "shell.execute_reply.started": "2025-09-09T01:31:31.662674Z"
    }
   },
   "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": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:32:52.236156Z",
     "iopub.status.busy": "2025-09-09T01:32:52.235979Z",
     "iopub.status.idle": "2025-09-09T01:32:52.258965Z",
     "shell.execute_reply": "2025-09-09T01:32:52.258374Z",
     "shell.execute_reply.started": "2025-09-09T01:32:52.236138Z"
    }
   },
   "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": 89,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:14.258010Z",
     "iopub.status.busy": "2025-09-09T03:00:14.257664Z",
     "iopub.status.idle": "2025-09-09T03:00:14.322572Z",
     "shell.execute_reply": "2025-09-09T03:00:14.322088Z",
     "shell.execute_reply.started": "2025-09-09T03:00:14.257994Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N_TOKENS_AUDIO 12000\n"
     ]
    }
   ],
   "source": [
    "OUT_DATA_DIR = \"/app2/suno/data/dpo/bluejay_t1_v58\"\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 * 8* 60\n",
    "print(\"N_TOKENS_AUDIO\", N_TOKENS_AUDIO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:00.353565Z",
     "iopub.status.busy": "2025-09-09T01:50:00.353210Z",
     "iopub.status.idle": "2025-09-09T01:50:04.550037Z",
     "shell.execute_reply": "2025-09-09T01:50:04.549231Z",
     "shell.execute_reply.started": "2025-09-09T01:50:00.353545Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2138390, 199) (367352, 199)\n",
      "after date cut (367352, 199)\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 \n",
    "# # v52 # 07-22 170036\n",
    "# # v53 # 07-26 181850\n",
    "# # v54 # 07-29 176956\n",
    "# # v55 # 08-04 360168\n",
    "# # v56 # 08-10 364698\n",
    "# # v57 # 08-16 360482\n",
    "# # v58 # 08-22 367352\n",
    "df_total[\"created_at\"] = pd.to_datetime(df_total[\"created_at\"], utc=True)\n",
    "start_cutoff_date = pd.to_datetime(\"2025-08-16\", utc=True)\n",
    "end_cutoff_date = pd.to_datetime(\"2025-08-22\", 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": 40,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:04.551672Z",
     "iopub.status.busy": "2025-09-09T01:50:04.551005Z",
     "iopub.status.idle": "2025-09-09T01:50:04.574164Z",
     "shell.execute_reply": "2025-09-09T01:50:04.573587Z",
     "shell.execute_reply.started": "2025-09-09T01:50:04.551652Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice = df_total.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:04.641486Z",
     "iopub.status.busy": "2025-09-09T01:50:04.641313Z",
     "iopub.status.idle": "2025-09-09T01:50:04.661080Z",
     "shell.execute_reply": "2025-09-09T01:50:04.660536Z",
     "shell.execute_reply.started": "2025-09-09T01:50:04.641471Z"
    }
   },
   "outputs": [],
   "source": [
    "# from tqdm import tqdm\n",
    "\n",
    "# list_of_past_data = [\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v42\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v43\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v44\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v45\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v46\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v47\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v48\",\n",
    "#     \"/app2/suno/data/dpo/bluejay_t1_v49\",\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": 42,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:04.884272Z",
     "iopub.status.busy": "2025-09-09T01:50:04.883926Z",
     "iopub.status.idle": "2025-09-09T01:50:04.899567Z",
     "shell.execute_reply": "2025-09-09T01:50:04.899042Z",
     "shell.execute_reply.started": "2025-09-09T01:50:04.884256Z"
    }
   },
   "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": 43,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:05.921063Z",
     "iopub.status.busy": "2025-09-09T01:50:05.920549Z",
     "iopub.status.idle": "2025-09-09T01:50:05.935800Z",
     "shell.execute_reply": "2025-09-09T01:50:05.935274Z",
     "shell.execute_reply.started": "2025-09-09T01:50:05.921047Z"
    }
   },
   "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": 44,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:05.937050Z",
     "iopub.status.busy": "2025-09-09T01:50:05.936637Z",
     "iopub.status.idle": "2025-09-09T01:50:05.952225Z",
     "shell.execute_reply": "2025-09-09T01:50:05.951699Z",
     "shell.execute_reply.started": "2025-09-09T01:50:05.937034Z"
    }
   },
   "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": 45,
   "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:50:05.952913Z",
     "iopub.status.busy": "2025-09-09T01:50:05.952769Z",
     "iopub.status.idle": "2025-09-09T01:50:06.012166Z",
     "shell.execute_reply": "2025-09-09T01:50:06.011488Z",
     "shell.execute_reply.started": "2025-09-09T01:50:05.952899Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(367352, 199)\n",
      "task\n",
      "                      229152\n",
      "cover                  72182\n",
      "artist_consistency     26576\n",
      "artist_cover           12230\n",
      "extend                  9408\n",
      "playlist_condition      4318\n",
      "infill                  4140\n",
      "overpainting            3698\n",
      "upload_extend           2578\n",
      "artist_extend           1616\n",
      "underpainting           1454\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[45], 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# (269282, 199)\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",
    "# (269282, 199)"
   ]
  },
  {
   "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": 46,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:50:10.646063Z",
     "iopub.status.busy": "2025-09-09T01:50:10.645719Z",
     "iopub.status.idle": "2025-09-09T01:50:11.465113Z",
     "shell.execute_reply": "2025-09-09T01:50:11.464408Z",
     "shell.execute_reply.started": "2025-09-09T01:50:10.646045Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(367352, 199)\n",
      "(367352, 199)\n",
      "(367352, 199)\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": 47,
   "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:50:11.466497Z",
     "iopub.status.busy": "2025-09-09T01:50:11.466192Z",
     "iopub.status.idle": "2025-09-09T01:50:11.504491Z",
     "shell.execute_reply": "2025-09-09T01:50:11.503893Z",
     "shell.execute_reply.started": "2025-09-09T01:50:11.466479Z"
    }
   },
   "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": 48,
   "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:50:11.505301Z",
     "iopub.status.busy": "2025-09-09T01:50:11.505146Z",
     "iopub.status.idle": "2025-09-09T01:50:11.586635Z",
     "shell.execute_reply": "2025-09-09T01:50:11.586024Z",
     "shell.execute_reply.started": "2025-09-09T01:50:11.505285Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "183676\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": 49,
   "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:50:11.587430Z",
     "iopub.status.busy": "2025-09-09T01:50:11.587272Z",
     "iopub.status.idle": "2025-09-09T01:50:15.726347Z",
     "shell.execute_reply": "2025-09-09T01:50:15.725550Z",
     "shell.execute_reply.started": "2025-09-09T01:50:11.587416Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "181839 1837\n",
      "(363678, 199) (3674, 199)\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": 50,
   "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:50:15.728312Z",
     "iopub.status.busy": "2025-09-09T01:50:15.727775Z",
     "iopub.status.idle": "2025-09-09T01:50:29.415321Z",
     "shell.execute_reply": "2025-09-09T01:50:29.414603Z",
     "shell.execute_reply.started": "2025-09-09T01:50:15.728293Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 363678/363678 [00:13<00:00, 26621.27it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20,646 hours of 363678 clips, 22.729875 nodes, 473.5390625 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": 51,
   "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:50:29.416207Z",
     "iopub.status.busy": "2025-09-09T01:50:29.416040Z",
     "iopub.status.idle": "2025-09-09T01:51:11.533447Z",
     "shell.execute_reply": "2025-09-09T01:51:11.532750Z",
     "shell.execute_reply.started": "2025-09-09T01:50:29.416191Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t_data_memmap is set to: 13500\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3674/3674 [00:40<00:00, 89.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total 3674 clips, 2 different prompts, 0 different tags, 0 different negative tags\n",
      "139 hours of False\n",
      "138 hours of True\n",
      "gen: 129.8 hours\n",
      "artist_consistency: 32.8 hours\n",
      "infill: 0.9 hours\n",
      "cover: 73.6 hours\n",
      "artist_cover: 19.9 hours\n",
      "overpainting: 3.1 hours\n",
      "extend: 9.3 hours\n",
      "artist_extend: 1.8 hours\n",
      "playlist_condition: 5.6 hours\n",
      "underpainting: 1.1 hours\n",
      "\n",
      "--- Gender Distribution ---\n",
      "  female: 334 (9.1%)\n",
      "  male: 424 (11.5%)\n",
      "  unspecified: 2,916 (79.4%)\n",
      "\n",
      "--- Negative Tags Usage ---\n",
      "  has_neg_tags: 232 (6.3%)\n",
      "  no_neg_tags: 3,442 (93.7%)\n",
      "\n",
      "--- Control Slider Usage ---\n",
      "  has_control_slider: 1,202 (32.7% of clips)\n",
      "  no_control_slider: 2,472 (67.3% 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": 52,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T01:51:11.534274Z",
     "iopub.status.busy": "2025-09-09T01:51:11.534114Z",
     "iopub.status.idle": "2025-09-09T01:51:11.558606Z",
     "shell.execute_reply": "2025-09-09T01:51:11.558046Z",
     "shell.execute_reply.started": "2025-09-09T01:51:11.534257Z"
    }
   },
   "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": 53,
   "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:51:11.559498Z",
     "iopub.status.busy": "2025-09-09T01:51:11.559232Z",
     "iopub.status.idle": "2025-09-09T02:58:15.617376Z",
     "shell.execute_reply": "2025-09-09T02:58:15.616797Z",
     "shell.execute_reply.started": "2025-09-09T01:51:11.559483Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "t_data_memmap is set to: 13500\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████| 363678/363678 [1:07:03<00:00, 90.39it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total 363678 clips, 48 different prompts, 2 different tags, 0 different negative tags\n",
      "13,660 hours of False\n",
      "13,597 hours of True\n",
      "gen: 13247.9 hours\n",
      "cover: 7510.2 hours\n",
      "extend: 832.9 hours\n",
      "artist_consistency: 2956.9 hours\n",
      "artist_cover: 1480.6 hours\n",
      "overpainting: 368.8 hours\n",
      "infill: 77.9 hours\n",
      "playlist_condition: 471.4 hours\n",
      "underpainting: 123.7 hours\n",
      "artist_extend: 186.5 hours\n",
      "\n",
      "--- Gender Distribution ---\n",
      "  female: 30,324 (8.3%)\n",
      "  male: 42,306 (11.6%)\n",
      "  unspecified: 291,048 (80.0%)\n",
      "\n",
      "--- Negative Tags Usage ---\n",
      "  has_neg_tags: 21,950 (6.0%)\n",
      "  no_neg_tags: 341,728 (94.0%)\n",
      "\n",
      "--- Control Slider Usage ---\n",
      "  has_control_slider: 118,670 (32.6% of clips)\n",
      "  no_control_slider: 245,008 (67.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": 54,
   "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:58:15.618107Z",
     "iopub.status.busy": "2025-09-09T02:58:15.617956Z",
     "iopub.status.idle": "2025-09-09T02:58:16.846418Z",
     "shell.execute_reply": "2025-09-09T02:58:16.845885Z",
     "shell.execute_reply.started": "2025-09-09T02:58:15.618092Z"
    }
   },
   "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": 55,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:16.847157Z",
     "iopub.status.busy": "2025-09-09T02:58:16.847005Z",
     "iopub.status.idle": "2025-09-09T02:58:16.867825Z",
     "shell.execute_reply": "2025-09-09T02:58:16.867345Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.847142Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({None: 2238, 'cover': 708, 'artist_consistency': 286, 'artist_cover': 160, 'extend': 128, 'playlist_condition': 52, 'infill': 48, 'overpainting': 28, 'artist_extend': 14, 'underpainting': 12})\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": 56,
   "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:58:16.868458Z",
     "iopub.status.busy": "2025-09-09T02:58:16.868316Z",
     "iopub.status.idle": "2025-09-09T02:58:16.884371Z",
     "shell.execute_reply": "2025-09-09T02:58:16.883938Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.868444Z"
    }
   },
   "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": 57,
   "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:58:16.884999Z",
     "iopub.status.busy": "2025-09-09T02:58:16.884864Z",
     "iopub.status.idle": "2025-09-09T02:58:16.899906Z",
     "shell.execute_reply": "2025-09-09T02:58:16.899476Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.884985Z"
    }
   },
   "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": 58,
   "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:58:16.900513Z",
     "iopub.status.busy": "2025-09-09T02:58:16.900374Z",
     "iopub.status.idle": "2025-09-09T02:58:16.915180Z",
     "shell.execute_reply": "2025-09-09T02:58:16.914749Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.900499Z"
    }
   },
   "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": 59,
   "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:58:16.917702Z",
     "iopub.status.busy": "2025-09-09T02:58:16.917456Z",
     "iopub.status.idle": "2025-09-09T02:58:16.932215Z",
     "shell.execute_reply": "2025-09-09T02:58:16.931788Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.917686Z"
    }
   },
   "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": 60,
   "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:58:16.932900Z",
     "iopub.status.busy": "2025-09-09T02:58:16.932766Z",
     "iopub.status.idle": "2025-09-09T02:58:16.947304Z",
     "shell.execute_reply": "2025-09-09T02:58:16.946877Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.932887Z"
    }
   },
   "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": 61,
   "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:58:16.947907Z",
     "iopub.status.busy": "2025-09-09T02:58:16.947774Z",
     "iopub.status.idle": "2025-09-09T02:58:16.966198Z",
     "shell.execute_reply": "2025-09-09T02:58:16.965742Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.947894Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1837 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": 62,
   "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:58:16.966827Z",
     "iopub.status.busy": "2025-09-09T02:58:16.966685Z",
     "iopub.status.idle": "2025-09-09T02:58:17.004757Z",
     "shell.execute_reply": "2025-09-09T02:58:17.004314Z",
     "shell.execute_reply.started": "2025-09-09T02:58:16.966814Z"
    }
   },
   "outputs": [],
   "source": [
    "train_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_tr.json\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "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:58:17.005517Z",
     "iopub.status.busy": "2025-09-09T02:58:17.005376Z",
     "iopub.status.idle": "2025-09-09T02:58:17.033351Z",
     "shell.execute_reply": "2025-09-09T02:58:17.032909Z",
     "shell.execute_reply.started": "2025-09-09T02:58:17.005502Z"
    }
   },
   "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": 64,
   "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:58:17.033914Z",
     "iopub.status.busy": "2025-09-09T02:58:17.033779Z",
     "iopub.status.idle": "2025-09-09T02:58:17.049189Z",
     "shell.execute_reply": "2025-09-09T02:58:17.048737Z",
     "shell.execute_reply.started": "2025-09-09T02:58:17.033901Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total samples 363678 (363678, 199)\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": 65,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:17.049812Z",
     "iopub.status.busy": "2025-09-09T02:58:17.049670Z",
     "iopub.status.idle": "2025-09-09T02:58:23.094503Z",
     "shell.execute_reply": "2025-09-09T02:58:23.093925Z",
     "shell.execute_reply.started": "2025-09-09T02:58:17.049798Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "181839 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": 66,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.095230Z",
     "iopub.status.busy": "2025-09-09T02:58:23.095073Z",
     "iopub.status.idle": "2025-09-09T02:58:23.115112Z",
     "shell.execute_reply": "2025-09-09T02:58:23.114667Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.095214Z"
    }
   },
   "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": 67,
   "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:58:23.115746Z",
     "iopub.status.busy": "2025-09-09T02:58:23.115610Z",
     "iopub.status.idle": "2025-09-09T02:58:23.133471Z",
     "shell.execute_reply": "2025-09-09T02:58:23.133013Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.115732Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 epoch per batch 4, total 1420.6171875\n",
      "1 epoch per batch 6, total 473.5390625\n",
      "1 epoch per batch 8, total 355.154296875\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": 68,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.134073Z",
     "iopub.status.busy": "2025-09-09T02:58:23.133941Z",
     "iopub.status.idle": "2025-09-09T02:58:23.148457Z",
     "shell.execute_reply": "2025-09-09T02:58:23.148029Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.134059Z"
    }
   },
   "outputs": [],
   "source": [
    "# import time\n",
    "# time.sleep(60 * 60 * 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "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:58:23.149068Z",
     "iopub.status.busy": "2025-09-09T02:58:23.148933Z",
     "iopub.status.idle": "2025-09-09T02:58:23.163449Z",
     "shell.execute_reply": "2025-09-09T02:58:23.163020Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.149054Z"
    }
   },
   "outputs": [],
   "source": [
    "# !cd /home/tony/Work/tony/slurm/bluejay && sbatch sbatch_ipo_bluejay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.164046Z",
     "iopub.status.busy": "2025-09-09T02:58:23.163909Z",
     "iopub.status.idle": "2025-09-09T02:58:23.190000Z",
     "shell.execute_reply": "2025-09-09T02:58:23.189539Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.164032Z"
    }
   },
   "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_parallel_2.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": 71,
   "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:58:23.190642Z",
     "iopub.status.busy": "2025-09-09T02:58:23.190505Z",
     "iopub.status.idle": "2025-09-09T02:58:23.205100Z",
     "shell.execute_reply": "2025-09-09T02:58:23.204664Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.190628Z"
    }
   },
   "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": 72,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.205705Z",
     "iopub.status.busy": "2025-09-09T02:58:23.205565Z",
     "iopub.status.idle": "2025-09-09T02:58:23.220414Z",
     "shell.execute_reply": "2025-09-09T02:58:23.219978Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.205692Z"
    }
   },
   "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": 73,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.221031Z",
     "iopub.status.busy": "2025-09-09T02:58:23.220895Z",
     "iopub.status.idle": "2025-09-09T02:58:23.235453Z",
     "shell.execute_reply": "2025-09-09T02:58:23.235030Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.221017Z"
    }
   },
   "outputs": [],
   "source": [
    "# train_metas = read_jsonl(os.path.join(OUT_DATA_DIR, f\"meta_tr.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.236055Z",
     "iopub.status.busy": "2025-09-09T02:58:23.235920Z",
     "iopub.status.idle": "2025-09-09T02:58:23.250378Z",
     "shell.execute_reply": "2025-09-09T02:58:23.249941Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.236042Z"
    }
   },
   "outputs": [],
   "source": [
    "# train_info.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.250957Z",
     "iopub.status.busy": "2025-09-09T02:58:23.250826Z",
     "iopub.status.idle": "2025-09-09T02:58:23.265325Z",
     "shell.execute_reply": "2025-09-09T02:58:23.264897Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.250944Z"
    }
   },
   "outputs": [],
   "source": [
    "# import torch\n",
    "\n",
    "# a = torch.tensor([6.2500e-04, 3.9062e-05, 2.3462e-03])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.266034Z",
     "iopub.status.busy": "2025-09-09T02:58:23.265785Z",
     "iopub.status.idle": "2025-09-09T02:58:23.280390Z",
     "shell.execute_reply": "2025-09-09T02:58:23.279963Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.266020Z"
    }
   },
   "outputs": [],
   "source": [
    "# a.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.281109Z",
     "iopub.status.busy": "2025-09-09T02:58:23.280854Z",
     "iopub.status.idle": "2025-09-09T02:58:23.295379Z",
     "shell.execute_reply": "2025-09-09T02:58:23.294957Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.281094Z"
    }
   },
   "outputs": [],
   "source": [
    "# import time\n",
    "# time.sleep(3600 * 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.296016Z",
     "iopub.status.busy": "2025-09-09T02:58:23.295885Z",
     "iopub.status.idle": "2025-09-09T02:58:23.310313Z",
     "shell.execute_reply": "2025-09-09T02:58:23.309888Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.296003Z"
    }
   },
   "outputs": [],
   "source": [
    "# !cd /home/tony/Work/tony/slurm/diffusion && sbatch run_diffusion_infill.sh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T02:58:23.310910Z",
     "iopub.status.busy": "2025-09-09T02:58:23.310772Z",
     "iopub.status.idle": "2025-09-09T03:00:07.056905Z",
     "shell.execute_reply": "2025-09-09T03:00:07.056400Z",
     "shell.execute_reply.started": "2025-09-09T02:58:23.310896Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "check subset shape (6915436, 196) (564890, 196)\n",
      "user_id\n",
      "9      1.000000\n",
      "199    1.000000\n",
      "411    1.000000\n",
      "591    0.363636\n",
      "717    0.500000\n",
      "Name: preference, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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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": 80,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:07.057623Z",
     "iopub.status.busy": "2025-09-09T03:00:07.057469Z",
     "iopub.status.idle": "2025-09-09T03:00:08.256178Z",
     "shell.execute_reply": "2025-09-09T03:00:08.255697Z",
     "shell.execute_reply.started": "2025-09-09T03:00:07.057608Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "55479"
      ]
     },
     "execution_count": 80,
     "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": 81,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:08.256886Z",
     "iopub.status.busy": "2025-09-09T03:00:08.256737Z",
     "iopub.status.idle": "2025-09-09T03:00:09.991554Z",
     "shell.execute_reply": "2025-09-09T03:00:09.990984Z",
     "shell.execute_reply.started": "2025-09-09T03:00:08.256871Z"
    }
   },
   "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": 82,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:09.992303Z",
     "iopub.status.busy": "2025-09-09T03:00:09.992156Z",
     "iopub.status.idle": "2025-09-09T03:00:10.162781Z",
     "shell.execute_reply": "2025-09-09T03:00:10.162317Z",
     "shell.execute_reply.started": "2025-09-09T03:00:09.992288Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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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": 83,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:10.163440Z",
     "iopub.status.busy": "2025-09-09T03:00:10.163296Z",
     "iopub.status.idle": "2025-09-09T03:00:10.183533Z",
     "shell.execute_reply": "2025-09-09T03:00:10.183103Z",
     "shell.execute_reply.started": "2025-09-09T03:00:10.163426Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eligible_user_pref_pct[172918] # kakermix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sliders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:10.184133Z",
     "iopub.status.busy": "2025-09-09T03:00:10.183997Z",
     "iopub.status.idle": "2025-09-09T03:00:10.202200Z",
     "shell.execute_reply": "2025-09-09T03:00:10.201758Z",
     "shell.execute_reply.started": "2025-09-09T03:00:10.184119Z"
    }
   },
   "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": 85,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:10.202919Z",
     "iopub.status.busy": "2025-09-09T03:00:10.202785Z",
     "iopub.status.idle": "2025-09-09T03:00:13.434313Z",
     "shell.execute_reply": "2025-09-09T03:00:13.433807Z",
     "shell.execute_reply.started": "2025-09-09T03:00:10.202906Z"
    }
   },
   "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>529234.000000</td>\n",
       "      <td>500948.000000</td>\n",
       "      <td>334830.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.753549</td>\n",
       "      <td>0.405174</td>\n",
       "      <td>0.663413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.229448</td>\n",
       "      <td>0.279268</td>\n",
       "      <td>0.295007</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.150000</td>\n",
       "      <td>0.480000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>0.800000</td>\n",
       "      <td>0.400000</td>\n",
       "      <td>0.740000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.950000</td>\n",
       "      <td>0.660000</td>\n",
       "      <td>0.950000</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  529234.000000         500948.000000  334830.000000\n",
       "mean        0.753549              0.405174       0.663413\n",
       "std         0.229448              0.279268       0.295007\n",
       "min         0.000000              0.000000       0.000000\n",
       "25%         0.640000              0.150000       0.480000\n",
       "50%         0.800000              0.400000       0.740000\n",
       "75%         0.950000              0.660000       0.950000\n",
       "max         1.000000              1.000000       1.000000"
      ]
     },
     "execution_count": 85,
     "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": 86,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:13.437493Z",
     "iopub.status.busy": "2025-09-09T03:00:13.437011Z",
     "iopub.status.idle": "2025-09-09T03:00:13.725376Z",
     "shell.execute_reply": "2025-09-09T03:00:13.724881Z",
     "shell.execute_reply.started": "2025-09-09T03:00:13.437477Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.2900\n",
      "   10%: 0.4500\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": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABn3ElEQVR4nO3deXhU5f3//1d2EgKpJAEloUhZAkogQZASg5RF4QuiggougFIqgihqoVQRQRYNRUTWAoKiUBRRAUHAVlxRAsgmBdlkUQL9YBYFsk4yM78/+GVgSAJJJpmZ5H4+rovrMuecmfO+8wo475xz38fHbrfbBQAAAAAu8PV0AQAAAACqPhoLAAAAAC6jsQAAAADgMhoLAAAAAC6jsQAAAADgMhoLAAAAAC6jsQAAAADgMhoLAAAAAC6jsQAAAADgMhoLACinOXPmKCYmxi3nGjhwoAYOHOj4etu2bYqJidEnn3zilvM/++yz6tKli1vOVV5ZWVl6/vnndcsttygmJkYvvfSSp0uSJMXExGjOnDmeLqNMUlJSFBMTo1WrVpX7tW+88UYlVAbAm9FYAICkVatWKSYmxvEnNjZWiYmJGjJkiJYuXarMzMwKOc+ZM2c0Z84cHThwoELeryJ5c22lsXDhQq1evVoPPPCApk2bprvuuqvEYy0Wi95++23dfffdatOmjdq2batevXrphRde0NGjRx3H7dq1S3PmzNG5c+fcMYSr6tmzp+68884i2z/99FPFxMRowIABRfZ98MEHiomJ0TfffOOOEsvkq6++qnJNF4CS+Xu6AADwJiNHjlR0dLQKCgqUlpam7du36+WXX9Zbb72lf/7zn2revLnj2OHDh2vo0KFlev9ffvlFc+fOVVRUlFq0aFHq17njt79Xqm3y5Mmy2+2VXoMrtm7dqtatW+uJJ5646rEjR47U119/rV69eum+++5TQUGBjh07pi+//FLx8fFq3LixJGn37t2aO3eu+vTpo9q1a1f2EK7qpptu0gcffKDz58+rVq1aju27du2Sv7+//vvf/yo/P18BAQFO+/z8/BQXF1fq80RFRWnv3r3y96/cjwlfffWVli9frieffLJSzwPAPWgsAOASt956q2JjYx1fP/bYY0pOTtawYcP0+OOPa8OGDapRo4Ykyd/fv9I/eOXk5Cg4OFiBgYGVep6rufSDqrdKT09XkyZNrnrc3r179cUXX+iZZ57RsGHDnPZZrVavuTpRnJtuukkrV67Url271KlTJ8f2Xbt2qUePHvr444+1f/9+pyZi586diomJUWhoaKnP4+Pjo6CgoIosHYABuBUKAK6iQ4cOevzxx3Xq1CmtXbvWsb24ORbffvutHnjgAbVt21bx8fHq3r27ZsyYIenCvIh7771XkvTcc885brsqvI994MCBuuOOO7Rv3z499NBDat26teO1l8+xKGSz2TRjxgzdcsstiouL07Bhw/S///3P6ZguXbro2WefLfLaS9/zarUVN8ciOztbU6dOVadOndSyZUt1795db7zxRpErGzExMZo0aZI2bdqkO+64Qy1btlSvXr309ddfX+nb7pCenq6xY8cqISFBsbGxuvPOO7V69WrH/sL5JikpKfryyy8dtaekpBT7fidPnpQktWnTpsg+Pz8/XXPNNZIu5Dtt2jRJUteuXZ3ed8CAAcXekiRJ3bt315AhQ644pjNnzui5555TQkKC4/vxwQcfXPV7cdNNN0m60EgUysvL0/79+3X77berQYMGTvsyMjJ04sQJx+tKe+6S5lhs3LhRPXv2VGxsrO644w59+umnV5x/895776lbt25q2bKl7rnnHu3du9ex79lnn9Xy5cslyek2RABVF1csAKAU7rrrLs2YMUPffPON+vXrV+wxR44c0WOPPaaYmBiNHDlSgYGB+umnnxwf9Bo3bqyRI0dq9uzZ6t+/v+PD3qUfcH/77Tc9+uij6tWrl+68806Fh4dfsa758+fLx8dHjz76qNLT0/X222/rkUce0UcffeS4slIapantUna7XcOHD3c0JC1atNDmzZs1bdo0nTlzRmPHjnU6fufOnfrPf/6jBx98UDVr1tSyZcs0cuRIffHFF44P8sXJzc3VwIED9fPPP+uhhx5SdHS0PvnkEz377LM6d+6cHn74YTVu3FjTpk1TUlKSrr32Wg0ePFiSVKdOnWLfs379+pKkdevWqU2bNiVedbrtttt04sQJffzxx3ruueccddapU0d33XWXxo0bp8OHD6tZs2aO1+zdu1cnTpzQ8OHDSxxTWlqa+vXrJx8fHz300EOqU6eOvv76az3//PPKzMzUI488UuJrGzRooLp16zo1D4W3P8XHxys+Pl67du3Sn//8Z0kXG5DCHF0595dffqlnnnlGzZo106hRo3T27Fk9//zzqlevXrHHf/zxx8rKylL//v3l4+OjxYsX68knn9SmTZsUEBCg/v3765dfftG3337raOAAVG00FgBQCtdee61q1arl+G13cb799lvl5+dr0aJFxX6ojYiI0K233qrZs2crLi6u2MnFqampmjhxou6///5S1XX27Flt2LDBcZvLDTfcoKefflorV67UoEGDSjm60tV2qc8++0xbt27V008/7fgQ/dBDD2nkyJFaunSpBgwYoN///veO448ePaoNGzY4trVv31533XWX1q9fX+yE40Lvvfeejh49qldeecVxheD+++/XwIEDNXPmTN1zzz2KiIjQXXfdpVmzZqlevXpXrT0uLk4333yzVq5cqc8//1x//OMf1aZNG3Xu3NnRdEhS8+bNdcMNN+jjjz9Wt27dFB0d7djXo0cPTZ48WWvXrtXo0aMd29euXauQkBDdfvvtJZ7/tddek9Vq1bp16xzNygMPPKC//vWvmjt3ru6///4rNoVt2rTRl19+6ZhLsWvXLkVHR6tu3bqKj4/X3LlzHcfu3LlT0sUrHa6c+9VXX1W9evX07rvvqmbNmpIuXM0bOHCgoqKiihx/+vRp/ec//1FYWJgkqVGjRnr88cf1zTffqHPnzoqPj9f111+vb7/99qqZAagauBUKAEopJCREWVlZJe4vnNz72WefyWazlescgYGB6tu3b6mPv/vuu53une/Ro4ciIyP11Vdflev8pfX111/Lz8+vyO1Zf/7zn2W324vc5pSQkODUaDRv3lyhoaFXbNQKzxMZGak77rjDsS0gIEADBw5Udna2vvvuuzLX7uPjozfeeENPP/20ateurY8//liTJk1S586d9fTTT5dqjkWtWrXUtWtXrV+/3nHrl9Vq1caNG9W1a1eFhIQU+zq73a7//Oc/6tKli+x2uzIyMhx/EhMTdf78ee3fv/+K577pppuUm5vrOG7Xrl2Kj4+XdKHpSE9P14kTJyRdmHweHR2tevXquXTuM2fO6PDhw7r77rsdTYUk3XzzzU5XbC7Vs2dPR1MhSW3btpWkq2YOoOriigUAlFJ2dvYVb03q2bOn3n//fY0bN06vvvqqOnTooNtuu009evSQr2/pfo9Tr169Mk3UbtiwodPXPj4+atiwoU6dOlXq9yiPU6dOqW7dukUmBBeupnT5+a+77roi7xEWFnbVD/GnTp1Sw4YNi3z/Cs9z+vTpMtcuXWjghg8fruHDh+uXX37Rd999p6VLl2rjxo3y9/fX9OnTr/oed999tzZs2KAdO3aoXbt22rJli9LS0q742/eMjAydO3dO7733nt57770Sj7mSS+dZtG7dWrt379ZTTz0lSWrWrJlCQ0O1a9cuXXfdddq3b5969uzp8rkLv8+XNoeFGjZsqB9++KHI9sszL2wyvHlyPADX0FgAQCn83//9n86fP1/sB6tCNWrU0PLly7Vt2zZ9+eWX2rx5szZs2KD33ntPb775pvz8/K56nrLMi3CV1WotVU0VoaTzeMMStnXr1lWvXr10++2364477tAnn3yiqVOnXnXFr8TEREVERGjt2rVq166d1q5dq8jISCUkJJT4msIrWXfeeaf69OlT7DFXm8DcvHlz1axZUzt37lSnTp3022+/OeZQ+Pr6qnXr1tq5c6d+//vfKz8/39GIVMS5y8KbMwdQOWgsAKAUPvroI0kXPkxeia+vrzp06KAOHTroueee04IFC/Taa69p27ZtSkhIkI+PT4XW9dNPPzl9bbfb9dNPPzl9QCzpysDp06fVoEEDx9dlqS0qKkrJycnKzMx0umpx7Ngxx/6KEBUVpUOHDslmszldtSg8z6VzIlwVEBCgmJgYnThxQr/++qsiIyOv+D3x8/PTHXfcodWrV2v06NHatGmT+vXrd8VmrU6dOqpZs6ZsNtsVG5ArKXwmxa5du7Rz506FhoY63Y4UHx+vDRs2OK5mFTYWrpy78Pv8888/F9l3+c9gWVT03wcAnsUcCwC4iuTkZP3zn/9UdHR0iUuMShdWdLpc4YPmLBaLJCk4OFhSxd0OsmbNGqengn/yySdKTU3Vrbfe6tjWoEEDff/9944aJOmLL74osixtWWq79dZbZbVaHcuFFnrrrbfk4+PjdH5X3HrrrUpNTdWGDRsc2woKCrRs2TKFhISoXbt2ZX7PEydOFHsL1blz57R7926FhYU5Jt8Xfk/Onz9f7HvdddddOnv2rMaPH6/s7Owr/nxIF5qC7t2769///rcOHz5cZP/VboMq1KZNG2VkZGjVqlVq3bq1U9MVHx+v48eP67PPPtPvfvc7x21jrpy7Xr16atasmdasWeM0z2j79u3FvldpVfTfBwCexRULALjE119/rWPHjslqtSotLU3btm3Tt99+q/r162v+/PlXfGjYvHnztGPHDnXq1ElRUVFKT0/XO++8o2uvvdbxW+Pf//73ql27tlasWKGaNWsqJCRErVq1crpyUBZhYWF68MEH1bdvX8dysw0bNnRaEve+++7Tv//9b/3lL3/R//t//08///yz1q1bV+S2rrLU1qVLF7Vv316vvfaaTp06pZiYGH377bf67LPP9PDDD1/xlrGy6N+/v9577z09++yz2r9/v6KiovTvf/9bu3bt0tixY8v00LdCBw8e1OjRo9WxY0e1bdtWYWFhOnPmjNasWaNffvlFY8eOdVx1uPHGGyVdWE2pZ8+eCggIUOfOnR2Ts2+44QY1a9ZMn3zyiRo3buw4/kpGjRqlbdu2qV+/frrvvvvUpEkTnT17Vvv371dycrK2b99+1fco/HnavXt3kadWx8XFycfHR3v27FHnzp2drgq4cu5nnnlGjz/+uB544AH17dtX586d0/Lly9WsWbMrLmpwJYXfrylTpigxMVF+fn7q1atXud4LgOfRWADAJWbPni3pwm0xv/vd79SsWTONHTtWffv2veqH2C5duujUqVP68MMP9euvv+qaa67RzTffrCeffFK1atVyvO/UqVM1Y8YMvfjiiyooKFBSUlK5G4thw4bp0KFDev3115WVlaUOHTpowoQJjt8ES1LHjh317LPPasmSJXr55ZfVsmVLLViwQP/4xz+c3qsstfn6+mr+/PmaPXu2NmzYoFWrVikqKkpjxoxxPEOhItSoUUPLli3T9OnTtXr1amVmZqpRo0ZKSkoq0+pZl2rXrp1GjhypzZs3a8mSJfr1119Vs2ZNtWjRQqNHj1b37t0dx7Zq1UpPPfWUVqxYoc2bN8tms+mzzz5zWvXprrvu0iuvvFLqJVMjIiL0/vvva968efr000/17rvv6ne/+52aNGnitHTtlcTFxcnf318FBQWOFaEKhYaGqmnTpjp06JDTg/FcPXeXLl00Y8YMzZkzR6+++qquv/56JSUlac2aNTpy5Eip6r7c7bffroEDB2r9+vVau3at7HY7jQVQhfnYmUUFAEC5vf3220pKStLnn39eoXM+qoq77rpLderU0ZIlSzxdCgAPY44FAADlZLfb9cEHH6hdu3bVvqnIz89XQUGB07Zt27bp4MGDuvnmmz1UFQBvwq1QAACUUXZ2tj7//HNt27ZNhw8f1j//+U9Pl1Tpzpw5o8GD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kWMs7fbSjLEiv19l/T4Wd44r/ftV3rFX5PeR93Lve1W1enkvflbK8l7nT51QrVq15Ofn5/bPkWU5n4/dbrdXXinVx5kzZ3TrrbdqxYoVio+Pd2yfNm2avvvuO73//vserA4AAADwLF9PF1BVXHPNNfLz81N6uvO97enp6YqIiPBQVQAAAIB3oLEopcDAQN14441KTk52bLPZbEpOTna6ggEAAACYiDkWZTB48GD9/e9/V8uWLdWqVSu9/fbbysnJUd++fT1dGgAAAOBRNBZl0LNnT2VkZGj27NlKTU1VixYttHjxYm6FAgAAgPGYvA0AAADAZcyxAAAAAOAyGgsAAAAALqOxAAAAAOAyGgsAAAAALqOxqEaWL1+uLl26KDY2Vvfdd5/27t17xeM3btyoHj16KDY2Vr1799ZXX33lpkpRUcqS+cqVK/Xggw+qXbt2ateunR555JGr/ozA+5T173mh9evXKyYmRo8//nglV4iKVtbMz507p4kTJyoxMVEtW7ZU9+7d+fe9iilr5m+99Za6d++uVq1aqVOnTnr55ZeVl5fnpmrhqu+++07Dhg1TYmKiYmJitGnTpqu+Ztu2berTp49atmyp2267TatWrXJDpVdHY1FNbNiwQUlJSRoxYoRWr16t5s2ba8iQIUWeFF5o165dGjVqlO69916tWbNGXbt21YgRI3T48GE3V47yKmvm27ZtU69evbR06VKtWLFC1113nf785z/rzJkzbq4c5VXWzAulpKToH//4h9q2beumSlFRypq5xWLR4MGDderUKc2aNUuffPKJJk+erHr16rm5cpRXWTNft26dXn31VT3xxBPasGGDXnrpJW3YsEEzZsxwc+Uor+zsbMXExGjChAmlOv7kyZN67LHH1L59e3300Ud6+OGHNW7cOG3evLmSKy0FO6qFe++91z5x4kTH11ar1Z6YmGhfuHBhscc/9dRT9qFDhzptu+++++wvvPBCpdaJilPWzC9XUFBgj4+Pt69evbqSKkRFK0/mBQUF9v79+9tXrlxp//vf/24fPny4O0pFBSlr5u+88469a9eudovF4q4SUcHKmvnEiRPtgwYNctqWlJRkv//++yu1TlSOZs2a2T/99NMrHjNt2jR7r169nLY9/fTT9j//+c+VWVqpcMWiGrBYLNq/f78SEhIc23x9fZWQkKDdu3cX+5o9e/aoQ4cOTtsSExO1Z8+eyiwVFaQ8mV8uJydHBQUFCgsLq6wyUYHKm/m8efMUHh6u++67zx1logKVJ/PPP/9ccXFxmjRpkhISEnTHHXdowYIFslqt7iobLihP5vHx8dq/f7/jdqmTJ0/qq6++UqdOndxSM9zPmz/D8eTtauDXX3+V1WpVeHi40/bw8HAdO3as2NekpaUVeWJ4eHi40tLSKq1OVJzyZH656dOnq27duk7/A4P3Kk/mO3bs0AcffKA1a9a4oUJUtPJkfvLkSW3dulW9e/fW66+/rp9//lkTJ05UQUGBnnjiCXeUDReUJ/PevXvr119/1YMPPii73a6CggLdf//9GjZsmDtKhgcU9xkuIiJCmZmZys3NVY0aNTxUGXMsACO9/vrr2rBhg+bOnaugoCBPl4NKkJmZqTFjxmjy5MmqU6eOp8uBm9jtdoWHh2vy5Mlq2bKlevbsqWHDhmnFihWeLg2VZNu2bVq4cKEmTJigVatWae7cufrqq680b948T5cGA3HFohq45ppr5OfnV2RiV3p6epGOtlBERESRqxNXOh7epTyZF3rjjTf0+uuva8mSJWrevHlllokKVNbMT548qVOnTmn48OGObTabTZJ0ww036JNPPtHvf//7yi0aLinP3/PIyEj5+/vLz8/Pse0Pf/iDUlNTZbFYFBgYWKk1wzXlyXzWrFm68847Hbc7xsTEKDs7W+PHj9fw4cPl68vvkKub4j7DpaWlKTQ01KNXKySuWFQLgYGBuvHGG5WcnOzYZrPZlJycrPj4+GJfExcXp61btzpt27Jli+Li4iqzVFSQ8mQuSYsWLdI///lPLV68WLGxse4oFRWkrJn/4Q9/0Lp167RmzRrHny5duqh9+/Zas2aNrr32WneWj3Ioz9/zNm3a6Oeff3Y0kZJ04sQJRUZG0lRUAeXJPDc3t0jzUNhY2u32yisWHuPNn+FoLKqJwYMHa+XKlVq9erWOHj2qF198UTk5Oerbt68kacyYMXr11Vcdxw8aNEibN2/Wm2++qaNHj2rOnDnat2+fBgwY4KkhoIzKmvnrr7+uWbNm6eWXX1ZUVJRSU1OVmpqqrKwsTw0BZVSWzIOCgtSsWTOnP7Vr11bNmjXVrFkzPmRWEWX9e/7AAw/ot99+00svvaTjx4/ryy+/1MKFC/XQQw95aggoo7Jm3rlzZ7377rtav369Tp48qW+//VazZs1S586dna5cwXtlZWXpwIEDOnDggKQLS4QfOHBAp0+fliS9+uqrGjNmjOP4+++/XydPntS0adN09OhRLV++XBs3btQjjzziifKdcCtUNdGzZ09lZGRo9uzZSk1NVYsWLbR48WLHpdP//e9/Tr/RaNOmjaZPn66ZM2dqxowZuv766zVv3jw1a9bMU0NAGZU18xUrVig/P18jR450ep8nnnhCTz75pFtrR/mUNXNUfWXN/LrrrtMbb7yhpKQk3XnnnapXr54GDRqkRx991FNDQBmVNfPhw4fLx8dHM2fO1JkzZ1SnTh117txZzzzzjKeGgDLat2+fBg0a5Pg6KSlJktSnTx9NnTpVqamp+t///ufY36BBAy1cuFBJSUlaunSprr32Wk2ZMkUdO3Z0e+2X87FznQwAAACAi/jVFgAAAACX0VgAAAAAcBmNBQAAAACX0VgAAAAAcBmNBQAAAACX0VgAAAAAcBmNBQAAAACX0VgAAAAAcBmNBQDA7bZt26aYmBidO3fO06UUERMTo02bNpX6eG8eCwC4E40FAKBEGRkZmjBhgv70pz+pZcuWuuWWWzRkyBDt3LnTcUxZP4hXhKNHjyomJkZ79uxx2t6vXz/FxsYqLy/PsS0vL0+xsbF6//33S/Xe33zzjW699daKLFdz5szRXXfdVaHvCQDext/TBQAAvNeTTz6p/Px8TZ06VQ0aNFB6erqSk5P122+/ebSuxo0bKzIyUtu3b1dcXJwkKTMzUz/88IPCw8O1Z88etW/fXpK0e/duWSwW/fGPfyzVe0dGRlZW2QBQrXHFAgBQrHPnzmnHjh0aPXq0/vjHPyoqKkqtWrXSY489pq5du0qSunTpIkkaMWKEYmJi1KVLF6WkpKh58+b673//6/R+b731ljp37iybzVbs+Xbs2KEHH3xQrVq1UqdOnTRlyhRlZ2eXWF/79u21bds2x9c7d+7U9ddfr86dO2v79u2O7du3b1dUVJQaNGggSdq0aZP69Omj2NhYde3aVXPnzlVBQYHj+MuvwOzatUt33XWXYmNj1bdvX23atEkxMTE6cOCAUz379+9X37591bp1a91///06duyYJGnVqlWaO3euDh48qJiYGMXExGjVqlUlf+MBoIqisQAAFCskJEQhISHatGmTLBZLscd88MEHkqSkpCR98803+uCDDxQdHa2EhIQiH55XrVqlPn36yNe36P96fv75Zz366KO6/fbbtXbtWr322mvauXOnJk+eXGJ97du3165duxxNwbZt23TzzTfr5ptvdmo4tm3b5rh6sWPHDv3973/XoEGDtGHDBk2aNEmrVq3SggULij1HZmamhg8frmbNmmn16tV66qmn9MorrxR77GuvvaZnn31WH374ofz8/DR27FhJUs+ePfXnP/9ZTZs21TfffKNvvvlGPXv2LHFcAFBV0VgAAIrl7++vqVOnas2aNWrbtq3uv/9+zZgxQwcPHnQcU6dOHUlS7dq1FRkZ6fj63nvv1fr16x0Nyf79+3X48GH17du32HMtXLhQvXv31iOPPKLrr79ebdq00fPPP681a9Y4zZe4VPv27ZWdne24MrJ9+3a1a9dObdu21ffff6+8vDzl5uZq7969jsZi7ty5Gjp0qPr06aMGDRrolltu0VNPPaUVK1YUe45169ZJkqZMmaImTZqoU6dO+stf/lLssc8884xuvvlmNWnSREOHDtXu3buVl5enGjVqKCQkRH5+foqMjFRkZKRq1Khxxe89AFRFzLEAAJSoe/fu+tOf/qQdO3Zoz5492rx5sxYvXqwpU6aU2CRIUrdu3TRp0iR9+umn6tWrl1avXq327dsrOjq62OMPHjyoQ4cOOT7IS5LdbpfNZlNKSooaN25c5DUNGzbUtddeq+3bt6tp06Y6cOCAbr75ZoWHh6t+/fravXu37Ha7LBaLo7E4ePCgdu3a5XSFwmq1Ki8vTzk5OQoODnY6x/HjxxUTE6OgoCDHttjY2GLHEBMT4/jvwnka6enpql+/fonfJwCoTmgsAABXFBQUpFtuuUW33HKLRowYoeeff15z5sy5YmMRGBiou+++W6tWrdJtt92mdevW6fnnny/x+OzsbN1///0aOHBgkX3XXXddia8rvO0pJiZGDRs2VHh4uCSpXbt22rZtm+x2uxo2bOh4j+zsbD355JO6/fbbix2nK/z9L/4v1cfHR5JKnE8CANURjQUAoEyaNGniNLk5ICBAVqu1yHH33Xef7rjjDr3zzjuyWq3FfpgvdMMNN+jHH39Uw4YNy1RL+/bt9dJLL6lx48a6+eabHdvbtm2r999/X3a73XG1ovA8x48fL/V5GjVqpLVr18pisSgwMFCSikxKL42AgACaDADVHnMsAADF+vXXXzVo0CB99NFHOnjwoE6ePKmNGzdq8eLFjlWhJCkqKkrJyclKTU3V2bNnHdsbN26s1q1ba/r06erVq9cV5xU8+uij2r17tyZNmqQDBw7oxIkT2rRpkyZNmnTFGgvnWXz44YdOjcXNN9+s77//3ml+hXRh9aqPPvpIc+fO1ZEjR3T06FGtX79er732WrHv37t3b9ntdr3wwgs6evSoNm/erDfffFPSxasSpREVFaWUlBQdOHBAGRkZJU6GB4CqjMYCAFCsmjVrqnXr1nr77bc1YMAA9e7dW7NmzdJ9992n8ePHO477+9//ri1btuhPf/qT+vTp4/Qe9957r/Lz83XPPfdc8VzNmzfXsmXLdOLECT344IPq06ePZs+erbp1617xdQ0aNFBUVJSysrLUrl07x/b69eurbt26ys/Pd2o4OnbsqAULFuibb77Rvffeq379+umtt95SVFRUse8fGhqq+fPn68CBA7rrrrv02muvacSIEZLkuIJRGt27d1fHjh01aNAgdejQQR9//HGpXwsAVYWP3W63e7oIAED1NG/ePH3yySdOk7KrurVr12rs2LHasWMHqzsBwCWYYwEAqHBZWVk6deqUli9frqefftrT5bhkzZo1io6OVr169XTo0CFNnz5dPXr0oKkAgMvQWAAAKtzkyZP18ccfq1u3ble9Dcrbpaamavbs2UpNTVVkZKR69OihZ555xtNlAYDX4VYoAAAAAC5j8jYAAAAAl9FYAAAAAHAZjQUAAAAAl9FYAAAAAHAZjQUAAAAAl9FYAAAAAHAZjQUAAAAAl9FYAAAAAHAZjQUAAAAAl/1/mPIoAGDFO74AAAAASUVORK5CYII=",
      "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": 87,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:13.726103Z",
     "iopub.status.busy": "2025-09-09T03:00:13.725951Z",
     "iopub.status.idle": "2025-09-09T03:00:14.000123Z",
     "shell.execute_reply": "2025-09-09T03:00:13.999640Z",
     "shell.execute_reply.started": "2025-09-09T03:00:13.726088Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.0000\n",
      "   10%: 0.0000\n",
      "   20%: 0.1000\n",
      "   25%: 0.1500\n",
      "   50%: 0.4000\n",
      "   75%: 0.6600\n",
      "   80%: 0.7000\n",
      "   90%: 0.7600\n",
      "   95%: 0.8000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0ZUlEQVR4nO3deVxU9f4/8BczzLBLCqgllgaJFCKo5YVQbmZpmnXRXMo9yyXNFkvNvClqoFZe19TMNE0zyy1vWjf9ammAVkKmmWsWaClLLgPD7L8//HFk2GEGzpz5vJ6Ph49HnHPmnM9nXjPTvOecz+d42Gw2G4iIiIiIiBygkrsBRERERESkfCwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIiIiIjIYSwsiIicaMmSJYiIiGiQYw0dOhRDhw6V/j506BAiIiLw5ZdfNsjxp06dim7dujXIseqqsLAQr7/+Ou6//35ERETgzTfflLU9OTk5iIiIwNatWx3aT0REBJYsWeKkVhEROQcLCyKiSmzduhURERHSv3bt2iEhIQGjRo3CunXroNPpnHKcS5cuYcmSJThx4oRT9udMrty2mli5ciW2bduGJ598EvPnz8fjjz9e4Xa9evXCY489Vm75119/jYiICAwZMqTcus8++wwRERE4ePCg09tNRKREnnI3gIjI1U2cOBGhoaEwm83Iy8vD4cOHkZKSgrVr1+Ldd99F27ZtpW3HjRuH0aNH12r/ly9fxtKlS9GiRQtERkbW+HGrV6+u1XHqoqq2zZ49Gzabrd7b4IiMjAy0b98eEyZMqHK7jh074rPPPsP169cREBAgLT9y5Ag8PT3x888/w2QyQaPR2K1Tq9WIiYmpcXtatGiBo0ePwtOT//slIvfDMxZERNXo2rUrHn/8cfTr1w9jxozB6tWrsWbNGuTn5+O5555DcXGxtK2npye8vLzqtT16vR4AoNVqodVq6/VYVdFoNLIevyby8/PRqFGjarfr2LEjrFYrjhw5Yrf8yJEj6NmzJ4qLi3H8+HG7dT/++CMiIiLg7+9f4/Z4eHjAy8sLarW6yu2KiopqvE8iIlfBwoKIqA7i4uLw3HPP4cKFC/j888+l5RWNsfjuu+/w5JNPolOnToiNjUWPHj2wYMECADfGRTzxxBMAgNdee0267KrkGvyhQ4fi0UcfxbFjxzB48GC0b99eemzZMRYlrFYrFixYgPvvvx8xMTEYO3Ys/vzzT7ttunXrhqlTp5Z7bOl9Vte2isZYFBUVYe7cuUhMTERUVBR69OiB1atXlzuzERERgVmzZmHPnj149NFHERUVhd69e+Pbb7+t6mmX5OfnY9q0aYiPj0e7du3w2GOPYdu2bdL6kvEmOTk52L9/v9T2nJycCvfXsWNHALArLAwGA44fP46HH34YLVu2tFtXUFCA8+fPS48Dblw29tprryE+Pl7qz2effWZ3nIrGWEydOhWxsbH4448/8OyzzyI2NhavvPIKAMBoNCIlJQX/+Mc/EBsbi7Fjx+Kvv/4q1/6S193vv/+OqVOnolOnTujYsSNee+01qRAtbceOHejbty+io6Nx33334aWXXir3Gjl//jyef/553H///WjXrh26du2Kl156CdevX5e2qeq1TUTi4blYIqI6evzxx7FgwQIcPHgQAwYMqHCb06dPY8yYMYiIiMDEiROh1Wrx+++/S19Sw8LCMHHiRCxevBgDBw6Uvqh26NBB2seVK1fw7LPPonfv3njssccQFBRUZbuWL18ODw8PPPvss8jPz8eHH36IESNGYMeOHfD29q5x/2rSttJsNhvGjRsnFSSRkZE4cOAA5s+fj0uXLmHatGl22//444/43//+h6eeegp+fn5Yv349Jk6ciH379qFx48aVtqu4uBhDhw7FH3/8gcGDByM0NBRffvklpk6dimvXrmH48OEICwvD/PnzkZqaiubNm2PkyJEAgCZNmlS4z5YtW6Jp06Z2xUPJ5U+xsbGIjY3FkSNH8PTTTwO4WYCUPBd5eXkYMGAAPDw8MHjwYDRp0gTffvstXn/9deh0OowYMaLK59psNmPUqFHo2LEjpkyZIuX0+uuv4/PPP8ejjz6KDh06ICMjo8pL7V588UWEhobi5Zdfxi+//IJPP/0UTZo0wauvvipts3z5cixatAiPPPIInnjiCRQUFOCjjz7C4MGDsX37djRq1AhGoxGjRo2C0WjEkCFDEBwcjEuXLmH//v24du0aAgICqn1tE5F4WFgQEdVR8+bNERAQgOzs7Eq3+e6772AymbBq1aoKv9QGBweja9euWLx4MWJiYiocXJybm4vk5GQMGjSoRu26evUqdu3aJV2i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+HGkp6fj8OHDtW5LZGQkHn30UWzcuBHXr19HbGwsMjIyyp2Rqo3bb78dL774It555x1cuHAB3bt3h5+fH3JycrBnzx4MGDAAo0aNQkZGBmbNmoWePXuiVatWsFgs2LFjh1REATV7bRORWFhYEBFVY/HixQBuzDx0yy23oE2bNpg2bRr69u1b7ZfYbt264cKFC9iyZQv+/vtvNG7cGPfddx+ef/55aRCsRqPB3LlzsWDBAsycORNmsxmpqal1LizGjh2LkydP4r333kNhYSHi4uIwY8YM6ewDAHTp0gVTp07FmjVrkJKSgqioKKxYsQLz5s2z21dt2qZSqbB8+XIsXrwYu3btwtatW9GiRQtMnjxZuv+DM3h7e2P9+vV4++23sW3bNuh0OrRu3Rqpqam1mj2rIjExMfD09ITZbJZmhCrh7++Pu+66CydPniz3xTk4OBiffvopli1bhq+//hoff/wxbrnlFoSHh0s3u6uLlJQUNG7cGDt37sTevXvRuXNnvPfee0hMTKzzPkePHo1WrVph7dq1WLZsGYAbUyfff//90g0PIyIikJCQgH379uHSpUvw8fFBREQEVq1ahZiYGAA1e20TkVg8bHKNkiMiIiIiIrfBMRZEREREROQwFhZEREREROQwFhZEREREROQwFhZEREREROQwFhZEREREROQwFhZEREREROQwFhZEREREROQwFhZEREREROQw3nnbyfLzr0OuWw76+XmhsNAgz8FJVsxeTMxdXMxeXMxeTHLm7uEBBAUF1GhbFhZOZrNBtsKi5PgkJmYvJuYuLmYvLmYvJiXkzkuhiIiIiIjIYSwsiIiIiIjIYR42mxJOrChHXp58YyyIiIiIiJzJwwMIDq7ZGAuesXAjKpWH3E0gmTB7MTF3cTF7cTF7MSkldxYWbsTXVyt3E0gmzF5MzF1czF5czF5MSsmdhQURERERETmMhQURERERETmMhYUb4aBxcTF7MTF3cTF7cTF7MSkld84K5WScFYqIiIiI3AVnhRKUWs04RcXsxcTcxcXsxcXsxaSU3JXRSqoRHx+N3E0gmTB7MTF3cTF7cTF7MSkldxYWRERERETkMBYWRERERETkMBYWbsRq5ahxUTF7MTF3cTF7cTF7MSkld84K5WScFYqIiIiI3AVnhRKUp6da7iaQTJi9mJi7uJi9uJi9mJSSu6yFhcVi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tc2e3Edts7/11luxevVqpKam4rHHHkOzZs0wbNgwPPvss3J1geqottmPGzcOHh4eWLhwIS5duoQmTZrggQcewEsvvSRXF6gOjh07hmHDhkl/p6amAgCSkpIwd+5c5Obm4s8//5TWt2zZEitXrkRqairWrVuH5s2bY86cOejSpUuDt70sDxvPlRERERERkYP4cxcRERERETmMhQURERERETmMhQURERERETmMhQURERERETmMhQURERERETmMhQURERERETmMhQURERERETmMhQURERERETmMhQURkQC6deuGtWvX1vpxS5YsweOPP+78BlGVDh06hIiICFy7dk3uphAR1RgLCyIiAXz22WcYOHCg3M1wWzk5OYiIiMCJEyecsr/Y2FgcPHgQAQEBNX7M1KlT8dxzzznl+EREdcHCgohIAE2aNIGPj0+l600mUwO2RlxGo7FG22m1WoSEhMDDw6OeW0RE5DwsLIiIXNC+ffvQqVMnWCwWAMCJEycQERGBt99+W9rm9ddfxyuvvAIA+OGHH/DUU08hOjoaiYmJmDNnDoqKiqRty14KFRERgY0bN2Ls2LGIiYnBihUrAADvvfce4uPjERsbi2nTpsFgMNi1q+RX8dWrVyMhIQGdO3dGcnKyXWFiNBoxb948dOnSBTExMejfvz8OHTokrb9w4QLGjh2Le++9FzExMejduze++eYbAMDVq1cxadIk/OMf/0B0dDQefvhhbNmypUbP2V9//YWXX34Z9913H2JiYtC3b1/89NNP0vqNGzeie/fuiIqKQo8ePbB9+3a7x0dERODTTz/F+PHj0b59ezz88MPYu3evtL6qtj344IMAgH/961+IiIjA0KFD7Z6v5cuXIyEhAT179gQAbN++HX379kVsbCzuv/9+TJo0Cfn5+dKxyl4KtXXrVnTq1AkHDhzAI488gtjYWIwaNQqXL18GcOOStW3btmHv3r2IiIhARESE3XNORNQQPOVuABERldepUycUFhbil19+Qbt27XD48GE0btwYhw8flrb5/vvv8eyzz+KPP/7As88+ixdeeAEpKSkoKCjA7NmzMXv2bKSmplZ6jKVLl2LSpEl4/fXXoVarsWvXLixZsgRvvPEGOnbsiB07dmD9+vVo2bKl3eMOHTqEkJAQfPjhh/jjjz/w0ksvITIyEgMGDAAAzJo1C2fOnMF//vMf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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[\"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": 88,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-09T03:00:14.000820Z",
     "iopub.status.busy": "2025-09-09T03:00:14.000670Z",
     "iopub.status.idle": "2025-09-09T03:00:14.257126Z",
     "shell.execute_reply": "2025-09-09T03:00:14.256651Z",
     "shell.execute_reply.started": "2025-09-09T03:00:14.000805Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentiles:\n",
      "    5%: 0.1000\n",
      "   10%: 0.2000\n",
      "   20%: 0.4000\n",
      "   25%: 0.4800\n",
      "   50%: 0.7400\n",
      "   75%: 0.9500\n",
      "   80%: 1.0000\n",
      "   90%: 1.0000\n",
      "   95%: 1.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "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uQ+sG+Ib+6rUxTeWVW2rouVl18mttu9zVTdCExERkbhYWPzP77//DpvNVu6Sp4CAAJw+fbrG2/HwqOue1YxWq4W/vz+uXziLfE+ttPzKuRPw8/VFj1FTcFvLYKfX5BzNwk9//wwGvQ7eZV7jabdU+JrS9rfuAwBKCi7B39+/3LZ8vL0qXF7VutLlt+6ndB9V7b8uX1PTftXX/uUe/63L//ufQ2jStCmmTXsZFVH7+Ll/7p/75/65f+5fjv1fv3AW/v7+0Gq1shxn1mafHg6Hw1F/XWk8Ll26hB49eiAtLQ3R0dHS8gULFuDHH3/E559/LmPviIiIiIiUTSN3B5Ti9ttvh1arRX6+843M+fn5CAwMlKlXRERERESNAwuL/9Hr9bj33nuRmZkpLbPb7cjMzHQ6g0FEREREROXxHosyxowZg1dffRXh4eGIjIzEunXrYDKZMGDAALm7RkRERESkaCwsyujTpw8KCgqwZMkS5ObmIiwsDKtXr+alUERERERE1eDN20RERERE5DbeY0FERERERG5jYUFERERERG5jYUFERERERG5jYUFERERERG5jYdGIpKamomfPnoiIiMCgQYNw+PDhKttv374djzzyCCIiIvD4449j165dDdRTqku1yX3Dhg145plncP/99+P+++/H6NGjq/2ckHLV9ne+1Ndff43Q0FBMmjSpnntI9aW22V+7dg2JiYmIj49HeHg4evfuzX/zG6naZr927Vr07t0bkZGRSEhIwLx581BSUtJAvaW68OOPP2LChAmIj49HaGgodu7cWe1r9u3bh/79+yM8PBwPP/wwNm3a1AA9rR4Li0Zi27ZtSEpKwuTJk7F582Z06tQJY8eOLfek8FI//fQTXnnlFTz11FPYsmULHnroIUyePBm//vprA/ec3FHb3Pft24e+ffsiJSUFaWlpaNWqFZ599llcunSpgXtO7qpt9qVycnLw9ttvo2vXrg3UU6prtc3ebDZjzJgxuHDhAt5//33s2LEDc+bMQYsWLRq45+Su2ma/detWvPvuu5gyZQq2bduGt956C9u2bcOiRYsauOfkjqKiIoSGhmLWrFk1ap+dnY3x48cjJiYGX375JUaNGoWZM2ciPT29nntaAw5qFJ566ilHYmKi9LPNZnPEx8c7Vq5cWWH7F1980TFu3DinZYMGDXL89a9/rdd+Ut2qbe63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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": 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
}
