anhtld commited on
Commit
7837ef8
·
verified ·
1 Parent(s): a3a2923

auto-sync 2026-07-04T03:59:09Z workspace (part 4)

Browse files
workspace/runs/ctt_val_proxy_comparison/command.txt CHANGED
@@ -1 +1 @@
1
- python scripts/build_ctt_proxy_comparison.py --out-dir runs/ctt_val_proxy_comparison
 
1
+ python scripts/build_ctt_proxy_comparison.py --out-dir runs/ctt_val_proxy_comparison --no-markdown-report
workspace/runs/ctt_val_proxy_comparison/metrics.json CHANGED
@@ -6,12 +6,15 @@
6
  {
7
  "beats_local_atlas_support": false,
8
  "candidate_diversity": 0.821928094090022,
 
9
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
 
10
  "mean_positive_distance": 0.7203264851945577,
11
  "method": "local_atlas",
12
  "negative_near_0p20": 0.03683574879227053,
13
  "negative_near_0p40": 0.20513731437644483,
14
  "num_rows": 69,
 
15
  "pptc_0p20": 0.4057971014492754,
16
  "pptc_0p40": 0.6811594202898551,
17
  "proxy_gate_pass": false,
@@ -24,12 +27,15 @@
24
  {
25
  "beats_local_atlas_support": false,
26
  "candidate_diversity": 0.9751103010950768,
 
27
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
 
28
  "mean_positive_distance": 0.9615657234367121,
29
  "method": "task_memory",
30
  "negative_near_0p20": 0.017451690821256038,
31
  "negative_near_0p40": 0.1108695652173913,
32
  "num_rows": 69,
 
33
  "pptc_0p20": 0.3188405797101449,
34
  "pptc_0p40": 0.5362318840579711,
35
  "proxy_gate_pass": false,
@@ -42,12 +48,15 @@
42
  {
43
  "beats_local_atlas_support": true,
44
  "candidate_diversity": 0.27027754304306056,
 
45
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
 
46
  "mean_positive_distance": 0.45091308311397055,
47
  "method": "ctt_residual_full",
48
  "negative_near_0p20": 0.029584063279715453,
49
  "negative_near_0p40": 0.289941117658509,
50
  "num_rows": 207,
 
51
  "pptc_0p20": 0.19806763285024154,
52
  "pptc_0p40": 0.608695652173913,
53
  "proxy_gate_pass": true,
@@ -60,12 +69,15 @@
60
  {
61
  "beats_local_atlas_support": true,
62
  "candidate_diversity": 0.24708366700914647,
 
63
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
 
64
  "mean_positive_distance": 0.44291597778605085,
65
  "method": "ctt_residual_base_context",
66
  "negative_near_0p20": 0.018245341614906832,
67
  "negative_near_0p40": 0.28596910336040765,
68
  "num_rows": 69,
 
69
  "pptc_0p20": 0.17391304347826086,
70
  "pptc_0p40": 0.6231884057971014,
71
  "proxy_gate_pass": true,
@@ -78,12 +90,15 @@
78
  {
79
  "beats_local_atlas_support": true,
80
  "candidate_diversity": 0.23968052668773945,
 
81
  "data_hash": "1d15143588697e89f7fc2f6375b2745e4d479c726c9a947ff7eb7b2705280e1a",
 
82
  "mean_positive_distance": 0.43468703005975967,
83
  "method": "ctt_residual_base_context_obs",
84
  "negative_near_0p20": 0.034336456619065314,
85
  "negative_near_0p40": 0.30197859708729274,
86
  "num_rows": 207,
 
87
  "pptc_0p20": 0.24637681159420288,
88
  "pptc_0p40": 0.6425120772946861,
89
  "proxy_gate_pass": true,
@@ -96,12 +111,15 @@
96
  {
97
  "beats_local_atlas_support": true,
98
  "candidate_diversity": 0.24174490402345686,
 
99
  "data_hash": "67f7b4a692f7c7e71da24378dc71e3399c5d35afc14c494869eba6087b765c42",
 
100
  "mean_positive_distance": 0.43402743826233176,
101
  "method": "ctt_residual_base_context_obj",
102
  "negative_near_0p20": 0.038024455415759766,
103
  "negative_near_0p40": 0.30944174585478934,
104
  "num_rows": 207,
 
105
  "pptc_0p20": 0.22705314009661837,
106
  "pptc_0p40": 0.6425120772946861,
107
  "proxy_gate_pass": true,
@@ -114,12 +132,15 @@
114
  {
115
  "beats_local_atlas_support": true,
116
  "candidate_diversity": 0.2447676812446944,
 
117
  "data_hash": "67f7b4a692f7c7e71da24378dc71e3399c5d35afc14c494869eba6087b765c42",
 
118
  "mean_positive_distance": 0.4429413077106721,
119
  "method": "ctt_residual_base_context_obs_obj",
120
  "negative_near_0p20": 0.02853647962343615,
121
  "negative_near_0p40": 0.2934249526640831,
122
  "num_rows": 207,
 
123
  "pptc_0p20": 0.20772946859903382,
124
  "pptc_0p40": 0.642512077294686,
125
  "proxy_gate_pass": true,
@@ -132,12 +153,15 @@
132
  {
133
  "beats_local_atlas_support": true,
134
  "candidate_diversity": 0.1163743674776266,
 
135
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
 
136
  "mean_positive_distance": 0.4336709210379143,
137
  "method": "ctt_gated_residual_full",
138
  "negative_near_0p20": 0.05269106899541682,
139
  "negative_near_0p40": 0.33921316203924895,
140
  "num_rows": 207,
 
141
  "pptc_0p20": 0.2318840579710145,
142
  "pptc_0p40": 0.6135265700483091,
143
  "proxy_gate_pass": false,
@@ -149,5 +173,6 @@
149
  }
150
  ],
151
  "safety_slack": 0.01,
 
152
  "split_hash": "9d1dc1c10868f76fa080895df0f2730c173f12b6db14932599d55c2b60859381"
153
  }
 
6
  {
7
  "beats_local_atlas_support": false,
8
  "candidate_diversity": 0.821928094090022,
9
+ "collapse_rate": 0.06605580409928237,
10
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
11
+ "mean_negative_distance": 0.6789322236382422,
12
  "mean_positive_distance": 0.7203264851945577,
13
  "method": "local_atlas",
14
  "negative_near_0p20": 0.03683574879227053,
15
  "negative_near_0p40": 0.20513731437644483,
16
  "num_rows": 69,
17
+ "pos_closer_than_neg": 0.5998446814623285,
18
  "pptc_0p20": 0.4057971014492754,
19
  "pptc_0p40": 0.6811594202898551,
20
  "proxy_gate_pass": false,
 
27
  {
28
  "beats_local_atlas_support": false,
29
  "candidate_diversity": 0.9751103010950768,
30
+ "collapse_rate": 0.06256038647342994,
31
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
32
+ "mean_negative_distance": 0.9219133529525894,
33
  "mean_positive_distance": 0.9615657234367121,
34
  "method": "task_memory",
35
  "negative_near_0p20": 0.017451690821256038,
36
  "negative_near_0p40": 0.1108695652173913,
37
  "num_rows": 69,
38
+ "pos_closer_than_neg": 0.5852941176470589,
39
  "pptc_0p20": 0.3188405797101449,
40
  "pptc_0p40": 0.5362318840579711,
41
  "proxy_gate_pass": false,
 
48
  {
49
  "beats_local_atlas_support": true,
50
  "candidate_diversity": 0.27027754304306056,
51
+ "collapse_rate": 0.06806780176345395,
52
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
53
+ "mean_negative_distance": 0.5291780433921461,
54
  "mean_positive_distance": 0.45091308311397055,
55
  "method": "ctt_residual_full",
56
  "negative_near_0p20": 0.029584063279715453,
57
  "negative_near_0p40": 0.289941117658509,
58
  "num_rows": 207,
59
+ "pos_closer_than_neg": 0.7351920682803036,
60
  "pptc_0p20": 0.19806763285024154,
61
  "pptc_0p40": 0.608695652173913,
62
  "proxy_gate_pass": true,
 
69
  {
70
  "beats_local_atlas_support": true,
71
  "candidate_diversity": 0.24708366700914647,
72
+ "collapse_rate": 0.06806780176345395,
73
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
74
+ "mean_negative_distance": 0.5274893750999132,
75
  "mean_positive_distance": 0.44291597778605085,
76
  "method": "ctt_residual_base_context",
77
  "negative_near_0p20": 0.018245341614906832,
78
  "negative_near_0p40": 0.28596910336040765,
79
  "num_rows": 69,
80
+ "pos_closer_than_neg": 0.7576806363571069,
81
  "pptc_0p20": 0.17391304347826086,
82
  "pptc_0p40": 0.6231884057971014,
83
  "proxy_gate_pass": true,
 
90
  {
91
  "beats_local_atlas_support": true,
92
  "candidate_diversity": 0.23968052668773945,
93
+ "collapse_rate": 0.06806780176345395,
94
  "data_hash": "1d15143588697e89f7fc2f6375b2745e4d479c726c9a947ff7eb7b2705280e1a",
95
+ "mean_negative_distance": 0.5130644364599437,
96
  "mean_positive_distance": 0.43468703005975967,
97
  "method": "ctt_residual_base_context_obs",
98
  "negative_near_0p20": 0.034336456619065314,
99
  "negative_near_0p40": 0.30197859708729274,
100
  "num_rows": 207,
101
+ "pos_closer_than_neg": 0.7717469893940482,
102
  "pptc_0p20": 0.24637681159420288,
103
  "pptc_0p40": 0.6425120772946861,
104
  "proxy_gate_pass": true,
 
111
  {
112
  "beats_local_atlas_support": true,
113
  "candidate_diversity": 0.24174490402345686,
114
+ "collapse_rate": 0.06830470254383299,
115
  "data_hash": "67f7b4a692f7c7e71da24378dc71e3399c5d35afc14c494869eba6087b765c42",
116
+ "mean_negative_distance": 0.5216229740528893,
117
  "mean_positive_distance": 0.43402743826233176,
118
  "method": "ctt_residual_base_context_obj",
119
  "negative_near_0p20": 0.038024455415759766,
120
  "negative_near_0p40": 0.30944174585478934,
121
  "num_rows": 207,
122
+ "pos_closer_than_neg": 0.7307419976537622,
123
  "pptc_0p20": 0.22705314009661837,
124
  "pptc_0p40": 0.6425120772946861,
125
  "proxy_gate_pass": true,
 
132
  {
133
  "beats_local_atlas_support": true,
134
  "candidate_diversity": 0.2447676812446944,
135
+ "collapse_rate": 0.06830470254383299,
136
  "data_hash": "67f7b4a692f7c7e71da24378dc71e3399c5d35afc14c494869eba6087b765c42",
137
+ "mean_negative_distance": 0.5333629090899681,
138
  "mean_positive_distance": 0.4429413077106721,
139
  "method": "ctt_residual_base_context_obs_obj",
140
  "negative_near_0p20": 0.02853647962343615,
141
  "negative_near_0p40": 0.2934249526640831,
142
  "num_rows": 207,
143
+ "pos_closer_than_neg": 0.7277074505015682,
144
  "pptc_0p20": 0.20772946859903382,
145
  "pptc_0p40": 0.642512077294686,
146
  "proxy_gate_pass": true,
 
153
  {
154
  "beats_local_atlas_support": true,
155
  "candidate_diversity": 0.1163743674776266,
156
+ "collapse_rate": 0.06806780176345395,
157
  "data_hash": "90b431047a1f35cec095cbafa7de5bc0126cb0d0f4db3ff31843dca369977957",
158
+ "mean_negative_distance": 0.5050016174085634,
159
  "mean_positive_distance": 0.4336709210379143,
160
  "method": "ctt_gated_residual_full",
161
  "negative_near_0p20": 0.05269106899541682,
162
  "negative_near_0p40": 0.33921316203924895,
163
  "num_rows": 207,
164
+ "pos_closer_than_neg": 0.7247617850559026,
165
  "pptc_0p20": 0.2318840579710145,
166
  "pptc_0p40": 0.6135265700483091,
167
  "proxy_gate_pass": false,
 
173
  }
174
  ],
175
  "safety_slack": 0.01,
176
+ "schema_version": 2,
177
  "split_hash": "9d1dc1c10868f76fa080895df0f2730c173f12b6db14932599d55c2b60859381"
178
  }
workspace/runs/ctt_val_proxy_comparison/metrics_by_seed.json CHANGED
The diff for this file is too large to render. See raw diff
 
workspace/runs/ctt_val_proxy_comparison/metrics_by_task.json CHANGED
@@ -1 +1,498 @@
1
- {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "ctt_gated_residual_full": {
3
+ "LiftPegUpright-v1": {
4
+ "candidate_diversity": 0.05970962647106902,
5
+ "collapse_rate": 0.07311091686091686,
6
+ "mean_negative_distance": 0.3839348728146849,
7
+ "mean_positive_distance": 0.25572830294882354,
8
+ "negative_near_0p20": 0.0,
9
+ "negative_near_0p40": 0.53125,
10
+ "pos_closer_than_neg": 0.9444444444444444,
11
+ "pptc_0p20": 0.5,
12
+ "pptc_0p40": 0.8888888888888888,
13
+ "proxy_support_distance": 0.23664649313175856
14
+ },
15
+ "PickCube-v1": {
16
+ "candidate_diversity": 0.2021307744588189,
17
+ "collapse_rate": 0.10000000000000002,
18
+ "mean_negative_distance": 0.5829484689774836,
19
+ "mean_positive_distance": 0.576577907999753,
20
+ "negative_near_0p20": 0.0,
21
+ "negative_near_0p40": 0.3333333333333333,
22
+ "pos_closer_than_neg": 0.7666666666666666,
23
+ "pptc_0p20": 0.0,
24
+ "pptc_0p40": 0.3333333333333333,
25
+ "proxy_support_distance": 0.4443502650555026
26
+ },
27
+ "PullCube-v1": {
28
+ "candidate_diversity": 0.14847138063951565,
29
+ "collapse_rate": 0.06404465632406808,
30
+ "mean_negative_distance": 0.7041678688460474,
31
+ "mean_positive_distance": 0.592154236746947,
32
+ "negative_near_0p20": 0.0,
33
+ "negative_near_0p40": 0.05861928104575163,
34
+ "pos_closer_than_neg": 0.6517195767195768,
35
+ "pptc_0p20": 0.029411764705882353,
36
+ "pptc_0p40": 0.3137254901960784,
37
+ "proxy_support_distance": 0.5373627305388711
38
+ },
39
+ "PushCube-v1": {
40
+ "candidate_diversity": 0.05417944485503618,
41
+ "collapse_rate": 0.06478937728937728,
42
+ "mean_negative_distance": 0.3979735192222798,
43
+ "mean_positive_distance": 0.2811870120807798,
44
+ "negative_near_0p20": 0.08974358974358974,
45
+ "negative_near_0p40": 0.44871794871794873,
46
+ "pos_closer_than_neg": 0.625,
47
+ "pptc_0p20": 0.3076923076923077,
48
+ "pptc_0p40": 0.9230769230769231,
49
+ "proxy_support_distance": 0.26109739578233915
50
+ },
51
+ "StackCube-v1": {
52
+ "candidate_diversity": 0.11447220652079974,
53
+ "collapse_rate": 0.07588217338217343,
54
+ "mean_negative_distance": 0.3264807588283944,
55
+ "mean_positive_distance": 0.268244707965138,
56
+ "negative_near_0p20": 0.16460113960113962,
57
+ "negative_near_0p40": 0.8038990638990638,
58
+ "pos_closer_than_neg": 0.7895604395604395,
59
+ "pptc_0p20": 0.5333333333333333,
60
+ "pptc_0p40": 0.9333333333333333,
61
+ "proxy_support_distance": 0.2277182791599637
62
+ }
63
+ },
64
+ "ctt_residual_base_context": {
65
+ "LiftPegUpright-v1": {
66
+ "candidate_diversity": 0.14362703522993195,
67
+ "collapse_rate": 0.07311091686091686,
68
+ "mean_negative_distance": 0.41497127070807355,
69
+ "mean_positive_distance": 0.2305104051790113,
70
+ "negative_near_0p20": 0.0,
71
+ "negative_near_0p40": 0.5,
72
+ "pos_closer_than_neg": 1.0,
73
+ "pptc_0p20": 0.6666666666666666,
74
+ "pptc_0p40": 1.0,
75
+ "proxy_support_distance": 0.2014216883582193
76
+ },
77
+ "PickCube-v1": {
78
+ "candidate_diversity": 0.25660266524569825,
79
+ "collapse_rate": 0.1,
80
+ "mean_negative_distance": 0.899796341697192,
81
+ "mean_positive_distance": 0.9817664760096816,
82
+ "negative_near_0p20": 0.0,
83
+ "negative_near_0p40": 0.0,
84
+ "pos_closer_than_neg": 0.2,
85
+ "pptc_0p20": 0.0,
86
+ "pptc_0p40": 0.0,
87
+ "proxy_support_distance": 0.7855270291361975
88
+ },
89
+ "PullCube-v1": {
90
+ "candidate_diversity": 0.3216694071900426,
91
+ "collapse_rate": 0.06404465632406808,
92
+ "mean_negative_distance": 0.6926077604425354,
93
+ "mean_positive_distance": 0.5696106164927525,
94
+ "negative_near_0p20": 0.0,
95
+ "negative_near_0p40": 0.02022058823529412,
96
+ "pos_closer_than_neg": 0.6978174603174603,
97
+ "pptc_0p20": 0.029411764705882353,
98
+ "pptc_0p40": 0.38235294117647056,
99
+ "proxy_support_distance": 0.4743135938351562
100
+ },
101
+ "PushCube-v1": {
102
+ "candidate_diversity": 0.18464687502804178,
103
+ "collapse_rate": 0.06478937728937728,
104
+ "mean_negative_distance": 0.4607380704920465,
105
+ "mean_positive_distance": 0.31700052432677295,
106
+ "negative_near_0p20": 0.052884615384615384,
107
+ "negative_near_0p40": 0.3701923076923077,
108
+ "pos_closer_than_neg": 0.71875,
109
+ "pptc_0p20": 0.23076923076923078,
110
+ "pptc_0p40": 0.8461538461538461,
111
+ "proxy_support_distance": 0.267084673449308
112
+ },
113
+ "StackCube-v1": {
114
+ "candidate_diversity": 0.17288259514532145,
115
+ "collapse_rate": 0.07588217338217337,
116
+ "mean_negative_distance": 0.35211110872802126,
117
+ "mean_positive_distance": 0.3139070522101423,
118
+ "negative_near_0p20": 0.03809523809523809,
119
+ "negative_near_0p40": 0.7487912087912088,
120
+ "pos_closer_than_neg": 0.8025030525030525,
121
+ "pptc_0p20": 0.26666666666666666,
122
+ "pptc_0p40": 0.8666666666666667,
123
+ "proxy_support_distance": 0.2492223974983373
124
+ }
125
+ },
126
+ "ctt_residual_base_context_obj": {
127
+ "LiftPegUpright-v1": {
128
+ "candidate_diversity": 0.1493872636722864,
129
+ "collapse_rate": 0.07311091686091686,
130
+ "mean_negative_distance": 0.4120512868826152,
131
+ "mean_positive_distance": 0.26240904635443296,
132
+ "negative_near_0p20": 0.0,
133
+ "negative_near_0p40": 0.4647435897435897,
134
+ "pos_closer_than_neg": 0.9375,
135
+ "pptc_0p20": 0.4444444444444444,
136
+ "pptc_0p40": 0.8888888888888888,
137
+ "proxy_support_distance": 0.22436331113570077
138
+ },
139
+ "PickCube-v1": {
140
+ "candidate_diversity": 0.2693081365535955,
141
+ "collapse_rate": 0.10000000000000002,
142
+ "mean_negative_distance": 0.7942766276118407,
143
+ "mean_positive_distance": 0.8679002702981619,
144
+ "negative_near_0p20": 0.0,
145
+ "negative_near_0p40": 0.0,
146
+ "pos_closer_than_neg": 0.3333333333333333,
147
+ "pptc_0p20": 0.0,
148
+ "pptc_0p40": 0.0,
149
+ "proxy_support_distance": 0.7622612941754188
150
+ },
151
+ "PullCube-v1": {
152
+ "candidate_diversity": 0.31298127304146967,
153
+ "collapse_rate": 0.06404465632406808,
154
+ "mean_negative_distance": 0.7058399367948929,
155
+ "mean_positive_distance": 0.5663405352240012,
156
+ "negative_near_0p20": 0.0,
157
+ "negative_near_0p40": 0.03982843137254902,
158
+ "pos_closer_than_neg": 0.6993386243386243,
159
+ "pptc_0p20": 0.058823529411764705,
160
+ "pptc_0p40": 0.4019607843137255,
161
+ "proxy_support_distance": 0.47487613941275497
162
+ },
163
+ "PushCube-v1": {
164
+ "candidate_diversity": 0.18267389477352383,
165
+ "collapse_rate": 0.06478937728937728,
166
+ "mean_negative_distance": 0.45435797530595545,
167
+ "mean_positive_distance": 0.32555326496747355,
168
+ "negative_near_0p20": 0.052884615384615384,
169
+ "negative_near_0p40": 0.375,
170
+ "pos_closer_than_neg": 0.712673611111111,
171
+ "pptc_0p20": 0.15384615384615385,
172
+ "pptc_0p40": 0.8717948717948718,
173
+ "proxy_support_distance": 0.2722421007397641
174
+ },
175
+ "StackCube-v1": {
176
+ "candidate_diversity": 0.1665761829043618,
177
+ "collapse_rate": 0.07697191697191702,
178
+ "mean_negative_distance": 0.32524565684329504,
179
+ "mean_positive_distance": 0.26785120329886264,
180
+ "negative_near_0p20": 0.12907916157916158,
181
+ "negative_near_0p40": 0.8222568172568172,
182
+ "pos_closer_than_neg": 0.7281339031339031,
183
+ "pptc_0p20": 0.6,
184
+ "pptc_0p40": 0.9333333333333333,
185
+ "proxy_support_distance": 0.20483640069851286
186
+ }
187
+ },
188
+ "ctt_residual_base_context_obs": {
189
+ "LiftPegUpright-v1": {
190
+ "candidate_diversity": 0.148958579095827,
191
+ "collapse_rate": 0.07311091686091686,
192
+ "mean_negative_distance": 0.4115981169631194,
193
+ "mean_positive_distance": 0.2362653608389971,
194
+ "negative_near_0p20": 0.0,
195
+ "negative_near_0p40": 0.47061965811965817,
196
+ "pos_closer_than_neg": 0.9965277777777778,
197
+ "pptc_0p20": 0.6666666666666666,
198
+ "pptc_0p40": 1.0,
199
+ "proxy_support_distance": 0.1957123602918266
200
+ },
201
+ "PickCube-v1": {
202
+ "candidate_diversity": 0.28828954720262945,
203
+ "collapse_rate": 0.10000000000000002,
204
+ "mean_negative_distance": 0.7587970286519089,
205
+ "mean_positive_distance": 0.7901440255768358,
206
+ "negative_near_0p20": 0.0,
207
+ "negative_near_0p40": 0.0,
208
+ "pos_closer_than_neg": 0.5333333333333333,
209
+ "pptc_0p20": 0.0,
210
+ "pptc_0p40": 0.0,
211
+ "proxy_support_distance": 0.6021893630844198
212
+ },
213
+ "PullCube-v1": {
214
+ "candidate_diversity": 0.3133621097757295,
215
+ "collapse_rate": 0.06404465632406808,
216
+ "mean_negative_distance": 0.6841223846741898,
217
+ "mean_positive_distance": 0.5733947056530471,
218
+ "negative_near_0p20": 0.0,
219
+ "negative_near_0p40": 0.02839052287581699,
220
+ "pos_closer_than_neg": 0.7119047619047619,
221
+ "pptc_0p20": 0.0392156862745098,
222
+ "pptc_0p40": 0.37254901960784315,
223
+ "proxy_support_distance": 0.4821119993756999
224
+ },
225
+ "PushCube-v1": {
226
+ "candidate_diversity": 0.17226944365330818,
227
+ "collapse_rate": 0.06478937728937728,
228
+ "mean_negative_distance": 0.4515933904080564,
229
+ "mean_positive_distance": 0.31235985654167453,
230
+ "negative_near_0p20": 0.06891025641025642,
231
+ "negative_near_0p40": 0.38247863247863245,
232
+ "pos_closer_than_neg": 0.732638888888889,
233
+ "pptc_0p20": 0.3333333333333333,
234
+ "pptc_0p40": 0.9230769230769231,
235
+ "proxy_support_distance": 0.2586271514743408
236
+ },
237
+ "StackCube-v1": {
238
+ "candidate_diversity": 0.16414005465390855,
239
+ "collapse_rate": 0.07588217338217343,
240
+ "mean_negative_distance": 0.33057222184027074,
241
+ "mean_positive_distance": 0.2819713837511487,
242
+ "negative_near_0p20": 0.09822547822547821,
243
+ "negative_near_0p40": 0.8050203500203499,
244
+ "pos_closer_than_neg": 0.8023656898656899,
245
+ "pptc_0p20": 0.4888888888888889,
246
+ "pptc_0p40": 0.9111111111111111,
247
+ "proxy_support_distance": 0.22536104103963187
248
+ }
249
+ },
250
+ "ctt_residual_base_context_obs_obj": {
251
+ "LiftPegUpright-v1": {
252
+ "candidate_diversity": 0.14766830492610186,
253
+ "collapse_rate": 0.07311091686091686,
254
+ "mean_negative_distance": 0.41649342498231295,
255
+ "mean_positive_distance": 0.2643206130229132,
256
+ "negative_near_0p20": 0.0,
257
+ "negative_near_0p40": 0.4671474358974359,
258
+ "pos_closer_than_neg": 0.9861111111111112,
259
+ "pptc_0p20": 0.4444444444444444,
260
+ "pptc_0p40": 1.0,
261
+ "proxy_support_distance": 0.22818479501118874
262
+ },
263
+ "PickCube-v1": {
264
+ "candidate_diversity": 0.33757465230985995,
265
+ "collapse_rate": 0.10000000000000002,
266
+ "mean_negative_distance": 1.1075887642380198,
267
+ "mean_positive_distance": 1.1680868800298911,
268
+ "negative_near_0p20": 0.0,
269
+ "negative_near_0p40": 0.0,
270
+ "pos_closer_than_neg": 0.43333333333333335,
271
+ "pptc_0p20": 0.0,
272
+ "pptc_0p40": 0.0,
273
+ "proxy_support_distance": 0.9803242549573113
274
+ },
275
+ "PullCube-v1": {
276
+ "candidate_diversity": 0.3136336919427042,
277
+ "collapse_rate": 0.06404465632406808,
278
+ "mean_negative_distance": 0.7162658429465761,
279
+ "mean_positive_distance": 0.565417223038266,
280
+ "negative_near_0p20": 0.0,
281
+ "negative_near_0p40": 0.029411764705882353,
282
+ "pos_closer_than_neg": 0.683994708994709,
283
+ "pptc_0p20": 0.029411764705882353,
284
+ "pptc_0p40": 0.37254901960784315,
285
+ "proxy_support_distance": 0.47243182399485906
286
+ },
287
+ "PushCube-v1": {
288
+ "candidate_diversity": 0.181916451774259,
289
+ "collapse_rate": 0.06478937728937728,
290
+ "mean_negative_distance": 0.44441461966625945,
291
+ "mean_positive_distance": 0.32881952335913633,
292
+ "negative_near_0p20": 0.04487179487179487,
293
+ "negative_near_0p40": 0.3643162393162393,
294
+ "pos_closer_than_neg": 0.6822916666666666,
295
+ "pptc_0p20": 0.23076923076923078,
296
+ "pptc_0p40": 0.9230769230769231,
297
+ "proxy_support_distance": 0.27338380647453003
298
+ },
299
+ "StackCube-v1": {
300
+ "candidate_diversity": 0.17579507499334182,
301
+ "collapse_rate": 0.07697191697191702,
302
+ "mean_negative_distance": 0.3332039593498869,
303
+ "mean_positive_distance": 0.28734001912661167,
304
+ "negative_near_0p20": 0.09237891737891737,
305
+ "negative_near_0p40": 0.7804884004884005,
306
+ "pos_closer_than_neg": 0.7293905168905168,
307
+ "pptc_0p20": 0.5111111111111111,
308
+ "pptc_0p40": 0.9111111111111111,
309
+ "proxy_support_distance": 0.225556820839634
310
+ }
311
+ },
312
+ "ctt_residual_full": {
313
+ "LiftPegUpright-v1": {
314
+ "candidate_diversity": 0.16663572531428117,
315
+ "collapse_rate": 0.07311091686091686,
316
+ "mean_negative_distance": 0.41647353998567643,
317
+ "mean_positive_distance": 0.2771405265426538,
318
+ "negative_near_0p20": 0.0,
319
+ "negative_near_0p40": 0.468215811965812,
320
+ "pos_closer_than_neg": 0.90625,
321
+ "pptc_0p20": 0.4444444444444444,
322
+ "pptc_0p40": 0.8888888888888888,
323
+ "proxy_support_distance": 0.225699402965728
324
+ },
325
+ "PickCube-v1": {
326
+ "candidate_diversity": 0.2841252624025221,
327
+ "collapse_rate": 0.10000000000000002,
328
+ "mean_negative_distance": 0.7853855604157447,
329
+ "mean_positive_distance": 0.8107379646608238,
330
+ "negative_near_0p20": 0.0,
331
+ "negative_near_0p40": 0.06666666666666667,
332
+ "pos_closer_than_neg": 0.7333333333333334,
333
+ "pptc_0p20": 0.0,
334
+ "pptc_0p40": 0.3333333333333333,
335
+ "proxy_support_distance": 0.5973002537013845
336
+ },
337
+ "PullCube-v1": {
338
+ "candidate_diversity": 0.35669628571891027,
339
+ "collapse_rate": 0.06404465632406808,
340
+ "mean_negative_distance": 0.7141779455036535,
341
+ "mean_positive_distance": 0.5869452164166006,
342
+ "negative_near_0p20": 0.0,
343
+ "negative_near_0p40": 0.0196078431372549,
344
+ "pos_closer_than_neg": 0.6872354497354497,
345
+ "pptc_0p20": 0.029411764705882353,
346
+ "pptc_0p40": 0.3235294117647059,
347
+ "proxy_support_distance": 0.48532493799704673
348
+ },
349
+ "PushCube-v1": {
350
+ "candidate_diversity": 0.1897940504075825,
351
+ "collapse_rate": 0.06478937728937728,
352
+ "mean_negative_distance": 0.4571901910242416,
353
+ "mean_positive_distance": 0.33455829528179704,
354
+ "negative_near_0p20": 0.03685897435897436,
355
+ "negative_near_0p40": 0.36217948717948717,
356
+ "pos_closer_than_neg": 0.7239583333333334,
357
+ "pptc_0p20": 0.1282051282051282,
358
+ "pptc_0p40": 0.8717948717948718,
359
+ "proxy_support_distance": 0.27709473619662045
360
+ },
361
+ "StackCube-v1": {
362
+ "candidate_diversity": 0.18468096572943052,
363
+ "collapse_rate": 0.07588217338217343,
364
+ "mean_negative_distance": 0.33657300192660006,
365
+ "mean_positive_distance": 0.28893509427463027,
366
+ "negative_near_0p20": 0.10414224664224664,
367
+ "negative_near_0p40": 0.7836650386650388,
368
+ "pos_closer_than_neg": 0.7400234025234025,
369
+ "pptc_0p20": 0.5555555555555556,
370
+ "pptc_0p40": 0.9333333333333333,
371
+ "proxy_support_distance": 0.22290972126483205
372
+ }
373
+ },
374
+ "local_atlas": {
375
+ "LiftPegUpright-v1": {
376
+ "candidate_diversity": 0.5014669861510727,
377
+ "collapse_rate": 0.07219516594516594,
378
+ "mean_negative_distance": 0.4854021065936647,
379
+ "mean_positive_distance": 0.43646670032063084,
380
+ "negative_near_0p20": 0.027777777777777776,
381
+ "negative_near_0p40": 0.24219877344877347,
382
+ "pos_closer_than_neg": 0.7192460317460317,
383
+ "pptc_0p20": 0.5,
384
+ "pptc_0p40": 1.0,
385
+ "proxy_support_distance": 0.18189470652155995
386
+ },
387
+ "PickCube-v1": {
388
+ "candidate_diversity": 1.0944000325107157,
389
+ "collapse_rate": 0.1,
390
+ "mean_negative_distance": 0.6373729677105011,
391
+ "mean_positive_distance": 0.7798613153680638,
392
+ "negative_near_0p20": 0.3,
393
+ "negative_near_0p40": 0.4,
394
+ "pos_closer_than_neg": 0.6,
395
+ "pptc_0p20": 1.0,
396
+ "pptc_0p40": 1.0,
397
+ "proxy_support_distance": 0.07461591163524217
398
+ },
399
+ "PullCube-v1": {
400
+ "candidate_diversity": 1.0209711156114212,
401
+ "collapse_rate": 0.06316930618401206,
402
+ "mean_negative_distance": 0.9870468132552196,
403
+ "mean_positive_distance": 0.9460291977432415,
404
+ "negative_near_0p20": 0.003676470588235294,
405
+ "negative_near_0p40": 0.039460784313725496,
406
+ "pos_closer_than_neg": 0.6720238095238096,
407
+ "pptc_0p20": 0.058823529411764705,
408
+ "pptc_0p40": 0.38235294117647056,
409
+ "proxy_support_distance": 0.5490009012121931
410
+ },
411
+ "PushCube-v1": {
412
+ "candidate_diversity": 0.692147376654553,
413
+ "collapse_rate": 0.0641025641025641,
414
+ "mean_negative_distance": 0.5298147189077234,
415
+ "mean_positive_distance": 0.5107316898096026,
416
+ "negative_near_0p20": 0.028846153846153848,
417
+ "negative_near_0p40": 0.23237179487179485,
418
+ "pos_closer_than_neg": 0.5859375,
419
+ "pptc_0p20": 0.7692307692307693,
420
+ "pptc_0p40": 0.9230769230769231,
421
+ "proxy_support_distance": 0.21488945685319283
422
+ },
423
+ "StackCube-v1": {
424
+ "candidate_diversity": 0.593260181033124,
425
+ "collapse_rate": 0.06957264957264958,
426
+ "mean_negative_distance": 0.40728379791043173,
427
+ "mean_positive_distance": 0.4999574180225059,
428
+ "negative_near_0p20": 0.105,
429
+ "negative_near_0p40": 0.5292521367521368,
430
+ "pos_closer_than_neg": 0.4584401709401709,
431
+ "pptc_0p20": 0.8,
432
+ "pptc_0p40": 1.0,
433
+ "proxy_support_distance": 0.15391202596431447
434
+ }
435
+ },
436
+ "task_memory": {
437
+ "LiftPegUpright-v1": {
438
+ "candidate_diversity": 0.6210576200589012,
439
+ "collapse_rate": 0.0625,
440
+ "mean_negative_distance": 0.583368643118901,
441
+ "mean_positive_distance": 0.5613930072546827,
442
+ "negative_near_0p20": 0.010416666666666666,
443
+ "negative_near_0p40": 0.13541666666666666,
444
+ "pos_closer_than_neg": 0.6875,
445
+ "pptc_0p20": 0.5,
446
+ "pptc_0p40": 1.0,
447
+ "proxy_support_distance": 0.20479276324345116
448
+ },
449
+ "PickCube-v1": {
450
+ "candidate_diversity": 1.2387041849339937,
451
+ "collapse_rate": 0.06666666666666667,
452
+ "mean_negative_distance": 0.8095929802695191,
453
+ "mean_positive_distance": 0.9291008275018162,
454
+ "negative_near_0p20": 0.26666666666666666,
455
+ "negative_near_0p40": 0.4,
456
+ "pos_closer_than_neg": 0.6,
457
+ "pptc_0p20": 1.0,
458
+ "pptc_0p40": 1.0,
459
+ "proxy_support_distance": 0.07461591163524217
460
+ },
461
+ "PullCube-v1": {
462
+ "candidate_diversity": 1.3442506282390456,
463
+ "collapse_rate": 0.0625,
464
+ "mean_negative_distance": 1.383142918984482,
465
+ "mean_positive_distance": 1.3657646662805298,
466
+ "negative_near_0p20": 0.0,
467
+ "negative_near_0p40": 0.0,
468
+ "pos_closer_than_neg": 0.4732142857142857,
469
+ "pptc_0p20": 0.029411764705882353,
470
+ "pptc_0p40": 0.08823529411764706,
471
+ "proxy_support_distance": 0.8291223046675316
472
+ },
473
+ "PushCube-v1": {
474
+ "candidate_diversity": 0.6719745815075286,
475
+ "collapse_rate": 0.0625,
476
+ "mean_negative_distance": 0.7351552918288785,
477
+ "mean_positive_distance": 0.6373056713998045,
478
+ "negative_near_0p20": 0.014423076923076924,
479
+ "negative_near_0p40": 0.07211538461538461,
480
+ "pos_closer_than_neg": 0.609375,
481
+ "pptc_0p20": 0.38461538461538464,
482
+ "pptc_0p40": 0.9230769230769231,
483
+ "proxy_support_distance": 0.26447355510409054
484
+ },
485
+ "StackCube-v1": {
486
+ "candidate_diversity": 0.5251579967031662,
487
+ "collapse_rate": 0.0625,
488
+ "mean_negative_distance": 0.5187021685529322,
489
+ "mean_positive_distance": 0.48864024429118186,
490
+ "negative_near_0p20": 0.04583333333333333,
491
+ "negative_near_0p40": 0.36666666666666664,
492
+ "pos_closer_than_neg": 0.6875,
493
+ "pptc_0p20": 0.8,
494
+ "pptc_0p40": 1.0,
495
+ "proxy_support_distance": 0.17466840356416174
496
+ }
497
+ }
498
+ }
workspace/runs/ctt_val_proxy_comparison/table.tex CHANGED
@@ -1,15 +1,15 @@
1
  % Auto-generated by scripts/build_ctt_proxy_comparison.py
2
- \begin{tabular}{lrrrrrrrc}
3
  \toprule
4
- Method & Seeds & Rows & PPTC@0.20 & PPTC@0.40 & Neg@0.20 & MeanPosDist & Diversity & Gate \\
5
  \midrule
6
- local\_atlas & 1 & 69 & 0.4058 & 0.6812 & 0.0368 & 0.7203 & 0.8219 & baseline \\
7
- task\_memory & 1 & 69 & 0.3188 & 0.5362 & 0.0175 & 0.9616 & 0.9751 & baseline \\
8
- ctt\_residual\_full & 3 & 207 & 0.1981 & 0.6087 & 0.0296 & 0.4509 & 0.2703 & pass \\
9
- ctt\_residual\_base\_context & 1 & 69 & 0.1739 & 0.6232 & 0.0182 & 0.4429 & 0.2471 & pass \\
10
- ctt\_residual\_base\_context\_obs & 3 & 207 & 0.2464 & 0.6425 & 0.0343 & 0.4347 & 0.2397 & pass \\
11
- ctt\_residual\_base\_context\_obj & 3 & 207 & 0.2271 & 0.6425 & 0.0380 & 0.4340 & 0.2417 & pass \\
12
- ctt\_residual\_base\_context\_obs\_obj & 3 & 207 & 0.2077 & 0.6425 & 0.0285 & 0.4429 & 0.2448 & pass \\
13
- ctt\_gated\_residual\_full & 3 & 207 & 0.2319 & 0.6135 & 0.0527 & 0.4337 & 0.1164 & fail \\
14
  \bottomrule
15
  \end{tabular}
 
1
  % Auto-generated by scripts/build_ctt_proxy_comparison.py
2
+ \begin{tabular}{lrrrrrrrrrrc}
3
  \toprule
4
+ Method & Seeds & Rows & PPTC@0.20 & PPTC@0.40 & Neg@0.20 & Neg@0.40 & Pos<Neg & MeanPos & MeanNeg & Collapse & Gate \\
5
  \midrule
6
+ local\_atlas & 1 & 69 & 0.4058 & 0.6812 & 0.0368 & 0.2051 & 0.5998 & 0.7203 & 0.6789 & 0.0661 & baseline \\
7
+ task\_memory & 1 & 69 & 0.3188 & 0.5362 & 0.0175 & 0.1109 & 0.5853 & 0.9616 & 0.9219 & 0.0626 & baseline \\
8
+ ctt\_residual\_full & 3 & 207 & 0.1981 & 0.6087 & 0.0296 & 0.2899 & 0.7352 & 0.4509 & 0.5292 & 0.0681 & pass \\
9
+ ctt\_residual\_base\_context & 1 & 69 & 0.1739 & 0.6232 & 0.0182 & 0.2860 & 0.7577 & 0.4429 & 0.5275 & 0.0681 & pass \\
10
+ ctt\_residual\_base\_context\_obs & 3 & 207 & 0.2464 & 0.6425 & 0.0343 & 0.3020 & 0.7717 & 0.4347 & 0.5131 & 0.0681 & pass \\
11
+ ctt\_residual\_base\_context\_obj & 3 & 207 & 0.2271 & 0.6425 & 0.0380 & 0.3094 & 0.7307 & 0.4340 & 0.5216 & 0.0683 & pass \\
12
+ ctt\_residual\_base\_context\_obs\_obj & 3 & 207 & 0.2077 & 0.6425 & 0.0285 & 0.2934 & 0.7277 & 0.4429 & 0.5334 & 0.0683 & pass \\
13
+ ctt\_gated\_residual\_full & 3 & 207 & 0.2319 & 0.6135 & 0.0527 & 0.3392 & 0.7248 & 0.4337 & 0.5050 & 0.0681 & fail \\
14
  \bottomrule
15
  \end{tabular}
workspace/runs/paper_ctt_audit/command.txt CHANGED
@@ -1 +1 @@
1
- python scripts/audit_ctt_paper_artifacts.py --repo-root . --paper latex/main.tex --out-dir runs/paper_ctt_audit
 
1
+ python scripts/audit_ctt_paper_artifacts.py
workspace/runs/summary_ctt.csv CHANGED
@@ -206,6 +206,10 @@ CTT residual test dominance tau0,runs/ctt_base_context_obs_dominance_val_to_test
206
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_tanh_val_to_test,yes,measured dominance K=8 coverage=0.3403 fallback=0.6597 target=utility_margin features=context,"fail:selected<47.45,oracle<50,support_gap>7,selector_gap>3,OutcomePTR<=V0oracle",0.3333,0.3125,0.3819,0.7292,0.6913,0.3366,0.3681,0.1806,0.4167,n/a,n/a,n/a,n/a,n/a,3,see run
207
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_train_to_test,yes,measured dominance K=8 coverage=0.3403 fallback=0.6597 target=utility_margin features=context,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.2986,0.5139,0.7292,0.4885,0.4836,0.2639,0.2639,0.5347,n/a,n/a,n/a,n/a,n/a,3,see run
208
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_val_to_test,yes,measured dominance K=8 coverage=0.5069 fallback=0.4931 target=utility_margin features=context,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3264,0.5139,0.7292,0.4885,0.4355,0.2639,0.2431,0.5347,n/a,n/a,n/a,n/a,n/a,3,see run
 
 
 
 
209
  "CTT residual test learned dominance (source_evidence, utility_margin)",runs/ctt_base_context_obs_learned_dominance_source_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.5903 fallback=0.4097 target=utility_margin features=source_evidence,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3056,0.5694,0.7292,0.3761,0.5187,0.2014,0.2847,0.5486,n/a,n/a,n/a,n/a,n/a,3,see run
210
  "CTT residual test learned dominance (source_evidence, utility_margin)",runs/ctt_base_context_obs_learned_dominance_source_envclip_train_to_test,yes,measured dominance K=8 coverage=0.2361 fallback=0.7639 target=utility_margin features=source_evidence,"fail:selected<47.45,oracle<50,support_gap>7,selector_gap>3",0.2917,0.3333,0.4792,0.7292,0.5381,0.3674,0.2917,0.2014,0.5069,n/a,n/a,n/a,n/a,n/a,3,see run
211
  "CTT residual test learned dominance (source_evidence, success)",runs/ctt_base_context_obs_learned_dominance_source_success_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.5139 fallback=0.4861 target=success features=source_evidence,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3056,0.5694,0.7292,0.3761,0.4804,0.2014,0.2708,0.5486,n/a,n/a,n/a,n/a,n/a,3,see run
 
206
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_tanh_val_to_test,yes,measured dominance K=8 coverage=0.3403 fallback=0.6597 target=utility_margin features=context,"fail:selected<47.45,oracle<50,support_gap>7,selector_gap>3,OutcomePTR<=V0oracle",0.3333,0.3125,0.3819,0.7292,0.6913,0.3366,0.3681,0.1806,0.4167,n/a,n/a,n/a,n/a,n/a,3,see run
207
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_train_to_test,yes,measured dominance K=8 coverage=0.3403 fallback=0.6597 target=utility_margin features=context,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.2986,0.5139,0.7292,0.4885,0.4836,0.2639,0.2639,0.5347,n/a,n/a,n/a,n/a,n/a,3,see run
208
  "CTT residual test learned dominance (context, utility_margin)",runs/ctt_base_context_obs_learned_dominance_context_val_to_test,yes,measured dominance K=8 coverage=0.5069 fallback=0.4931 target=utility_margin features=context,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3264,0.5139,0.7292,0.4885,0.4355,0.2639,0.2431,0.5347,n/a,n/a,n/a,n/a,n/a,3,see run
209
+ "CTT residual test learned dominance (score_chart_compat, success_weighted_margin)",runs/ctt_base_context_obs_learned_dominance_score_chartcompat_successbonus2_task_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.5486 fallback=0.4514 target=success_weighted_margin features=score_chart_compat,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3194,0.5694,0.7292,0.3761,0.4580,0.2014,0.2500,0.5486,n/a,n/a,n/a,n/a,0.0302,3,see run
210
+ "CTT residual test learned dominance (score_chart_compat, utility_margin)",runs/ctt_base_context_obs_learned_dominance_score_chartcompat_utility_task_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.6389 fallback=0.3611 target=utility_margin features=score_chart_compat,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3264,0.5694,0.7292,0.3761,0.4654,0.2014,0.2500,0.5486,n/a,n/a,n/a,n/a,0.0221,3,see run
211
+ "CTT residual test learned dominance (score_context_chart_compat, success_weighted_margin)",runs/ctt_base_context_obs_learned_dominance_score_context_chartcompat_successbonus2_task_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.6111 fallback=0.3889 target=success_weighted_margin features=score_context_chart_compat,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3403,0.5694,0.7292,0.3761,0.4248,0.2014,0.2292,0.5486,n/a,n/a,n/a,n/a,0.0365,3,see run
212
+ "CTT residual test learned dominance (score_context_chart_compat, utility_margin)",runs/ctt_base_context_obs_learned_dominance_score_context_chartcompat_utility_task_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.6458 fallback=0.3542 target=utility_margin features=score_context_chart_compat,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3264,0.5694,0.7292,0.3761,0.4655,0.2014,0.2500,0.5486,n/a,n/a,n/a,n/a,0.0188,3,see run
213
  "CTT residual test learned dominance (source_evidence, utility_margin)",runs/ctt_base_context_obs_learned_dominance_source_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.5903 fallback=0.4097 target=utility_margin features=source_evidence,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3056,0.5694,0.7292,0.3761,0.5187,0.2014,0.2847,0.5486,n/a,n/a,n/a,n/a,n/a,3,see run
214
  "CTT residual test learned dominance (source_evidence, utility_margin)",runs/ctt_base_context_obs_learned_dominance_source_envclip_train_to_test,yes,measured dominance K=8 coverage=0.2361 fallback=0.7639 target=utility_margin features=source_evidence,"fail:selected<47.45,oracle<50,support_gap>7,selector_gap>3",0.2917,0.3333,0.4792,0.7292,0.5381,0.3674,0.2917,0.2014,0.5069,n/a,n/a,n/a,n/a,n/a,3,see run
215
  "CTT residual test learned dominance (source_evidence, success)",runs/ctt_base_context_obs_learned_dominance_source_success_envclip_k16_train_to_test,yes,measured dominance K=16 coverage=0.5139 fallback=0.4861 target=success features=source_evidence,"fail:selected<47.45,support_gap>7,selector_gap>3",0.2917,0.3056,0.5694,0.7292,0.3761,0.4804,0.2014,0.2708,0.5486,n/a,n/a,n/a,n/a,n/a,3,see run
workspace/scripts/build_ctt_proxy_comparison.py CHANGED
@@ -43,6 +43,11 @@ def main(argv: list[str] | None = None) -> int:
43
  parser = argparse.ArgumentParser(description="Build CTT validation proxy comparison table.")
44
  parser.add_argument("--out-dir", type=Path, default=Path("runs/ctt_val_proxy_comparison"))
45
  parser.add_argument("--safety-slack", type=float, default=0.01)
 
 
 
 
 
46
  args = parser.parse_args(argv)
47
 
48
  rows = [
@@ -74,6 +79,7 @@ def main(argv: list[str] | None = None) -> int:
74
  out_dir.mkdir(parents=True, exist_ok=True)
75
  payload = {
76
  "report_type": "ctt_val_proxy_comparison",
 
77
  "baseline": "local_atlas",
78
  "safety_slack": args.safety_slack,
79
  "rows": rows,
@@ -81,10 +87,21 @@ def main(argv: list[str] | None = None) -> int:
81
  "split_hash": _first(rows, "split_hash"),
82
  }
83
  (out_dir / "metrics.json").write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n")
84
- (out_dir / "metrics_by_task.json").write_text("{}\n")
85
- (out_dir / "metrics_by_seed.json").write_text("{}\n")
 
 
 
 
 
 
86
  (out_dir / "table.tex").write_text(_table(rows) + "\n")
87
- (out_dir / "report.md").write_text(_report(rows, args.safety_slack) + "\n")
 
 
 
 
 
88
  (out_dir / "train.log").write_text("comparison artifact; no training\n")
89
  (out_dir / "eval.log").write_text(
90
  "\n".join(f"{row['method']}: {row['run_path']}" for row in rows) + "\n"
@@ -113,7 +130,10 @@ def _row(method: str, run_dirs: list[Path]) -> dict[str, Any]:
113
  "negative_near_0p20": _mean_across(summaries, "negative_near_at_16_thr_0p20"),
114
  "negative_near_0p40": _mean_across(summaries, "negative_near_at_16_thr_0p40"),
115
  "mean_positive_distance": _mean_across(summaries, "mean_positive_distance_at_16"),
 
 
116
  "candidate_diversity": _mean_across(summaries, "candidate_diversity_at_16"),
 
117
  "proxy_support_distance": _mean_across(summaries, "proxy_support_distance_at_16"),
118
  "data_hash": payloads[0].get("data_hash"),
119
  "split_hash": payloads[0].get("target_split_hash", payloads[0].get("split_hash")),
@@ -132,17 +152,19 @@ def _mean_across(summaries: list[dict[str, Any]], key: str) -> float:
132
  def _table(rows: list[dict[str, Any]]) -> str:
133
  lines = [
134
  "% Auto-generated by scripts/build_ctt_proxy_comparison.py",
135
- "\\begin{tabular}{lrrrrrrrc}",
136
  "\\toprule",
137
- "Method & Seeds & Rows & PPTC@0.20 & PPTC@0.40 & Neg@0.20 & MeanPosDist & Diversity & Gate \\\\",
138
  "\\midrule",
139
  ]
140
  for row in rows:
141
  lines.append(
142
  f"{_latex_escape(row['method'])} & {row['train_seeds']} & {row['num_rows']} & "
143
  f"{_fmt(row['pptc_0p20'])} & {_fmt(row['pptc_0p40'])} & "
144
- f"{_fmt(row['negative_near_0p20'])} & {_fmt(row['mean_positive_distance'])} & "
145
- f"{_fmt(row['candidate_diversity'])} & {_gate(row)} \\\\"
 
 
146
  )
147
  lines.extend(["\\bottomrule", "\\end{tabular}"])
148
  return "\n".join(lines)
@@ -154,15 +176,17 @@ def _report(rows: list[dict[str, Any]], safety_slack: float) -> str:
154
  "",
155
  f"Safety slack over local-atlas NegativeNear@0.20: `{safety_slack:.4f}`",
156
  "",
157
- "| Method | Seeds | Rows | PPTC@0.20 | PPTC@0.40 | Neg@0.20 | MeanPosDist | Diversity | Gate | Run |",
158
- "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- |",
159
  ]
160
  for row in rows:
161
  lines.append(
162
  f"| {row['method']} | {row['train_seeds']} | {row['num_rows']} | "
163
  f"{_fmt(row['pptc_0p20'])} | "
164
  f"{_fmt(row['pptc_0p40'])} | {_fmt(row['negative_near_0p20'])} | "
165
- f"{_fmt(row['mean_positive_distance'])} | {_fmt(row['candidate_diversity'])} | "
 
 
166
  f"{_gate(row)} | `{row['run_path']}` |"
167
  )
168
  lines.append("")
@@ -170,6 +194,66 @@ def _report(rows: list[dict[str, Any]], safety_slack: float) -> str:
170
  return "\n".join(lines)
171
 
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  def _fmt(value: Any) -> str:
174
  if not isinstance(value, (int, float)) or not math.isfinite(float(value)):
175
  return "n/a"
 
43
  parser = argparse.ArgumentParser(description="Build CTT validation proxy comparison table.")
44
  parser.add_argument("--out-dir", type=Path, default=Path("runs/ctt_val_proxy_comparison"))
45
  parser.add_argument("--safety-slack", type=float, default=0.01)
46
+ parser.add_argument(
47
+ "--no-markdown-report",
48
+ action="store_true",
49
+ help="Do not write report.md; the persistent prose summary lives in README.md.",
50
+ )
51
  args = parser.parse_args(argv)
52
 
53
  rows = [
 
79
  out_dir.mkdir(parents=True, exist_ok=True)
80
  payload = {
81
  "report_type": "ctt_val_proxy_comparison",
82
+ "schema_version": 2,
83
  "baseline": "local_atlas",
84
  "safety_slack": args.safety_slack,
85
  "rows": rows,
 
87
  "split_hash": _first(rows, "split_hash"),
88
  }
89
  (out_dir / "metrics.json").write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n")
90
+ (out_dir / "metrics_by_task.json").write_text(
91
+ json.dumps(_grouped_metrics(DEFAULT_RUNS, group_key="task_id"), indent=2, sort_keys=True)
92
+ + "\n"
93
+ )
94
+ (out_dir / "metrics_by_seed.json").write_text(
95
+ json.dumps(_grouped_metrics(DEFAULT_RUNS, group_key="seed"), indent=2, sort_keys=True)
96
+ + "\n"
97
+ )
98
  (out_dir / "table.tex").write_text(_table(rows) + "\n")
99
+ _write_report_artifact(
100
+ out_dir,
101
+ rows,
102
+ safety_slack=args.safety_slack,
103
+ no_markdown_report=args.no_markdown_report,
104
+ )
105
  (out_dir / "train.log").write_text("comparison artifact; no training\n")
106
  (out_dir / "eval.log").write_text(
107
  "\n".join(f"{row['method']}: {row['run_path']}" for row in rows) + "\n"
 
130
  "negative_near_0p20": _mean_across(summaries, "negative_near_at_16_thr_0p20"),
131
  "negative_near_0p40": _mean_across(summaries, "negative_near_at_16_thr_0p40"),
132
  "mean_positive_distance": _mean_across(summaries, "mean_positive_distance_at_16"),
133
+ "mean_negative_distance": _mean_across(summaries, "mean_negative_distance_at_16"),
134
+ "pos_closer_than_neg": _mean_across(summaries, "pos_closer_than_neg_at_16"),
135
  "candidate_diversity": _mean_across(summaries, "candidate_diversity_at_16"),
136
+ "collapse_rate": _mean_across(summaries, "collapse_rate_at_16"),
137
  "proxy_support_distance": _mean_across(summaries, "proxy_support_distance_at_16"),
138
  "data_hash": payloads[0].get("data_hash"),
139
  "split_hash": payloads[0].get("target_split_hash", payloads[0].get("split_hash")),
 
152
  def _table(rows: list[dict[str, Any]]) -> str:
153
  lines = [
154
  "% Auto-generated by scripts/build_ctt_proxy_comparison.py",
155
+ "\\begin{tabular}{lrrrrrrrrrrc}",
156
  "\\toprule",
157
+ "Method & Seeds & Rows & PPTC@0.20 & PPTC@0.40 & Neg@0.20 & Neg@0.40 & Pos<Neg & MeanPos & MeanNeg & Collapse & Gate \\\\",
158
  "\\midrule",
159
  ]
160
  for row in rows:
161
  lines.append(
162
  f"{_latex_escape(row['method'])} & {row['train_seeds']} & {row['num_rows']} & "
163
  f"{_fmt(row['pptc_0p20'])} & {_fmt(row['pptc_0p40'])} & "
164
+ f"{_fmt(row['negative_near_0p20'])} & {_fmt(row['negative_near_0p40'])} & "
165
+ f"{_fmt(row['pos_closer_than_neg'])} & {_fmt(row['mean_positive_distance'])} & "
166
+ f"{_fmt(row['mean_negative_distance'])} & {_fmt(row['collapse_rate'])} & "
167
+ f"{_gate(row)} \\\\"
168
  )
169
  lines.extend(["\\bottomrule", "\\end{tabular}"])
170
  return "\n".join(lines)
 
176
  "",
177
  f"Safety slack over local-atlas NegativeNear@0.20: `{safety_slack:.4f}`",
178
  "",
179
+ "| Method | Seeds | Rows | PPTC@0.20 | PPTC@0.40 | Neg@0.20 | Neg@0.40 | Pos<Neg | MeanPos | MeanNeg | Diversity | Collapse | Gate | Run |",
180
+ "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- |",
181
  ]
182
  for row in rows:
183
  lines.append(
184
  f"| {row['method']} | {row['train_seeds']} | {row['num_rows']} | "
185
  f"{_fmt(row['pptc_0p20'])} | "
186
  f"{_fmt(row['pptc_0p40'])} | {_fmt(row['negative_near_0p20'])} | "
187
+ f"{_fmt(row['negative_near_0p40'])} | {_fmt(row['pos_closer_than_neg'])} | "
188
+ f"{_fmt(row['mean_positive_distance'])} | {_fmt(row['mean_negative_distance'])} | "
189
+ f"{_fmt(row['candidate_diversity'])} | {_fmt(row['collapse_rate'])} | "
190
  f"{_gate(row)} | `{row['run_path']}` |"
191
  )
192
  lines.append("")
 
194
  return "\n".join(lines)
195
 
196
 
197
+ def _write_report_artifact(
198
+ out_dir: Path,
199
+ rows: list[dict[str, Any]],
200
+ *,
201
+ safety_slack: float,
202
+ no_markdown_report: bool,
203
+ ) -> None:
204
+ report_path = out_dir / "report.md"
205
+ if no_markdown_report:
206
+ if report_path.exists():
207
+ report_path.unlink()
208
+ return
209
+ report_path.write_text(_report(rows, safety_slack) + "\n")
210
+
211
+
212
+ def _grouped_metrics(
213
+ run_specs: list[tuple[str, list[Path]]],
214
+ *,
215
+ group_key: str,
216
+ ) -> dict[str, dict[str, dict[str, float]]]:
217
+ output: dict[str, dict[str, dict[str, float]]] = {}
218
+ for method, run_dirs in run_specs:
219
+ if not run_dirs or not all((run_dir / "metrics.json").exists() for run_dir in run_dirs):
220
+ continue
221
+ rows: list[dict[str, Any]] = []
222
+ for run_dir in run_dirs:
223
+ payload = json.loads((run_dir / "metrics.json").read_text())
224
+ rows.extend(payload.get("rows", []))
225
+ if not rows:
226
+ continue
227
+ method_groups: dict[str, dict[str, list[float]]] = {}
228
+ for row in rows:
229
+ group = str(row.get(group_key, "unknown"))
230
+ metrics = method_groups.setdefault(group, {})
231
+ for source_key, target_key in _row_metric_key_map().items():
232
+ value = row.get(source_key)
233
+ if isinstance(value, (int, float)) and math.isfinite(float(value)):
234
+ metrics.setdefault(target_key, []).append(float(value))
235
+ output[method] = {
236
+ group: {name: sum(values) / len(values) for name, values in sorted(metrics.items())}
237
+ for group, metrics in sorted(method_groups.items())
238
+ }
239
+ return output
240
+
241
+
242
+ def _row_metric_key_map() -> dict[str, str]:
243
+ return {
244
+ "pptc_at_16_thr_0p20": "pptc_0p20",
245
+ "pptc_at_16_thr_0p40": "pptc_0p40",
246
+ "negative_near_at_16_thr_0p20": "negative_near_0p20",
247
+ "negative_near_at_16_thr_0p40": "negative_near_0p40",
248
+ "mean_positive_distance_at_16": "mean_positive_distance",
249
+ "mean_negative_distance_at_16": "mean_negative_distance",
250
+ "pos_closer_than_neg_at_16": "pos_closer_than_neg",
251
+ "candidate_diversity_at_16": "candidate_diversity",
252
+ "collapse_rate_at_16": "collapse_rate",
253
+ "proxy_support_distance_at_16": "proxy_support_distance",
254
+ }
255
+
256
+
257
  def _fmt(value: Any) -> str:
258
  if not isinstance(value, (int, float)) or not math.isfinite(float(value)):
259
  return "n/a"
workspace/scripts/eval_ctt_proxy.py CHANGED
@@ -39,6 +39,11 @@ def main(argv: list[str] | None = None) -> int:
39
  parser.add_argument("--thresholds", default="0.20,0.40")
40
  parser.add_argument("--max-target-charts", type=int, default=64)
41
  parser.add_argument("--neighbors", type=int, default=8)
 
 
 
 
 
42
  args = parser.parse_args(argv)
43
 
44
  thresholds = [float(item) for item in args.thresholds.split(",") if item.strip()]
@@ -159,7 +164,7 @@ def main(argv: list[str] | None = None) -> int:
159
  (out_dir / "eval.log").write_text("\n".join(log_lines) + "\n")
160
  (out_dir / "train.log").write_text("see checkpoint run\n")
161
  (out_dir / "table.tex").write_text(_table(summary) + "\n")
162
- (out_dir / "report.md").write_text(_report(summary, args.k) + "\n")
163
  print(json.dumps({"out_dir": str(out_dir), "num_rows": len(rows)}, indent=2))
164
  return 0
165
 
@@ -271,5 +276,20 @@ def _report(summary: dict[str, Any], k: int) -> str:
271
  return "\n".join(lines)
272
 
273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  if __name__ == "__main__":
275
  raise SystemExit(main())
 
39
  parser.add_argument("--thresholds", default="0.20,0.40")
40
  parser.add_argument("--max-target-charts", type=int, default=64)
41
  parser.add_argument("--neighbors", type=int, default=8)
42
+ parser.add_argument(
43
+ "--no-markdown-report",
44
+ action="store_true",
45
+ help="Do not write report.md; the persistent prose summary lives in README.md.",
46
+ )
47
  args = parser.parse_args(argv)
48
 
49
  thresholds = [float(item) for item in args.thresholds.split(",") if item.strip()]
 
164
  (out_dir / "eval.log").write_text("\n".join(log_lines) + "\n")
165
  (out_dir / "train.log").write_text("see checkpoint run\n")
166
  (out_dir / "table.tex").write_text(_table(summary) + "\n")
167
+ _write_report_artifact(out_dir, summary, k=args.k, no_markdown_report=args.no_markdown_report)
168
  print(json.dumps({"out_dir": str(out_dir), "num_rows": len(rows)}, indent=2))
169
  return 0
170
 
 
276
  return "\n".join(lines)
277
 
278
 
279
+ def _write_report_artifact(
280
+ out_dir: Path,
281
+ summary: dict[str, Any],
282
+ *,
283
+ k: int,
284
+ no_markdown_report: bool,
285
+ ) -> None:
286
+ report_path = out_dir / "report.md"
287
+ if no_markdown_report:
288
+ if report_path.exists():
289
+ report_path.unlink()
290
+ return
291
+ report_path.write_text(_report(summary, k) + "\n")
292
+
293
+
294
  if __name__ == "__main__":
295
  raise SystemExit(main())
workspace/scripts/eval_learned_dominance_selector.py CHANGED
@@ -82,17 +82,30 @@ CHART_COMPAT_NAMES = [
82
  "target_obj_norm",
83
  "source_obj_norm",
84
  ]
 
 
 
 
 
 
 
 
 
 
85
  FEATURE_SET_CHOICES = (
86
  "basic",
87
  "tangent",
88
  "context",
89
  "context_tangent",
 
90
  "source_evidence",
91
  "tangent_source_evidence",
92
  "context_source_evidence",
93
  "context_tangent_source_evidence",
94
  "chart_compat",
95
  "chart_tangent_compat",
 
 
96
  "chart_source_compat",
97
  "chart_tangent_source_compat",
98
  )
@@ -149,6 +162,15 @@ def main(argv: list[str] | None = None) -> int:
149
  "candidate success to prioritize the lexicographic success/progress utility."
150
  ),
151
  )
 
 
 
 
 
 
 
 
 
152
  parser.add_argument(
153
  "--threshold-scope",
154
  choices=("global", "task"),
@@ -175,6 +197,11 @@ def main(argv: list[str] | None = None) -> int:
175
  help="Relative weight for pairwise rows when --fit-objective=hybrid_pairwise.",
176
  )
177
  parser.add_argument("--bootstrap-samples", type=int, default=1000)
 
 
 
 
 
178
  args = parser.parse_args(argv)
179
 
180
  if args.k <= 0:
@@ -184,6 +211,8 @@ def main(argv: list[str] | None = None) -> int:
184
  parser.error("--ridge-lambdas must contain non-negative values")
185
  if args.pairwise_weight <= 0.0:
186
  parser.error("--pairwise-weight must be positive")
 
 
187
 
188
  out_dir = args.out_dir
189
  out_dir.mkdir(parents=True, exist_ok=True)
@@ -236,6 +265,7 @@ def main(argv: list[str] | None = None) -> int:
236
  selector_target_charts=selector_calibration_charts,
237
  selector_source_charts=selector_source_charts,
238
  selector_chart_feature_mode=args.selector_chart_feature_mode,
 
239
  )
240
  eval_dataset = _candidate_dataset(
241
  eval_rows,
@@ -248,6 +278,7 @@ def main(argv: list[str] | None = None) -> int:
248
  selector_target_charts=selector_eval_charts,
249
  selector_source_charts=selector_source_charts,
250
  selector_chart_feature_mode=args.selector_chart_feature_mode,
 
251
  )
252
  best = _fit_select_ridge(
253
  calibration_dataset,
@@ -307,6 +338,7 @@ def main(argv: list[str] | None = None) -> int:
307
  args.selector_chart_feature_mode if _uses_chart_compat(args.feature_set) else None
308
  ),
309
  "target": args.target,
 
310
  "fit_objective": args.fit_objective,
311
  "pairwise_weight": args.pairwise_weight,
312
  "threshold_scope": args.threshold_scope,
@@ -360,7 +392,7 @@ def main(argv: list[str] | None = None) -> int:
360
  + "\n"
361
  )
362
  (out_dir / "table.tex").write_text(_table(metrics) + "\n")
363
- (out_dir / "report.md").write_text(_report(metrics) + "\n")
364
  (out_dir / "train.log").write_text(
365
  "trained ridge dominance calibrator on calibration measured rows only\n"
366
  f"fit_objective={args.fit_objective}\n"
@@ -399,6 +431,7 @@ def _candidate_dataset(
399
  selector_target_charts: dict[str, Any] | None = None,
400
  selector_source_charts: dict[str, Any] | None = None,
401
  selector_chart_feature_mode: str = "base_context_obs_obj",
 
402
  ) -> dict[str, Any]:
403
  source_evidence = source_evidence or {}
404
  selector_target_charts = selector_target_charts or {}
@@ -422,6 +455,7 @@ def _candidate_dataset(
422
  continue
423
  score_mean = sum(scores) / len(scores)
424
  score_std = math.sqrt(sum((score - score_mean) ** 2 for score in scores) / len(scores)) + 1.0e-6
 
425
  for candidate_index, score in enumerate(scores):
426
  source_chart_id = str(source_chart_ids[candidate_index]) if candidate_index < len(source_chart_ids) else ""
427
  tangent = np.asarray(
@@ -454,6 +488,7 @@ def _candidate_dataset(
454
  selector_source_charts.get(source_chart_id),
455
  chart_feature_mode=selector_chart_feature_mode,
456
  ),
 
457
  num_candidates=len(scores),
458
  feature_set=feature_set,
459
  )
@@ -472,6 +507,7 @@ def _candidate_dataset(
472
  target,
473
  utility_margin=target_margin,
474
  candidate_success=successes[candidate_index],
 
475
  ),
476
  "measured_utility_margin": target_margin,
477
  "candidate_utility": utilities[candidate_index],
@@ -508,6 +544,8 @@ def _feature_names(feature_set: str) -> list[str]:
508
  *[f"abs_tangent_{index:02d}" for index in range(21)],
509
  ]
510
  names = list(BASIC_FEATURE_NAMES)
 
 
511
  if _uses_context(feature_set):
512
  names.extend(context_names)
513
  if _uses_tangent(feature_set):
@@ -535,6 +573,7 @@ def _candidate_feature(
535
  context: dict[str, Any] | None = None,
536
  source_evidence: np.ndarray | None = None,
537
  chart_compat: np.ndarray | None = None,
 
538
  ) -> np.ndarray:
539
  tangent = np.asarray(tangent, dtype=float).reshape(-1)
540
  if tangent.size < 21:
@@ -561,6 +600,10 @@ def _candidate_feature(
561
  if feature_set == "basic":
562
  return basic
563
  parts = [basic]
 
 
 
 
564
  if _uses_context(feature_set):
565
  parts.append(_context_feature(context or {}))
566
  if _uses_tangent(feature_set):
@@ -584,6 +627,16 @@ def _uses_context(feature_set: str) -> bool:
584
  "context_tangent",
585
  "context_source_evidence",
586
  "context_tangent_source_evidence",
 
 
 
 
 
 
 
 
 
 
587
  }
588
 
589
 
@@ -613,6 +666,8 @@ def _uses_chart_compat(feature_set: str) -> bool:
613
  return feature_set in {
614
  "chart_compat",
615
  "chart_tangent_compat",
 
 
616
  "chart_source_compat",
617
  "chart_tangent_source_compat",
618
  }
@@ -864,6 +919,44 @@ def _min_rms_distance(tangent: np.ndarray, candidates: np.ndarray) -> float:
864
  return float(np.sqrt(np.mean(diff * diff, axis=1)).min())
865
 
866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
867
  def _context_feature(context: dict[str, Any]) -> np.ndarray:
868
  target_task = str(context.get("target_task_id", ""))
869
  source_task = str(context.get("source_task_id", ""))
@@ -891,13 +984,14 @@ def _target_value(
891
  *,
892
  utility_margin: float,
893
  candidate_success: float,
 
894
  ) -> float:
895
  if target == "utility_margin":
896
  return float(utility_margin)
897
  if target == "success":
898
  return float(candidate_success)
899
  if target == "success_weighted_margin":
900
- return float(utility_margin) + float(candidate_success)
901
  raise ValueError(f"unknown target: {target}")
902
 
903
 
@@ -1446,6 +1540,20 @@ def _report(metrics: dict[str, Any]) -> str:
1446
  return "\n".join(lines)
1447
 
1448
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1449
  def _write_provenance(out_dir: Path, args: argparse.Namespace) -> None:
1450
  (out_dir / "config.yaml").write_text(
1451
  "\n".join(f"{key}: {value}" for key, value in sorted(vars(args).items())) + "\n"
 
82
  "target_obj_norm",
83
  "source_obj_norm",
84
  ]
85
+ SCORE_SHAPE_NAMES = [
86
+ "candidate_score_rank_fraction",
87
+ "candidate_score_softmax_prob",
88
+ "candidate_score_gap_to_best",
89
+ "candidate_score_gap_to_second_best",
90
+ "candidate_score_gap_to_prev_higher",
91
+ "candidate_score_gap_to_next_lower",
92
+ "candidate_score_percentile",
93
+ "candidate_score_top_margin",
94
+ ]
95
  FEATURE_SET_CHOICES = (
96
  "basic",
97
  "tangent",
98
  "context",
99
  "context_tangent",
100
+ "score_context",
101
  "source_evidence",
102
  "tangent_source_evidence",
103
  "context_source_evidence",
104
  "context_tangent_source_evidence",
105
  "chart_compat",
106
  "chart_tangent_compat",
107
+ "score_chart_compat",
108
+ "score_context_chart_compat",
109
  "chart_source_compat",
110
  "chart_tangent_source_compat",
111
  )
 
162
  "candidate success to prioritize the lexicographic success/progress utility."
163
  ),
164
  )
165
+ parser.add_argument(
166
+ "--success-bonus",
167
+ type=float,
168
+ default=1.0,
169
+ help=(
170
+ "Bonus multiplier for candidate_success when --target=success_weighted_margin. "
171
+ "Default preserves the original +1 success bonus."
172
+ ),
173
+ )
174
  parser.add_argument(
175
  "--threshold-scope",
176
  choices=("global", "task"),
 
197
  help="Relative weight for pairwise rows when --fit-objective=hybrid_pairwise.",
198
  )
199
  parser.add_argument("--bootstrap-samples", type=int, default=1000)
200
+ parser.add_argument(
201
+ "--no-markdown-report",
202
+ action="store_true",
203
+ help="Do not write report.md; useful when the workspace is kept README-only.",
204
+ )
205
  args = parser.parse_args(argv)
206
 
207
  if args.k <= 0:
 
211
  parser.error("--ridge-lambdas must contain non-negative values")
212
  if args.pairwise_weight <= 0.0:
213
  parser.error("--pairwise-weight must be positive")
214
+ if args.success_bonus < 0.0:
215
+ parser.error("--success-bonus must be non-negative")
216
 
217
  out_dir = args.out_dir
218
  out_dir.mkdir(parents=True, exist_ok=True)
 
265
  selector_target_charts=selector_calibration_charts,
266
  selector_source_charts=selector_source_charts,
267
  selector_chart_feature_mode=args.selector_chart_feature_mode,
268
+ success_bonus=args.success_bonus,
269
  )
270
  eval_dataset = _candidate_dataset(
271
  eval_rows,
 
278
  selector_target_charts=selector_eval_charts,
279
  selector_source_charts=selector_source_charts,
280
  selector_chart_feature_mode=args.selector_chart_feature_mode,
281
+ success_bonus=args.success_bonus,
282
  )
283
  best = _fit_select_ridge(
284
  calibration_dataset,
 
338
  args.selector_chart_feature_mode if _uses_chart_compat(args.feature_set) else None
339
  ),
340
  "target": args.target,
341
+ "success_bonus": args.success_bonus,
342
  "fit_objective": args.fit_objective,
343
  "pairwise_weight": args.pairwise_weight,
344
  "threshold_scope": args.threshold_scope,
 
392
  + "\n"
393
  )
394
  (out_dir / "table.tex").write_text(_table(metrics) + "\n")
395
+ _write_report_artifact(out_dir, metrics, no_markdown_report=args.no_markdown_report)
396
  (out_dir / "train.log").write_text(
397
  "trained ridge dominance calibrator on calibration measured rows only\n"
398
  f"fit_objective={args.fit_objective}\n"
 
431
  selector_target_charts: dict[str, Any] | None = None,
432
  selector_source_charts: dict[str, Any] | None = None,
433
  selector_chart_feature_mode: str = "base_context_obs_obj",
434
+ success_bonus: float = 1.0,
435
  ) -> dict[str, Any]:
436
  source_evidence = source_evidence or {}
437
  selector_target_charts = selector_target_charts or {}
 
455
  continue
456
  score_mean = sum(scores) / len(scores)
457
  score_std = math.sqrt(sum((score - score_mean) ** 2 for score in scores) / len(scores)) + 1.0e-6
458
+ score_shape = _score_shape_matrix(scores)
459
  for candidate_index, score in enumerate(scores):
460
  source_chart_id = str(source_chart_ids[candidate_index]) if candidate_index < len(source_chart_ids) else ""
461
  tangent = np.asarray(
 
488
  selector_source_charts.get(source_chart_id),
489
  chart_feature_mode=selector_chart_feature_mode,
490
  ),
491
+ score_shape=score_shape[candidate_index],
492
  num_candidates=len(scores),
493
  feature_set=feature_set,
494
  )
 
507
  target,
508
  utility_margin=target_margin,
509
  candidate_success=successes[candidate_index],
510
+ success_bonus=success_bonus,
511
  ),
512
  "measured_utility_margin": target_margin,
513
  "candidate_utility": utilities[candidate_index],
 
544
  *[f"abs_tangent_{index:02d}" for index in range(21)],
545
  ]
546
  names = list(BASIC_FEATURE_NAMES)
547
+ if _uses_score_shape(feature_set):
548
+ names.extend(SCORE_SHAPE_NAMES)
549
  if _uses_context(feature_set):
550
  names.extend(context_names)
551
  if _uses_tangent(feature_set):
 
573
  context: dict[str, Any] | None = None,
574
  source_evidence: np.ndarray | None = None,
575
  chart_compat: np.ndarray | None = None,
576
+ score_shape: np.ndarray | None = None,
577
  ) -> np.ndarray:
578
  tangent = np.asarray(tangent, dtype=float).reshape(-1)
579
  if tangent.size < 21:
 
600
  if feature_set == "basic":
601
  return basic
602
  parts = [basic]
603
+ if _uses_score_shape(feature_set):
604
+ if score_shape is None:
605
+ score_shape = np.zeros(len(SCORE_SHAPE_NAMES), dtype=float)
606
+ parts.append(np.asarray(score_shape, dtype=float).reshape(-1))
607
  if _uses_context(feature_set):
608
  parts.append(_context_feature(context or {}))
609
  if _uses_tangent(feature_set):
 
627
  "context_tangent",
628
  "context_source_evidence",
629
  "context_tangent_source_evidence",
630
+ "score_context",
631
+ "score_context_chart_compat",
632
+ }
633
+
634
+
635
+ def _uses_score_shape(feature_set: str) -> bool:
636
+ return feature_set in {
637
+ "score_context",
638
+ "score_chart_compat",
639
+ "score_context_chart_compat",
640
  }
641
 
642
 
 
666
  return feature_set in {
667
  "chart_compat",
668
  "chart_tangent_compat",
669
+ "score_chart_compat",
670
+ "score_context_chart_compat",
671
  "chart_source_compat",
672
  "chart_tangent_source_compat",
673
  }
 
919
  return float(np.sqrt(np.mean(diff * diff, axis=1)).min())
920
 
921
 
922
+ def _score_shape_matrix(scores: list[float]) -> np.ndarray:
923
+ """Deployment-visible row-relative score features for each candidate."""
924
+ score_array = np.asarray(scores, dtype=float).reshape(-1)
925
+ if score_array.size == 0:
926
+ return np.zeros((0, len(SCORE_SHAPE_NAMES)), dtype=float)
927
+ order = sorted(range(score_array.size), key=lambda index: (-float(score_array[index]), index))
928
+ ranks = np.zeros(score_array.size, dtype=float)
929
+ for rank, index in enumerate(order):
930
+ ranks[index] = float(rank)
931
+ sorted_scores = score_array[order]
932
+ best = float(sorted_scores[0])
933
+ second = float(sorted_scores[1]) if sorted_scores.size > 1 else best
934
+ denom = max(1.0, float(score_array.size - 1))
935
+ shifted = score_array - float(np.max(score_array))
936
+ exp_scores = np.exp(np.clip(shifted, -60.0, 60.0))
937
+ softmax = exp_scores / max(float(exp_scores.sum()), 1.0e-12)
938
+
939
+ rows: list[list[float]] = []
940
+ for index, score in enumerate(score_array):
941
+ rank = int(ranks[index])
942
+ prev_higher = sorted_scores[rank - 1] if rank > 0 else score
943
+ next_lower = sorted_scores[rank + 1] if rank + 1 < sorted_scores.size else score
944
+ percentile = float(np.mean(score_array <= score))
945
+ rows.append(
946
+ [
947
+ float(rank) / denom,
948
+ float(softmax[index]),
949
+ float(score - best),
950
+ float(score - second),
951
+ float(score - prev_higher),
952
+ float(score - next_lower),
953
+ percentile,
954
+ float(best - second),
955
+ ]
956
+ )
957
+ return np.asarray(rows, dtype=float)
958
+
959
+
960
  def _context_feature(context: dict[str, Any]) -> np.ndarray:
961
  target_task = str(context.get("target_task_id", ""))
962
  source_task = str(context.get("source_task_id", ""))
 
984
  *,
985
  utility_margin: float,
986
  candidate_success: float,
987
+ success_bonus: float = 1.0,
988
  ) -> float:
989
  if target == "utility_margin":
990
  return float(utility_margin)
991
  if target == "success":
992
  return float(candidate_success)
993
  if target == "success_weighted_margin":
994
+ return float(utility_margin) + float(success_bonus) * float(candidate_success)
995
  raise ValueError(f"unknown target: {target}")
996
 
997
 
 
1540
  return "\n".join(lines)
1541
 
1542
 
1543
+ def _write_report_artifact(
1544
+ out_dir: Path,
1545
+ metrics: dict[str, Any],
1546
+ *,
1547
+ no_markdown_report: bool = False,
1548
+ ) -> None:
1549
+ report_path = out_dir / "report.md"
1550
+ if no_markdown_report:
1551
+ if report_path.exists():
1552
+ report_path.unlink()
1553
+ return
1554
+ report_path.write_text(_report(metrics) + "\n")
1555
+
1556
+
1557
  def _write_provenance(out_dir: Path, args: argparse.Namespace) -> None:
1558
  (out_dir / "config.yaml").write_text(
1559
  "\n".join(f"{key}: {value}" for key, value in sorted(vars(args).items())) + "\n"
workspace/scripts/eval_nonlinear_dominance_selector.py CHANGED
@@ -105,6 +105,11 @@ def main(argv: list[str] | None = None) -> int:
105
  parser.add_argument("--selection-frac", type=float, default=0.35)
106
  parser.add_argument("--seed", type=int, default=0)
107
  parser.add_argument("--bootstrap-samples", type=int, default=1000)
 
 
 
 
 
108
  args = parser.parse_args(argv)
109
 
110
  if args.k <= 0:
@@ -309,7 +314,7 @@ def main(argv: list[str] | None = None) -> int:
309
  + "\n"
310
  )
311
  (out_dir / "table.tex").write_text(_table(metrics) + "\n")
312
- (out_dir / "report.md").write_text(_report(metrics) + "\n")
313
  (out_dir / "train.log").write_text(
314
  "trained nonlinear dominance selector on calibration-fit rows only\n"
315
  f"selected_model_type={best['model_type']}\n"
@@ -599,6 +604,20 @@ def _report(metrics: dict[str, Any]) -> str:
599
  return "\n".join(lines)
600
 
601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  def _write_provenance(out_dir: Path, args: argparse.Namespace) -> None:
603
  (out_dir / "config.yaml").write_text(
604
  "\n".join(f"{key}: {value}" for key, value in sorted(vars(args).items())) + "\n"
 
105
  parser.add_argument("--selection-frac", type=float, default=0.35)
106
  parser.add_argument("--seed", type=int, default=0)
107
  parser.add_argument("--bootstrap-samples", type=int, default=1000)
108
+ parser.add_argument(
109
+ "--no-markdown-report",
110
+ action="store_true",
111
+ help="Do not write report.md; useful when the workspace is kept README-only.",
112
+ )
113
  args = parser.parse_args(argv)
114
 
115
  if args.k <= 0:
 
314
  + "\n"
315
  )
316
  (out_dir / "table.tex").write_text(_table(metrics) + "\n")
317
+ _write_report_artifact(out_dir, metrics, no_markdown_report=args.no_markdown_report)
318
  (out_dir / "train.log").write_text(
319
  "trained nonlinear dominance selector on calibration-fit rows only\n"
320
  f"selected_model_type={best['model_type']}\n"
 
604
  return "\n".join(lines)
605
 
606
 
607
+ def _write_report_artifact(
608
+ out_dir: Path,
609
+ metrics: dict[str, Any],
610
+ *,
611
+ no_markdown_report: bool = False,
612
+ ) -> None:
613
+ report_path = out_dir / "report.md"
614
+ if no_markdown_report:
615
+ if report_path.exists():
616
+ report_path.unlink()
617
+ return
618
+ report_path.write_text(_report(metrics) + "\n")
619
+
620
+
621
  def _write_provenance(out_dir: Path, args: argparse.Namespace) -> None:
622
  (out_dir / "config.yaml").write_text(
623
  "\n".join(f"{key}: {value}" for key, value in sorted(vars(args).items())) + "\n"