summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYurenHao0426 <Blackhao0426@gmail.com>2026-08-01 16:23:26 -0500
committerYurenHao0426 <Blackhao0426@gmail.com>2026-08-01 16:23:26 -0500
commit66af02f1e5c50e041ced3e8b85659709a1c1f4f3 (patch)
tree6dd0de68e644be5e7a5546123f44ea3c4a63646f
parent735f9c7fd202d0eaed9183094d84d365e0e5404d (diff)
Record the gate correction in the concept document
The user-facing statement still carried the retired correlation threshold. Adds the correction, the joint condition that replaces it, the width diagnosis, and the closure of the shrink-N route. Co-Authored-By: Claude <noreply@anthropic.com>
-rw-r--r--PROJECT_CONCEPT.md47
-rw-r--r--RANK_RESULTS.md12
-rw-r--r--logs/obj_base_gpu.log4
-rw-r--r--logs/obj_large_gpu.log3
-rw-r--r--logs/rank_gate.log0
-rw-r--r--logs/rho_full_width.log1
-rw-r--r--worldalign/rank_gate.py138
7 files changed, 204 insertions, 1 deletions
diff --git a/PROJECT_CONCEPT.md b/PROJECT_CONCEPT.md
index d5c0265..d9232e6 100644
--- a/PROJECT_CONCEPT.md
+++ b/PROJECT_CONCEPT.md
@@ -297,6 +297,53 @@ E(\text{permuted / semantically wrong configurations}),
唯一、低能的一致解释。视图级探针给出了这个方向的第一个正信号:
以粗对齐为参照系,细粒度状态在种群上下文中变得跨模态可比。
+## 2026-08-01 更正:我们一直在看错的那个统计量
+
+过去几个月的判据是「真配对处的场相关 ρ 要到 0.9」,低于就不值得跑
+搜索。**这条判据是错的**,而且是被我们自己的对照实验推翻的:把那个
+能恢复到 95.3% 的合成世界的场截断到秩 r,ρ 几乎不动(0.902 / 0.906
+/ 0.928),恢复率却横跨整个量程(6.2% / 12.9% / **95.6%**,秩 4 / 8
+/ 16)。一个 ρ=0.906、已经越过所谓门槛的场,只恢复 13%。
+
+理论其实早就说了,是我们读错了。相关匹配的门槛是为**满秩可交换噪声**
+推导的,那里 N²/2 个矩阵元每一个都独立约束配对;而秩 r 的共享成分只
+提供约 rN 个。256 个场景、r≈10 时,这是门槛公式所假设的八分之一。
+
+新的判据是**二元条件**:场相关,加上**共享谱宽度**——两侧关系场主
+特征子空间之间主角余弦大于 0.7 的方向数,以打乱场景顺序的 null 为
+基线(null=1.0)。两者缺一不可:18 个共享方向配 ρ=0.508 会失败,
+11 个配 ρ=0.902 也会失败。
+
+旧判据一撤,「自然数据不值得跑搜索」的理由也没了,于是跑了:
+**0.0000,chance 是 0.0039**。结论没变,但现在它是测量结果,而不是
+从一个并不支配它的统计量推出来的。
+
+诊断比「特征不够好」精确得多:照片上两个模态**各自都很丰富**(视觉
+有效秩 40,文本 48),但只在 15 个方向上一致——**各自丰富的东西不
+是同一批东西**。而且这个交集对视觉侧几乎一切可调项免疫:分割数 6→16
+掉 1 个方向,直接给标注框只买到 1 个,集合核加三阶矩把视觉自身的秩
+抬高 7 而共享只 +1。文本侧能推动但很快饱和(10→17)。场景数从 256
+加到 1024 反而从 23 降到 19。
+
+于是**语料选择变成一等变量**:合成世界能到 26 个共享方向,是因为它
+的 caption 恰好陈述了完整世界状态;VG 只有 15,是因为一句 region
+description 和一个 patch descriptor 大概就只在这么多个方面重叠。下一
+步要找的不是更好的特征,而是**天然重叠就宽的语料对**——稠密描述、
+带完整规格的商品图文、截图配可访问性树。
+
+顺带的免费收益:判别方向按自身特征值加权、保留更宽的基底,再把文本
+向量提到 128 维,把 ρ 从 0.656 推到 0.716,共享方向从 10 到 16;
+短语按中心词/修饰词分开编码再到 0.725。hubness 假设被证伪(度模型只
+占场方差 1–5%,去掉反而让 ρ 略升)。
+
+另外**「缩小 N」这条路彻底死了,而且方向是反的**:信息论门槛
+ρ_IT ≈ √(4 log N / N) 随 N 减小而**升高**(256 时 0.29,64 时 0.51,
+16 时 0.83)。闸门直接证实:N = 16 至 96 的每个尺寸上,强搜索器找到
+的最深状态都比真值更深,3/3 复现。真值都不是最优解时,算法类别就不
+重要了——这也顺带回答了「接受指数级代价」为什么没用。
+
+详见 `RANK_RESULTS.md`。
+
## 合作者应避免的误解
- 这不是“LLM 通过文本已经获得了视觉知觉”。语言模型拥有的可能是可被
diff --git a/RANK_RESULTS.md b/RANK_RESULTS.md
index e1c4343..0e481b9 100644
--- a/RANK_RESULTS.md
+++ b/RANK_RESULTS.md
@@ -91,6 +91,18 @@ segmentation and nothing over using fewer segments. This confirms from a new
angle what the earlier oracle-box comparison found: **segmentation is not the
constraint on photographs.**
+The correlation column in that table should be read against a noise floor.
+Moving the segmentation eigendecomposition from CPU to GPU changes nothing in
+the recipe, yet re-deriving segments through it takes the baseline correlation
+from 0.6559 to 0.6767 — the eigenvectors differ in sign and, where eigenvalues
+are near-degenerate, in rotation, so the clustering that follows lands
+differently. **Segmentation reseeding is worth about 0.02 in correlation**, so
+the 6-versus-16-segment and oracle-box differences in that table are inside
+the noise and only the shared counts distinguish them. The session's headline
+movements, 0.656 to 0.716 to 0.725, are three times the floor. The pipeline
+itself is unchanged: run against the original CPU-derived segments it
+reproduces 0.6559 exactly.
+
The text side does move it, and saturates:
| Text vector dimension | text eff. rank | ρ | shared |
diff --git a/logs/obj_base_gpu.log b/logs/obj_base_gpu.log
index c3ea786..3fccb88 100644
--- a/logs/obj_base_gpu.log
+++ b/logs/obj_base_gpu.log
@@ -1,3 +1,5 @@
Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.52, even if the model was saved with a slow processor. This will result in minor differences in outputs. You'll still be able to use a slow processor with `use_fast=False`.
`torch_dtype` is deprecated! Use `dtype` instead!
- segment: 0%| | 0/250 [00:00<?, ?it/s] segment: 0%| | 1/250 [00:02<10:41, 2.58s/it] segment: 1%| | 2/250 [00:04<08:49, 2.13s/it] segment: 1%| | 3/250 [00:06<08:11, 1.99s/it] segment: 2%|▏ | 4/250 [00:08<07:52, 1.92s/it] segment: 2%|▏ | 5/250 [00:09<07:41, 1.88s/it] segment: 2%|▏ | 6/250 [00:11<07:02, 1.73s/it] segment: 3%|▎ | 7/250 [00:12<06:28, 1.60s/it] segment: 3%|▎ | 8/250 [00:13<06:06, 1.52s/it] segment: 4%|▎ | 9/250 [00:15<05:50, 1.45s/it] segment: 4%|▍ | 10/250 [00:16<05:40, 1.42s/it] segment: 4%|▍ | 11/250 [00:17<05:31, 1.39s/it] segment: 5%|▍ | 12/250 [00:19<05:26, 1.37s/it] segment: 5%|▌ | 13/250 [00:20<05:23, 1.37s/it] segment: 6%|▌ | 14/250 [00:21<05:20, 1.36s/it] segment: 6%|▌ | 15/250 [00:23<05:16, 1.35s/it] segment: 6%|▋ | 16/250 [00:24<05:14, 1.34s/it] segment: 7%|▋ | 17/250 [00:25<05:12, 1.34s/it] segment: 7%|▋ | 18/250 [00:27<05:10, 1.34s/it] segment: 8%|▊ | 19/250 [00:28<05:07, 1.33s/it] segment: 8%|▊ | 20/250 [00:29<05:06, 1.33s/it] segment: 8%|▊ | 21/250 [00:31<05:04, 1.33s/it] segment: 9%|▉ | 22/250 [00:32<05:01, 1.32s/it] segment: 9%|▉ | 23/250 [00:33<04:59, 1.32s/it] segment: 10%|▉ | 24/250 [00:35<04:58, 1.32s/it] segment: 10%|█ | 25/250 [00:36<04:57, 1.32s/it] segment: 10%|█ | 26/250 [00:37<04:56, 1.32s/it] segment: 11%|█ | 27/250 [00:39<04:56, 1.33s/it] segment: 11%|█ | 28/250 [00:40<04:55, 1.33s/it] segment: 12%|█▏ | 29/250 [00:41<04:54, 1.33s/it] segment: 12%|█▏ | 30/250 [00:43<04:53, 1.33s/it] segment: 12%|█▏ | 31/250 [00:44<04:51, 1.33s/it] segment: 13%|█▎ | 32/250 [00:45<04:48, 1.32s/it] segment: 13%|█▎ | 33/250 [00:47<04:46, 1.32s/it] segment: 14%|█▎ | 34/250 [00:48<04:44, 1.32s/it] segment: 14%|█▍ | 35/250 [00:49<04:43, 1.32s/it] segment: 14%|█▍ | 36/250 [00:51<04:43, 1.32s/it] segment: 15%|█▍ | 37/250 [00:52<04:41, 1.32s/it] segment: 15%|█▌ | 38/250 [00:53<04:40, 1.32s/it] segment: 16%|█▌ | 39/250 [00:55<04:39, 1.32s/it] segment: 16%|█▌ | 40/250 [00:56<04:36, 1.32s/it] segment: 16%|█▋ | 41/250 [00:57<04:34, 1.31s/it] segment: 17%|█▋ | 42/250 [00:59<04:33, 1.32s/it] segment: 17%|█▋ | 43/250 [01:00<04:32, 1.32s/it] segment: 18%|█▊ | 44/250 [01:01<04:31, 1.32s/it] segment: 18%|█▊ | 45/250 [01:03<04:34, 1.34s/it] segment: 18%|█▊ | 46/250 [01:04<04:31, 1.33s/it] segment: 19%|█▉ | 47/250 [01:05<04:27, 1.32s/it] segment: 19%|█▉ | 48/250 [01:06<04:25, 1.32s/it] segment: 20%|█▉ | 49/250 [01:08<04:23, 1.31s/it] segment: 20%|██ | 50/250 [01:09<04:21, 1.31s/it] segment: 20%|██ | 51/250 [01:10<04:21, 1.31s/it] segment: 21%|██ | 52/250 [01:12<04:20, 1.31s/it] segment: 21%|██ | 53/250 [01:13<04:19, 1.32s/it] segment: 22%|██▏ | 54/250 [01:14<04:17, 1.32s/it] segment: 22%|██▏ | 55/250 [01:16<04:16, 1.32s/it] segment: 22%|██▏ | 56/250 [01:17<04:15, 1.32s/it] segment: 23%|██▎ | 57/250 [01:18<04:14, 1.32s/it] segment: 23%|██▎ | 58/250 [01:20<04:13, 1.32s/it] segment: 24%|██▎ | 59/250 [01:21<04:11, 1.32s/it] segment: 24%|██▍ | 60/250 [01:22<04:10, 1.32s/it] segment: 24%|██▍ | 61/250 [01:24<04:08, 1.32s/it] segment: 25%|██▍ | 62/250 [01:25<04:07, 1.32s/it] segment: 25%|██▌ | 63/250 [01:26<04:06, 1.32s/it] segment: 26%|██▌ | 64/250 [01:27<04:04, 1.31s/it] segment: 26%|██▌ | 65/250 [01:29<04:03, 1.32s/it] segment: 26%|██▋ | 66/250 [01:30<04:01, 1.32s/it] segment: 27%|██▋ | 67/250 [01:31<04:01, 1.32s/it] segment: 27%|██▋ | 68/250 [01:33<03:58, 1.31s/it] segment: 28%|██▊ | 69/250 [01:34<03:57, 1.31s/it] segment: 28%|██▊ | 70/250 [01:35<03:56, 1.31s/it] segment: 28%|██▊ | 71/250 [01:37<03:56, 1.32s/it] segment: 29%|██▉ | 72/250 [01:38<03:54, 1.32s/it] segment: 29%|██▉ | 73/250 [01:39<03:52, 1.31s/it] segment: 30%|██▉ | 74/250 [01:41<03:52, 1.32s/it] segment: 30%|███ | 75/250 [01:42<03:51, 1.32s/it] segment: 30%|███ | 76/250 [01:43<03:49, 1.32s/it] segment: 31%|███ | 77/250 [01:45<03:47, 1.32s/it] segment: 31%|███ | 78/250 [01:46<03:47, 1.32s/it] segment: 32%|███▏ | 79/250 [01:47<03:44, 1.31s/it] segment: 32%|███▏ | 80/250 [01:49<03:43, 1.32s/it] segment: 32%|███▏ | 81/250 [01:50<03:42, 1.32s/it] segment: 33%|███▎ | 82/250 [01:51<03:41, 1.32s/it] segment: 33%|███▎ | 83/250 [01:53<03:39, 1.31s/it] segment: 34%|███▎ | 84/250 [01:54<03:37, 1.31s/it] segment: 34%|███▍ | 85/250 [01:55<03:37, 1.32s/it] segment: 34%|███▍ | 86/250 [01:56<03:35, 1.31s/it] segment: 35%|███▍ | 87/250 [01:58<03:34, 1.31s/it] segment: 35%|███▌ | 88/250 [01:59<03:33, 1.32s/it] segment: 36%|███▌ | 89/250 [02:00<03:32, 1.32s/it] segment: 36%|███▌ | 90/250 [02:02<03:30, 1.32s/it] segment: 36%|███▋ | 91/250 [02:03<03:30, 1.32s/it] segment: 37%|███▋ | 92/250 [02:04<03:29, 1.32s/it] segment: 37%|███▋ | 93/250 [02:06<03:28, 1.32s/it] segment: 38%|███▊ | 94/250 [02:07<03:26, 1.33s/it] segment: 38%|███▊ | 95/250 [02:08<03:24, 1.32s/it] segment: 38%|███▊ | 96/250 [02:10<03:23, 1.32s/it] segment: 39%|███▉ | 97/250 [02:11<03:21, 1.32s/it] segment: 39%|███▉ | 98/250 [02:12<03:20, 1.32s/it] segment: 40%|███▉ | 99/250 [02:14<03:18, 1.32s/it] segment: 40%|████ | 100/250 [02:15<03:16, 1.31s/it] segment: 40%|████ | 101/250 [02:16<03:15, 1.31s/it] segment: 41%|████ | 102/250 [02:18<03:14, 1.31s/it] segment: 41%|████ | 103/250 [02:19<03:13, 1.31s/it] segment: 42%|████▏ | 104/250 [02:20<03:11, 1.31s/it] segment: 42%|████▏ | 105/250 [02:21<03:10, 1.31s/it] segment: 42%|████▏ | 106/250 [02:23<03:09, 1.32s/it] segment: 43%|████▎ | 107/250 [02:24<03:08, 1.32s/it] segment: 43%|████▎ | 108/250 [02:25<03:06, 1.31s/it] segment: 44%|████▎ | 109/250 [02:27<03:04, 1.31s/it] segment: 44%|████▍ | 110/250 [02:28<03:03, 1.31s/it] segment: 44%|████▍ | 111/250 [02:29<03:03, 1.32s/it] segment: 45%|████▍ | 112/250 [02:31<03:02, 1.32s/it] segment: 45%|████▌ | 113/250 [02:32<03:00, 1.32s/it] segment: 46%|████▌ | 114/250 [02:33<02:59, 1.32s/it] segment: 46%|████▌ | 115/250 [02:35<02:57, 1.31s/it] segment: 46%|████▋ | 116/250 [02:36<02:56, 1.32s/it] segment: 47%|████▋ | 117/250 [02:37<02:55, 1.32s/it] segment: 47%|████▋ | 118/250 [02:39<02:54, 1.32s/it] segment: 48%|████▊ | 119/250 [02:40<02:52, 1.32s/it] segment: 48%|████▊ | 120/250 [02:41<02:50, 1.31s/it] segment: 48%|████▊ | 121/250 [02:43<02:48, 1.31s/it] segment: 49%|████▉ | 122/250 [02:44<02:47, 1.31s/it] segment: 49%|████▉ | 123/250 [02:45<02:46, 1.31s/it] segment: 50%|████▉ | 124/250 [02:46<02:45, 1.32s/it] segment: 50%|█████ | 125/250 [02:48<02:43, 1.31s/it] segment: 50%|█████ | 126/250 [02:49<02:42, 1.31s/it] segment: 51%|█████ | 127/250 [02:50<02:40, 1.31s/it] segment: 51%|█████ | 128/250 [02:52<02:39, 1.31s/it] segment: 52%|█████▏ | 129/250 [02:53<02:38, 1.31s/it] segment: 52%|█████▏ | 130/250 [02:54<02:37, 1.31s/it] segment: 52%|█████▏ | 131/250 [02:56<02:36, 1.32s/it] segment: 53%|█████▎ | 132/250 [02:57<02:35, 1.32s/it] segment: 53%|█████▎ | 133/250 [02:58<02:33, 1.31s/it] segment: 54%|█████▎ | 134/250 [03:00<02:31, 1.31s/it] segment: 54%|█████▍ | 135/250 [03:01<02:30, 1.31s/it] segment: 54%|█████▍ | 136/250 [03:02<02:28, 1.31s/it] segment: 55%|█████▍ | 137/250 [03:03<02:28, 1.31s/it] segment: 55%|█████▌ | 138/250 [03:05<02:26, 1.31s/it] segment: 56%|█████▌ | 139/250 [03:06<02:25, 1.31s/it] segment: 56%|█████▌ | 140/250 [03:07<02:23, 1.31s/it] segment: 56%|█████▋ | 141/250 [03:09<02:22, 1.31s/it] segment: 57%|█████▋ | 142/250 [03:10<02:21, 1.31s/it] segment: 57%|█████▋ | 143/250 [03:11<02:20, 1.31s/it] segment: 58%|█████▊ | 144/250 [03:13<02:19, 1.32s/it] segment: 58%|█████▊ | 145/250 [03:14<02:18, 1.32s/it] segment: 58%|█████▊ | 146/250 [03:15<02:18, 1.33s/it] segment: 59%|█████▉ | 147/250 [03:17<02:15, 1.31s/it] segment: 59%|█████▉ | 148/250 [03:18<02:13, 1.31s/it] segment: 60%|█████▉ | 149/250 [03:19<02:12, 1.31s/it] segment: 60%|██████ | 150/250 [03:21<02:11, 1.32s/it] segment: 60%|██████ | 151/250 [03:22<02:10, 1.32s/it] segment: 61%|██████ | 152/250 [03:23<02:09, 1.32s/it] segment: 61%|██████ | 153/250 [03:25<02:08, 1.32s/it] segment: 62%|██████▏ | 154/250 [03:26<02:07, 1.33s/it] segment: 62%|██████▏ | 155/250 [03:27<02:05, 1.32s/it] segment: 62%|██████▏ | 156/250 [03:29<02:04, 1.33s/it] segment: 63%|██████▎ | 157/250 [03:30<02:02, 1.32s/it] segment: 63%|██████▎ | 158/250 [03:31<02:01, 1.32s/it] segment: 64%|██████▎ | 159/250 [03:33<02:02, 1.35s/it] segment: 64%|██████▍ | 160/250 [03:34<02:00, 1.34s/it] segment: 64%|██████▍ | 161/250 [03:35<01:58, 1.34s/it] segment: 65%|██████▍ | 162/250 [03:37<01:57, 1.33s/it] segment: 65%|██████▌ | 163/250 [03:38<01:55, 1.33s/it] segment: 66%|██████▌ | 164/250 [03:39<02:00, 1.40s/it] segment: 66%|██████▌ | 165/250 [03:41<02:09, 1.53s/it] segment: 66%|██████▋ | 166/250 [03:43<02:16, 1.62s/it] segment: 67%|██████▋ | 167/250 [03:45<02:19, 1.68s/it] segment: 67%|██████▋ | 168/250 [03:47<02:21, 1.73s/it] segment: 68%|██████▊ | 169/250 [03:49<02:22, 1.76s/it] segment: 68%|██████▊ | 170/250 [03:50<02:22, 1.79s/it] segment: 68%|██████▊ | 171/250 [03:52<02:22, 1.80s/it] segment: 69%|██████▉ | 172/250 [03:54<02:21, 1.82s/it] segment: 69%|██████▉ | 173/250 [03:56<02:20, 1.82s/it] segment: 70%|██████▉ | 174/250 [03:58<02:19, 1.83s/it] segment: 70%|███████ | 175/250 [04:00<02:19, 1.86s/it] segment: 70%|███████ | 176/250 [04:02<02:17, 1.85s/it] segment: 71%|███████ | 177/250 [04:03<02:15, 1.85s/it] segment: 71%|███████ | 178/250 [04:05<02:13, 1.86s/it] segment: 72%|███████▏ | 179/250 [04:07<02:11, 1.86s/it] segment: 72%|███████▏ | 180/250 [04:09<02:09, 1.85s/it] segment: 72%|███████▏ | 181/250 [04:11<02:07, 1.84s/it] segment: 73%|███████▎ | 182/250 [04:13<02:05, 1.84s/it] segment: 73%|███████▎ | 183/250 [04:15<02:03, 1.84s/it] segment: 74%|███████▎ | 184/250 [04:16<02:01, 1.84s/it] segment: 74%|███████▍ | 185/250 [04:18<01:59, 1.84s/it] segment: 74%|███████▍ | 186/250 [04:20<01:58, 1.85s/it] segment: 75%|███████▍ | 187/250 [04:22<01:56, 1.85s/it] segment: 75%|███████▌ | 188/250 [04:24<01:54, 1.85s/it] segment: 76%|███████▌ | 189/250 [04:26<01:52, 1.85s/it] segment: 76%|███████▌ | 190/250 [04:27<01:50, 1.85s/it] segment: 76%|███████▋ | 191/250 [04:29<01:49, 1.86s/it] segment: 77%|███████▋ | 192/250 [04:31<01:47, 1.86s/it] segment: 77%|███████▋ | 193/250 [04:33<01:45, 1.85s/it] segment: 78%|███████▊ | 194/250 [04:35<01:43, 1.85s/it] segment: 78%|███████▊ | 195/250 [04:37<01:41, 1.85s/it] segment: 78%|███████▊ | 196/250 [04:39<01:40, 1.86s/it] segment: 79%|███████▉ | 197/250 [04:40<01:38, 1.86s/it] segment: 79%|███████▉ | 198/250 [04:42<01:36, 1.85s/it] segment: 80%|███████▉ | 199/250 [04:44<01:34, 1.85s/it] segment: 80%|████████ | 200/250 [04:46<01:32, 1.85s/it] segment: 80%|████████ | 201/250 [04:48<01:30, 1.85s/it] segment: 81%|████████ | 202/250 [04:50<01:28, 1.85s/it] segment: 81%|████████ | 203/250 [04:52<01:26, 1.85s/it] segment: 82%|████████▏ | 204/250 [04:53<01:25, 1.85s/it] segment: 82%|████████▏ | 205/250 [04:55<01:23, 1.85s/it] segment: 82%|████████▏ | 206/250 [04:57<01:22, 1.87s/it] segment: 83%|████████▎ | 207/250 [04:59<01:20, 1.86s/it] segment: 83%|████████▎ | 208/250 [05:01<01:18, 1.86s/it] segment: 84%|████████▎ | 209/250 [05:03<01:16, 1.86s/it] segment: 84%|████████▍ | 210/250 [05:05<01:15, 1.88s/it] segment: 84%|████████▍ | 211/250 [05:06<01:12, 1.87s/it] segment: 85%|████████▍ | 212/250 [05:08<01:10, 1.86s/it] segment: 85%|████████▌ | 213/250 [05:10<01:08, 1.85s/it] segment: 86%|████████▌ | 214/250 [05:12<01:06, 1.86s/it] segment: 86%|████████▌ | 215/250 [05:14<01:04, 1.85s/it] segment: 86%|████████▋ | 216/250 [05:16<01:02, 1.85s/it] segment: 87%|████████▋ | 217/250 [05:18<01:01, 1.85s/it] segment: 87%|████████▋ | 218/250 [05:19<00:59, 1.86s/it] segment: 88%|████████▊ | 219/250 [05:21<00:57, 1.85s/it] segment: 88%|████████▊ | 220/250 [05:23<00:55, 1.85s/it] segment: 88%|████████▊ | 221/250 [05:25<00:53, 1.85s/it] segment: 89%|████████▉ | 222/250 [05:27<00:51, 1.85s/it] segment: 89%|████████▉ | 223/250 [05:29<00:49, 1.85s/it] segment: 90%|████████▉ | 224/250 [05:31<00:48, 1.85s/it] segment: 90%|█████████ | 225/250 [05:32<00:46, 1.84s/it] segment: 90%|█████████ | 226/250 [05:34<00:44, 1.84s/it] segment: 91%|█████████ | 227/250 [05:36<00:42, 1.84s/it] segment: 91%|█████████ | 228/250 [05:38<00:40, 1.85s/it] segment: 92%|█████████▏| 229/250 [05:40<00:38, 1.85s/it] segment: 92%|█████████▏| 230/250 [05:42<00:36, 1.84s/it] segment: 92%|█████████▏| 231/250 [05:43<00:34, 1.84s/it] segment: 93%|█████████▎| 232/250 [05:45<00:33, 1.84s/it] segment: 93%|█████████▎| 233/250 [05:47<00:31, 1.85s/it] segment: 94%|█████████▎| 234/250 [05:49<00:29, 1.86s/it] segment: 94%|█████████▍| 235/250 [05:51<00:28, 1.88s/it] segment: 94%|█████████▍| 236/250 [05:53<00:26, 1.87s/it] segment: 95%|█████████▍| 237/250 [05:56<00:30, 2.35s/it] segment: 95%|█████████▌| 238/250 [05:58<00:26, 2.20s/it] segment: 96%|█████████▌| 239/250 [06:00<00:22, 2.09s/it] segment: 96%|█████████▌| 240/250 [06:02<00:20, 2.01s/it] segment: 96%|█████████▋| 241/250 [06:04<00:17, 1.96s/it] segment: 97%|█████████▋| 242/250 [06:05<00:15, 1.92s/it] segment: 97%|█████████▋| 243/250 [06:07<00:13, 1.90s/it] segment: 98%|█████████▊| 244/250 [06:09<00:11, 1.88s/it] segment: 98%|█████████▊| 245/250 [06:11<00:09, 1.87s/it] segment: 98%|█████████▊| 246/250 [06:13<00:07, 1.86s/it] segment: 99%|█████████▉| 247/250 [06:15<00:05, 1.86s/it] \ No newline at end of file
+ segment: 0%| | 0/250 [00:00<?, ?it/s] segment: 0%| | 1/250 [00:02<10:41, 2.58s/it] segment: 1%| | 2/250 [00:04<08:49, 2.13s/it] segment: 1%| | 3/250 [00:06<08:11, 1.99s/it] segment: 2%|▏ | 4/250 [00:08<07:52, 1.92s/it] segment: 2%|▏ | 5/250 [00:09<07:41, 1.88s/it] segment: 2%|▏ | 6/250 [00:11<07:02, 1.73s/it] segment: 3%|▎ | 7/250 [00:12<06:28, 1.60s/it] segment: 3%|▎ | 8/250 [00:13<06:06, 1.52s/it] segment: 4%|▎ | 9/250 [00:15<05:50, 1.45s/it] segment: 4%|▍ | 10/250 [00:16<05:40, 1.42s/it] segment: 4%|▍ | 11/250 [00:17<05:31, 1.39s/it] segment: 5%|▍ | 12/250 [00:19<05:26, 1.37s/it] segment: 5%|▌ | 13/250 [00:20<05:23, 1.37s/it] segment: 6%|▌ | 14/250 [00:21<05:20, 1.36s/it] segment: 6%|▌ | 15/250 [00:23<05:16, 1.35s/it] segment: 6%|▋ | 16/250 [00:24<05:14, 1.34s/it] segment: 7%|▋ | 17/250 [00:25<05:12, 1.34s/it] segment: 7%|▋ | 18/250 [00:27<05:10, 1.34s/it] segment: 8%|▊ | 19/250 [00:28<05:07, 1.33s/it] segment: 8%|▊ | 20/250 [00:29<05:06, 1.33s/it] segment: 8%|▊ | 21/250 [00:31<05:04, 1.33s/it] segment: 9%|▉ | 22/250 [00:32<05:01, 1.32s/it] segment: 9%|▉ | 23/250 [00:33<04:59, 1.32s/it] segment: 10%|▉ | 24/250 [00:35<04:58, 1.32s/it] segment: 10%|█ | 25/250 [00:36<04:57, 1.32s/it] segment: 10%|█ | 26/250 [00:37<04:56, 1.32s/it] segment: 11%|█ | 27/250 [00:39<04:56, 1.33s/it] segment: 11%|█ | 28/250 [00:40<04:55, 1.33s/it] segment: 12%|█▏ | 29/250 [00:41<04:54, 1.33s/it] segment: 12%|█▏ | 30/250 [00:43<04:53, 1.33s/it] segment: 12%|█▏ | 31/250 [00:44<04:51, 1.33s/it] segment: 13%|█▎ | 32/250 [00:45<04:48, 1.32s/it] segment: 13%|█▎ | 33/250 [00:47<04:46, 1.32s/it] segment: 14%|█▎ | 34/250 [00:48<04:44, 1.32s/it] segment: 14%|█▍ | 35/250 [00:49<04:43, 1.32s/it] segment: 14%|█▍ | 36/250 [00:51<04:43, 1.32s/it] segment: 15%|█▍ | 37/250 [00:52<04:41, 1.32s/it] segment: 15%|█▌ | 38/250 [00:53<04:40, 1.32s/it] segment: 16%|█▌ | 39/250 [00:55<04:39, 1.32s/it] segment: 16%|█▌ | 40/250 [00:56<04:36, 1.32s/it] segment: 16%|█▋ | 41/250 [00:57<04:34, 1.31s/it] segment: 17%|█▋ | 42/250 [00:59<04:33, 1.32s/it] segment: 17%|█▋ | 43/250 [01:00<04:32, 1.32s/it] segment: 18%|█▊ | 44/250 [01:01<04:31, 1.32s/it] segment: 18%|█▊ | 45/250 [01:03<04:34, 1.34s/it] segment: 18%|█▊ | 46/250 [01:04<04:31, 1.33s/it] segment: 19%|█▉ | 47/250 [01:05<04:27, 1.32s/it] segment: 19%|█▉ | 48/250 [01:06<04:25, 1.32s/it] segment: 20%|█▉ | 49/250 [01:08<04:23, 1.31s/it] segment: 20%|██ | 50/250 [01:09<04:21, 1.31s/it] segment: 20%|██ | 51/250 [01:10<04:21, 1.31s/it] segment: 21%|██ | 52/250 [01:12<04:20, 1.31s/it] segment: 21%|██ | 53/250 [01:13<04:19, 1.32s/it] segment: 22%|██▏ | 54/250 [01:14<04:17, 1.32s/it] segment: 22%|██▏ | 55/250 [01:16<04:16, 1.32s/it] segment: 22%|██▏ | 56/250 [01:17<04:15, 1.32s/it] segment: 23%|██▎ | 57/250 [01:18<04:14, 1.32s/it] segment: 23%|██▎ | 58/250 [01:20<04:13, 1.32s/it] segment: 24%|██▎ | 59/250 [01:21<04:11, 1.32s/it] segment: 24%|██▍ | 60/250 [01:22<04:10, 1.32s/it] segment: 24%|██▍ | 61/250 [01:24<04:08, 1.32s/it] segment: 25%|██▍ | 62/250 [01:25<04:07, 1.32s/it] segment: 25%|██▌ | 63/250 [01:26<04:06, 1.32s/it] segment: 26%|██▌ | 64/250 [01:27<04:04, 1.31s/it] segment: 26%|██▌ | 65/250 [01:29<04:03, 1.32s/it] segment: 26%|██▋ | 66/250 [01:30<04:01, 1.32s/it] segment: 27%|██▋ | 67/250 [01:31<04:01, 1.32s/it] segment: 27%|██▋ | 68/250 [01:33<03:58, 1.31s/it] segment: 28%|██▊ | 69/250 [01:34<03:57, 1.31s/it] segment: 28%|██▊ | 70/250 [01:35<03:56, 1.31s/it] segment: 28%|██▊ | 71/250 [01:37<03:56, 1.32s/it] segment: 29%|██▉ | 72/250 [01:38<03:54, 1.32s/it] segment: 29%|██▉ | 73/250 [01:39<03:52, 1.31s/it] segment: 30%|██▉ | 74/250 [01:41<03:52, 1.32s/it] segment: 30%|███ | 75/250 [01:42<03:51, 1.32s/it] segment: 30%|███ | 76/250 [01:43<03:49, 1.32s/it] segment: 31%|███ | 77/250 [01:45<03:47, 1.32s/it] segment: 31%|███ | 78/250 [01:46<03:47, 1.32s/it] segment: 32%|███▏ | 79/250 [01:47<03:44, 1.31s/it] segment: 32%|███▏ | 80/250 [01:49<03:43, 1.32s/it] segment: 32%|███▏ | 81/250 [01:50<03:42, 1.32s/it] segment: 33%|███▎ | 82/250 [01:51<03:41, 1.32s/it] segment: 33%|███▎ | 83/250 [01:53<03:39, 1.31s/it] segment: 34%|███▎ | 84/250 [01:54<03:37, 1.31s/it] segment: 34%|███▍ | 85/250 [01:55<03:37, 1.32s/it] segment: 34%|███▍ | 86/250 [01:56<03:35, 1.31s/it] segment: 35%|███▍ | 87/250 [01:58<03:34, 1.31s/it] segment: 35%|███▌ | 88/250 [01:59<03:33, 1.32s/it] segment: 36%|███▌ | 89/250 [02:00<03:32, 1.32s/it] segment: 36%|███▌ | 90/250 [02:02<03:30, 1.32s/it] segment: 36%|███▋ | 91/250 [02:03<03:30, 1.32s/it] segment: 37%|███▋ | 92/250 [02:04<03:29, 1.32s/it] segment: 37%|███▋ | 93/250 [02:06<03:28, 1.32s/it] segment: 38%|███▊ | 94/250 [02:07<03:26, 1.33s/it] segment: 38%|███▊ | 95/250 [02:08<03:24, 1.32s/it] segment: 38%|███▊ | 96/250 [02:10<03:23, 1.32s/it] segment: 39%|███▉ | 97/250 [02:11<03:21, 1.32s/it] segment: 39%|███▉ | 98/250 [02:12<03:20, 1.32s/it] segment: 40%|███▉ | 99/250 [02:14<03:18, 1.32s/it] segment: 40%|████ | 100/250 [02:15<03:16, 1.31s/it] segment: 40%|████ | 101/250 [02:16<03:15, 1.31s/it] segment: 41%|████ | 102/250 [02:18<03:14, 1.31s/it] segment: 41%|████ | 103/250 [02:19<03:13, 1.31s/it] segment: 42%|████▏ | 104/250 [02:20<03:11, 1.31s/it] segment: 42%|████▏ | 105/250 [02:21<03:10, 1.31s/it] segment: 42%|████▏ | 106/250 [02:23<03:09, 1.32s/it] segment: 43%|████▎ | 107/250 [02:24<03:08, 1.32s/it] segment: 43%|████▎ | 108/250 [02:25<03:06, 1.31s/it] segment: 44%|████▎ | 109/250 [02:27<03:04, 1.31s/it] segment: 44%|████▍ | 110/250 [02:28<03:03, 1.31s/it] segment: 44%|████▍ | 111/250 [02:29<03:03, 1.32s/it] segment: 45%|████▍ | 112/250 [02:31<03:02, 1.32s/it] segment: 45%|████▌ | 113/250 [02:32<03:00, 1.32s/it] segment: 46%|████▌ | 114/250 [02:33<02:59, 1.32s/it] segment: 46%|████▌ | 115/250 [02:35<02:57, 1.31s/it] segment: 46%|████▋ | 116/250 [02:36<02:56, 1.32s/it] segment: 47%|████▋ | 117/250 [02:37<02:55, 1.32s/it] segment: 47%|████▋ | 118/250 [02:39<02:54, 1.32s/it] segment: 48%|████▊ | 119/250 [02:40<02:52, 1.32s/it] segment: 48%|████▊ | 120/250 [02:41<02:50, 1.31s/it] segment: 48%|████▊ | 121/250 [02:43<02:48, 1.31s/it] segment: 49%|████▉ | 122/250 [02:44<02:47, 1.31s/it] segment: 49%|████▉ | 123/250 [02:45<02:46, 1.31s/it] segment: 50%|████▉ | 124/250 [02:46<02:45, 1.32s/it] segment: 50%|█████ | 125/250 [02:48<02:43, 1.31s/it] segment: 50%|█████ | 126/250 [02:49<02:42, 1.31s/it] segment: 51%|█████ | 127/250 [02:50<02:40, 1.31s/it] segment: 51%|█████ | 128/250 [02:52<02:39, 1.31s/it] segment: 52%|█████▏ | 129/250 [02:53<02:38, 1.31s/it] segment: 52%|█████▏ | 130/250 [02:54<02:37, 1.31s/it] segment: 52%|█████▏ | 131/250 [02:56<02:36, 1.32s/it] segment: 53%|█████▎ | 132/250 [02:57<02:35, 1.32s/it] segment: 53%|█████▎ | 133/250 [02:58<02:33, 1.31s/it] segment: 54%|█████▎ | 134/250 [03:00<02:31, 1.31s/it] segment: 54%|█████▍ | 135/250 [03:01<02:30, 1.31s/it] segment: 54%|█████▍ | 136/250 [03:02<02:28, 1.31s/it] segment: 55%|█████▍ | 137/250 [03:03<02:28, 1.31s/it] segment: 55%|█████▌ | 138/250 [03:05<02:26, 1.31s/it] segment: 56%|█████▌ | 139/250 [03:06<02:25, 1.31s/it] segment: 56%|█████▌ | 140/250 [03:07<02:23, 1.31s/it] segment: 56%|█████▋ | 141/250 [03:09<02:22, 1.31s/it] segment: 57%|█████▋ | 142/250 [03:10<02:21, 1.31s/it] segment: 57%|█████▋ | 143/250 [03:11<02:20, 1.31s/it] segment: 58%|█████▊ | 144/250 [03:13<02:19, 1.32s/it] segment: 58%|█████▊ | 145/250 [03:14<02:18, 1.32s/it] segment: 58%|█████▊ | 146/250 [03:15<02:18, 1.33s/it] segment: 59%|█████▉ | 147/250 [03:17<02:15, 1.31s/it] segment: 59%|█████▉ | 148/250 [03:18<02:13, 1.31s/it] segment: 60%|█████▉ | 149/250 [03:19<02:12, 1.31s/it] segment: 60%|██████ | 150/250 [03:21<02:11, 1.32s/it] segment: 60%|██████ | 151/250 [03:22<02:10, 1.32s/it] segment: 61%|██████ | 152/250 [03:23<02:09, 1.32s/it] segment: 61%|██████ | 153/250 [03:25<02:08, 1.32s/it] segment: 62%|██████▏ | 154/250 [03:26<02:07, 1.33s/it] segment: 62%|██████▏ | 155/250 [03:27<02:05, 1.32s/it] segment: 62%|██████▏ | 156/250 [03:29<02:04, 1.33s/it] segment: 63%|██████▎ | 157/250 [03:30<02:02, 1.32s/it] segment: 63%|██████▎ | 158/250 [03:31<02:01, 1.32s/it] segment: 64%|██████▎ | 159/250 [03:33<02:02, 1.35s/it] segment: 64%|██████▍ | 160/250 [03:34<02:00, 1.34s/it] segment: 64%|██████▍ | 161/250 [03:35<01:58, 1.34s/it] segment: 65%|██████▍ | 162/250 [03:37<01:57, 1.33s/it] segment: 65%|██████▌ | 163/250 [03:38<01:55, 1.33s/it] segment: 66%|██████▌ | 164/250 [03:39<02:00, 1.40s/it] segment: 66%|██████▌ | 165/250 [03:41<02:09, 1.53s/it] segment: 66%|██████▋ | 166/250 [03:43<02:16, 1.62s/it] segment: 67%|██████▋ | 167/250 [03:45<02:19, 1.68s/it] segment: 67%|██████▋ | 168/250 [03:47<02:21, 1.73s/it] segment: 68%|██████▊ | 169/250 [03:49<02:22, 1.76s/it] segment: 68%|██████▊ | 170/250 [03:50<02:22, 1.79s/it] segment: 68%|██████▊ | 171/250 [03:52<02:22, 1.80s/it] segment: 69%|██████▉ | 172/250 [03:54<02:21, 1.82s/it] segment: 69%|██████▉ | 173/250 [03:56<02:20, 1.82s/it] segment: 70%|██████▉ | 174/250 [03:58<02:19, 1.83s/it] segment: 70%|███████ | 175/250 [04:00<02:19, 1.86s/it] segment: 70%|███████ | 176/250 [04:02<02:17, 1.85s/it] segment: 71%|███████ | 177/250 [04:03<02:15, 1.85s/it] segment: 71%|███████ | 178/250 [04:05<02:13, 1.86s/it] segment: 72%|███████▏ | 179/250 [04:07<02:11, 1.86s/it] segment: 72%|███████▏ | 180/250 [04:09<02:09, 1.85s/it] segment: 72%|███████▏ | 181/250 [04:11<02:07, 1.84s/it] segment: 73%|███████▎ | 182/250 [04:13<02:05, 1.84s/it] segment: 73%|███████▎ | 183/250 [04:15<02:03, 1.84s/it] segment: 74%|███████▎ | 184/250 [04:16<02:01, 1.84s/it] segment: 74%|███████▍ | 185/250 [04:18<01:59, 1.84s/it] segment: 74%|███████▍ | 186/250 [04:20<01:58, 1.85s/it] segment: 75%|███████▍ | 187/250 [04:22<01:56, 1.85s/it] segment: 75%|███████▌ | 188/250 [04:24<01:54, 1.85s/it] segment: 76%|███████▌ | 189/250 [04:26<01:52, 1.85s/it] segment: 76%|███████▌ | 190/250 [04:27<01:50, 1.85s/it] segment: 76%|███████▋ | 191/250 [04:29<01:49, 1.86s/it] segment: 77%|███████▋ | 192/250 [04:31<01:47, 1.86s/it] segment: 77%|███████▋ | 193/250 [04:33<01:45, 1.85s/it] segment: 78%|███████▊ | 194/250 [04:35<01:43, 1.85s/it] segment: 78%|███████▊ | 195/250 [04:37<01:41, 1.85s/it] segment: 78%|███████▊ | 196/250 [04:39<01:40, 1.86s/it] segment: 79%|███████▉ | 197/250 [04:40<01:38, 1.86s/it] segment: 79%|███████▉ | 198/250 [04:42<01:36, 1.85s/it] segment: 80%|███████▉ | 199/250 [04:44<01:34, 1.85s/it] segment: 80%|████████ | 200/250 [04:46<01:32, 1.85s/it] segment: 80%|████████ | 201/250 [04:48<01:30, 1.85s/it] segment: 81%|████████ | 202/250 [04:50<01:28, 1.85s/it] segment: 81%|████████ | 203/250 [04:52<01:26, 1.85s/it] segment: 82%|████████▏ | 204/250 [04:53<01:25, 1.85s/it] segment: 82%|████████▏ | 205/250 [04:55<01:23, 1.85s/it] segment: 82%|████████▏ | 206/250 [04:57<01:22, 1.87s/it] segment: 83%|████████▎ | 207/250 [04:59<01:20, 1.86s/it] segment: 83%|████████▎ | 208/250 [05:01<01:18, 1.86s/it] segment: 84%|████████▎ | 209/250 [05:03<01:16, 1.86s/it] segment: 84%|████████▍ | 210/250 [05:05<01:15, 1.88s/it] segment: 84%|████████▍ | 211/250 [05:06<01:12, 1.87s/it] segment: 85%|████████▍ | 212/250 [05:08<01:10, 1.86s/it] segment: 85%|████████▌ | 213/250 [05:10<01:08, 1.85s/it] segment: 86%|████████▌ | 214/250 [05:12<01:06, 1.86s/it] segment: 86%|████████▌ | 215/250 [05:14<01:04, 1.85s/it] segment: 86%|████████▋ | 216/250 [05:16<01:02, 1.85s/it] segment: 87%|████████▋ | 217/250 [05:18<01:01, 1.85s/it] segment: 87%|████████▋ | 218/250 [05:19<00:59, 1.86s/it] segment: 88%|████████▊ | 219/250 [05:21<00:57, 1.85s/it] segment: 88%|████████▊ | 220/250 [05:23<00:55, 1.85s/it] segment: 88%|████████▊ | 221/250 [05:25<00:53, 1.85s/it] segment: 89%|████████▉ | 222/250 [05:27<00:51, 1.85s/it] segment: 89%|████████▉ | 223/250 [05:29<00:49, 1.85s/it] segment: 90%|████████▉ | 224/250 [05:31<00:48, 1.85s/it] segment: 90%|█████████ | 225/250 [05:32<00:46, 1.84s/it] segment: 90%|█████████ | 226/250 [05:34<00:44, 1.84s/it] segment: 91%|█████████ | 227/250 [05:36<00:42, 1.84s/it] segment: 91%|█████████ | 228/250 [05:38<00:40, 1.85s/it] segment: 92%|█████████▏| 229/250 [05:40<00:38, 1.85s/it] segment: 92%|█████████▏| 230/250 [05:42<00:36, 1.84s/it] segment: 92%|█████████▏| 231/250 [05:43<00:34, 1.84s/it] segment: 93%|█████████▎| 232/250 [05:45<00:33, 1.84s/it] segment: 93%|█████████▎| 233/250 [05:47<00:31, 1.85s/it] segment: 94%|█████████▎| 234/250 [05:49<00:29, 1.86s/it] segment: 94%|█████████▍| 235/250 [05:51<00:28, 1.88s/it] segment: 94%|█████████▍| 236/250 [05:53<00:26, 1.87s/it] segment: 95%|█████████▍| 237/250 [05:56<00:30, 2.35s/it] segment: 95%|█████████▌| 238/250 [05:58<00:26, 2.20s/it] segment: 96%|█████████▌| 239/250 [06:00<00:22, 2.09s/it] segment: 96%|█████████▌| 240/250 [06:02<00:20, 2.01s/it] segment: 96%|█████████▋| 241/250 [06:04<00:17, 1.96s/it] segment: 97%|█████████▋| 242/250 [06:05<00:15, 1.92s/it] segment: 97%|█████████▋| 243/250 [06:07<00:13, 1.90s/it] segment: 98%|█████████▊| 244/250 [06:09<00:11, 1.88s/it] segment: 98%|█████████▊| 245/250 [06:11<00:09, 1.87s/it] segment: 98%|█████████▊| 246/250 [06:13<00:07, 1.86s/it] segment: 99%|█████████▉| 247/250 [06:15<00:05, 1.86s/it] segment: 99%|█████████▉| 248/250 [06:16<00:03, 1.86s/it] segment: 100%|█████████▉| 249/250 [06:18<00:01, 1.85s/it] segment: 100%|██████████| 250/250 [06:20<00:00, 1.85s/it] segment: 100%|██████████| 250/250 [06:20<00:00, 1.52s/it]
+{"nodes": 2000, "mean_segments": 6.0, "min_segments": 6}
+Wrote artifacts/vg_5k/nobj_base_gpu.pt
diff --git a/logs/obj_large_gpu.log b/logs/obj_large_gpu.log
new file mode 100644
index 0000000..0ba1ad7
--- /dev/null
+++ b/logs/obj_large_gpu.log
@@ -0,0 +1,3 @@
+Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.52, even if the model was saved with a slow processor. This will result in minor differences in outputs. You'll still be able to use a slow processor with `use_fast=False`.
+`torch_dtype` is deprecated! Use `dtype` instead!
+ segment: 0%| | 0/250 [00:00<?, ?it/s] segment: 0%| | 1/250 [00:03<14:05, 3.39s/it] segment: 1%| | 2/250 [00:06<12:26, 3.01s/it] segment: 1%| | 3/250 [00:08<11:50, 2.88s/it] segment: 2%|▏ | 4/250 [00:11<11:34, 2.82s/it] segment: 2%|▏ | 5/250 [00:14<11:25, 2.80s/it] segment: 2%|▏ | 6/250 [00:17<11:16, 2.77s/it] segment: 3%|▎ | 7/250 [00:19<11:09, 2.76s/it] segment: 3%|▎ | 8/250 [00:22<11:08, 2.76s/it] segment: 4%|▎ | 9/250 [00:25<11:02, 2.75s/it] segment: 4%|▍ | 10/250 [00:28<10:59, 2.75s/it] segment: 4%|▍ | 11/250 [00:30<10:55, 2.74s/it] segment: 5%|▍ | 12/250 [00:33<10:52, 2.74s/it] segment: 5%|▌ | 13/250 [00:36<10:49, 2.74s/it] segment: 6%|▌ | 14/250 [00:38<10:47, 2.74s/it] segment: 6%|▌ | 15/250 [00:41<10:43, 2.74s/it] segment: 6%|▋ | 16/250 [00:44<10:40, 2.74s/it] segment: 7%|▋ | 17/250 [00:47<10:39, 2.74s/it] segment: 7%|▋ | 18/250 [00:49<10:35, 2.74s/it] segment: 8%|▊ | 19/250 [00:52<10:31, 2.73s/it] segment: 8%|▊ | 20/250 [00:55<10:29, 2.74s/it] segment: 8%|▊ | 21/250 [00:58<10:26, 2.74s/it] segment: 9%|▉ | 22/250 [01:00<10:24, 2.74s/it] segment: 9%|▉ | 23/250 [01:03<10:21, 2.74s/it] segment: 10%|▉ | 24/250 [01:06<10:20, 2.75s/it] segment: 10%|█ | 25/250 [01:09<10:16, 2.74s/it] segment: 10%|█ | 26/250 [01:11<10:11, 2.73s/it] segment: 11%|█ | 27/250 [01:14<10:09, 2.73s/it] segment: 11%|█ | 28/250 [01:17<10:07, 2.74s/it] segment: 12%|█▏ | 29/250 [01:20<10:05, 2.74s/it] segment: 12%|█▏ | 30/250 [01:22<10:02, 2.74s/it] segment: 12%|█▏ | 31/250 [01:25<10:00, 2.74s/it] segment: 13%|█▎ | 32/250 [01:28<09:56, 2.74s/it] segment: 13%|█▎ | 33/250 [01:30<09:53, 2.74s/it] segment: 14%|█▎ | 34/250 [01:33<09:50, 2.73s/it] segment: 14%|█▍ | 35/250 [01:36<09:47, 2.73s/it] segment: 14%|█▍ | 36/250 [01:39<10:36, 2.97s/it] segment: 15%|█▍ | 37/250 [01:43<11:11, 3.15s/it] segment: 15%|█▌ | 38/250 [01:47<11:35, 3.28s/it] segment: 16%|█▌ | 39/250 [01:50<11:50, 3.37s/it] segment: 16%|█▌ | 40/250 [01:54<11:58, 3.42s/it] segment: 16%|█▋ | 41/250 [01:57<12:03, 3.46s/it] segment: 17%|█▋ | 42/250 [02:01<12:07, 3.50s/it] segment: 17%|█▋ | 43/250 [02:04<12:06, 3.51s/it] segment: 18%|█▊ | 44/250 [02:08<12:05, 3.52s/it] segment: 18%|█▊ | 45/250 [02:12<12:05, 3.54s/it] segment: 18%|█▊ | 46/250 [02:15<12:00, 3.53s/it] segment: 19%|█▉ | 47/250 [02:19<11:58, 3.54s/it] segment: 19%|█▉ | 48/250 [02:22<11:56, 3.55s/it] segment: 20%|█▉ | 49/250 [02:26<11:54, 3.55s/it] segment: 20%|██ | 50/250 [02:29<11:51, 3.56s/it] \ No newline at end of file
diff --git a/logs/rank_gate.log b/logs/rank_gate.log
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/logs/rank_gate.log
diff --git a/logs/rho_full_width.log b/logs/rho_full_width.log
index e69de29..f0255ac 100644
--- a/logs/rho_full_width.log
+++ b/logs/rho_full_width.log
@@ -0,0 +1 @@
+noise=0.0 rho=0.928 shared= 21.0 recovery=0.961
diff --git a/worldalign/rank_gate.py b/worldalign/rank_gate.py
new file mode 100644
index 0000000..d55f12e
--- /dev/null
+++ b/worldalign/rank_gate.py
@@ -0,0 +1,138 @@
+"""Is low-rank failure an information limit or a solver limit?
+
+The rank ladder is the result that retires the correlation gate, so it has to
+survive the objection the project has fallen for three times before: a limit
+that looks intrinsic and turns out to belong to the search operator. At rank
+eight the composed solver reaches 13%, and that alone does not say whether the
+truth is unreachable or merely unreached.
+
+The gate answers it. If the deepest state a strong searcher finds is deeper
+than the truth, the truth is not the optimum and no solver of any cost
+recovers it -- the width really is an information limit. If the truth is
+deepest and the solver still misses it, the ladder measures search difficulty
+instead and the conclusion has to be rewritten.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+
+import numpy as np
+import torch
+
+from .common import write_json
+from .spectral_match import grampa
+from .synth_fast_gate import ClosedFormEnergy, all_swaps, steepest_descent
+from .synth_triangle_gate import standardized
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--fields", default="artifacts/synth_v1/fields_tier0_ws_256.pt")
+ parser.add_argument("--ranks", type=int, nargs="+", default=[4, 8, 16, 256])
+ parser.add_argument("--restarts", type=int, default=60)
+ parser.add_argument("--trials", type=int, default=3)
+ parser.add_argument("--device", default="cuda:3")
+ parser.add_argument("--output", default="artifacts/synth_v1/rank_gate.json")
+ return parser.parse_args()
+
+
+def offdiagonal(matrix: np.ndarray) -> np.ndarray:
+ return matrix[~np.eye(len(matrix), dtype=bool)]
+
+
+def normalise(matrix: np.ndarray) -> np.ndarray:
+ values = offdiagonal(matrix)
+ out = (matrix - values.mean()) / values.std()
+ np.fill_diagonal(out, 0.0)
+ return out
+
+
+def truncate(matrix: np.ndarray, rank: int) -> np.ndarray:
+ symmetric = (matrix + matrix.T) / 2.0
+ values, vectors = np.linalg.eigh(symmetric)
+ order = np.argsort(np.abs(values))[::-1][:rank]
+ return (vectors[:, order] * values[order]) @ vectors[:, order].T
+
+
+def main() -> None:
+ args = parse_args()
+ state = torch.load(args.fields, map_location="cpu", weights_only=False)
+ visual_full = state["visual_field"].double().numpy()
+ text_full = state["text_field"].double().numpy()
+ size = len(visual_full)
+ device = torch.device(args.device)
+ swaps = all_swaps(size, device)
+
+ rows = []
+ for rank in args.ranks:
+ visual = normalise(truncate(visual_full, rank) if rank < size else visual_full)
+ text = normalise(truncate(text_full, rank) if rank < size else text_full)
+ verdicts, gaps, accuracies = [], [], []
+ for trial in range(args.trials):
+ generator = np.random.default_rng(trial)
+ hidden = generator.permutation(size)
+ shuffled = text[np.ix_(hidden, hidden)]
+ energy = ClosedFormEnergy(
+ standardized(torch.from_numpy(shuffled).to(device)).float(),
+ standardized(torch.from_numpy(visual).to(device)).float(),
+ 1.0, 1.0, 256,
+ )
+ truth = torch.from_numpy(np.argsort(hidden).copy()).to(device)
+ truth_energy = float(energy.energy(truth[None])[0])
+
+ starts = [torch.from_numpy(grampa(visual, shuffled, 1.0).copy()).to(device)]
+ starts += [
+ torch.from_numpy(generator.permutation(size).copy()).to(device)
+ for _ in range(args.restarts)
+ ]
+ best_energy, best_accuracy = np.inf, 0.0
+ for start in starts:
+ final, _ = steepest_descent(energy, start, swaps, 4000)
+ value = float(energy.energy(final[None])[0])
+ if value < best_energy:
+ best_energy = value
+ best_accuracy = float(
+ (hidden[final.cpu().numpy()] == np.arange(size)).mean()
+ )
+ verdicts.append(truth_energy <= best_energy + 1e-6)
+ gaps.append(best_energy - truth_energy)
+ accuracies.append(best_accuracy)
+
+ row = {
+ "rank": rank,
+ "truth_is_deepest": f"{sum(verdicts)}/{args.trials}",
+ "mean_energy_gap_best_minus_truth": float(np.mean(gaps)),
+ "best_accuracy": float(np.mean(accuracies)),
+ "reading": (
+ "information limit" if sum(verdicts) == 0 else
+ "truth is optimal; failure is search" if sum(verdicts) == args.trials
+ else "mixed"
+ ),
+ }
+ rows.append(row)
+ print(
+ f"rank={rank:<5} truth deepest {row['truth_is_deepest']} "
+ f"gap(best-truth)={row['mean_energy_gap_best_minus_truth']:+.4f} "
+ f"best acc={row['best_accuracy']:.3f} -> {row['reading']}",
+ flush=True,
+ )
+
+ summary = {
+ "protocol": (
+ "Spectral start plus random restarts, each run to a local optimum "
+ "under exact steepest descent. A negative gap means the searcher "
+ "found a state deeper than the truth, so the truth is not the "
+ "optimum and the limit is information rather than search."
+ ),
+ "size": size,
+ "restarts": args.restarts,
+ "rows": rows,
+ }
+ print(json.dumps({"done": True}))
+ write_json(args.output, summary)
+
+
+if __name__ == "__main__":
+ main()