{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "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-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": [
    {
     "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_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": 3,
   "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/auk_mix_t1_v4\"\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": 4,
   "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 (893006, 90)\n"
     ]
    }
   ],
   "source": [
    "df = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250405_full_long.pkl\"\n",
    ")\n",
    "print(\"Preference data shape\", df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "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 (893006, 85)\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-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": [
      "5656027\n",
      "5656027\n",
      "pre-downloaded df (893006, 85)\n",
      "downloaded df (893006, 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": 7,
   "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    893006\n",
      "Name: count, dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "task\n",
       "cover                 465352\n",
       "artist_consistency    394012\n",
       "infill                 33636\n",
       "artist_cover               6\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 7,
     "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": 8,
   "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": [
      "(893006, 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": 9,
   "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    446503\n",
      "True        chirp-v4-h-t-6    446503\n",
      "Name: count, dtype: int64\n",
      "before filter on model name (893006, 86)\n",
      "after filter on model name (893006, 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": 10,
   "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    868461\n",
      "True      24545\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": 11,
   "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 (893006, 86)\n",
      "after filter on request id pairs (893006, 86)\n",
      "preference  model_name    \n",
      "False       chirp-v4-h-t-6    446503\n",
      "True        chirp-v4-h-t-6    446503\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": 12,
   "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 446503\n",
      "before removing duplicates (893006, 151)\n",
      "after removing duplicates (893006, 144)\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": 13,
   "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                 465352\n",
       "artist_consistency    394012\n",
       "infill                 33636\n",
       "artist_cover               6\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"task\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "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    305312\n",
       "2.0    141191\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 14,
     "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": 15,
   "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",
      "min_p_0001    16659\n",
      "min_p_002     15720\n",
      "text_1        11213\n",
      "temp_s_80     11036\n",
      "temp_s_70     10409\n",
      "step_12        8296\n",
      "text_3         8017\n",
      "step_8         7883\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": 16,
   "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": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 104686 duplicated prompts 52344 unique requests\n",
      "Found 26973 request_ids with duplicate prompts but not highest play counts in their group\n",
      "['31f6cf77-5db4-466d-a6f5-c455dcdab4d7', '5ad6125e-1eac-48a5-ae59-716454c0225d', '72b44637-c34a-4194-8fd9-3c5bc34aef13', 'c8390ab2-e5be-4d69-b5bf-4e9404088949', 'e12dafc1-45e3-4abd-9a58-d5e4293ae33b', '6f5b4451-853e-4196-818c-345d9fa0f684', '69e8eef7-4326-4796-b9f7-833143e3afde', 'b75e653f-eb32-409e-a5ce-1ef39f1fa1c1', '26cdd563-ecc3-41f2-b217-f7a38ca7bf4d', 'd8f6fa06-5d04-415e-9407-afb3ce94920a']\n",
      "Before dedup user gen requests 893006\n",
      "After dedup user gen requests 839060\n"
     ]
    }
   ],
   "source": [
    "# Find duplicated prompts with count > 2\n",
    "duplicate_entries = df.groupby([\"user_id\", \"prompt_text\", \"tags\", \"task\"]).filter(\n",
    "    lambda x: len(x) > 2\n",
    ")\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([\"user_id\", \"prompt_text\", \"tags\", \"task\"])\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": 17,
   "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": [
      "15124\n",
      "good_continue_at\n",
      "True    839060\n",
      "Name: count, dtype: int64\n",
      "\n",
      " Check some basics... \n",
      " preference\n",
      "False    419530\n",
      "True     419530\n",
      "Name: count, dtype: int64 is_30b\n",
      "True    839060\n",
      "Name: count, dtype: int64 model_name\n",
      "chirp-v4-h-t-6    839060\n",
      "Name: count, dtype: int64 preference  model_name    \n",
      "False       chirp-v4-h-t-6    419530\n",
      "True        chirp-v4-h-t-6    419530\n",
      "Name: count, dtype: int64\n",
      "task\n",
      "cover                 431776\n",
      "artist_consistency    374820\n",
      "infill                 32458\n",
      "artist_cover               6\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\"] = (\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": 18,
   "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": {
      "image/png": "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WBNg0C1Tp071/JycnKzU1FTdeeed2rt3rwYOHBjAnqG3TZ8+3fNzx4V+d999t+eoTH+Qn5+vY8eOaffu3YHuSp+5XM05OTmen5OSkpSQkKC5c+fqxIkTuvHGG/u6m34zZswY7dmzR01NTfrDH/6g3Nxc7dy5M9Dd6nWXqzsxMdH4seYU0jWKi4uTw+FQQ0OD1/KGhoZ+/dymmJgY3XTTTTpx4oScTqdaW1vV2Njo1aahoUEJCQkB6qF/ddRxpXF2Op36+uuvvda3tbXpzJkz/eZzkKRRo0YpLi5OX375pSTz616zZo327dun1157TcOHD/cs78732ul0futulY7XwVz75WruSmpqqiR5jbeJNUdERGj06NFKSUnR0qVLlZycrB07dvTrcZYuX3dXTBtrAsw1ioiI0K233qrS0lLPMrfbrdLSUq/zjP1NS0uLqqurlZCQoJSUFIWHh3t9BsePH1dNTY3S0tIC10k/GjlypBISErxqbG5u1p///GfPOKenp6uxsVHl5eWeNgcOHJDb7dbEiRP7vM+95auvvtLp06c9/4CZWrdlWVqzZo3ee+89vfbaaxo1apTX+u58r9PS0nT06FGvYFtSUqKoqCjPYfpgcrWau1JRUSHpH7+wTKv5ctxuty5cuNAvx/lKOuruimljzSkkP3j44YeVm5urlJQUTZw4Ua+99pq++eYb3XfffYHumt9s2LBBd955p0aMGKHa2lq9+OKLstvtmjFjhqKjozVr1iytX79esbGxioqK0rp165Senm5UgGlpadGJEyc8r0+ePKmKigrFxsZqxIgRevDBB/Xzn/9co0eP1siRI/X8889r2LBhuvvuuyVdvPBvypQpeuaZZ5Sfn6/W1latXbtW06dP13XXXReosq7qSnXHxsbqpZde0r333iun06nq6mr97Gc/0+jRozVlyhRJ5tadn5+v3/72t/rP//xPDR482HNOPzo6WgMHDuzW99rlcikxMVHLli3T008/rbq6Om3atElz5sxRREREAKvr2tVqPnHihN555x1NnTpVQ4YMUWVlpQoLCzVp0iQlJydLMq9mSdq4caO++93v6vrrr1dLS4t++9vf6uDBg9q2bVu/HOcOV6q7P4w1T6P2k507d2rbtm2qq6vT+PHjtXLlSs/huP7giSee0KFDh3T69GkNHTpUt912m5544gnPedLz589r/fr1evfdd3XhwgW5XC6tXr06KA4zdtfHH3+sBx988FvLs7OztX79elmWpRdeeEGvv/66Ghsbddttt2n16tUaM2aMp+3p06e1du1a/c///I/sdrvuuecerVy5UoMHD+7LUnxypbrz8vL02GOP6a9//auampo0bNgw3XHHHVqyZInXKVIT605KSupyeWFhoec/H935Xv/v//6v8vLydPDgQUVGRio7O1tLly5VWFjw/f/wajX//e9/19NPP61jx47p7Nmzuv7663X33Xdr4cKFioqK8rQ3qWZJWrFihQ4cOKDa2lpFR0crKSlJjzzyiO644w5J/W+cO1yp7v4w1gQYAABgHK6BAQAAxiHAAAAA4xBgAACAcQgwAADAOAQYAABgHAIMAAAwDgEGAAAYhwADAACMQ4ABAADGIcAAAADjEGAAAIBxCDAAAMA4/x/5+iamXcbRHAAAAABJRU5ErkJggg==",
      "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))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "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.9961802493266274\n",
      "after infill duration 0.9985591018520725\n",
      "neg_filter_reaction_play_count 1.0\n",
      "neg_filter_upvote_count 0.9889\n",
      "neg_filter_norm_play_frac 1.0\n",
      "neg_filter_continues 1.0\n",
      "----------------\n",
      "pos_filter_continues 1.0\n",
      "pos_filter_reaction_play_count 1.0\n",
      "pos_filter_relative_play_count 0.9731\n",
      "pos_filter_cer_diff_preference 1.0\n",
      "pos_filter_bad_flags 0.9998\n",
      "after filter on play counts 0.965\n",
      "after filter on higher quality 0.2917\n",
      "----------------\n",
      "negative 412656 positive 103317\n",
      "----------------\n",
      "total pair requests 419530  --> selected pair requests 102002 frac 0.243\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 = (\n",
    "    ~df[\"task\"].isin(\n",
    "        [\n",
    "            \"infill\",\n",
    "            \"infill_intro\",\n",
    "            \"infill_outro\",\n",
    "        ]\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",
    ")\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",
    "    (df[\"task\"].isin([\"cover\", \"extend\", \"artist_consistency\", \"\"]))\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",
    "        ]\n",
    "    )\n",
    ") & (\n",
    "    (\n",
    "        df[\"upvote_count\"] >= 1\n",
    "    )  # (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 = (\n",
    "    df[\"user_n_clips\"] >= 100\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",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "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": [
      "auk_mix_t1_v4 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"
     ]
    }
   ],
   "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\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"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-16T13:59:41.277006Z",
     "start_time": "2024-05-16T13:59:41.252105Z"
    },
    "execution": {
     "iopub.execute_input": "2025-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 (27757, 150)\n",
      "task\n",
      "artist_consistency    96696\n",
      "cover                 85444\n",
      "infill                21864\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "test_mask = (df_slice[\"preference\"]) & (\n",
    "    (df_slice[\"is_in_playlist\"]) | (df_slice[\"concat_in_playlist\"])\n",
    ")\n",
    "print(\"positive in playlist\", df_slice[test_mask].shape)\n",
    "print(df_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-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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",
      "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": 23,
   "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": 24,
   "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": 25,
   "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": 26,
   "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": 27,
   "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": 28,
   "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": 29,
   "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": 30,
   "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": 31,
   "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": 32,
   "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": 33,
   "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    194331\n",
      "True       9673\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df_slice[\"is_public\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_slice[\"npz_path\"] = df_slice[\"s3_id\"].map(lambda x: f\"{NPZ_DIR}/{x}.npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "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": [
      "(204004, 151)\n",
      "task\n",
      "artist_consistency    96696\n",
      "cover                 85444\n",
      "infill                21864\n",
      "Name: count, dtype: int64\n",
      "(204004, 151)\n",
      "task\n",
      "artist_consistency    96696\n",
      "cover                 85444\n",
      "infill                21864\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[35], line 9\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[38;5;28mprint\u001b[39m(df_slice\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m      8\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----> 9\u001b[0m \u001b[43mBREAK\u001b[49m\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_20250405_full_long_slice.pkl\"\n",
    "# )\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": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(543554, 160)\n",
      "task\n",
      "                 446146\n",
      "extend            63164\n",
      "upload_extend     34244\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df_13b_slice = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/13b_v32/interesting_clips_v4_h_s_32_20250405_full_long_slice_v2.pkl\"\n",
    ")\n",
    "print(df_13b_slice.shape)\n",
    "print(df_13b_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(107104, 150)\n",
      "task\n",
      "artist_consistency    47026\n",
      "cover                 34492\n",
      "infill                25456\n",
      "infill_intro            130\n",
      "Name: count, dtype: int64\n",
      "(130026, 96)\n",
      "task\n",
      "    130026\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df_30b_t6_slice = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/30b_v6/interesting_clips_v4_h_t_6_20250222_full_v34.pkl\"\n",
    ")\n",
    "print(df_30b_t6_slice.shape)\n",
    "print(df_30b_t6_slice[\"task\"].value_counts())\n",
    "df_30b_t1_slice = pd.read_pickle(\n",
    "    \"/home/tony/Data/Preference/30b_v0/interesting_clips_v4_t_1_20240808_v23_slice.pkl\"\n",
    ")\n",
    "df_30b_t1_slice[\"task\"] = \"\"\n",
    "print(df_30b_t1_slice.shape)\n",
    "print(df_30b_t1_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(204004, 151)\n",
      "task\n",
      "artist_consistency    96696\n",
      "cover                 85444\n",
      "infill                21864\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df_30b_slice = df_slice.copy()\n",
    "print(df_30b_slice.shape)\n",
    "print(df_30b_slice[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(984688, 174)\n",
      "task\n",
      "                      576172\n",
      "artist_consistency    143722\n",
      "cover                 119936\n",
      "extend                 63164\n",
      "infill                 47320\n",
      "upload_extend          34244\n",
      "infill_intro             130\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df_total = pd.concat([df_13b_slice, df_30b_slice, df_30b_t1_slice, df_30b_t6_slice])\n",
    "print(df_total.shape)\n",
    "print(df_total[\"task\"].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_slice = df_total.copy()"
   ]
  },
  {
   "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": 41,
   "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[\"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": 42,
   "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": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(984688, 174)\n",
      "(984688, 174)\n",
      "(984688, 174)\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": 43,
   "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": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "491966\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": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape before filtering to max 2 rows per request_id: (984688, 174)\n",
      "Shape after filtering to max 2 rows per request_id: (983932, 174)\n"
     ]
    }
   ],
   "source": [
    "print(f\"Shape before filtering to max 2 rows per request_id: {df_slice.shape}\")\n",
    "\n",
    "# Yes, this keeps the first two rows for each request_id\n",
    "# Create a helper column with row number within each request_id group\n",
    "df_slice = df_slice.copy()\n",
    "df_slice[\"row_num\"] = df_slice.groupby(\"request_id\").cumcount() + 1\n",
    "\n",
    "# Keep only rows where row_num <= 2 (first two rows for each request_id)\n",
    "# This keeps row_num=1 (first row) and row_num=2 (second row) for each request_id\n",
    "df_slice = df_slice[df_slice[\"row_num\"] <= 2]\n",
    "\n",
    "# Drop the helper column\n",
    "df_slice = df_slice.drop(\"row_num\", axis=1).reset_index(drop=True)\n",
    "\n",
    "print(f\"Shape after filtering to max 2 rows per request_id: {df_slice.shape}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_slice = df_slice.sort_values(by=[\"request_id\", \"preference\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_slice[\"created_at\"] = df_slice[\"created_at\"].copy()\n",
    "df_slice.loc[1::2, \"created_at\"] = df_slice.loc[::2, \"created_at\"].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert to datetime with UTC for all values to avoid mixing tz-aware and tz-naive values\n",
    "df_slice[\"created_at\"] = pd.to_datetime(df_slice[\"created_at\"], utc=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_slice = df_slice.sort_values(by=[\"created_at\", \"request_id\", \"preference\"])\n",
    "# df_slice.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "# train_meta = read_jsonl(\"/app/suno/data/dpo/auk_mix_t1_v3/meta_tr.jsonl\")\n",
    "# print(len(train_meta))\n",
    "# s3_id_to_index = {}\n",
    "# index_to_s3_id = {}\n",
    "# for i, row in enumerate(train_meta):\n",
    "#     s3_id_to_index[row[\"id\"]] = i\n",
    "#     index_to_s3_id[i] = row[\"id\"]\n",
    "# print(len(s3_id_to_index))\n",
    "# # this is sorted by time\n",
    "# df_slice = df_slice.sort_values(by=[\"created_at\", \"request_id\", \"preference\"])\n",
    "# df_slice = df_slice.reset_index(drop=True)\n",
    "# s3_id_to_time_ordered_index = {}\n",
    "# for i, row in df_slice.iterrows():\n",
    "#     s3_id_to_time_ordered_index[row[\"s3_id\"]] = i\n",
    "# print(len(s3_id_to_time_ordered_index))\n",
    "# # this is a map that is the raw ordered index to the time ordered index\n",
    "# # we should retrieve the time ordered index\n",
    "# index_to_time_ordered_index = {}\n",
    "# for s3_id in s3_id_to_index.keys():\n",
    "#     index_to_time_ordered_index[s3_id_to_index[s3_id]] = s3_id_to_time_ordered_index[s3_id]\n",
    "# print(len(index_to_time_ordered_index))\n",
    "\n",
    "# all_indices = list(index_to_time_ordered_index.keys())\n",
    "# print(all_indices[:100])\n",
    "# all_indices.sort(key=lambda x: index_to_time_ordered_index[x])\n",
    "# print(all_indices[:100])\n",
    "\n",
    "# ddp_rank_to_indices = {}\n",
    "# for i in range(16 * 8):\n",
    "#     ddp_rank_to_indices[i] = []\n",
    "# for i in range(0, len(all_indices) // 2):\n",
    "#     ddp_rank_to_indices[i % (16 * 8)].extend(all_indices[i*2:i*2+2])\n",
    "# # for i in range(16 * 8):\n",
    "# #     print(i, len(ddp_rank_to_indices[i]))\n",
    "# with open(\"/app/suno/data/dpo/auk_mix_t1_v3/lookup_info.json\", \"w\") as fp:\n",
    "#     json.dump(ddp_rank_to_indices, fp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "973928 128\n"
     ]
    }
   ],
   "source": [
    "total_len = 0\n",
    "for k, v in ddp_rank_to_indices.items():\n",
    "    total_len += len(v)\n",
    "print(total_len, len(ddp_rank_to_indices))"
   ]
  },
  {
   "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",
    "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": 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(\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": 54,
   "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(\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": 56,
   "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": 58,
   "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": 59,
   "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": 60,
   "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": 61,
   "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": 62,
   "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": 64,
   "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": 65,
   "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/sem_4p5_dpo && sbatch sbatch_ipo_4p5"
   ]
  },
  {
   "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_auk_mixed_full.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": 70,
   "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": 71,
   "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": 72,
   "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": "suno_env_dev",
   "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
}
