{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:21.040680Z",
     "start_time": "2024-05-16T13:58:19.777010Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:14:22.619680Z",
     "iopub.status.busy": "2025-03-20T20:14:22.619548Z",
     "iopub.status.idle": "2025-03-20T20:14:26.463647Z",
     "shell.execute_reply": "2025-03-20T20:14:26.463110Z",
     "shell.execute_reply.started": "2025-03-20T20:14:22.619666Z"
    }
   },
   "outputs": [],
   "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_4min_30b_task 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": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:21.082172Z",
     "start_time": "2024-05-16T13:58:21.041926Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:14:26.465664Z",
     "iopub.status.busy": "2025-03-20T20:14:26.465537Z",
     "iopub.status.idle": "2025-03-20T20:14:26.524781Z",
     "shell.execute_reply": "2025-03-20T20:14:26.524341Z",
     "shell.execute_reply.started": "2025-03-20T20:14:26.465651Z"
    }
   },
   "outputs": [],
   "source": [
    "OUT_DATA_DIR = \"/app/suno/data/dpo/30b_t6_v34\"\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 = \"/app/suno/data/dpo/30b_npz\"\n",
    "# NOTE FOR 30b we increase this from 6016 up\n",
    "N_TOKENS_AUDIO = 6016"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:53.962528Z",
     "start_time": "2024-05-16T13:58:21.105919Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:14:26.526478Z",
     "iopub.status.busy": "2025-03-20T20:14:26.526352Z",
     "iopub.status.idle": "2025-03-20T20:15:20.749130Z",
     "shell.execute_reply": "2025-03-20T20:15:20.748547Z",
     "shell.execute_reply.started": "2025-03-20T20:14:26.526465Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preference data shape (1705756, 90)\n"
     ]
    }
   ],
   "source": [
    "df = pd.read_pickle(\n",
    "    # \"/home/tony/Data/Preference/30b_v3/interesting_clips_v4_t_4_20240923_full_with_sem_distance_and_similarity.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v2/interesting_clips_v4_t_3_20240919_full_l10_with_cer.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v3/interesting_clips_v4_t_4_20240925_full_l10_with_cer.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v5/interesting_clips_v4_t_5_20241029_full_with_cer.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241117_full_with_cer.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241118_full.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250222_full.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250301_full.pkl\"\n",
    "    \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250227_full_long.pkl\"\n",
    "    # \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250107_full.pkl\"\n",
    ")  # , engine='python')\n",
    "# df = pd.read_csv(\n",
    "#     \"/home/tony/Data/Preference/30b_v0/interesting_clips_v4_t_1_20240808.csv\"\n",
    "# )  # , engine='python')\n",
    "print(\"Preference data shape\", df.shape)\n",
    "\n",
    "# df_cover = pd.read_pickle(\n",
    "#     \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241109_full_with_sem_distance_and_similarity.pkl\"\n",
    "# )\n",
    "# print(df_cover.shape)\n",
    "\n",
    "# df_artist = pd.read_pickle(\n",
    "#     \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241109_full_with_sem_distance_and_similarity_artist.pkl\"\n",
    "# )\n",
    "# print(df_cover.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:15:20.751109Z",
     "iopub.status.busy": "2025-03-20T20:15:20.750979Z",
     "iopub.status.idle": "2025-03-20T20:15:21.096600Z",
     "shell.execute_reply": "2025-03-20T20:15:21.096129Z",
     "shell.execute_reply.started": "2025-03-20T20:15:20.751095Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_cover[df_cover[\"preference\"]][\"similarity\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# df_cover[\"similarity_diff\"] = df_cover[\"similarity\"].diff()\n",
    "# df_cover[df_cover[\"preference\"]][\"similarity_diff\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# df_cover[\"continued_parent\"] = None\n",
    "# df_cover[\"continue_at\"] = -1\n",
    "# df_cover[df_cover[\"preference\"]][\"similarity\"].describe()\n",
    "# df_cover_drops_id = df_cover[\n",
    "#     (df_cover[\"preference\"])\n",
    "#     & (~((0.1 < df_cover[\"similarity\"]) & (df_cover[\"similarity\"] <= 0.99)))\n",
    "# ][\"s3_id\"].unique()\n",
    "# print(len(df_cover_drops_id))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:15:21.098340Z",
     "iopub.status.busy": "2025-03-20T20:15:21.098214Z",
     "iopub.status.idle": "2025-03-20T20:15:21.111961Z",
     "shell.execute_reply": "2025-03-20T20:15:21.111529Z",
     "shell.execute_reply.started": "2025-03-20T20:15:21.098326Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_artist[df_artist[\"preference\"]][\"similarity\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# df_artist[\"similarity_diff\"] = df_artist[\"similarity\"].diff()\n",
    "# df_artist[df_artist[\"preference\"]][\"similarity_diff\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# df_artist[\"continued_parent\"] = None\n",
    "# df_artist[\"continue_at\"] = -1\n",
    "# df_artist[df_artist[\"preference\"]][\"similarity\"].describe()\n",
    "# df_artist_drops_id = df_artist[\n",
    "#     (df_artist[\"preference\"])\n",
    "#     & ((~((0 < df_artist[\"similarity\"]) & (df_artist[\"similarity\"] <= 0.99)))\n",
    "#     | (~(df_artist[\"similarity_diff\"] > -0.2)))\n",
    "# ][\"s3_id\"].unique()\n",
    "# print(len(df_artist_drops_id))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:15:21.113660Z",
     "iopub.status.busy": "2025-03-20T20:15:21.113533Z",
     "iopub.status.idle": "2025-03-20T20:15:21.125046Z",
     "shell.execute_reply": "2025-03-20T20:15:21.124618Z",
     "shell.execute_reply.started": "2025-03-20T20:15:21.113647Z"
    }
   },
   "outputs": [],
   "source": [
    "# print(\"before filter on cover similarity\", df.shape)\n",
    "# df = df[~df[\"s3_id\"].isin(df_cover_drops_id)].copy()\n",
    "# print(\"after filter on cover similarity\", df.shape)\n",
    "# df = df[~df[\"s3_id\"].isin(df_artist_drops_id)].copy()\n",
    "# print(\"after filter on artist similarity\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:15:21.126691Z",
     "iopub.status.busy": "2025-03-20T20:15:21.126566Z",
     "iopub.status.idle": "2025-03-20T20:15:31.943706Z",
     "shell.execute_reply": "2025-03-20T20:15:31.943122Z",
     "shell.execute_reply.started": "2025-03-20T20:15:21.126678Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after dropna (1705756, 85)\n"
     ]
    }
   ],
   "source": [
    "df = df.dropna(axis=1, how=\"all\")\n",
    "print(\"after dropna\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.199480Z",
     "start_time": "2024-05-16T13:58:53.963687Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:15:31.944427Z",
     "iopub.status.busy": "2025-03-20T20:15:31.944276Z",
     "iopub.status.idle": "2025-03-20T20:17:51.270886Z",
     "shell.execute_reply": "2025-03-20T20:17:51.270121Z",
     "shell.execute_reply.started": "2025-03-20T20:15:31.944412Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4872143\n",
      "4872143\n",
      "pre-downloaded df (1705756, 85)\n",
      "downloaded df (1705756, 85)\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": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.467253Z",
     "start_time": "2024-05-16T13:58:56.207647Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:51.271813Z",
     "iopub.status.busy": "2025-03-20T20:17:51.271632Z",
     "iopub.status.idle": "2025-03-20T20:17:52.714796Z",
     "shell.execute_reply": "2025-03-20T20:17:52.714179Z",
     "shell.execute_reply.started": "2025-03-20T20:17:51.271796Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "is_30b\n",
      "True    1705756\n",
      "Name: count, dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "task\n",
       "cover                 768166\n",
       "artist_consistency    721170\n",
       "infill                131330\n",
       "                       64594\n",
       "extend                 17220\n",
       "upload_extend           3174\n",
       "infill_intro              98\n",
       "artist_cover               4\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"is_30b\"] = df[\"model_name\"].str.contains(\"-t\")\n",
    "print(df[\"is_30b\"].value_counts())\n",
    "df[\"task\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LET's do the data prep"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:52.715693Z",
     "iopub.status.busy": "2025-03-20T20:17:52.715519Z",
     "iopub.status.idle": "2025-03-20T20:17:52.732265Z",
     "shell.execute_reply": "2025-03-20T20:17:52.731701Z",
     "shell.execute_reply.started": "2025-03-20T20:17:52.715676Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1705756, 86)\n"
     ]
    }
   ],
   "source": [
    "# drop extend for now\n",
    "# reason is -- cause they are likely caused by extend from 13b\n",
    "# we don't want contamination\n",
    "# df = df[df[\"task\"] != \"extend\"].copy()\n",
    "print(df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.592883Z",
     "start_time": "2024-05-16T13:58:56.470781Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:52.733063Z",
     "iopub.status.busy": "2025-03-20T20:17:52.732911Z",
     "iopub.status.idle": "2025-03-20T20:17:53.572077Z",
     "shell.execute_reply": "2025-03-20T20:17:53.571330Z",
     "shell.execute_reply.started": "2025-03-20T20:17:52.733047Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "preference  model_name    \n",
      "False       chirp-v4-h-t-6    852878\n",
      "True        chirp-v4-h-t-6    852878\n",
      "Name: count, dtype: int64\n",
      "before filter on model name (1705756, 86)\n",
      "after filter on model name (1705756, 86)\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-v4-h-t-6\", \"chirp-v3p5-engine-t-6\"])]\n",
    "# df = df[df[\"model_name\"].isin([\"chirp-v3p5-engine-t-6\"])]\n",
    "print(\"after filter on model name\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:53.572996Z",
     "iopub.status.busy": "2025-03-20T20:17:53.572827Z",
     "iopub.status.idle": "2025-03-20T20:17:53.596310Z",
     "shell.execute_reply": "2025-03-20T20:17:53.595725Z",
     "shell.execute_reply.started": "2025-03-20T20:17:53.572977Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "is_public\n",
      "False    1645495\n",
      "True       60261\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df[\"is_public\"].value_counts())\n",
    "# remove public for now cause fucking users\n",
    "# df = df[~df[\"is_public\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:58:56.909539Z",
     "start_time": "2024-05-16T13:58:56.595736Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:53.597088Z",
     "iopub.status.busy": "2025-03-20T20:17:53.596936Z",
     "iopub.status.idle": "2025-03-20T20:17:56.247824Z",
     "shell.execute_reply": "2025-03-20T20:17:56.247019Z",
     "shell.execute_reply.started": "2025-03-20T20:17:53.597073Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "before filter on request id pairs (1705756, 86)\n",
      "after filter on request id pairs (1705756, 86)\n",
      "preference  model_name    \n",
      "False       chirp-v4-h-t-6    852878\n",
      "True        chirp-v4-h-t-6    852878\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": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:17:56.248782Z",
     "iopub.status.busy": "2025-03-20T20:17:56.248602Z",
     "iopub.status.idle": "2025-03-20T20:23:43.102711Z",
     "shell.execute_reply": "2025-03-20T20:23:43.101954Z",
     "shell.execute_reply.started": "2025-03-20T20:17:56.248765Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique_requests 852878\n",
      "before removing duplicates (1705756, 150)\n",
      "after removing duplicates (1705756, 143)\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": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:23:43.103635Z",
     "iopub.status.busy": "2025-03-20T20:23:43.103461Z",
     "iopub.status.idle": "2025-03-20T20:23:43.880658Z",
     "shell.execute_reply": "2025-03-20T20:23:43.880120Z",
     "shell.execute_reply.started": "2025-03-20T20:23:43.103618Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "task\n",
       "cover                 768166\n",
       "artist_consistency    721170\n",
       "infill                131330\n",
       "                       64594\n",
       "extend                 17220\n",
       "upload_extend           3174\n",
       "infill_intro              98\n",
       "artist_cover               4\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"task\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:23:43.881441Z",
     "iopub.status.busy": "2025-03-20T20:23:43.881283Z",
     "iopub.status.idle": "2025-03-20T20:23:48.072815Z",
     "shell.execute_reply": "2025-03-20T20:23:48.072197Z",
     "shell.execute_reply.started": "2025-03-20T20:23:43.881426Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pos_diff_preference\n",
       "1.0    570420\n",
       "2.0    282458\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 16,
     "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": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:23:48.073685Z",
     "iopub.status.busy": "2025-03-20T20:23:48.073520Z",
     "iopub.status.idle": "2025-03-20T20:23:49.564713Z",
     "shell.execute_reply": "2025-03-20T20:23:49.564009Z",
     "shell.execute_reply.started": "2025-03-20T20:23:48.073670Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive param_experiment\n",
      "step_8              25601\n",
      "temp_s_80           20639\n",
      "temp_s_70           20207\n",
      "text_1              20029\n",
      "text_3              17313\n",
      "step_16             13928\n",
      "step_12             11579\n",
      "step_10              9991\n",
      "temp_s_90            8383\n",
      "step_16_text_1       7851\n",
      "adjust_cfg_steps     5654\n",
      "text_15              5424\n",
      "temp_s_95            5412\n",
      "text_25              4335\n",
      "min_p_0001           1748\n",
      "min_p_002            1643\n",
      "s_20_t_12            1260\n",
      "s_10_t_12            1213\n",
      "text_2               1034\n",
      "min_p_005             665\n",
      "min_p_02              664\n",
      "min_p_01              654\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": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:23:49.568824Z",
     "iopub.status.busy": "2025-03-20T20:23:49.568511Z",
     "iopub.status.idle": "2025-03-20T20:23:49.585611Z",
     "shell.execute_reply": "2025-03-20T20:23:49.585061Z",
     "shell.execute_reply.started": "2025-03-20T20:23:49.568804Z"
    }
   },
   "outputs": [],
   "source": [
    "# df[df[\"preference\"]][\"cer_diff_preference\"].hist(bins=50)\n",
    "# print(df[df[\"preference\"]][\"cer_diff_preference\"].quantile(0.95))\n",
    "# plt.show()\n",
    "# print(df[df[\"preference\"]][\"cer\"].hist(bins=50))\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:40.799375Z",
     "start_time": "2024-05-16T13:59:36.394236Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:23:49.586385Z",
     "iopub.status.busy": "2025-03-20T20:23:49.586234Z",
     "iopub.status.idle": "2025-03-20T20:24:08.098903Z",
     "shell.execute_reply": "2025-03-20T20:24:08.098166Z",
     "shell.execute_reply.started": "2025-03-20T20:23:49.586370Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "62542\n",
      "good_continue_at\n",
      "True     1705154\n",
      "False        602\n",
      "Name: count, dtype: int64\n",
      "\n",
      " Check some basics... \n",
      " preference\n",
      "False    852878\n",
      "True     852878\n",
      "Name: count, dtype: int64 is_30b\n",
      "True    1705756\n",
      "Name: count, dtype: int64 model_name\n",
      "chirp-v4-h-t-6    1705756\n",
      "Name: count, dtype: int64 preference  model_name    \n",
      "False       chirp-v4-h-t-6    852878\n",
      "True        chirp-v4-h-t-6    852878\n",
      "Name: count, dtype: int64\n",
      "task\n",
      "cover                 768166\n",
      "artist_consistency    721170\n",
      "infill                131330\n",
      "                       64594\n",
      "extend                 17220\n",
      "upload_extend           3174\n",
      "infill_intro              98\n",
      "artist_cover               4\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[\"is_30b\"].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\"] = (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\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:08.099823Z",
     "iopub.status.busy": "2025-03-20T20:24:08.099657Z",
     "iopub.status.idle": "2025-03-20T20:24:08.377857Z",
     "shell.execute_reply": "2025-03-20T20:24:08.377272Z",
     "shell.execute_reply.started": "2025-03-20T20:24:08.099807Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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v7ymu4cBAF2CE48BAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABjJ6yGnsbFRq1at0ne+8x2lpKRo9OjReu6552RZ/7gs1bIsrV69Wi6XSykpKZo8ebI+++wzj9c5ceKEZs+erfT0dGVkZGjOnDmqq6vzaPPxxx/rnnvuUXJyskaNGqUNGzZ4uxwAABCgvB5yNmzYoF//+teaN2+e3nzzTT322GN64YUXtHnzZo82mzdv1oIFC7Rt2zb17t1bU6dO1dmzZ+02jz32mMrKypSXl6d169bp/fff17x58+z1tbW1mjp1qgYMGKDt27crOztba9eu1csvv+ztkgAAQADyesgpLCzULbfcoptuuklxcXG644475HK5VFxcLOn8LE5+fr4eeughjR49WomJiVq+fLmOHTumt99+W5J06NAh7d69W4sXL9awYcOUkZGhnJwc7dixQ19++aUk6fXXX1d9fb2WLFmi6667TllZWbr//vuVl5fn7ZIAAEAA8nrISUtL0969e3X48GFJ5w8pffDBB/r2t78tSTp69KgqKiqUmZlpPyc8PFzDhg1TYWGhpPNBKSIiQsnJyXabzMxMOZ1OOywVFRUpIyNDoaGhdhuXy6XDhw+rurq6U2N2OHz34+v+/OWHurt3DL7+/+APdffEbU3d1N2T6u4Ir3/j8fTp01VbW6vvfve7CgoKUmNjox599FHdddddkqSKigpJUnR0tMfzoqOjVVlZKUmqrKzUVVdd5TnQ4GBFRkbaz6+srFRcXJxHm5iYGHtdZGRkh8ccHR3eiQovn6/78xfU7f+iovp47bUCqW5v6Yk1S9Td0wRS3V4POTt37tQbb7yhlStXavDgwSotLdXSpUvVr18/jR071tvdeUVV1UlZPrhdj8NxfufwVX/+grq7t+6gIGeHw8tXX9WpsdF9Wf35S92+1BNrlqiburt/LO3xeshZvny5pk+frqysLElSQkKCysvLtX79eo0dO1axsbGSpKqqKvXr189+XlVVlRITEyWdn5E5fvy4x+s2NDSourrafn5MTIw989Ok6XHTjE5HWZZ8usF83Z+/oO7A4K2xBlrd3tATa5aou6cJpLq9fk7OmTNn5Gh2sCwoKMi+hDwuLk6xsbHas2ePvb62tlYffvih0tLSJJ0/r6empkYlJSV2m71798rtdislJUWSlJqaqvfff1/19fV2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/ve/+27wl6G1kPPQQw+1+hwT6q6qqrKGDBlivffee5ZldWy/3rVrl5WYmGhVVFTYbbZs2WKlp6dbZ8+e9en4L1Xzui3r/Aff4sWLW32OCXVblmXdeOON1rZt23rMtm7SVLdlBf625nCVD5w7d0779+9XZmamvczpdCozM1OFhYXdODLv+vzzz+VyuXTLLbdo9uzZKi8vlySVlJSovr7eo/74+HgNGDBARUVF3TRa7zt69KgqKio86gwPD9ewYcPs7VxYWKiIiAglJyfbbTIzM+V0OgP+8OV7772nESNG6Pbbb9f8+fP11Vdf2etMqPvkyZOSpMjISEkd26+Lioo0ZMgQjy8odblcqq2tVVlZme8Gfxma193kjTfe0PDhw3XnnXdq5cqVOn36tL0u0OtubGzUjh07dOrUKaWlpfWYbd287iaBvK0D+huPA8VXX32lxsZGRUdHeyyPjo6+6Fh3oEpJSdHSpUs1aNAgVVRU6LnnntO9996rN954Q5WVlQoJCVFERITHc6Kjo1VRUdFNI/a+plpa2s5Nx+4rKyt11VVXeawPDg5WZGRkQP8uRo4cqVtvvVVxcXE6cuSInnnmGU2bNk0vv/yygoKCAr5ut9utJUuWKD09XUOGDJGkDu3XlZWVF30De9PjQK1bku68804NGDBA/fr104EDB7RixQodPnxYa9eulRS4dR84cEB33323zp49qyuvvFLPPfecBg8erNLSUqO3dWt1S4G/rQk58IpRo0bZ/05MTNSwYcN08803a+fOnbriiiu6cWTwhaysLPvfTScnjh492p7dCXS5ubk6ePCgtmzZ0t1D8anW6p4wYYL974SEBMXGxmry5Mn64osv9P/+3//z9TC9ZtCgQXrttdd08uRJ/f73v9cTTzyhF198sbuH1eVaq3vw4MEBv605XOUDUVFRCgoKUlVVlcfyqqoqY++zFRERoWuvvVZffPGFYmJiVF9fr5qaGo82VVVVio2N7aYRel9TLW1t55iYGB0/ftxjfUNDg6qrq436XQwcOFBRUVH6/PPPJQV23QsXLtSuXbu0adMmXX311fbyjuzXMTExF12B0/Q4UOtuybBhwyTJY3sHYt2hoaH6+te/rqSkJM2ePVuJiYnKz883flu3VndLAm1bE3J8IDQ0VEOHDtWePXvsZW63W3v27PE47mmSuro6HTlyRLGxsUpKSlJISIhH/Z9++qnKy8uVmprafYP0sri4OMXGxnrUWVtbqw8//NDezmlpaaqpqVFJSYndZu/evXK73UpJSfH5mLvK3//+d504ccJ+kwvEui3L0sKFC/XWW29p06ZNGjhwoMf6juzXqamp+uSTTzyCb0FBgcLCwuzDAf6mvbpbUlpaKukfH2qBWHdL3G63zp07Z+y2bk1T3S0JtG3N4SofmTJlip544gklJSUpJSVFmzZt0unTpzVu3LjuHppXPP3007r55ps1YMAAHTt2TM8++6ycTqfuvPNOhYeHa/z48Vq2bJkiIyMVFhamxYsXKy0tLeBCTl1dnb744gv78dGjR1VaWqrIyEgNGDBAEydO1PPPP6+vf/3riouL0+rVq9WvXz+NHj1a0vmTFUeOHKm5c+cqNzdX9fX1WrRokbKystS/f//uKqtdbdUdGRmptWvX6vbbb1dMTIyOHDmiX/ziF/r617+ukSNHSgrMunNzc/W73/1O//7v/64+ffrY5xeEh4friiuu6NB+7XK5NHjwYGVnZ+vxxx9XRUWFVq1apXvvvVehoaHdWF3r2qv7iy++0BtvvKFRo0apb9++OnDggJYuXaobb7xRiYmJkgKz7pUrV+rb3/62vva1r6murk6/+93v9N5772njxo3Gbmup7bpN2NbchdyHXnzxRW3cuFEVFRW6/vrrlZOTY0/9BbpHH31U+/bt04kTJ3TVVVfphhtu0KOPPmofsz179qyWLVumHTt26Ny5c3K5XJo/f75fTGd2xp///GdNnDjxouVjx47VsmXLZFmW1qxZo23btqmmpkY33HCD5s+fr0GDBtltT5w4oUWLFukPf/iDnE6nbrvtNuXk5KhPnz6+LKVT2qp7wYIFevjhh/XRRx/p5MmT6tevn771rW9p1qxZHodjA63uhISEFpcvXbrU/uOkI/v1//7v/2rBggV677331Lt3b40dO1azZ89WcLB//o3ZXt1/+9vf9Pjjj+vgwYM6deqUvva1r2n06NGaMWOGwsLC7PaBVvecOXO0d+9eHTt2TOHh4UpISNC0adP0rW99S5KZ21pqu24TtjUhBwAAGIlzcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAw0v8HCIk/OswWfdQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[\"post_infill_duration\"].hist(bins=np.linspace(-5, 360, 100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:08.378973Z",
     "iopub.status.busy": "2025-03-20T20:24:08.378552Z",
     "iopub.status.idle": "2025-03-20T20:24:08.393936Z",
     "shell.execute_reply": "2025-03-20T20:24:08.393409Z",
     "shell.execute_reply.started": "2025-03-20T20:24:08.378955Z"
    }
   },
   "outputs": [],
   "source": [
    "# df = df[df[\"task\"].isin([\"extend\", \"\"])].copy()\n",
    "# print(df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.035167Z",
     "start_time": "2024-05-16T13:59:40.801098Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:08.394678Z",
     "iopub.status.busy": "2025-03-20T20:24:08.394527Z",
     "iopub.status.idle": "2025-03-20T20:24:14.019169Z",
     "shell.execute_reply": "2025-03-20T20:24:14.018389Z",
     "shell.execute_reply.started": "2025-03-20T20:24:08.394664Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after duration 0.9844919202980965\n",
      "after infill duration 0.9896087130867486\n",
      "neg_filter_reaction_play_count 1.0\n",
      "neg_filter_upvote_count 0.9879\n",
      "neg_filter_norm_play_frac 1.0\n",
      "neg_filter_continues 1.0\n",
      "----------------\n",
      "pos_filter_continues 0.9993\n",
      "pos_filter_reaction_play_count 1.0\n",
      "pos_filter_relative_play_count 0.9785\n",
      "pos_filter_cer_diff_preference 1.0\n",
      "pos_filter_bad_flags 0.9998\n",
      "after filter on play counts 0.9783\n",
      "after filter on higher quality 0.2561\n",
      "----------------\n",
      "negative 819846 positive 185982\n",
      "----------------\n",
      "total pair requests 852878  --> selected pair requests 182096 frac 0.214\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\"] <= 240)\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[\"preference\"]) # & (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",
    ")\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",
    "                \"extend\",\n",
    "                \"artist_consistency\",\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",
    "            & (df[\"norm_play_frac\"] >= df[\"reaction_play_count\"] / 3) # 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",
    "        ]\n",
    "    )\n",
    ") & (\n",
    "    (df[\"upvote_count\"] >= 1) # (df[\"upvote_count\"] >= 1)  (df[\"pos_diff_preference\"] == 2)\n",
    "    | (df[\"reaction_play_count\"] >= 5)\n",
    "    | (df[\"concat_play_counts\"] >= 5)\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 = (df[\"user_n_clips\"] >= 100)  # 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",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.250737Z",
     "start_time": "2024-05-16T13:59:41.036434Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:14.020133Z",
     "iopub.status.busy": "2025-03-20T20:24:14.019953Z",
     "iopub.status.idle": "2025-03-20T20:24:15.729012Z",
     "shell.execute_reply": "2025-03-20T20:24:15.728301Z",
     "shell.execute_reply.started": "2025-03-20T20:24:14.020116Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "30b_t6_v34 requests 182096 clips 364192 total khrs 13.745; N gpus for 1000 iters 22.762; 4 gpus for x iters 5690.500; n unique users 40437 n pro users 34524\n"
     ]
    }
   ],
   "source": [
    "df_slice = df[df[\"request_id\"].isin(set(unique_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",
    ")\n",
    "# 76171 152342 total khrs 2.880 n gpus for 1250 iters 3.809\n",
    "# v10 has 78866\n",
    "# v14 has 110402\n",
    "# 30b_t4_v12 requests 47755 clips 95510 total khrs 4.555; N gpus for 1000 iters 5.969; 4 gpus for x iters 1492.344; n unique users 13790 n pro users 13526\n",
    "# 30b_t4_v20 requests 18306 clips 36612 total khrs 1.754; N gpus for 1000 iters 2.288; 4 gpus for x iters 572.062; n unique users 6943 n pro users 6714\n",
    "# 30b_t5_v5 requests 21318 clips 42636 total khrs 1.938; N gpus for 1000 iters 2.665; 4 gpus for x iters 666.188; n unique users 11661 n pro users 9347\n",
    "# 30b_t5_v6 requests 22833 clips 45666 total khrs 2.072; N gpus for 1000 iters 2.854; 4 gpus for x iters 713.531; n unique users 12576 n pro users 9910\n",
    "# 30b_t5_v7 requests 33197 clips 66394 total khrs 2.846; N gpus for 1000 iters 4.150; 4 gpus for x iters 1037.406; n unique users 16665 n pro users 13050\n",
    "# 30b_t5_v8 requests 20907 clips 41814 total khrs 1.629; N gpus for 1000 iters 2.613; 4 gpus for x iters 653.344; n unique users 11102 n pro users 9052\n",
    "# 30b_t5_v9 requests 24645 clips 49290 total khrs 1.918; N gpus for 1000 iters 3.081; 4 gpus for x iters 770.156; n unique users 12661 n pro users 10229\n",
    "# 30b_t5_v11 requests 21975 clips 43950 total khrs 1.508; N gpus for 1000 iters 2.747; 4 gpus for x iters 686.719; n unique users 11173 n pro users 9270\n",
    "# 30b_t5_v12 requests 21436 clips 42872 total khrs 1.582; N gpus for 1000 iters 2.679; 4 gpus for x iters 669.875; n unique users 11553 n pro users 9374\n",
    "# 30b_t5_v13 requests 25912 clips 51824 total khrs 1.922; N gpus for 1000 iters 3.239; 4 gpus for x iters 809.750; n unique users 13429 n pro users 10737\n",
    "# 30b_t5_v14 requests 27687 clips 55374 total khrs 2.036; N gpus for 1000 iters 3.461; 4 gpus for x iters 865.219; n unique users 14196 n pro users 11227\n",
    "# 30b_t5_v15 requests 29563 clips 59126 total khrs 2.225; N gpus for 1000 iters 3.695; 4 gpus for x iters 923.844; n unique users 14684 n pro users 11642\n",
    "# 30b_t6_v1 requests 24678 clips 49356 total khrs 1.934; N gpus for 1000 iters 3.085; 4 gpus for x iters 771.188; n unique users 11350 n pro users 10065\n",
    "# 30b_t6_v2 requests 49341 clips 98682 total khrs 4.332; N gpus for 1000 iters 6.168; 4 gpus for x iters 1541.906; n unique users 19992 n pro users 16972\n",
    "# 30b_t6_v3 requests 54967 clips 109934 total khrs 4.826; N gpus for 1000 iters 6.871; 4 gpus for x iters 1717.719; n unique users 21653 n pro users 18266\n",
    "# 30b_t6_v5 requests 29459 clips 58918 total khrs 2.657; N gpus for 1000 iters 3.682; 4 gpus for x iters 920.594; n unique users 14091 n pro users 11884\n",
    "# 30b_t6_v7 requests 40056 clips 80112 total khrs 3.354; N gpus for 1000 iters 5.007; 4 gpus for x iters 1251.750; n unique users 17440 n pro users 14476\n",
    "# 30b_t6_v8 requests 31681 clips 63362 total khrs 2.681; N gpus for 1000 iters 3.960; 4 gpus for x iters 990.031; n unique users 15180 n pro users 15078\n",
    "# 30b_t6_v9 requests 55785 clips 111570 total khrs 4.727; N gpus for 1000 iters 6.973; 4 gpus for x iters 1743.281; n unique users 23114 n pro users 22871\n",
    "# 30b_t6_v10 requests 52209 clips 104418 total khrs 4.515; N gpus for 1000 iters 6.526; 4 gpus for x iters 1631.531; n unique users 22216 n pro users 21893\n",
    "# 30b_t6_v11 requests 31338 clips 62676 total khrs 2.493; N gpus for 1000 iters 3.917; 4 gpus for x iters 979.312; n unique users 15190 n pro users 14973\n",
    "# 30b_t6_v13 requests 50856 clips 101712 total khrs 3.987; N gpus for 1000 iters 6.357; 4 gpus for x iters 1589.250; n unique users 23547 n pro users 23097\n",
    "# 30b_t6_v15 requests 65213 clips 130426 total khrs 5.217; N gpus for 1000 iters 8.152; 4 gpus for x iters 2037.906; n unique users 28763 n pro users 27964\n",
    "# 30b_t6_v16 requests 37907 clips 75814 total khrs 2.956; N gpus for 1000 iters 4.738; 4 gpus for x iters 1184.594; n unique users 18448 n pro users 17212\n",
    "# 30b_t6_v17 requests 51543 clips 103086 total khrs 4.154; N gpus for 1000 iters 6.443; 4 gpus for x iters 1610.719; n unique users 24223 n pro users 21829\n",
    "# 30b_t6_v18 requests 94965 clips 189930 total khrs 7.483; N gpus for 1000 iters 11.871; 4 gpus for x iters 2967.656; n unique users 23852 n pro users 21767\n",
    "# 30b_t6_v19 requests 34289 clips 68578 total khrs 2.846; N gpus for 1000 iters 4.286; 4 gpus for x iters 1071.531; n unique users 11802 n pro users 10830\n",
    "# 30b_t6_v20 requests 53258 clips 106516 total khrs 4.270; N gpus for 1000 iters 6.657; 4 gpus for x iters 1664.312; n unique users 22096 n pro users 21171\n",
    "# 30b_t6_v22 requests 29971 clips 59942 total khrs 1.992; N gpus for 1000 iters 3.746; 4 gpus for x iters 936.594; n unique users 13611 n pro users 13036\n",
    "# 30b_t6_v24 requests 45333 clips 90666 total khrs 3.343; N gpus for 1000 iters 5.667; 4 gpus for x iters 1416.656; n unique users 18853 n pro users 18049\n",
    "# 30b_t6_v25 requests 28154 clips 56308 total khrs 2.401; N gpus for 1000 iters 3.519; 4 gpus for x iters 879.812; n unique users 12946 n pro users 12361\n",
    "# 30b_t6_v26 requests 30428 clips 60856 total khrs 2.599; N gpus for 1000 iters 3.804; 4 gpus for x iters 950.875; n unique users 13822 n pro users 13163\n",
    "# 30b_t6_v27 requests 43731 clips 87462 total khrs 3.862; N gpus for 1000 iters 5.466; 4 gpus for x iters 1366.594; n unique users 17898 n pro users 16865\n",
    "# 30b_t6_v28 requests 56869 clips 113738 total khrs 5.064; N gpus for 1000 iters 7.109; 4 gpus for x iters 1777.156; n unique users 22004 n pro users 20244\n",
    "# 30b_t6_v29 requests 32729 clips 65458 total khrs 2.604; N gpus for 1000 iters 4.091; 4 gpus for x iters 1022.781; n unique users 13739 n pro users 13503\n",
    "# 30b_t6_v30 requests 32553 clips 65106 total khrs 2.592; N gpus for 1000 iters 4.069; 4 gpus for x iters 1017.281; n unique users 13712 n pro users 13478\n",
    "# 30b_t6_v31 requests 41523 clips 83046 total khrs 3.164; N gpus for 1000 iters 5.190; 4 gpus for x iters 1297.594; n unique users 16266 n pro users 15967\n",
    "# 30b_t6_v32 requests 55942 clips 111884 total khrs 4.361; N gpus for 1000 iters 6.993; 4 gpus for x iters 1748.188; n unique users 20808 n pro users 20271\n",
    "# 30b_t6_v33 requests 182096 clips 364192 total khrs 13.745; N gpus for 1000 iters 22.762; 4 gpus for x iters 5690.500; n unique users 40437 n pro users 34524"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.277006Z",
     "start_time": "2024-05-16T13:59:41.252105Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:15.729911Z",
     "iopub.status.busy": "2025-03-20T20:24:15.729740Z",
     "iopub.status.idle": "2025-03-20T20:24:15.903147Z",
     "shell.execute_reply": "2025-03-20T20:24:15.902501Z",
     "shell.execute_reply.started": "2025-03-20T20:24:15.729894Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "positive in playlist (58775, 149)\n",
      "task\n",
      "artist_consistency    144680\n",
      "cover                 114644\n",
      "infill                 89698\n",
      "extend                  8256\n",
      "                        6842\n",
      "infill_intro              72\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": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:15.904002Z",
     "iopub.status.busy": "2025-03-20T20:24:15.903831Z",
     "iopub.status.idle": "2025-03-20T20:24:16.096590Z",
     "shell.execute_reply": "2025-03-20T20:24:16.096007Z",
     "shell.execute_reply.started": "2025-03-20T20:24:15.903985Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1FMcQgIAAAPzKiQAAIBLGZDnwAAAAFwKAQYAABiHAAMAAIxDgAEAAMYhwPSiHTt26Jvf/KYmT56sf//3f9fhw4cD3aWAevzxx5WUlOT18+1vf9uaf/bsWeXn5ysjI0Pp6em6//775XK5Atjj/nHo0CH98Ic/lNPpVFJSkl555RWv+R6PR4899picTqdSUlI0b948ffjhh15tTp48qaVLl2rKlCm6/vrrlZubq9OnT/fjVvS97uq0fPnyC/av+fPne7UJ9jpt3rxZs2bNUnp6ujIzM3Xvvffq+PHjXm18+ZzV1tZqwYIFSk1NVWZmptauXau2trb+3JQ+5UudfvCDH1ywPz3yyCNebYK9Tjt37tStt96qKVOmaMqUKZo9e7Zef/11a/5A25cIML3k5ZdfVmFhoe677z49//zzmjhxoubPn3/B3YQHm2uuuUZvvPGG9bNz505rXkFBgV599VUVFxdr+/btqqur06JFiwLY2/5x5swZJSUlKS8vr8v5JSUl2r59u1auXKldu3YpPDxc8+fP19mzZ602Dz74oKqrq7V161Zt2rRJb7311gVftqbrrk6SNHXqVK/962c/+5nX/GCv08GDBzV37lzt2rVLW7duVVtbm+bPn68zZ85Ybbr7nLW3t2vhwoVqbW1VaWmpioqK9Pzzz2vjxo2B2KQ+4UudJOl73/ue1/6Uk5NjzRsMdRozZowefPBB7dmzR7t379bXvvY13XfffTp27JikAbgvedAr/u3f/s2Tn59vvW5vb/c4nU7P5s2bA9irwNq4caPnu9/9bpfzGhsbPddee61n37591rTq6mrPhAkTPBUVFf3Uw8CbMGGC53e/+5312u12e2688UbPU089ZU1rbGz0JCcne3796197PJ4v6nT48GGrzeuvv+5JSkry/P3vf++/zvejznXyeDyeZcuWeX70ox9d9D2DsU4NDQ2eCRMmeA4ePOjxeHz7nL322mueiRMneurr6602O3fu9EyZMsVz9uzZfu1/f+lcJ4/H47njjjs8a9asueh7BmOdPB6P54YbbvDs2rVrQO5LjMD0gpaWFr377rvKysqyptntdmVlZamioiKAPQu8jz76SE6nU//8z/+spUuXqra2VpJUVVWl1tZWr5olJCRo7NixqqysDFBvA++TTz5RfX29V10iIyOVmppq7UsVFRWKiorS5MmTrTZZWVmy2+2D7rDlwYMHlZmZqRkzZigvL08nTpyw5g3GOjU1NUmSoqOjJfn2OausrNSECRO8bhLqdDrV3Nys6urq/ut8P+pcpw4vvviiMjIydMstt2jDhg367LPPrHmDrU7t7e166aWXdObMGaWnpw/IfWnA3onXJCdOnFB7e7tiYmK8psfExFxwnHUwSUlJUWFhocaPH6/6+no9+eSTmjt3rl588UW5XC6FhoYqKirK6z0xMTGqr68PUI8Dr2Pbu9qXOo41u1wujRw50mt+SEiIoqOjB1Xtpk6dqunTpys+Pl41NTX62c9+pnvuuUe//OUv5XA4Bl2d3G63CgoKNGXKFE2YMEGSfPqcuVyuC+5w3vF6sNRJkm655RaNHTtWo0aN0tGjR7V+/Xr95S9/0RNPPCFp8NTp6NGjmjNnjs6ePathw4bpySefVGJioo4cOTLg9iUCDPrMtGnTrP+fOHGiUlNTddNNN2nfvn0aOnRoAHuGYDBz5kzr/ztOurz55putUZnBJj8/X8eOHfM6zwwXulidZs+ebf1/UlKS4uLiNG/ePH388cf68pe/3N/dDJjx48dr7969ampq0m9/+1stW7ZMzz77bKC71SUOIfWCESNGyOFwXHDCbkNDA89uOk9UVJSuvvpqffzxx4qNjVVra6saGxu92jQ0NCguLi5APQy8jm2/1L4UGxurTz/91Gt+W1ubTp06NahrN27cOI0YMUIfffSRpMFVp1WrVum1117TM888ozFjxljTffmcxcbGXnAlScfrwVKnrqSmpkqS1/40GOoUFhamq666SsnJyVq6dKkmTpyobdu2Dch9iQDTC8LCwnTttdeqvLzcmuZ2u1VeXq709PQA9mxgOX36tGpqahQXF6fk5GSFhoZ61ez48eOqra1VWlpa4DoZYPHx8YqLi/OqS3Nzs9555x1rX0pPT1djY6OqqqqsNgcOHJDb7VZKSkq/93mg+Pvf/66TJ09aX5SDoU4ej0erVq3S7373Oz3zzDMaN26c13xfPmdpaWl6//33vUJzWVmZIiIilJiY2C/b0de6q1NXjhw5IumLP7yDoU5dcbvdamlpGZD7EoeQesndd9+tZcuWKTk5WSkpKXrmmWf02Wef6bbbbgt01wJm7dq1uummmzR27FjV1dXp8ccfl91u1y233KLIyEjNmjVLRUVFio6OVkREhNasWaP09PSgDzCnT5/Wxx9/bL3+5JNPdOTIEUVHR2vs2LG688479fOf/1xXXXWV4uPj9dhjj2nUqFG6+eabJZ07cW7q1Kl6+OGHlZ+fr9bWVq1evVozZ87U6NGjA7VZve5SdYqOjtYTTzyhGTNmKDY2VjU1NXr00Ud11VVXaerUqZIGR53y8/P161//Wv/5n/+pK664wjrPIDIyUkOHDvXpc+Z0OpWYmKicnBw99NBDqq+vV3FxsebOnauwsLAAbl3v6a5OH3/8sV588UVNmzZNw4cP19GjR1VYWKgbbrhBEydOlDQ46rRhwwZ9/etf15e+9CWdPn1av/71r3Xw4EFt2bJlQO5LPI26Fz377LPasmWL6uvrNWnSJK1YscIahhyMfvzjH+vQoUM6efKkRo4cqeuuu04//vGPrePJZ8+eVVFRkV566SW1tLTI6XQqLy8vqIZju/Lmm2/qzjvvvGB6dna2ioqK5PF4tHHjRu3atUuNjY267rrrlJeXp/Hjx1ttT548qdWrV+sPf/iD7Ha7vvWtb2nFihW64oor+nNT+tSl6rRy5Urdd999+vOf/6ympiaNGjVKN954o5YsWeJ12DbY65SUlNTl9MLCQusfT758zv76179q5cqVOnjwoMLDw5Wdna2lS5cqJCQ4/o3bXZ3+9re/6aGHHtKxY8d05swZfelLX9LNN9+se++9VxEREVb7YK9Tbm6uDhw4oLq6OkVGRiopKUn33HOPbrzxRkkDb18iwAAAAONwDgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMAAAwDgEGAAAYBwCDAAAMA4BBgAAGIcAAwAAjEOAAQAAxvn/RmA0IjpP0qgAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_slice[\"post_infill_duration\"].hist(bins=np.linspace(-5, 300, 100))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.323409Z",
     "start_time": "2024-05-16T13:59:41.278278Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.097392Z",
     "iopub.status.busy": "2025-03-20T20:24:16.097234Z",
     "iopub.status.idle": "2025-03-20T20:24:16.112785Z",
     "shell.execute_reply": "2025-03-20T20:24:16.112275Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.097376Z"
    }
   },
   "outputs": [],
   "source": [
    "# interesting_clips_must_be_positive_mask = (\n",
    "#     (df_slice[\"upvoted\"] == True)\n",
    "#     | (df_slice[\"has_action\"] == True)\n",
    "#     | (df_slice[\"part_of_concat\"] == True)\n",
    "# )\n",
    "# interesting_clips_must_be_not_negative_mask = (df_slice[\"downvoted\"] == False) # & (df_slice[\"dislike_count\"] < 1)\n",
    "# interesting_clips_mask = interesting_clips_must_be_positive_mask & interesting_clips_must_be_not_negative_mask\n",
    "# assert interesting_clips_mask.eq(df_slice[\"preference\"]).all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.392244Z",
     "start_time": "2024-05-16T13:59:41.324472Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.113509Z",
     "iopub.status.busy": "2025-03-20T20:24:16.113362Z",
     "iopub.status.idle": "2025-03-20T20:24:16.125183Z",
     "shell.execute_reply": "2025-03-20T20:24:16.124673Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.113494Z"
    }
   },
   "outputs": [],
   "source": [
    "# save positive ids\n",
    "# positive_preference_ids = df_slice[df_slice[\"preference\"] == False][\"s3_id\"].to_json(orient='values')\n",
    "# with open('/home/tony/Data/Preference/7b_v2/7v_v20_full_recut_id_negative.json', 'w') as file:\n",
    "#     file.write(positive_preference_ids)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.125907Z",
     "iopub.status.busy": "2025-03-20T20:24:16.125754Z",
     "iopub.status.idle": "2025-03-20T20:24:16.137273Z",
     "shell.execute_reply": "2025-03-20T20:24:16.136777Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.125893Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice_2 = pd.read_pickle(\"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_t_6_20241118_full_slice.pkl\")\n",
    "# df_total = pd.concat([df_slice, df_slice_2])\n",
    "# print(df_total.shape)\n",
    "# df_slice = df_total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.137974Z",
     "iopub.status.busy": "2025-03-20T20:24:16.137830Z",
     "iopub.status.idle": "2025-03-20T20:24:16.149347Z",
     "shell.execute_reply": "2025-03-20T20:24:16.148849Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.137961Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice_prev = pd.read_pickle(\n",
    "#     \"/home/tony/Data/Preference/30b_v2/interesting_clips_v4_t_3_v13_20240902_slice.pkl\"\n",
    "# )\n",
    "# df_slice_prev = df_slice_prev[\n",
    "#     (\n",
    "#         (df_slice_prev[\"task\"] != \"infill\")\n",
    "#         & (df_slice_prev[\"task\"] != \"cover\")\n",
    "#         & (df_slice_prev[\"task\"] != \"artist_consistency\")\n",
    "#     )\n",
    "# ].copy()\n",
    "# df_slice = pd.concat([df_slice, df_slice_prev])\n",
    "# print(df_slice.shape)\n",
    "# print(df_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.150179Z",
     "iopub.status.busy": "2025-03-20T20:24:16.149875Z",
     "iopub.status.idle": "2025-03-20T20:24:16.161328Z",
     "shell.execute_reply": "2025-03-20T20:24:16.160821Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.150163Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice[(df_slice[\"preference\"]) & ((df_slice[\"task\"].str.strip() == \"\") | (df_slice[\"task\"].str.strip() == \"cover\"))].to_pickle(\n",
    "#     \"/home/tony/Data/Preference/30b_v5/interesting_clips_v4_t_5_20241018_full_with_cer_pos_gen.pkl\"\n",
    "# )\n",
    "# df_slice[(df_slice[\"preference\"]) & ((df_slice[\"task\"].str.strip() == \"\") | (df_slice[\"task\"].str.strip() == \"cover\"))].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.162018Z",
     "iopub.status.busy": "2025-03-20T20:24:16.161874Z",
     "iopub.status.idle": "2025-03-20T20:24:16.173437Z",
     "shell.execute_reply": "2025-03-20T20:24:16.172935Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.162004Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice.to_pickle(\"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250108_full_slice.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.174378Z",
     "iopub.status.busy": "2025-03-20T20:24:16.174003Z",
     "iopub.status.idle": "2025-03-20T20:24:16.185551Z",
     "shell.execute_reply": "2025-03-20T20:24:16.185036Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.174363Z"
    }
   },
   "outputs": [],
   "source": [
    "# with open(\"/home/tony/Data/Preference/30b_v6/similarities_30b_t6.json\", \"r\") as fp:\n",
    "#     all_similarities = json.load(fp)\n",
    "    \n",
    "# df_slice[\"similarity\"] = df_slice[\"id\"].map(all_similarities)\n",
    "# df_cover = df_slice[df_slice[\"task\"] == \"cover\"].copy()\n",
    "# df_artist = df_slice[df_slice[\"task\"] == \"artist_consistency\"].copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.186283Z",
     "iopub.status.busy": "2025-03-20T20:24:16.186139Z",
     "iopub.status.idle": "2025-03-20T20:24:16.197880Z",
     "shell.execute_reply": "2025-03-20T20:24:16.197373Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.186269Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_cover[df_cover[\"preference\"]][\"similarity\"].hist(bins=200, label=\"positive\", alpha=0.5)\n",
    "# df_cover[~df_cover[\"preference\"]][\"similarity\"].hist(bins=200, label=\"negative\", alpha=0.5)\n",
    "# plt.legend()\n",
    "# plt.show()\n",
    "# df_cover[\"similarity_diff\"] = df_cover[\"similarity\"].diff()\n",
    "# df_cover[df_cover[\"preference\"]][\"similarity_diff\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# df_cover[\"continued_parent\"] = None\n",
    "# df_cover[\"continue_at\"] = -1\n",
    "# too_similar = (df_cover[\"similarity\"] >= 0.99)\n",
    "# too_different = ( df_cover[\"similarity\"] < 0.25)\n",
    "# too_big_difference = (df_cover[\"similarity_diff\"] < -0.2)\n",
    "# df_cover_drops_id = df_cover[\n",
    "#     (df_cover[\"preference\"])\n",
    "#     & (too_similar | too_different | too_big_difference)\n",
    "# ][\"s3_id\"].unique()\n",
    "# print(\"total rows\", df_cover.shape[0], \"total drops\", len(df_cover_drops_id))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.198583Z",
     "iopub.status.busy": "2025-03-20T20:24:16.198437Z",
     "iopub.status.idle": "2025-03-20T20:24:16.210321Z",
     "shell.execute_reply": "2025-03-20T20:24:16.209808Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.198570Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_artist[df_artist[\"preference\"]][\"similarity\"].hist(bins=200, label=\"positive\", alpha=0.5)\n",
    "# df_artist[~df_artist[\"preference\"]][\"similarity\"].hist(bins=200, label=\"negative\", alpha=0.5)\n",
    "# plt.legend()\n",
    "# plt.show()\n",
    "# df_artist[\"similarity_diff\"] = df_artist[\"similarity\"].diff()\n",
    "# df_artist[df_artist[\"preference\"]][\"similarity_diff\"].hist(bins=200)\n",
    "# plt.show()\n",
    "# too_similar = (df_artist[\"similarity\"] >= 0.95)\n",
    "# too_different = ( df_artist[\"similarity\"] < 0.4)\n",
    "# too_big_difference = (df_artist[\"similarity_diff\"] < -0.2)\n",
    "# df_artist_drops_id = df_artist[\n",
    "#     (df_artist[\"preference\"])\n",
    "#     & (too_similar | too_different | too_big_difference)\n",
    "# ][\"s3_id\"].unique()\n",
    "# print(\"total rows\", df_artist.shape[0], \"total drops\", len(df_artist_drops_id))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.211020Z",
     "iopub.status.busy": "2025-03-20T20:24:16.210880Z",
     "iopub.status.idle": "2025-03-20T20:24:16.222443Z",
     "shell.execute_reply": "2025-03-20T20:24:16.221937Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.211007Z"
    }
   },
   "outputs": [],
   "source": [
    "# print(\"before filter on cover similarity\", df_slice.shape)\n",
    "# df_slice = df_slice[~df_slice[\"s3_id\"].isin(df_cover_drops_id)].copy()\n",
    "# print(\"after filter on cover similarity\", df_slice.shape)\n",
    "# df_slice = df_slice[~df_slice[\"s3_id\"].isin(df_artist_drops_id)].copy()\n",
    "# print(\"after filter on artist similarity\", df_slice.shape)\n",
    "# df_slice = df_slice[\n",
    "#     df_slice[\"request_id\"].isin(\n",
    "#         df_slice[\"request_id\"].value_counts().index[df_slice[\"request_id\"].value_counts() == 2]\n",
    "#     )\n",
    "# ]\n",
    "# print(\"after filter on request id pairs\", df_slice.shape)\n",
    "# print(df_slice.groupby([\"preference\"])[\"model_name\"].value_counts())\n",
    "# assert df_slice.shape[0] == df_slice[\"request_id\"].nunique() * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-03-20T20:24:16.223115Z",
     "iopub.status.busy": "2025-03-20T20:24:16.222977Z",
     "iopub.status.idle": "2025-03-20T20:24:16.237166Z",
     "shell.execute_reply": "2025-03-20T20:24:16.236608Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.223101Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "is_public\n",
      "False    344121\n",
      "True      20071\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df_slice[\"is_public\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T14:00:20.866354Z",
     "start_time": "2024-05-16T14:00:12.443344Z"
    },
    "execution": {
     "iopub.execute_input": "2025-03-20T20:27:49.687447Z",
     "iopub.status.busy": "2025-03-20T20:27:49.686995Z",
     "iopub.status.idle": "2025-03-20T20:28:04.487710Z",
     "shell.execute_reply": "2025-03-20T20:28:04.486910Z",
     "shell.execute_reply.started": "2025-03-20T20:27:49.687425Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(364192, 149)\n",
      "task\n",
      "artist_consistency    144680\n",
      "cover                 114644\n",
      "infill                 89698\n",
      "extend                  8256\n",
      "                        6842\n",
      "infill_intro              72\n",
      "Name: count, dtype: int64\n",
      "(364192, 149)\n",
      "task\n",
      "artist_consistency    144680\n",
      "cover                 114644\n",
      "infill                 89698\n",
      "extend                  8256\n",
      "                        6842\n",
      "infill_intro              72\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[38], line 7\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[38;5;28mprint\u001b[39m(df_slice\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m      6\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----> 7\u001b[0m \u001b[43mBREAK\u001b[49m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'BREAK' is not defined"
     ]
    }
   ],
   "source": [
    "df_slice.to_pickle(\"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250227_full_long_slice.pkl\")\n",
    "print(df_slice.shape)\n",
    "print(df_slice[\"task\"].value_counts())\n",
    "# df_slice = df_slice[df_slice[\"task\"].isin([\"extend\", \"\"])].copy()\n",
    "print(df_slice.shape)\n",
    "print(df_slice[\"task\"].value_counts())\n",
    "BREAK"
   ]
  },
  {
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.932296Z",
     "start_time": "2024-05-16T13:59:41.932287Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.576185Z",
     "iopub.status.idle": "2025-03-20T20:24:16.576382Z",
     "shell.execute_reply": "2025-03-20T20:24:16.576291Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.576282Z"
    }
   },
   "outputs": [],
   "source": [
    "# don't have continue at\n",
    "df_slice[\"request_id\"] = df_slice[\"request_id\"].astype(str)\n",
    "# df_slice[df_slice[\"continue_at\"].isna()][\"request_id\"].nunique(), df_slice[\"request_id\"].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.577057Z",
     "iopub.status.idle": "2025-03-20T20:24:16.577227Z",
     "shell.execute_reply": "2025-03-20T20:24:16.577148Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.577140Z"
    }
   },
   "outputs": [],
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.932966Z",
     "start_time": "2024-05-16T13:59:41.932957Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.577743Z",
     "iopub.status.idle": "2025-03-20T20:24:16.577916Z",
     "shell.execute_reply": "2025-03-20T20:24:16.577837Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.577828Z"
    }
   },
   "outputs": [],
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.933558Z",
     "start_time": "2024-05-16T13:59:41.933550Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.578560Z",
     "iopub.status.idle": "2025-03-20T20:24:16.578959Z",
     "shell.execute_reply": "2025-03-20T20:24:16.578858Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.578847Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice.to_csv(\"/home/tony/Data/Preference/30b_v2/interesting_clips_v4_t_3_20240902_slice.csv\", index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.579328Z",
     "iopub.status.idle": "2025-03-20T20:24:16.579477Z",
     "shell.execute_reply": "2025-03-20T20:24:16.579409Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.579402Z"
    }
   },
   "outputs": [],
   "source": [
    "# df_slice[\"continue_at\"] = -1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.934277Z",
     "start_time": "2024-05-16T13:59:41.934268Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.579938Z",
     "iopub.status.idle": "2025-03-20T20:24:16.580095Z",
     "shell.execute_reply": "2025-03-20T20:24:16.580021Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.580014Z"
    }
   },
   "outputs": [],
   "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",
    "\n",
    "print(train_df.shape, val_df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Actually make"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.934954Z",
     "start_time": "2024-05-16T13:59:41.934946Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.580618Z",
     "iopub.status.idle": "2025-03-20T20:24:16.580770Z",
     "shell.execute_reply": "2025-03-20T20:24:16.580699Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.580690Z"
    }
   },
   "outputs": [],
   "source": [
    "# val_df[[\"request_id\", \"metadata\", \"updated_at\", \"user_id\", \"preference\"]].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.935620Z",
     "start_time": "2024-05-16T13:59:41.935613Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.581281Z",
     "iopub.status.idle": "2025-03-20T20:24:16.581446Z",
     "shell.execute_reply": "2025-03-20T20:24:16.581371Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.581363Z"
    }
   },
   "outputs": [],
   "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 / 2 / 6} iters\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.936268Z",
     "start_time": "2024-05-16T13:59:41.936260Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.581914Z",
     "iopub.status.idle": "2025-03-20T20:24:16.582069Z",
     "shell.execute_reply": "2025-03-20T20:24:16.581996Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.581988Z"
    }
   },
   "outputs": [],
   "source": [
    "make_dataset(val_df, OUT_DATA_DIR, is_val=True, npz_dir=NPZ_DIR, t_data_memmap=N_TOKENS_AUDIO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.582805Z",
     "iopub.status.idle": "2025-03-20T20:24:16.582967Z",
     "shell.execute_reply": "2025-03-20T20:24:16.582890Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.582883Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.936964Z",
     "start_time": "2024-05-16T13:59:41.936957Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.583517Z",
     "iopub.status.idle": "2025-03-20T20:24:16.583667Z",
     "shell.execute_reply": "2025-03-20T20:24:16.583598Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.583591Z"
    }
   },
   "outputs": [],
   "source": [
    "make_dataset(train_df, OUT_DATA_DIR, is_val=False, npz_dir=NPZ_DIR, t_data_memmap=N_TOKENS_AUDIO)"
   ]
  },
  {
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.937879Z",
     "start_time": "2024-05-16T13:59:41.937870Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.584153Z",
     "iopub.status.idle": "2025-03-20T20:24:16.584309Z",
     "shell.execute_reply": "2025-03-20T20:24:16.584235Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.584228Z"
    }
   },
   "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, 13)\n",
    "assert len(mm) == len(test_metas)\n",
    "assert mm[:100, :, 0].min() >= 0\n",
    "assert mm[:100, :, 0].max() <= 4000\n",
    "assert mm[:100, :, 1:].min() >= 0\n",
    "assert mm[:100, :, 1:].max() <= 2048"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.584819Z",
     "iopub.status.idle": "2025-03-20T20:24:16.584970Z",
     "shell.execute_reply": "2025-03-20T20:24:16.584898Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.584891Z"
    }
   },
   "outputs": [],
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.938629Z",
     "start_time": "2024-05-16T13:59:41.938621Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.585492Z",
     "iopub.status.idle": "2025-03-20T20:24:16.585641Z",
     "shell.execute_reply": "2025-03-20T20:24:16.585573Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.585565Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.939205Z",
     "start_time": "2024-05-16T13:59:41.939198Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.586546Z",
     "iopub.status.idle": "2025-03-20T20:24:16.586724Z",
     "shell.execute_reply": "2025-03-20T20:24:16.586636Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.586628Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.939977Z",
     "start_time": "2024-05-16T13:59:41.939969Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.587036Z",
     "iopub.status.idle": "2025-03-20T20:24:16.587186Z",
     "shell.execute_reply": "2025-03-20T20:24:16.587113Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.587106Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.940610Z",
     "start_time": "2024-05-16T13:59:41.940603Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.587651Z",
     "iopub.status.idle": "2025-03-20T20:24:16.587794Z",
     "shell.execute_reply": "2025-03-20T20:24:16.587726Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.587720Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.941167Z",
     "start_time": "2024-05-16T13:59:41.941159Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.588318Z",
     "iopub.status.idle": "2025-03-20T20:24:16.588472Z",
     "shell.execute_reply": "2025-03-20T20:24:16.588401Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.588394Z"
    }
   },
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.941801Z",
     "start_time": "2024-05-16T13:59:41.941793Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.589012Z",
     "iopub.status.idle": "2025-03-20T20:24:16.589165Z",
     "shell.execute_reply": "2025-03-20T20:24:16.589095Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.589088Z"
    }
   },
   "outputs": [],
   "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(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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.942520Z",
     "start_time": "2024-05-16T13:59:41.942511Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.589697Z",
     "iopub.status.idle": "2025-03-20T20:24:16.589847Z",
     "shell.execute_reply": "2025-03-20T20:24:16.589779Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.589771Z"
    }
   },
   "outputs": [],
   "source": [
    "train_info = read_json(os.path.join(OUT_DATA_DIR, f\"info_tr.json\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.943072Z",
     "start_time": "2024-05-16T13:59:41.943065Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.590471Z",
     "iopub.status.idle": "2025-03-20T20:24:16.590624Z",
     "shell.execute_reply": "2025-03-20T20:24:16.590552Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.590545Z"
    }
   },
   "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)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.944246Z",
     "start_time": "2024-05-16T13:59:41.944237Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.590959Z",
     "iopub.status.idle": "2025-03-20T20:24:16.591116Z",
     "shell.execute_reply": "2025-03-20T20:24:16.591041Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.591033Z"
    }
   },
   "outputs": [],
   "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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.945249Z",
     "start_time": "2024-05-16T13:59:41.945241Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.591751Z",
     "iopub.status.idle": "2025-03-20T20:24:16.591911Z",
     "shell.execute_reply": "2025-03-20T20:24:16.591838Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.591830Z"
    }
   },
   "outputs": [],
   "source": [
    "print(\"1 epoch per batch 4, total\", total_iters / 8 / 2 / 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.945972Z",
     "start_time": "2024-05-16T13:59:41.945964Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.592475Z",
     "iopub.status.idle": "2025-03-20T20:24:16.592628Z",
     "shell.execute_reply": "2025-03-20T20:24:16.592557Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.592549Z"
    }
   },
   "outputs": [],
   "source": [
    "!cd /home/tony/Work/tony/slurm/30b_dpo && sbatch sbatch_ipo_30b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.593100Z",
     "iopub.status.idle": "2025-03-20T20:24:16.593451Z",
     "shell.execute_reply": "2025-03-20T20:24:16.593371Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.593363Z"
    }
   },
   "outputs": [],
   "source": [
    "import shutil\n",
    "\n",
    "# Basic file copy\n",
    "shutil.copy(\n",
    "    \"/home/tony/Work/tony/Preference/make_dataset_13b_v4_t6.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": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.946562Z",
     "start_time": "2024-05-16T13:59:41.946555Z"
    },
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.594007Z",
     "iopub.status.idle": "2025-03-20T20:24:16.594168Z",
     "shell.execute_reply": "2025-03-20T20:24:16.594092Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.594085Z"
    }
   },
   "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": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.594741Z",
     "iopub.status.idle": "2025-03-20T20:24:16.594898Z",
     "shell.execute_reply": "2025-03-20T20:24:16.594827Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.594820Z"
    }
   },
   "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": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.595472Z",
     "iopub.status.idle": "2025-03-20T20:24:16.595620Z",
     "shell.execute_reply": "2025-03-20T20:24:16.595552Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.595545Z"
    }
   },
   "outputs": [],
   "source": [
    "# train_metas = read_jsonl(os.path.join(OUT_DATA_DIR, f\"meta_tr.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-03-20T20:24:16.596229Z",
     "iopub.status.idle": "2025-03-20T20:24:16.596383Z",
     "shell.execute_reply": "2025-03-20T20:24:16.596311Z",
     "shell.execute_reply.started": "2025-03-20T20:24:16.596303Z"
    }
   },
   "outputs": [],
   "source": [
    "train_info.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.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
}
