{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.12"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":130287,"databundleVersionId":15633993,"isSourceIdPinned":false}],"dockerImageVersionId":31329,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Motion-S v7: Pure Retrieval (No Model Training)\n\n**Hypothesis:** Our models have been HURTING, not helping.\nThis version tests the retrieval ceiling with zero training overhead.\n\nThree strategies generated side by side:\n1. **Top-1 Copy** — nearest neighbor, exact tokens\n2. **Weighted Voting** — top-K neighbors, per-position voting\n3. **Soft Blend** — stochastic sampling from weighted prior\n\nPrimary submission: **Weighted Voting** (deterministic, robust)\n\n---","metadata":{}},{"cell_type":"markdown","source":"## 0. Setup","metadata":{}},{"cell_type":"code","source":"import os, gc, json, math, random, warnings, time\nfrom pathlib import Path\nfrom collections import Counter\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics.pairwise import cosine_similarity\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nwarnings.filterwarnings('ignore')\nSEED = 42\nrandom.seed(SEED); np.random.seed(SEED)\n\nT_START = time.time()\nprint('Setup OK')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import glob\nINPUT_DIR = None\nfor d in sorted(Path('/kaggle/input').iterdir()):\n    if (d / 'train.csv').exists(): INPUT_DIR = d; break\nif INPUT_DIR is None:\n    hits = glob.glob('/kaggle/input/**/train.csv', recursive=True)\n    if hits: INPUT_DIR = Path(hits[0]).parent\nassert INPUT_DIR is not None\nprint(f'Data: {INPUT_DIR}')\n\nOUTPUT_DIR = Path('/kaggle/working')\nTRAIN_CSV = INPUT_DIR / 'train.csv'\nTEST_CSV  = INPUT_DIR / 'test.csv'\n\nTOKEN_COLS = ['base_tokens','residual_1','residual_2',\n              'residual_3','residual_4','residual_5']\n\nNUM_CODEBOOK = 512\nMIN_SL = 40\nMAX_SL = 800\nRET_K = 20\nprint('Config OK')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv(TRAIN_CSV)\ntest_df  = pd.read_csv(TEST_CSV)\n\ndef parse_tokens(s):\n    if pd.isna(s) or str(s).strip() == '': return []\n    return list(map(int, str(s).strip().split()))\n\ntrain_df['seq_len'] = train_df['base_tokens'].apply(lambda x: len(parse_tokens(x)))\ntrain_valid = train_df[\n    (train_df['seq_len'] >= MIN_SL) &\n    (train_df['seq_len'] <= MAX_SL)\n].copy().reset_index(drop=True)\nprint(f'Train valid: {len(train_valid)}, Test: {len(test_df)}')\n\n# Pre-parse all tokens\ntrain_tokens = []\ntrain_lens = []\nfor i in range(len(train_valid)):\n    row = train_valid.iloc[i]\n    layers = [parse_tokens(row[c]) for c in TOKEN_COLS]\n    sl = len(layers[0])\n    train_tokens.append(np.array([l[:sl] for l in layers], dtype=np.int64))\n    train_lens.append(sl)\ntrain_lens = np.array(train_lens)\nprint(f'Parsed {len(train_tokens)}, len range: [{train_lens.min()}, {train_lens.max()}]')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. CLIP Encoding","metadata":{}},{"cell_type":"code","source":"try:\n    from transformers import CLIPTokenizer, CLIPTextModel\nexcept ImportError:\n    import subprocess, sys\n    subprocess.check_call([sys.executable,'-m','pip','install','-q','transformers'])\n    from transformers import CLIPTokenizer, CLIPTextModel\n\nclip_path = 'openai/clip-vit-base-patch32'\nclip_tok = CLIPTokenizer.from_pretrained(clip_path)\nclip_mdl = CLIPTextModel.from_pretrained(clip_path).cpu().eval()\nfor p in clip_mdl.parameters(): p.requires_grad = False\nprint(f'CLIP: {sum(p.numel() for p in clip_mdl.parameters())/1e6:.0f}M')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"@torch.no_grad()\ndef clip_encode(texts, bs=128):\n    out = []\n    for i in range(0,len(texts),bs):\n        inp = clip_tok(texts[i:i+bs], padding='max_length',\n                       truncation=True, max_length=77, return_tensors='pt')\n        o = clip_mdl(**inp)\n        out.append(F.normalize(o.pooler_output, dim=-1))\n    return torch.cat(out,0)\n\nprint('Encoding...')\nt0 = time.time()\n\n# Combined (sentence + gloss)\ntr_comb = [str(r['sentence']).strip()+' [SEP] '+str(r['gloss']).strip()\n           for _,r in train_valid.iterrows()]\nte_comb = [str(r['sentence']).strip()+' [SEP] '+str(r['gloss']).strip()\n           for _,r in test_df.iterrows()]\ntr_emb_c = clip_encode(tr_comb)\nte_emb_c = clip_encode(te_comb)\nprint(f'  combined: {time.time()-t0:.0f}s')\n\n# Gloss only\ntr_emb_g = clip_encode(train_valid['gloss'].tolist())\nte_emb_g = clip_encode(test_df['gloss'].tolist())\nprint(f'  +gloss: {time.time()-t0:.0f}s')\n\n# Sentence only\ntr_emb_s = clip_encode(train_valid['sentence'].tolist())\nte_emb_s = clip_encode(test_df['sentence'].tolist())\nprint(f'  +sentence: {time.time()-t0:.0f}s')\n\ndel clip_mdl, clip_tok; gc.collect()\nprint(f'CLIP done: {time.time()-t0:.0f}s total')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Retrieval Index (3-way similarity)","metadata":{}},{"cell_type":"code","source":"print(f'Building retrieval index K={RET_K}...')\nt0 = time.time()\nN_te = len(test_df); N_tr = len(train_valid)\n\nret_idx = np.zeros((N_te, RET_K), dtype=np.int64)\nret_sim = np.zeros((N_te, RET_K), dtype=np.float32)\nCH = 500\nfor i in range(0, N_te, CH):\n    e = min(i+CH, N_te)\n    sg = cosine_similarity(te_emb_g[i:e].numpy(), tr_emb_g.numpy())\n    ss = cosine_similarity(te_emb_s[i:e].numpy(), tr_emb_s.numpy())\n    sc = cosine_similarity(te_emb_c[i:e].numpy(), tr_emb_c.numpy())\n    combined = 0.4 * sg + 0.3 * ss + 0.3 * sc\n    for j in range(e-i):\n        ix = np.argpartition(combined[j], -RET_K)[-RET_K:]\n        ix = ix[np.argsort(combined[j][ix])[::-1]]\n        ret_idx[i+j] = ix\n        ret_sim[i+j] = combined[j][ix]\n\nprint(f'Top-1: mean={ret_sim[:,0].mean():.4f}, median={np.median(ret_sim[:,0]):.4f}')\nprint(f'Top-5: mean={ret_sim[:,:5].mean():.4f}')\nprint(f'Retrieval: {time.time()-t0:.0f}s')\n\n# Show some examples\nfor i in [0, 100, 500, 1000]:\n    te_txt = test_df.iloc[i]['gloss'][:60]\n    tr_txt = train_valid.iloc[ret_idx[i,0]]['gloss'][:60]\n    print(f'  Test[{i}]: \"{te_txt}\" -> \"{tr_txt}\" (sim={ret_sim[i,0]:.3f})')\n\ndel tr_emb_s, te_emb_s, tr_emb_g, te_emb_g, tr_emb_c, te_emb_c\ngc.collect()\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Length Prediction\n\nUse top-1 neighbor length (simplest, most reliable).","metadata":{}},{"cell_type":"code","source":"def get_length(test_idx):\n    \"\"\"Use top-1 neighbor length. Most reliable for retrieval.\"\"\"\n    tr_i = ret_idx[test_idx, 0]\n    sl = train_lens[tr_i]\n    return max(MIN_SL, min(MAX_SL, sl))\n\ndef get_length_weighted(test_idx, k=5):\n    \"\"\"Weighted average of top-K neighbor lengths.\"\"\"\n    w = np.exp(ret_sim[test_idx, :k] * 5.0)\n    w = w / w.sum()\n    lens = np.array([train_lens[ret_idx[test_idx, ki]] for ki in range(k)])\n    return max(MIN_SL, min(MAX_SL, int(np.round(np.dot(w, lens)))))\n\n# Compare strategies\nl1 = [get_length(i) for i in range(len(test_df))]\nlw = [get_length_weighted(i) for i in range(len(test_df))]\nprint(f'Top-1 len: mean={np.mean(l1):.0f}, std={np.std(l1):.0f}')\nprint(f'Weighted len: mean={np.mean(lw):.0f}, std={np.std(lw):.0f}')\nprint(f'Train len: mean={train_lens.mean():.0f}, std={train_lens.std():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Strategy A: Top-1 Copy\n\nSimplest: copy nearest neighbor tokens with their original length.","metadata":{}},{"cell_type":"code","source":"def strategy_top1():\n    \"\"\"Copy top-1 neighbor tokens exactly.\"\"\"\n    rows = []\n    for i in range(len(test_df)):\n        tid = test_df.iloc[i]['id']\n        tr_i = ret_idx[i, 0]\n        tok = train_tokens[tr_i].copy()  # [6, sl]\n        sl = tok.shape[1]\n        # Clamp length\n        if sl < MIN_SL:\n            pad = MIN_SL - sl\n            tok = np.concatenate([tok, np.repeat(tok[:, -1:], pad, axis=1)], axis=1)\n        elif sl > MAX_SL:\n            tok = tok[:, :MAX_SL]\n        d = {'id': tid}\n        for li, cn in enumerate(TOKEN_COLS):\n            d[cn] = ' '.join(map(str, tok[li].tolist()))\n        rows.append(d)\n    return pd.DataFrame(rows)[['id']+TOKEN_COLS]\n\nsub_top1 = strategy_top1()\nprint(f'Strategy A (Top-1): {len(sub_top1)} rows')\nsl_a = sub_top1['base_tokens'].apply(lambda x: len(str(x).split()))\nprint(f'  Lengths: [{sl_a.min()}, {sl_a.max()}], mean={sl_a.mean():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 6. Strategy B: Weighted Voting (top-K)\n\nPer-position, per-layer weighted majority vote across top-K neighbors.","metadata":{}},{"cell_type":"code","source":"def strategy_voting(k=10):\n    \"\"\"Weighted voting from top-K neighbors per position.\"\"\"\n    rows = []\n    for i in range(len(test_df)):\n        tid = test_df.iloc[i]['id']\n        # Use top-1 length (most reliable)\n        target_len = get_length(i)\n        \n        # Build weighted votes\n        votes = np.zeros((6, target_len, NUM_CODEBOOK), dtype=np.float32)\n        sims = ret_sim[i, :k]\n        w = np.exp(sims * 5.0)\n        w = w / w.sum()\n        \n        for ki in range(k):\n            tr_i = ret_idx[i, ki]\n            tok = train_tokens[tr_i]  # [6, sl_src]\n            src_len = tok.shape[1]\n            if src_len == 0: continue\n            for t in range(target_len):\n                sp = min(int(t * src_len / target_len), src_len - 1)\n                for li in range(6):\n                    votes[li, t, tok[li, sp]] += w[ki]\n        \n        result = np.argmax(votes, axis=-1)  # [6, target_len]\n        d = {'id': tid}\n        for li, cn in enumerate(TOKEN_COLS):\n            d[cn] = ' '.join(map(str, result[li].tolist()))\n        rows.append(d)\n        \n        if (i+1) % 500 == 0:\n            print(f'  {i+1}/{len(test_df)} ({time.time()-T_START:.0f}s)')\n    return pd.DataFrame(rows)[['id']+TOKEN_COLS]\n\nprint('Strategy B (Voting K=10)...')\nsub_vote = strategy_voting(k=10)\nprint(f'Strategy B: {len(sub_vote)} rows')\nsl_b = sub_vote['base_tokens'].apply(lambda x: len(str(x).split()))\nprint(f'  Lengths: [{sl_b.min()}, {sl_b.max()}], mean={sl_b.mean():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 7. Strategy C: Top-1 Copy with Exact Neighbor Length\n\nSame as Top-1 but NO position interpolation — use exact source length.","metadata":{}},{"cell_type":"code","source":"def strategy_top1_exact():\n    \"\"\"Copy top-1 neighbor tokens with THEIR original length (no interpolation).\"\"\"\n    rows = []\n    for i in range(len(test_df)):\n        tid = test_df.iloc[i]['id']\n        # Try top-K until valid length found\n        for ki in range(RET_K):\n            tr_i = ret_idx[i, ki]\n            tok = train_tokens[tr_i]  # [6, sl]\n            sl = tok.shape[1]\n            if MIN_SL <= sl <= MAX_SL:\n                break\n        # Fallback\n        if sl < MIN_SL:\n            pad = MIN_SL - sl\n            tok = np.concatenate([tok, np.repeat(tok[:, -1:], pad, axis=1)], axis=1)\n        elif sl > MAX_SL:\n            tok = tok[:, :MAX_SL]\n        elif sl == 0:\n            tok = np.zeros((6, 60), dtype=np.int64)\n        d = {'id': tid}\n        for li, cn in enumerate(TOKEN_COLS):\n            d[cn] = ' '.join(map(str, tok[li].tolist()))\n        rows.append(d)\n    return pd.DataFrame(rows)[['id']+TOKEN_COLS]\n\nsub_exact = strategy_top1_exact()\nprint(f'Strategy C (Exact): {len(sub_exact)} rows')\nsl_c = sub_exact['base_tokens'].apply(lambda x: len(str(x).split()))\nprint(f'  Lengths: [{sl_c.min()}, {sl_c.max()}], mean={sl_c.mean():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 8. Strategy D: Voting K=5 (less neighbors, less noise)","metadata":{}},{"cell_type":"code","source":"print('Strategy D (Voting K=5)...')\nsub_vote5 = strategy_voting(k=5)\nprint(f'Strategy D: {len(sub_vote5)} rows')\nsl_d = sub_vote5['base_tokens'].apply(lambda x: len(str(x).split()))\nprint(f'  Lengths: [{sl_d.min()}, {sl_d.max()}], mean={sl_d.mean():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 9. Strategy E: Voting with Top-1 Exact Length\n\nVoting from K=10, but use top-1 neighbor's EXACT length (no rounding).","metadata":{}},{"cell_type":"code","source":"def strategy_voting_exact_len(k=10):\n    \"\"\"Voting but use top-1 neighbor's exact original length.\"\"\"\n    rows = []\n    for i in range(len(test_df)):\n        tid = test_df.iloc[i]['id']\n        # Use top-1 neighbor's exact length\n        tr_top = ret_idx[i, 0]\n        target_len = train_lens[tr_top]\n        target_len = max(MIN_SL, min(MAX_SL, target_len))\n        \n        votes = np.zeros((6, target_len, NUM_CODEBOOK), dtype=np.float32)\n        sims = ret_sim[i, :k]\n        w = np.exp(sims * 5.0)\n        w = w / w.sum()\n        \n        for ki in range(k):\n            tr_i = ret_idx[i, ki]\n            tok = train_tokens[tr_i]\n            src_len = tok.shape[1]\n            if src_len == 0: continue\n            for t in range(target_len):\n                sp = min(int(t * src_len / target_len), src_len - 1)\n                for li in range(6):\n                    votes[li, t, tok[li, sp]] += w[ki]\n        \n        result = np.argmax(votes, axis=-1)\n        d = {'id': tid}\n        for li, cn in enumerate(TOKEN_COLS):\n            d[cn] = ' '.join(map(str, result[li].tolist()))\n        rows.append(d)\n        \n        if (i+1) % 500 == 0:\n            print(f'  {i+1}/{len(test_df)} ({time.time()-T_START:.0f}s)')\n    return pd.DataFrame(rows)[['id']+TOKEN_COLS]\n\nprint('Strategy E (Voting K=10, exact len)...')\nsub_vote_exact = strategy_voting_exact_len(k=10)\nprint(f'Strategy E: {len(sub_vote_exact)} rows')\nsl_e = sub_vote_exact['base_tokens'].apply(lambda x: len(str(x).split()))\nprint(f'  Lengths: [{sl_e.min()}, {sl_e.max()}], mean={sl_e.mean():.0f}')\nprint(f'Time: {time.time()-T_START:.0f}s')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 10. Compare Strategies","metadata":{}},{"cell_type":"code","source":"# Token-level comparison between strategies\ndef compare_subs(name1, sub1, name2, sub2, n=200):\n    diffs = 0; total = 0\n    for i in range(min(n, len(sub1))):\n        for c in TOKEN_COLS:\n            t1 = list(map(int, str(sub1.iloc[i][c]).split()))\n            t2 = list(map(int, str(sub2.iloc[i][c]).split()))\n            sl = min(len(t1), len(t2))\n            diffs += sum(1 for j in range(sl) if t1[j] != t2[j])\n            total += sl\n    pct = 100*diffs/max(1,total)\n    print(f'{name1} vs {name2}: {pct:.1f}% tokens differ')\n\ncompare_subs('Top-1', sub_top1, 'Vote-10', sub_vote)\ncompare_subs('Top-1', sub_top1, 'Exact', sub_exact)\ncompare_subs('Top-1', sub_top1, 'Vote-5', sub_vote5)\ncompare_subs('Vote-10', sub_vote, 'Vote-5', sub_vote5)\ncompare_subs('Vote-10', sub_vote, 'VoteExact', sub_vote_exact)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 11. Validation","metadata":{}},{"cell_type":"code","source":"def validate(df, name, n=3000):\n    errs = []\n    if len(df) - n: errs.append(f'Rows: {len(df)} expected {n}')\n    for idx, row in df.iterrows():\n        lens = []\n        for c in TOKEN_COLS:\n            toks = str(row[c]).split(); lens.append(len(toks))\n            for t in toks:\n                v = int(t)\n                if v < 0 or v > 511: errs.append(f'R{idx} {c}: {v}'); break\n        if len(set(lens)) > 1: errs.append(f'R{idx}: lens {lens}')\n        if lens[0] < 40 or lens[0] > 800: errs.append(f'R{idx}: len {lens[0]}')\n        if len(errs) > 10: break\n    if errs:\n        print(f'{name}: ERRORS'); [print(f'  {e}') for e in errs]\n    else:\n        sl = df['base_tokens'].apply(lambda x: len(str(x).split()))\n        print(f'{name}: OK [{sl.min()},{sl.max()}] mean={sl.mean():.0f}')\n\nfor name, df in [('Top-1', sub_top1), ('Vote-10', sub_vote),\n                  ('Exact', sub_exact), ('Vote-5', sub_vote5),\n                  ('VoteExact', sub_vote_exact)]:\n    validate(df, name)","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 12. Save Submissions\n\nPrimary: **Top-1 Exact** (simplest, no interpolation artifacts)","metadata":{}},{"cell_type":"code","source":"# PRIMARY: Top-1 exact copy (simplest, most faithful to retrieval)\nsub_exact.to_csv(OUTPUT_DIR/'submission.csv', index=False)\nprint(f'PRIMARY (submission.csv): Top-1 Exact, {len(sub_exact)} rows')\n\n# Alternatives\nsub_top1.to_csv(OUTPUT_DIR/'sub_top1.csv', index=False)\nsub_vote.to_csv(OUTPUT_DIR/'sub_vote10.csv', index=False)\nsub_vote5.to_csv(OUTPUT_DIR/'sub_vote5.csv', index=False)\nsub_vote_exact.to_csv(OUTPUT_DIR/'sub_vote_exact.csv', index=False)\nprint('All 5 strategies saved')\nprint(f'Total time: {(time.time()-T_START)/60:.1f} min')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 13. Distributions","metadata":{}},{"cell_type":"code","source":"fig, axes = plt.subplots(2,3,figsize=(15,8))\n\n# Length distributions\nax = axes[0,0]\nax.hist(train_valid['seq_len'],bins=50,alpha=.4,label='Train',density=True,color='steelblue')\nax.hist(sl_a,bins=50,alpha=.4,label='Top-1',density=True,color='coral')\nax.hist(sl_c,bins=50,alpha=.4,label='Exact',density=True,color='green')\nax.set_title('Seq Length (A vs C)'); ax.legend()\n\nax = axes[0,1]\nax.hist(train_valid['seq_len'],bins=50,alpha=.4,label='Train',density=True,color='steelblue')\nax.hist(sl_b,bins=50,alpha=.4,label='Vote-10',density=True,color='coral')\nax.hist(sl_d,bins=50,alpha=.4,label='Vote-5',density=True,color='green')\nax.set_title('Seq Length (B vs D)'); ax.legend()\n\n# Base token distributions\nax = axes[0,2]\ntbf=[]\nfor _,r in train_valid.head(500).iterrows(): tbf.extend(parse_tokens(r['base_tokens'])[:80])\nabf=[]\nfor _,r in sub_top1.head(500).iterrows(): abf.extend(list(map(int,str(r['base_tokens']).split()[:80])))\nbbf=[]\nfor _,r in sub_vote.head(500).iterrows(): bbf.extend(list(map(int,str(r['base_tokens']).split()[:80])))\nax.hist(tbf,bins=80,alpha=.4,label='Train',density=True,color='steelblue')\nax.hist(abf,bins=80,alpha=.4,label='Top-1',density=True,color='coral')\nax.hist(bbf,bins=80,alpha=.4,label='Vote-10',density=True,color='green')\nax.set_title('Base Tokens'); ax.legend()\n\n# Similarity distribution\nax = axes[1,0]\nax.hist(ret_sim[:,0],bins=50,alpha=.7,color='steelblue')\nax.set_title(f'Top-1 Similarity (mean={ret_sim[:,0].mean():.3f})')\nax.axvline(ret_sim[:,0].mean(),color='red',ls='--')\n\nax = axes[1,1]\nax.hist(ret_sim[:,:5].mean(1),bins=50,alpha=.7,color='coral')\nax.set_title(f'Top-5 Avg Similarity')\n\n# Length diff between top-1 and prediction\nax = axes[1,2]\nlen_diffs = [abs(get_length(i) - get_length_weighted(i)) for i in range(len(test_df))]\nax.hist(len_diffs, bins=50, alpha=.7, color='green')\nax.set_title(f'|Top1 len - Weighted len| (mean={np.mean(len_diffs):.1f})')\n\nplt.tight_layout(); plt.show()","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('='*60)\nprint('SUMMARY v7 (Pure Retrieval)')\nprint(f'  Total time: {(time.time()-T_START)/60:.1f} min')\nprint(f'  No model training!')\nprint(f'  Retrieval K: {RET_K}')\nprint(f'  Top-1 similarity: {ret_sim[:,0].mean():.4f}')\nprint(f'  Strategies saved:')\nprint(f'    submission.csv     = Top-1 Exact (primary)')\nprint(f'    sub_top1.csv       = Top-1 (clamped length)')\nprint(f'    sub_vote10.csv     = Voting K=10')\nprint(f'    sub_vote5.csv      = Voting K=5')\nprint(f'    sub_vote_exact.csv = Voting K=10 + exact len')\nprint(f'  Try primary first, then alternatives if needed')\nprint('='*60)","metadata":{},"outputs":[],"execution_count":null}]}